Version 1.7.0-dev.4.0

svn merge -r 40301:40671 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@40675 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 2d46d56..f11500b 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -28,7 +28,7 @@
 
 A conforming  implementation of the Dart programming language must provide and support all the  APIs (libraries, types, functions, getters, setters, whether top-level, static, instance or local) mandated in this specification. 
 
-A conforming implementation is permitted to provide additional APIs, but not additional syntax, except for experimental features in support of enumerated types and deferred loading which are expected to be added in the next revision of this specification.
+A conforming implementation is permitted to provide additional APIs, but not additional syntax.
 
 % A claim of conformance with this Ecma Standard shall specify?
 
@@ -2180,8 +2180,10 @@
 \item An expression of one of the forms  \code{$e_1$ == $e_2$} or  \code{$e_1$ != $e_2$} where $e_1$ and $e_2$ are constant expressions that evaluate to a numeric, string or boolean value or to \NULL{}.
 \item An expression of one of the forms \code{!$e$}, \code{$e_1$ \&\& $e_2$} or \code{$e_1 || e_2$}, where  $e$, $e_1$ and $e_2$ are constant expressions that evaluate to a boolean value.
 \item An expression of one of the forms \~{}$e$, $e_1$ \^{} $e_2$, \code{$e_1$ \& $e_2$}, $e_1 | e_2$, $e_1 >> e_2$ or $e_1 <<  e_2$, where  $e$, $e_1$ and $e_2$ are constant expressions that evaluate to an integer value  or to \NULL{}.
-\item An expression of one of the forms \code{$-e$},  \code{$e_1 + e_2$}, \code{$e_1$ - $e_2$}, \code{$e_1$ * $e_2$}, \code{$e_1$ / $e_2$,} \code{$e_1$ \~{}/ $e_2$},  \code{$e_1  >  e_2$}, \code{$e_1  <  e_2$}, \code{$e_1$ $>$= $e_2$}, \code{$e_1$ $<$= $e_2$} or \code{$e_1$ \% $e_2$},  where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to a numeric value  or to \NULL{}.
-\item An expression of the form \code{$e_1$?$e_2$:$e3$} where where $e_1$, $e_2$ and $e_3$ are constant expressions and $e_1$ evaluates to a boolean value.
+\item An expression of the form \code{$e_1 + e_2$} where $e_1$ and $e_2$ are constant expressions that evaluate to a numeric or string value or to \NULL{}.
+\item An expression of one of the forms \code{$-e$}, \code{$e_1$ - $e_2$}, \code{$e_1$ * $e_2$}, \code{$e_1$ / $e_2$,} \code{$e_1$ \~{}/ $e_2$},  \code{$e_1  >  e_2$}, \code{$e_1  <  e_2$}, \code{$e_1$ $>$= $e_2$}, \code{$e_1$ $<$= $e_2$} or \code{$e_1$ \% $e_2$},  where $e$, $e_1$ and $e_2$ are constant expressions that evaluate to a numeric value  or to \NULL{}.
+\item An expression of the form \code{$e_1$?$e_2$:$e3$} where $e_1$, $e_2$ and $e_3$ are constant expressions and $e_1$ evaluates to a boolean value.
+\item An expression of the form \code{$e$.length} where $e$ is a constant expression that evaluates to a string value.
 \end{itemize}
 
 % null in all the expressions
@@ -4040,9 +4042,11 @@
 Evaluation of an await expression $a$ of the form \AWAIT{} $e$ proceeds as follows:
 First, the expression $e$ is evaluated. Next:
 
-If $e$ evaluates to an instance of \code{Future}, $f$, then execution of the function $m$ immediately enclosing $a$ is suspended until after $f$ completes. The stream associated with the innermost enclosing asynchronous for loop (\ref{asynchronousFor-in}), if any, is paused. At some time after $f$ is completed, control returns to the current invocation. The stream associated with the innermost enclosing asynchronous for loop  (\ref{asynchronousFor-in}), if any, is resumed. If $f$ has completed with an exception $x$, $a$ raises $x$. If $f$ completes with a value $v$, $a$ evaluates to $v$.
+If $e$ raises an exception $x$, then an instance $f$ of class \code{Future} is allocated and later completed with $x$. Otherwise, if $e$ evaluates to an object $o$ that is not an instance of \code{Future}, then let $f$ be the result of calling \code{Future.value()} with $o$ as its argument; otherwise let $f$ be the result of evaluating $e$. 
 
-Otherwise, the value of $a$ is the value of $e$. If evaluation of $e$ raises an exception $x$, $a$ raises $x$.
+Next,  execution of the function $m$ immediately enclosing $a$ is suspended until after $f$ completes. The stream associated with the innermost enclosing asynchronous for loop (\ref{asynchronousFor-in}), if any, is paused. At some time after $f$ is completed, control returns to the current invocation. The stream associated with the innermost enclosing asynchronous for loop  (\ref{asynchronousFor-in}), if any, is resumed. If $f$ has completed with an exception $x$, $a$ raises $x$. If $f$ completes with a value $v$, $a$ evaluates to $v$.
+
+%Otherwise, the value of $a$ is the value of $e$. If evaluation of $e$ raises an exception $x$, $a$ raises $x$.
 
 \commentary{
 It is a compile-time error if  the function  immediately enclosing  $a$  is not declared asynchronous.  However, this error is simply a syntax error, because in the context of a normal function, \AWAIT{} has no special meaning.
diff --git a/pkg/analysis_server/bin/fuzz.dart b/pkg/analysis_server/bin/fuzz.dart
new file mode 100644
index 0000000..8fc71d9
--- /dev/null
+++ b/pkg/analysis_server/bin/fuzz.dart
@@ -0,0 +1,166 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:matcher/matcher.dart';
+import 'package:path/path.dart' as path;
+
+import 'fuzz/server_manager.dart';
+
+/**
+ * Start analysis server as a separate process and use the stdio to communicate
+ * with the server.
+ */
+void main(List<String> args) {
+  new _FuzzTest().run(args);
+}
+
+/**
+ * Instances of [_FuzzTest] launch and test an analysis server.
+ * You must specify the location of the Dart SDK and the directory
+ * containing sources to be analyzed.
+ */
+class _FuzzTest {
+
+  //TODO (danrubel) extract common behavior for use in multiple test scenarios
+  //TODO (danrubel) cleanup test to use async/await for better readability
+  // VM flag --enable_async
+
+  static const String DART_SDK_OPTION = 'dart-sdk';
+  static const String HELP_OPTION = 'help';
+
+  File serverSnapshot;
+  Directory appDir;
+
+  /// Parse the arguments and initialize the receiver
+  /// Return `true` if proper arguments were provided
+  bool parseArgs(List<String> args) {
+    ArgParser parser = new ArgParser();
+
+    void error(String errMsg) {
+      stderr.writeln(errMsg);
+      print('');
+      _printUsage(parser);
+      exitCode = 11;
+    }
+
+    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,
+        negatable: false);
+
+    ArgResults results;
+    try {
+      results = parser.parse(args);
+    } on FormatException catch (e) {
+      error(e.message);
+      return false;
+    }
+    if (results[HELP_OPTION]) {
+      _printUsage(parser);
+      return false;
+    }
+    String sdkPath = results[DART_SDK_OPTION];
+    if (sdkPath is! String) {
+      error('Missing path to Dart SDK');
+      return false;
+    }
+    Directory sdkDir = new Directory(sdkPath);
+    if (!sdkDir.existsSync()) {
+      error('Specified Dart SDK does not exist: $sdkPath');
+      return false;
+    }
+    if (results.rest.length == 0) {
+      error('Expected directory to analyze');
+      return false;
+    }
+    appDir = new Directory(results.rest[0]);
+    if (!appDir.existsSync()) {
+      error('Specified application directory does not exist: $appDir');
+      return false;
+    }
+    if (results.rest.length > 1) {
+      error('Unexpected arguments after $appDir');
+      return false;
+    }
+    serverSnapshot = new File(
+        path.join(sdkDir.path, 'bin', 'snapshots', 'analysis_server.dart.snapshot'));
+    if (!serverSnapshot.existsSync()) {
+      error('Analysis Server snapshot not found: $serverSnapshot');
+      return false;
+    }
+    return true;
+  }
+
+  /// Main entry point for launching, testing, and shutting down the server
+  void run(List<String> args) {
+    if (!parseArgs(args)) return;
+    ServerManager.start(serverSnapshot.path).then((ServerManager manager) {
+      runZoned(() {
+        test(manager).then(manager.stop).then((_) {
+          expect(manager.errorOccurred, isFalse);
+          print('Test completed successfully');
+        });
+      }, onError: (error, stack) {
+        stderr.writeln(error);
+        print(stack);
+        exitCode = 12;
+        manager.stop();
+      });
+    });
+  }
+
+  /// Use manager to exercise the analysis server
+  Future test(ServerManager manager) {
+
+    // perform initial analysis
+    return manager.analyze(appDir).then((AnalysisResults analysisResults) {
+      print(
+          'Found ${analysisResults.errorCount} errors,'
+              ' ${analysisResults.warningCount} warnings,'
+              ' and ${analysisResults.hintCount} hints in ${analysisResults.elapsed}');
+
+      // edit a method body
+      return manager.openFileNamed(
+          'domain_completion.dart').then((Editor editor) {
+        return editor.moveAfter('Response processRequest(Request request) {');
+      }).then((Editor editor) {
+        return editor.replace(0, '\nOb');
+      }).then((Editor editor) {
+
+        // request code completion and assert results
+        return editor.getSuggestions().then((List<CompletionResults> list) {
+          expect(list, isNotNull);
+          expect(list.length, equals(0));
+          list.forEach((CompletionResults results) {
+            print('${results.elapsed} received ${results.suggestionCount} suggestions');
+          });
+          return editor;
+        });
+
+      }).then((Editor editor) {
+        print('tests complete');
+      });
+    });
+  }
+
+  void _printAnalysisSummary(AnalysisResults results) {
+    print(
+        'Found ${results.errorCount} errors, ${results.warningCount} warnings,'
+            ' and ${results.hintCount} hints in $results.elapsed');
+  }
+
+  /// Print information about how to use the server.
+  void _printUsage(ArgParser parser) {
+    print('Usage: analyzer [flags] <application_directory>');
+    print('');
+    print('Supported flags are:');
+    print(parser.getUsage());
+  }
+}
diff --git a/pkg/analysis_server/bin/fuzz/README.txt b/pkg/analysis_server/bin/fuzz/README.txt
new file mode 100644
index 0000000..f8d8a44
--- /dev/null
+++ b/pkg/analysis_server/bin/fuzz/README.txt
@@ -0,0 +1,9 @@
+This directory contains code for fuzz testing the analysis server
+and for generating timing information for tracking server performance.
+
+Run:
+Launch fuzz.dart located in the parent directory.
+
+Overview:
+fuzz.dart - main entry point and simple example of exercizing server
+server_manager.dart - provides high level API for launching and driving server
diff --git a/pkg/analysis_server/bin/fuzz/byte_stream_channel.dart b/pkg/analysis_server/bin/fuzz/byte_stream_channel.dart
new file mode 100644
index 0000000..1b62506
--- /dev/null
+++ b/pkg/analysis_server/bin/fuzz/byte_stream_channel.dart
@@ -0,0 +1,137 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library channel.byte_stream;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'channel.dart';
+import 'protocol.dart';
+
+/**
+ * Instances of the class [ByteStreamClientChannel] implement a
+ * [ClientCommunicationChannel] that uses a stream and a sink (typically,
+ * standard input and standard output) to communicate with servers.
+ */
+class ByteStreamClientChannel implements ClientCommunicationChannel {
+  final Stream input;
+  final IOSink output;
+
+  @override
+  Stream<Response> responseStream;
+
+  @override
+  Stream<Notification> notificationStream;
+
+  ByteStreamClientChannel(this.input, this.output) {
+    Stream jsonStream = input.transform((new Utf8Codec()).decoder)
+        .transform(new LineSplitter())
+        .transform(new JsonStreamDecoder())
+        .where((json) => json is Map)
+        .asBroadcastStream();
+    responseStream = jsonStream
+        .where((json) => json[Notification.EVENT] == null)
+        .transform(new ResponseConverter())
+        .asBroadcastStream();
+    notificationStream = jsonStream
+        .where((json) => json[Notification.EVENT] != null)
+        .transform(new NotificationConverter())
+        .asBroadcastStream();
+  }
+
+  @override
+  Future close() {
+    return output.close();
+  }
+
+  @override
+  Future<Response> sendRequest(Request request) {
+    String id = request.id;
+    output.writeln(JSON.encode(request.toJson()));
+    return responseStream.firstWhere((Response response) => response.id == id);
+  }
+}
+
+/**
+ * Instances of the class [ByteStreamServerChannel] implement a
+ * [ServerCommunicationChannel] that uses a stream and a sink (typically,
+ * standard input and standard output) to communicate with clients.
+ */
+class ByteStreamServerChannel implements ServerCommunicationChannel {
+  final Stream input;
+  final IOSink output;
+
+  /**
+   * Completer that will be signalled when the input stream is closed.
+   */
+  final Completer _closed = new Completer();
+
+  ByteStreamServerChannel(this.input, this.output);
+
+  /**
+   * Future that will be completed when the input stream is closed.
+   */
+  Future get closed {
+    return _closed.future;
+  }
+
+  @override
+  void close() {
+    if (!_closed.isCompleted) {
+      _closed.complete();
+    }
+  }
+
+  @override
+  void listen(void onRequest(Request request), {Function onError, void
+      onDone()}) {
+    input.transform((new Utf8Codec()).decoder).transform(new LineSplitter()
+        ).listen((String data) => _readRequest(data, onRequest), onError: onError,
+        onDone: () {
+      close();
+      onDone();
+    });
+  }
+
+  @override
+  void sendNotification(Notification notification) {
+    // Don't send any further notifications after the communication channel is
+    // closed.
+    if (_closed.isCompleted) {
+      return;
+    }
+    output.writeln(JSON.encode(notification.toJson()));
+  }
+
+  @override
+  void sendResponse(Response response) {
+    // Don't send any further responses after the communication channel is
+    // closed.
+    if (_closed.isCompleted) {
+      return;
+    }
+    output.writeln(JSON.encode(response.toJson()));
+  }
+
+  /**
+   * Read a request from the given [data] and use the given function to handle
+   * the request.
+   */
+  void _readRequest(Object data, void onRequest(Request request)) {
+    // Ignore any further requests after the communication channel is closed.
+    if (_closed.isCompleted) {
+      return;
+    }
+    // Parse the string as a JSON descriptor and process the resulting
+    // structure as a request.
+    Request request = new Request.fromString(data);
+    if (request == null) {
+      sendResponse(new Response.invalidRequestFormat());
+      return;
+    }
+    onRequest(request);
+  }
+}
diff --git a/pkg/analysis_server/bin/fuzz/channel.dart b/pkg/analysis_server/bin/fuzz/channel.dart
new file mode 100644
index 0000000..1130ace
--- /dev/null
+++ b/pkg/analysis_server/bin/fuzz/channel.dart
@@ -0,0 +1,151 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library channel;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'protocol.dart';
+
+/**
+ * The abstract class [ClientCommunicationChannel] defines the behavior of
+ * objects that allow a client to send [Request]s to an [AnalysisServer] and to
+ * receive both [Response]s and [Notification]s.
+ */
+abstract class ClientCommunicationChannel {
+  /**
+   * The stream of notifications from the server.
+   */
+  Stream<Notification> notificationStream;
+
+  /**
+   * The stream of responses from the server.
+   */
+  Stream<Response> responseStream;
+
+  /**
+   * Send the given [request] to the server
+   * and return a future with the associated [Response].
+   */
+  Future<Response> sendRequest(Request request);
+
+  /**
+   * Close the channel to the server. Once called, all future communication
+   * with the server via [sendRequest] will silently be ignored.
+   */
+  Future close();
+}
+
+/**
+ * The abstract class [ServerCommunicationChannel] defines the behavior of
+ * objects that allow an [AnalysisServer] to receive [Request]s and to return
+ * both [Response]s and [Notification]s.
+ */
+abstract class ServerCommunicationChannel {
+  /**
+   * Listen to the channel for requests. If a request is received, invoke the
+   * [onRequest] function. If an error is encountered while trying to read from
+   * the socket, invoke the [onError] function. If the socket is closed by the
+   * client, invoke the [onDone] function.
+   * Only one listener is allowed per channel.
+   */
+  void listen(void onRequest(Request request), {Function onError, void onDone()});
+
+  /**
+   * Send the given [notification] to the client.
+   */
+  void sendNotification(Notification notification);
+
+  /**
+   * Send the given [response] to the client.
+   */
+  void sendResponse(Response response);
+
+  /**
+   * Close the communication channel.
+   */
+  void close();
+}
+
+/**
+ * Instances of the class [JsonStreamDecoder] convert JSON strings to JSON
+ * maps.
+ */
+class JsonStreamDecoder extends Converter<String, Map> {
+  @override
+  Map convert(String text) => JSON.decode(text);
+
+  @override
+  ChunkedConversionSink startChunkedConversion(Sink sink) =>
+      new ChannelChunkSink<String, Map>(this, sink);
+}
+
+/**
+ * Instances of the class [ResponseConverter] convert JSON maps to [Response]s.
+ */
+class ResponseConverter extends Converter<Map, Response> {
+  @override
+  Response convert(Map json) => new Response.fromJson(json);
+
+  @override
+  ChunkedConversionSink startChunkedConversion(Sink sink) =>
+      new ChannelChunkSink<Map, Response>(this, sink);
+}
+
+/**
+ * Instances of the class [NotificationConverter] convert JSON maps to
+ * [Notification]s.
+ */
+class NotificationConverter extends Converter<Map, Notification> {
+  @override
+  Notification convert(Map json) => new Notification.fromJson(json);
+
+  @override
+  ChunkedConversionSink startChunkedConversion(Sink sink) =>
+      new ChannelChunkSink<Map, Notification>(this, sink);
+}
+
+/**
+ * Instances of the class [ChannelChunkSink] uses a [Converter] to translate
+ * chunks.
+ */
+class ChannelChunkSink<S, T> extends ChunkedConversionSink<S> {
+  /**
+   * The converter used to translate chunks.
+   */
+  final Converter<S, T> converter;
+
+  /**
+   * The sink to which the converted chunks are added.
+   */
+  final Sink sink;
+
+  /**
+   * A flag indicating whether the sink has been closed.
+   */
+  bool closed = false;
+
+  /**
+   * Initialize a newly create sink to use the given [converter] to convert
+   * chunks before adding them to the given [sink].
+   */
+  ChannelChunkSink(this.converter, this.sink);
+
+  @override
+  void add(S chunk) {
+    if (!closed) {
+      T convertedChunk = converter.convert(chunk);
+      if (convertedChunk != null) {
+        sink.add(convertedChunk);
+      }
+    }
+  }
+
+  @override
+  void close() {
+    closed = true;
+    sink.close();
+  }
+}
diff --git a/pkg/analysis_server/bin/fuzz/generated_protocol.dart b/pkg/analysis_server/bin/fuzz/generated_protocol.dart
new file mode 100644
index 0000000..21bc896
--- /dev/null
+++ b/pkg/analysis_server/bin/fuzz/generated_protocol.dart
@@ -0,0 +1,10023 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// This file has been automatically generated.  Please do not edit it manually.
+// To regenerate the file, use the script
+// "pkg/analysis_server/tool/spec/generate_files".
+
+part of protocol;
+/**
+ * server.getVersion params
+ */
+class ServerGetVersionParams {
+  Request toRequest(String id) {
+    return new Request(id, "server.getVersion", null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is ServerGetVersionParams) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 55877452;
+  }
+}
+
+/**
+ * server.getVersion result
+ *
+ * {
+ *   "version": String
+ * }
+ */
+class ServerGetVersionResult implements HasToJson {
+  /**
+   * The version number of the analysis server.
+   */
+  String version;
+
+  ServerGetVersionResult(this.version);
+
+  factory ServerGetVersionResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String version;
+      if (json.containsKey("version")) {
+        version = jsonDecoder._decodeString(jsonPath + ".version", json["version"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "version");
+      }
+      return new ServerGetVersionResult(version);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "server.getVersion result");
+    }
+  }
+
+  factory ServerGetVersionResult.fromResponse(Response response) {
+    return new ServerGetVersionResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["version"] = version;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ServerGetVersionResult) {
+      return version == other.version;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, version.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * server.shutdown params
+ */
+class ServerShutdownParams {
+  Request toRequest(String id) {
+    return new Request(id, "server.shutdown", null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is ServerShutdownParams) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 366630911;
+  }
+}
+/**
+ * server.shutdown result
+ */
+class ServerShutdownResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is ServerShutdownResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 193626532;
+  }
+}
+
+/**
+ * server.setSubscriptions params
+ *
+ * {
+ *   "subscriptions": List<ServerService>
+ * }
+ */
+class ServerSetSubscriptionsParams implements HasToJson {
+  /**
+   * A list of the services being subscribed to.
+   */
+  List<ServerService> subscriptions;
+
+  ServerSetSubscriptionsParams(this.subscriptions);
+
+  factory ServerSetSubscriptionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<ServerService> subscriptions;
+      if (json.containsKey("subscriptions")) {
+        subscriptions = jsonDecoder._decodeList(jsonPath + ".subscriptions", json["subscriptions"], (String jsonPath, Object json) => new ServerService.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "subscriptions");
+      }
+      return new ServerSetSubscriptionsParams(subscriptions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "server.setSubscriptions params");
+    }
+  }
+
+  factory ServerSetSubscriptionsParams.fromRequest(Request request) {
+    return new ServerSetSubscriptionsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["subscriptions"] = subscriptions.map((ServerService value) => value.toJson()).toList();
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "server.setSubscriptions", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ServerSetSubscriptionsParams) {
+      return _listEqual(subscriptions, other.subscriptions, (ServerService a, ServerService b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, subscriptions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * server.setSubscriptions result
+ */
+class ServerSetSubscriptionsResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is ServerSetSubscriptionsResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 748820900;
+  }
+}
+/**
+ * server.connected params
+ */
+class ServerConnectedParams {
+  Notification toNotification() {
+    return new Notification("server.connected", null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is ServerConnectedParams) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 509239412;
+  }
+}
+
+/**
+ * server.error params
+ *
+ * {
+ *   "isFatal": bool
+ *   "message": String
+ *   "stackTrace": String
+ * }
+ */
+class ServerErrorParams implements HasToJson {
+  /**
+   * True if the error is a fatal error, meaning that the server will shutdown
+   * automatically after sending this notification.
+   */
+  bool isFatal;
+
+  /**
+   * The error message indicating what kind of error was encountered.
+   */
+  String message;
+
+  /**
+   * The stack trace associated with the generation of the error, used for
+   * debugging the server.
+   */
+  String stackTrace;
+
+  ServerErrorParams(this.isFatal, this.message, this.stackTrace);
+
+  factory ServerErrorParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      bool isFatal;
+      if (json.containsKey("isFatal")) {
+        isFatal = jsonDecoder._decodeBool(jsonPath + ".isFatal", json["isFatal"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isFatal");
+      }
+      String message;
+      if (json.containsKey("message")) {
+        message = jsonDecoder._decodeString(jsonPath + ".message", json["message"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "message");
+      }
+      String stackTrace;
+      if (json.containsKey("stackTrace")) {
+        stackTrace = jsonDecoder._decodeString(jsonPath + ".stackTrace", json["stackTrace"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "stackTrace");
+      }
+      return new ServerErrorParams(isFatal, message, stackTrace);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "server.error params");
+    }
+  }
+
+  factory ServerErrorParams.fromNotification(Notification notification) {
+    return new ServerErrorParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["isFatal"] = isFatal;
+    result["message"] = message;
+    result["stackTrace"] = stackTrace;
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("server.error", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ServerErrorParams) {
+      return isFatal == other.isFatal &&
+          message == other.message &&
+          stackTrace == other.stackTrace;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, isFatal.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, stackTrace.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * server.status params
+ *
+ * {
+ *   "analysis": optional AnalysisStatus
+ * }
+ */
+class ServerStatusParams implements HasToJson {
+  /**
+   * The current status of analysis, including whether analysis is being
+   * performed and if so what is being analyzed.
+   */
+  AnalysisStatus analysis;
+
+  ServerStatusParams({this.analysis});
+
+  factory ServerStatusParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      AnalysisStatus analysis;
+      if (json.containsKey("analysis")) {
+        analysis = new AnalysisStatus.fromJson(jsonDecoder, jsonPath + ".analysis", json["analysis"]);
+      }
+      return new ServerStatusParams(analysis: analysis);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "server.status params");
+    }
+  }
+
+  factory ServerStatusParams.fromNotification(Notification notification) {
+    return new ServerStatusParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (analysis != null) {
+      result["analysis"] = analysis.toJson();
+    }
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("server.status", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ServerStatusParams) {
+      return analysis == other.analysis;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, analysis.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.getErrors params
+ *
+ * {
+ *   "file": FilePath
+ * }
+ */
+class AnalysisGetErrorsParams implements HasToJson {
+  /**
+   * The file for which errors are being requested.
+   */
+  String file;
+
+  AnalysisGetErrorsParams(this.file);
+
+  factory AnalysisGetErrorsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      return new AnalysisGetErrorsParams(file);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.getErrors params");
+    }
+  }
+
+  factory AnalysisGetErrorsParams.fromRequest(Request request) {
+    return new AnalysisGetErrorsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.getErrors", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisGetErrorsParams) {
+      return file == other.file;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.getErrors result
+ *
+ * {
+ *   "errors": List<AnalysisError>
+ * }
+ */
+class AnalysisGetErrorsResult implements HasToJson {
+  /**
+   * The errors associated with the file.
+   */
+  List<AnalysisError> errors;
+
+  AnalysisGetErrorsResult(this.errors);
+
+  factory AnalysisGetErrorsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<AnalysisError> errors;
+      if (json.containsKey("errors")) {
+        errors = jsonDecoder._decodeList(jsonPath + ".errors", json["errors"], (String jsonPath, Object json) => new AnalysisError.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "errors");
+      }
+      return new AnalysisGetErrorsResult(errors);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.getErrors result");
+    }
+  }
+
+  factory AnalysisGetErrorsResult.fromResponse(Response response) {
+    return new AnalysisGetErrorsResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["errors"] = errors.map((AnalysisError value) => value.toJson()).toList();
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisGetErrorsResult) {
+      return _listEqual(errors, other.errors, (AnalysisError a, AnalysisError b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, errors.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.getHover params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ * }
+ */
+class AnalysisGetHoverParams implements HasToJson {
+  /**
+   * The file in which hover information is being requested.
+   */
+  String file;
+
+  /**
+   * The offset for which hover information is being requested.
+   */
+  int offset;
+
+  AnalysisGetHoverParams(this.file, this.offset);
+
+  factory AnalysisGetHoverParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      return new AnalysisGetHoverParams(file, offset);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.getHover params");
+    }
+  }
+
+  factory AnalysisGetHoverParams.fromRequest(Request request) {
+    return new AnalysisGetHoverParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.getHover", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisGetHoverParams) {
+      return file == other.file &&
+          offset == other.offset;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.getHover result
+ *
+ * {
+ *   "hovers": List<HoverInformation>
+ * }
+ */
+class AnalysisGetHoverResult implements HasToJson {
+  /**
+   * The hover information associated with the location. The list will be empty
+   * if no information could be determined for the location. The list can
+   * contain multiple items if the file is being analyzed in multiple contexts
+   * in conflicting ways (such as a part that is included in multiple
+   * libraries).
+   */
+  List<HoverInformation> hovers;
+
+  AnalysisGetHoverResult(this.hovers);
+
+  factory AnalysisGetHoverResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<HoverInformation> hovers;
+      if (json.containsKey("hovers")) {
+        hovers = jsonDecoder._decodeList(jsonPath + ".hovers", json["hovers"], (String jsonPath, Object json) => new HoverInformation.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "hovers");
+      }
+      return new AnalysisGetHoverResult(hovers);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.getHover result");
+    }
+  }
+
+  factory AnalysisGetHoverResult.fromResponse(Response response) {
+    return new AnalysisGetHoverResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["hovers"] = hovers.map((HoverInformation value) => value.toJson()).toList();
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisGetHoverResult) {
+      return _listEqual(hovers, other.hovers, (HoverInformation a, HoverInformation b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, hovers.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * analysis.reanalyze params
+ */
+class AnalysisReanalyzeParams {
+  Request toRequest(String id) {
+    return new Request(id, "analysis.reanalyze", null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisReanalyzeParams) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 613039876;
+  }
+}
+/**
+ * analysis.reanalyze result
+ */
+class AnalysisReanalyzeResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisReanalyzeResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 846803925;
+  }
+}
+
+/**
+ * analysis.setAnalysisRoots params
+ *
+ * {
+ *   "included": List<FilePath>
+ *   "excluded": List<FilePath>
+ * }
+ */
+class AnalysisSetAnalysisRootsParams implements HasToJson {
+  /**
+   * A list of the files and directories that should be analyzed.
+   */
+  List<String> included;
+
+  /**
+   * A list of the files and directories within the included directories that
+   * should not be analyzed.
+   */
+  List<String> excluded;
+
+  AnalysisSetAnalysisRootsParams(this.included, this.excluded);
+
+  factory AnalysisSetAnalysisRootsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<String> included;
+      if (json.containsKey("included")) {
+        included = jsonDecoder._decodeList(jsonPath + ".included", json["included"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "included");
+      }
+      List<String> excluded;
+      if (json.containsKey("excluded")) {
+        excluded = jsonDecoder._decodeList(jsonPath + ".excluded", json["excluded"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "excluded");
+      }
+      return new AnalysisSetAnalysisRootsParams(included, excluded);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.setAnalysisRoots params");
+    }
+  }
+
+  factory AnalysisSetAnalysisRootsParams.fromRequest(Request request) {
+    return new AnalysisSetAnalysisRootsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["included"] = included;
+    result["excluded"] = excluded;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.setAnalysisRoots", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisSetAnalysisRootsParams) {
+      return _listEqual(included, other.included, (String a, String b) => a == b) &&
+          _listEqual(excluded, other.excluded, (String a, String b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, included.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, excluded.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * analysis.setAnalysisRoots result
+ */
+class AnalysisSetAnalysisRootsResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisSetAnalysisRootsResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 866004753;
+  }
+}
+
+/**
+ * analysis.setPriorityFiles params
+ *
+ * {
+ *   "files": List<FilePath>
+ * }
+ */
+class AnalysisSetPriorityFilesParams implements HasToJson {
+  /**
+   * The files that are to be a priority for analysis.
+   */
+  List<String> files;
+
+  AnalysisSetPriorityFilesParams(this.files);
+
+  factory AnalysisSetPriorityFilesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<String> files;
+      if (json.containsKey("files")) {
+        files = jsonDecoder._decodeList(jsonPath + ".files", json["files"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "files");
+      }
+      return new AnalysisSetPriorityFilesParams(files);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.setPriorityFiles params");
+    }
+  }
+
+  factory AnalysisSetPriorityFilesParams.fromRequest(Request request) {
+    return new AnalysisSetPriorityFilesParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["files"] = files;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.setPriorityFiles", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisSetPriorityFilesParams) {
+      return _listEqual(files, other.files, (String a, String b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, files.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * analysis.setPriorityFiles result
+ */
+class AnalysisSetPriorityFilesResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisSetPriorityFilesResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 330050055;
+  }
+}
+
+/**
+ * analysis.setSubscriptions params
+ *
+ * {
+ *   "subscriptions": Map<AnalysisService, List<FilePath>>
+ * }
+ */
+class AnalysisSetSubscriptionsParams implements HasToJson {
+  /**
+   * A table mapping services to a list of the files being subscribed to the
+   * service.
+   */
+  Map<AnalysisService, List<String>> subscriptions;
+
+  AnalysisSetSubscriptionsParams(this.subscriptions);
+
+  factory AnalysisSetSubscriptionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Map<AnalysisService, List<String>> subscriptions;
+      if (json.containsKey("subscriptions")) {
+        subscriptions = jsonDecoder._decodeMap(jsonPath + ".subscriptions", json["subscriptions"], keyDecoder: (String jsonPath, Object json) => new AnalysisService.fromJson(jsonDecoder, jsonPath, json), valueDecoder: (String jsonPath, Object json) => jsonDecoder._decodeList(jsonPath, json, jsonDecoder._decodeString));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "subscriptions");
+      }
+      return new AnalysisSetSubscriptionsParams(subscriptions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.setSubscriptions params");
+    }
+  }
+
+  factory AnalysisSetSubscriptionsParams.fromRequest(Request request) {
+    return new AnalysisSetSubscriptionsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["subscriptions"] = mapMap(subscriptions, keyCallback: (AnalysisService value) => value.toJson());
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.setSubscriptions", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisSetSubscriptionsParams) {
+      return _mapEqual(subscriptions, other.subscriptions, (List<String> a, List<String> b) => _listEqual(a, b, (String a, String b) => a == b));
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, subscriptions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * analysis.setSubscriptions result
+ */
+class AnalysisSetSubscriptionsResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisSetSubscriptionsResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 218088493;
+  }
+}
+
+/**
+ * analysis.updateContent params
+ *
+ * {
+ *   "files": Map<FilePath, AddContentOverlay | ChangeContentOverlay | RemoveContentOverlay>
+ * }
+ */
+class AnalysisUpdateContentParams implements HasToJson {
+  /**
+   * A table mapping the files whose content has changed to a description of
+   * the content change.
+   */
+  Map<String, dynamic> files;
+
+  AnalysisUpdateContentParams(this.files);
+
+  factory AnalysisUpdateContentParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Map<String, dynamic> files;
+      if (json.containsKey("files")) {
+        files = jsonDecoder._decodeMap(jsonPath + ".files", json["files"], valueDecoder: (String jsonPath, Object json) => jsonDecoder._decodeUnion(jsonPath, json, "type", {"add": (String jsonPath, Object json) => new AddContentOverlay.fromJson(jsonDecoder, jsonPath, json), "change": (String jsonPath, Object json) => new ChangeContentOverlay.fromJson(jsonDecoder, jsonPath, json), "remove": (String jsonPath, Object json) => new RemoveContentOverlay.fromJson(jsonDecoder, jsonPath, json)}));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "files");
+      }
+      return new AnalysisUpdateContentParams(files);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.updateContent params");
+    }
+  }
+
+  factory AnalysisUpdateContentParams.fromRequest(Request request) {
+    return new AnalysisUpdateContentParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["files"] = mapMap(files, valueCallback: (dynamic value) => value.toJson());
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.updateContent", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisUpdateContentParams) {
+      return _mapEqual(files, other.files, (dynamic a, dynamic b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, files.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * analysis.updateContent result
+ */
+class AnalysisUpdateContentResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisUpdateContentResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 468798730;
+  }
+}
+
+/**
+ * analysis.updateOptions params
+ *
+ * {
+ *   "options": AnalysisOptions
+ * }
+ */
+class AnalysisUpdateOptionsParams implements HasToJson {
+  /**
+   * The options that are to be used to control analysis.
+   */
+  AnalysisOptions options;
+
+  AnalysisUpdateOptionsParams(this.options);
+
+  factory AnalysisUpdateOptionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      AnalysisOptions options;
+      if (json.containsKey("options")) {
+        options = new AnalysisOptions.fromJson(jsonDecoder, jsonPath + ".options", json["options"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "options");
+      }
+      return new AnalysisUpdateOptionsParams(options);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.updateOptions params");
+    }
+  }
+
+  factory AnalysisUpdateOptionsParams.fromRequest(Request request) {
+    return new AnalysisUpdateOptionsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["options"] = options.toJson();
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "analysis.updateOptions", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisUpdateOptionsParams) {
+      return options == other.options;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, options.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * analysis.updateOptions result
+ */
+class AnalysisUpdateOptionsResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisUpdateOptionsResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 179689467;
+  }
+}
+
+/**
+ * analysis.errors params
+ *
+ * {
+ *   "file": FilePath
+ *   "errors": List<AnalysisError>
+ * }
+ */
+class AnalysisErrorsParams implements HasToJson {
+  /**
+   * The file containing the errors.
+   */
+  String file;
+
+  /**
+   * The errors contained in the file.
+   */
+  List<AnalysisError> errors;
+
+  AnalysisErrorsParams(this.file, this.errors);
+
+  factory AnalysisErrorsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<AnalysisError> errors;
+      if (json.containsKey("errors")) {
+        errors = jsonDecoder._decodeList(jsonPath + ".errors", json["errors"], (String jsonPath, Object json) => new AnalysisError.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "errors");
+      }
+      return new AnalysisErrorsParams(file, errors);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.errors params");
+    }
+  }
+
+  factory AnalysisErrorsParams.fromNotification(Notification notification) {
+    return new AnalysisErrorsParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["errors"] = errors.map((AnalysisError value) => value.toJson()).toList();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.errors", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisErrorsParams) {
+      return file == other.file &&
+          _listEqual(errors, other.errors, (AnalysisError a, AnalysisError b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, errors.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.flushResults params
+ *
+ * {
+ *   "files": List<FilePath>
+ * }
+ */
+class AnalysisFlushResultsParams implements HasToJson {
+  /**
+   * The files that are no longer being analyzed.
+   */
+  List<String> files;
+
+  AnalysisFlushResultsParams(this.files);
+
+  factory AnalysisFlushResultsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<String> files;
+      if (json.containsKey("files")) {
+        files = jsonDecoder._decodeList(jsonPath + ".files", json["files"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "files");
+      }
+      return new AnalysisFlushResultsParams(files);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.flushResults params");
+    }
+  }
+
+  factory AnalysisFlushResultsParams.fromNotification(Notification notification) {
+    return new AnalysisFlushResultsParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["files"] = files;
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.flushResults", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisFlushResultsParams) {
+      return _listEqual(files, other.files, (String a, String b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, files.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.folding params
+ *
+ * {
+ *   "file": FilePath
+ *   "regions": List<FoldingRegion>
+ * }
+ */
+class AnalysisFoldingParams implements HasToJson {
+  /**
+   * The file containing the folding regions.
+   */
+  String file;
+
+  /**
+   * The folding regions contained in the file.
+   */
+  List<FoldingRegion> regions;
+
+  AnalysisFoldingParams(this.file, this.regions);
+
+  factory AnalysisFoldingParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<FoldingRegion> regions;
+      if (json.containsKey("regions")) {
+        regions = jsonDecoder._decodeList(jsonPath + ".regions", json["regions"], (String jsonPath, Object json) => new FoldingRegion.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "regions");
+      }
+      return new AnalysisFoldingParams(file, regions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.folding params");
+    }
+  }
+
+  factory AnalysisFoldingParams.fromNotification(Notification notification) {
+    return new AnalysisFoldingParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["regions"] = regions.map((FoldingRegion value) => value.toJson()).toList();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.folding", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisFoldingParams) {
+      return file == other.file &&
+          _listEqual(regions, other.regions, (FoldingRegion a, FoldingRegion b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, regions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.highlights params
+ *
+ * {
+ *   "file": FilePath
+ *   "regions": List<HighlightRegion>
+ * }
+ */
+class AnalysisHighlightsParams implements HasToJson {
+  /**
+   * The file containing the highlight regions.
+   */
+  String file;
+
+  /**
+   * The highlight regions contained in the file. Each highlight region
+   * represents a particular syntactic or semantic meaning associated with some
+   * range. Note that the highlight regions that are returned can overlap other
+   * highlight regions if there is more than one meaning associated with a
+   * particular region.
+   */
+  List<HighlightRegion> regions;
+
+  AnalysisHighlightsParams(this.file, this.regions);
+
+  factory AnalysisHighlightsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<HighlightRegion> regions;
+      if (json.containsKey("regions")) {
+        regions = jsonDecoder._decodeList(jsonPath + ".regions", json["regions"], (String jsonPath, Object json) => new HighlightRegion.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "regions");
+      }
+      return new AnalysisHighlightsParams(file, regions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.highlights params");
+    }
+  }
+
+  factory AnalysisHighlightsParams.fromNotification(Notification notification) {
+    return new AnalysisHighlightsParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["regions"] = regions.map((HighlightRegion value) => value.toJson()).toList();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.highlights", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisHighlightsParams) {
+      return file == other.file &&
+          _listEqual(regions, other.regions, (HighlightRegion a, HighlightRegion b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, regions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.navigation params
+ *
+ * {
+ *   "file": FilePath
+ *   "regions": List<NavigationRegion>
+ * }
+ */
+class AnalysisNavigationParams implements HasToJson {
+  /**
+   * The file containing the navigation regions.
+   */
+  String file;
+
+  /**
+   * The navigation regions contained in the file. Each navigation region
+   * represents a list of targets associated with some range. The lists will
+   * usually contain a single target, but can contain more in the case of a
+   * part that is included in multiple libraries or in Dart code that is
+   * compiled against multiple versions of a package. Note that the navigation
+   * regions that are returned do not overlap other navigation regions.
+   */
+  List<NavigationRegion> regions;
+
+  AnalysisNavigationParams(this.file, this.regions);
+
+  factory AnalysisNavigationParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<NavigationRegion> regions;
+      if (json.containsKey("regions")) {
+        regions = jsonDecoder._decodeList(jsonPath + ".regions", json["regions"], (String jsonPath, Object json) => new NavigationRegion.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "regions");
+      }
+      return new AnalysisNavigationParams(file, regions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.navigation params");
+    }
+  }
+
+  factory AnalysisNavigationParams.fromNotification(Notification notification) {
+    return new AnalysisNavigationParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["regions"] = regions.map((NavigationRegion value) => value.toJson()).toList();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.navigation", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisNavigationParams) {
+      return file == other.file &&
+          _listEqual(regions, other.regions, (NavigationRegion a, NavigationRegion b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, regions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.occurrences params
+ *
+ * {
+ *   "file": FilePath
+ *   "occurrences": List<Occurrences>
+ * }
+ */
+class AnalysisOccurrencesParams implements HasToJson {
+  /**
+   * The file in which the references occur.
+   */
+  String file;
+
+  /**
+   * The occurrences of references to elements within the file.
+   */
+  List<Occurrences> occurrences;
+
+  AnalysisOccurrencesParams(this.file, this.occurrences);
+
+  factory AnalysisOccurrencesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<Occurrences> occurrences;
+      if (json.containsKey("occurrences")) {
+        occurrences = jsonDecoder._decodeList(jsonPath + ".occurrences", json["occurrences"], (String jsonPath, Object json) => new Occurrences.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "occurrences");
+      }
+      return new AnalysisOccurrencesParams(file, occurrences);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.occurrences params");
+    }
+  }
+
+  factory AnalysisOccurrencesParams.fromNotification(Notification notification) {
+    return new AnalysisOccurrencesParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["occurrences"] = occurrences.map((Occurrences value) => value.toJson()).toList();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.occurrences", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisOccurrencesParams) {
+      return file == other.file &&
+          _listEqual(occurrences, other.occurrences, (Occurrences a, Occurrences b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, occurrences.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.outline params
+ *
+ * {
+ *   "file": FilePath
+ *   "outline": Outline
+ * }
+ */
+class AnalysisOutlineParams implements HasToJson {
+  /**
+   * The file with which the outline is associated.
+   */
+  String file;
+
+  /**
+   * The outline associated with the file.
+   */
+  Outline outline;
+
+  AnalysisOutlineParams(this.file, this.outline);
+
+  factory AnalysisOutlineParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      Outline outline;
+      if (json.containsKey("outline")) {
+        outline = new Outline.fromJson(jsonDecoder, jsonPath + ".outline", json["outline"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "outline");
+      }
+      return new AnalysisOutlineParams(file, outline);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.outline params");
+    }
+  }
+
+  factory AnalysisOutlineParams.fromNotification(Notification notification) {
+    return new AnalysisOutlineParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["outline"] = outline.toJson();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.outline", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisOutlineParams) {
+      return file == other.file &&
+          outline == other.outline;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, outline.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * analysis.overrides params
+ *
+ * {
+ *   "file": FilePath
+ *   "overrides": List<Override>
+ * }
+ */
+class AnalysisOverridesParams implements HasToJson {
+  /**
+   * The file with which the overrides are associated.
+   */
+  String file;
+
+  /**
+   * The overrides associated with the file.
+   */
+  List<Override> overrides;
+
+  AnalysisOverridesParams(this.file, this.overrides);
+
+  factory AnalysisOverridesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      List<Override> overrides;
+      if (json.containsKey("overrides")) {
+        overrides = jsonDecoder._decodeList(jsonPath + ".overrides", json["overrides"], (String jsonPath, Object json) => new Override.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "overrides");
+      }
+      return new AnalysisOverridesParams(file, overrides);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.overrides params");
+    }
+  }
+
+  factory AnalysisOverridesParams.fromNotification(Notification notification) {
+    return new AnalysisOverridesParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["overrides"] = overrides.map((Override value) => value.toJson()).toList();
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.overrides", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisOverridesParams) {
+      return file == other.file &&
+          _listEqual(overrides, other.overrides, (Override a, Override b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, overrides.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * completion.getSuggestions params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ * }
+ */
+class CompletionGetSuggestionsParams implements HasToJson {
+  /**
+   * The file containing the point at which suggestions are to be made.
+   */
+  String file;
+
+  /**
+   * The offset within the file at which suggestions are to be made.
+   */
+  int offset;
+
+  CompletionGetSuggestionsParams(this.file, this.offset);
+
+  factory CompletionGetSuggestionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      return new CompletionGetSuggestionsParams(file, offset);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "completion.getSuggestions params");
+    }
+  }
+
+  factory CompletionGetSuggestionsParams.fromRequest(Request request) {
+    return new CompletionGetSuggestionsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "completion.getSuggestions", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is CompletionGetSuggestionsParams) {
+      return file == other.file &&
+          offset == other.offset;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * completion.getSuggestions result
+ *
+ * {
+ *   "id": CompletionId
+ * }
+ */
+class CompletionGetSuggestionsResult implements HasToJson {
+  /**
+   * The identifier used to associate results with this completion request.
+   */
+  String id;
+
+  CompletionGetSuggestionsResult(this.id);
+
+  factory CompletionGetSuggestionsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      return new CompletionGetSuggestionsResult(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "completion.getSuggestions result");
+    }
+  }
+
+  factory CompletionGetSuggestionsResult.fromResponse(Response response) {
+    return new CompletionGetSuggestionsResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is CompletionGetSuggestionsResult) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * completion.results params
+ *
+ * {
+ *   "id": CompletionId
+ *   "replacementOffset": int
+ *   "replacementLength": int
+ *   "results": List<CompletionSuggestion>
+ *   "isLast": bool
+ * }
+ */
+class CompletionResultsParams implements HasToJson {
+  /**
+   * The id associated with the completion.
+   */
+  String id;
+
+  /**
+   * The offset of the start of the text to be replaced. This will be different
+   * than the offset used to request the completion suggestions if there was a
+   * portion of an identifier before the original offset. In particular, the
+   * replacementOffset will be the offset of the beginning of said identifier.
+   */
+  int replacementOffset;
+
+  /**
+   * The length of the text to be replaced if the remainder of the identifier
+   * containing the cursor is to be replaced when the suggestion is applied
+   * (that is, the number of characters in the existing identifier).
+   */
+  int replacementLength;
+
+  /**
+   * The completion suggestions being reported. The notification contains all
+   * possible completions at the requested cursor position, even those that do
+   * not match the characters the user has already typed. This allows the
+   * client to respond to further keystrokes from the user without having to
+   * make additional requests.
+   */
+  List<CompletionSuggestion> results;
+
+  /**
+   * True if this is that last set of results that will be returned for the
+   * indicated completion.
+   */
+  bool isLast;
+
+  CompletionResultsParams(this.id, this.replacementOffset, this.replacementLength, this.results, this.isLast);
+
+  factory CompletionResultsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      int replacementOffset;
+      if (json.containsKey("replacementOffset")) {
+        replacementOffset = jsonDecoder._decodeInt(jsonPath + ".replacementOffset", json["replacementOffset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "replacementOffset");
+      }
+      int replacementLength;
+      if (json.containsKey("replacementLength")) {
+        replacementLength = jsonDecoder._decodeInt(jsonPath + ".replacementLength", json["replacementLength"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "replacementLength");
+      }
+      List<CompletionSuggestion> results;
+      if (json.containsKey("results")) {
+        results = jsonDecoder._decodeList(jsonPath + ".results", json["results"], (String jsonPath, Object json) => new CompletionSuggestion.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "results");
+      }
+      bool isLast;
+      if (json.containsKey("isLast")) {
+        isLast = jsonDecoder._decodeBool(jsonPath + ".isLast", json["isLast"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isLast");
+      }
+      return new CompletionResultsParams(id, replacementOffset, replacementLength, results, isLast);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "completion.results params");
+    }
+  }
+
+  factory CompletionResultsParams.fromNotification(Notification notification) {
+    return new CompletionResultsParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    result["replacementOffset"] = replacementOffset;
+    result["replacementLength"] = replacementLength;
+    result["results"] = results.map((CompletionSuggestion value) => value.toJson()).toList();
+    result["isLast"] = isLast;
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("completion.results", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is CompletionResultsParams) {
+      return id == other.id &&
+          replacementOffset == other.replacementOffset &&
+          replacementLength == other.replacementLength &&
+          _listEqual(results, other.results, (CompletionSuggestion a, CompletionSuggestion b) => a == b) &&
+          isLast == other.isLast;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, replacementOffset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, replacementLength.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, results.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, isLast.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findElementReferences params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ *   "includePotential": bool
+ * }
+ */
+class SearchFindElementReferencesParams implements HasToJson {
+  /**
+   * The file containing the declaration of or reference to the element used to
+   * define the search.
+   */
+  String file;
+
+  /**
+   * The offset within the file of the declaration of or reference to the
+   * element.
+   */
+  int offset;
+
+  /**
+   * True if potential matches are to be included in the results.
+   */
+  bool includePotential;
+
+  SearchFindElementReferencesParams(this.file, this.offset, this.includePotential);
+
+  factory SearchFindElementReferencesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      bool includePotential;
+      if (json.containsKey("includePotential")) {
+        includePotential = jsonDecoder._decodeBool(jsonPath + ".includePotential", json["includePotential"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "includePotential");
+      }
+      return new SearchFindElementReferencesParams(file, offset, includePotential);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findElementReferences params");
+    }
+  }
+
+  factory SearchFindElementReferencesParams.fromRequest(Request request) {
+    return new SearchFindElementReferencesParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    result["includePotential"] = includePotential;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "search.findElementReferences", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindElementReferencesParams) {
+      return file == other.file &&
+          offset == other.offset &&
+          includePotential == other.includePotential;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, includePotential.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findElementReferences result
+ *
+ * {
+ *   "id": optional SearchId
+ *   "element": optional Element
+ * }
+ */
+class SearchFindElementReferencesResult implements HasToJson {
+  /**
+   * The identifier used to associate results with this search request.
+   *
+   * If no element was found at the given location, this field will be absent,
+   * and no results will be reported via the search.results notification.
+   */
+  String id;
+
+  /**
+   * The element referenced or defined at the given offset and whose references
+   * will be returned in the search results.
+   *
+   * If no element was found at the given location, this field will be absent.
+   */
+  Element element;
+
+  SearchFindElementReferencesResult({this.id, this.element});
+
+  factory SearchFindElementReferencesResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      }
+      Element element;
+      if (json.containsKey("element")) {
+        element = new Element.fromJson(jsonDecoder, jsonPath + ".element", json["element"]);
+      }
+      return new SearchFindElementReferencesResult(id: id, element: element);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findElementReferences result");
+    }
+  }
+
+  factory SearchFindElementReferencesResult.fromResponse(Response response) {
+    return new SearchFindElementReferencesResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (id != null) {
+      result["id"] = id;
+    }
+    if (element != null) {
+      result["element"] = element.toJson();
+    }
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindElementReferencesResult) {
+      return id == other.id &&
+          element == other.element;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, element.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findMemberDeclarations params
+ *
+ * {
+ *   "name": String
+ * }
+ */
+class SearchFindMemberDeclarationsParams implements HasToJson {
+  /**
+   * The name of the declarations to be found.
+   */
+  String name;
+
+  SearchFindMemberDeclarationsParams(this.name);
+
+  factory SearchFindMemberDeclarationsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      return new SearchFindMemberDeclarationsParams(name);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findMemberDeclarations params");
+    }
+  }
+
+  factory SearchFindMemberDeclarationsParams.fromRequest(Request request) {
+    return new SearchFindMemberDeclarationsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["name"] = name;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "search.findMemberDeclarations", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindMemberDeclarationsParams) {
+      return name == other.name;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findMemberDeclarations result
+ *
+ * {
+ *   "id": SearchId
+ * }
+ */
+class SearchFindMemberDeclarationsResult implements HasToJson {
+  /**
+   * The identifier used to associate results with this search request.
+   */
+  String id;
+
+  SearchFindMemberDeclarationsResult(this.id);
+
+  factory SearchFindMemberDeclarationsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      return new SearchFindMemberDeclarationsResult(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findMemberDeclarations result");
+    }
+  }
+
+  factory SearchFindMemberDeclarationsResult.fromResponse(Response response) {
+    return new SearchFindMemberDeclarationsResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindMemberDeclarationsResult) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findMemberReferences params
+ *
+ * {
+ *   "name": String
+ * }
+ */
+class SearchFindMemberReferencesParams implements HasToJson {
+  /**
+   * The name of the references to be found.
+   */
+  String name;
+
+  SearchFindMemberReferencesParams(this.name);
+
+  factory SearchFindMemberReferencesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      return new SearchFindMemberReferencesParams(name);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findMemberReferences params");
+    }
+  }
+
+  factory SearchFindMemberReferencesParams.fromRequest(Request request) {
+    return new SearchFindMemberReferencesParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["name"] = name;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "search.findMemberReferences", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindMemberReferencesParams) {
+      return name == other.name;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findMemberReferences result
+ *
+ * {
+ *   "id": SearchId
+ * }
+ */
+class SearchFindMemberReferencesResult implements HasToJson {
+  /**
+   * The identifier used to associate results with this search request.
+   */
+  String id;
+
+  SearchFindMemberReferencesResult(this.id);
+
+  factory SearchFindMemberReferencesResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      return new SearchFindMemberReferencesResult(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findMemberReferences result");
+    }
+  }
+
+  factory SearchFindMemberReferencesResult.fromResponse(Response response) {
+    return new SearchFindMemberReferencesResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindMemberReferencesResult) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findTopLevelDeclarations params
+ *
+ * {
+ *   "pattern": String
+ * }
+ */
+class SearchFindTopLevelDeclarationsParams implements HasToJson {
+  /**
+   * The regular expression used to match the names of the declarations to be
+   * found.
+   */
+  String pattern;
+
+  SearchFindTopLevelDeclarationsParams(this.pattern);
+
+  factory SearchFindTopLevelDeclarationsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String pattern;
+      if (json.containsKey("pattern")) {
+        pattern = jsonDecoder._decodeString(jsonPath + ".pattern", json["pattern"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "pattern");
+      }
+      return new SearchFindTopLevelDeclarationsParams(pattern);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findTopLevelDeclarations params");
+    }
+  }
+
+  factory SearchFindTopLevelDeclarationsParams.fromRequest(Request request) {
+    return new SearchFindTopLevelDeclarationsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["pattern"] = pattern;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "search.findTopLevelDeclarations", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindTopLevelDeclarationsParams) {
+      return pattern == other.pattern;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, pattern.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.findTopLevelDeclarations result
+ *
+ * {
+ *   "id": SearchId
+ * }
+ */
+class SearchFindTopLevelDeclarationsResult implements HasToJson {
+  /**
+   * The identifier used to associate results with this search request.
+   */
+  String id;
+
+  SearchFindTopLevelDeclarationsResult(this.id);
+
+  factory SearchFindTopLevelDeclarationsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      return new SearchFindTopLevelDeclarationsResult(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.findTopLevelDeclarations result");
+    }
+  }
+
+  factory SearchFindTopLevelDeclarationsResult.fromResponse(Response response) {
+    return new SearchFindTopLevelDeclarationsResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchFindTopLevelDeclarationsResult) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.getTypeHierarchy params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ * }
+ */
+class SearchGetTypeHierarchyParams implements HasToJson {
+  /**
+   * The file containing the declaration or reference to the type for which a
+   * hierarchy is being requested.
+   */
+  String file;
+
+  /**
+   * The offset of the name of the type within the file.
+   */
+  int offset;
+
+  SearchGetTypeHierarchyParams(this.file, this.offset);
+
+  factory SearchGetTypeHierarchyParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      return new SearchGetTypeHierarchyParams(file, offset);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.getTypeHierarchy params");
+    }
+  }
+
+  factory SearchGetTypeHierarchyParams.fromRequest(Request request) {
+    return new SearchGetTypeHierarchyParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "search.getTypeHierarchy", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchGetTypeHierarchyParams) {
+      return file == other.file &&
+          offset == other.offset;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.getTypeHierarchy result
+ *
+ * {
+ *   "hierarchyItems": optional List<TypeHierarchyItem>
+ * }
+ */
+class SearchGetTypeHierarchyResult implements HasToJson {
+  /**
+   * A list of the types in the requested hierarchy. The first element of the
+   * list is the item representing the type for which the hierarchy was
+   * requested. The index of other elements of the list is unspecified, but
+   * correspond to the integers used to reference supertype and subtype items
+   * within the items.
+   *
+   * This field will be absent if the code at the given file and offset does
+   * not represent a type, or if the file has not been sufficiently analyzed to
+   * allow a type hierarchy to be produced.
+   */
+  List<TypeHierarchyItem> hierarchyItems;
+
+  SearchGetTypeHierarchyResult({this.hierarchyItems}) {
+    if (hierarchyItems == null) {
+      hierarchyItems = <TypeHierarchyItem>[];
+    }
+  }
+
+  factory SearchGetTypeHierarchyResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<TypeHierarchyItem> hierarchyItems;
+      if (json.containsKey("hierarchyItems")) {
+        hierarchyItems = jsonDecoder._decodeList(jsonPath + ".hierarchyItems", json["hierarchyItems"], (String jsonPath, Object json) => new TypeHierarchyItem.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        hierarchyItems = <TypeHierarchyItem>[];
+      }
+      return new SearchGetTypeHierarchyResult(hierarchyItems: hierarchyItems);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.getTypeHierarchy result");
+    }
+  }
+
+  factory SearchGetTypeHierarchyResult.fromResponse(Response response) {
+    return new SearchGetTypeHierarchyResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (hierarchyItems.isNotEmpty) {
+      result["hierarchyItems"] = hierarchyItems.map((TypeHierarchyItem value) => value.toJson()).toList();
+    }
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchGetTypeHierarchyResult) {
+      return _listEqual(hierarchyItems, other.hierarchyItems, (TypeHierarchyItem a, TypeHierarchyItem b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, hierarchyItems.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * search.results params
+ *
+ * {
+ *   "id": SearchId
+ *   "results": List<SearchResult>
+ *   "isLast": bool
+ * }
+ */
+class SearchResultsParams implements HasToJson {
+  /**
+   * The id associated with the search.
+   */
+  String id;
+
+  /**
+   * The search results being reported.
+   */
+  List<SearchResult> results;
+
+  /**
+   * True if this is that last set of results that will be returned for the
+   * indicated search.
+   */
+  bool isLast;
+
+  SearchResultsParams(this.id, this.results, this.isLast);
+
+  factory SearchResultsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      List<SearchResult> results;
+      if (json.containsKey("results")) {
+        results = jsonDecoder._decodeList(jsonPath + ".results", json["results"], (String jsonPath, Object json) => new SearchResult.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "results");
+      }
+      bool isLast;
+      if (json.containsKey("isLast")) {
+        isLast = jsonDecoder._decodeBool(jsonPath + ".isLast", json["isLast"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isLast");
+      }
+      return new SearchResultsParams(id, results, isLast);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "search.results params");
+    }
+  }
+
+  factory SearchResultsParams.fromNotification(Notification notification) {
+    return new SearchResultsParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    result["results"] = results.map((SearchResult value) => value.toJson()).toList();
+    result["isLast"] = isLast;
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("search.results", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchResultsParams) {
+      return id == other.id &&
+          _listEqual(results, other.results, (SearchResult a, SearchResult b) => a == b) &&
+          isLast == other.isLast;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, results.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, isLast.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getAssists params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ *   "length": int
+ * }
+ */
+class EditGetAssistsParams implements HasToJson {
+  /**
+   * The file containing the code for which assists are being requested.
+   */
+  String file;
+
+  /**
+   * The offset of the code for which assists are being requested.
+   */
+  int offset;
+
+  /**
+   * The length of the code for which assists are being requested.
+   */
+  int length;
+
+  EditGetAssistsParams(this.file, this.offset, this.length);
+
+  factory EditGetAssistsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      return new EditGetAssistsParams(file, offset, length);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getAssists params");
+    }
+  }
+
+  factory EditGetAssistsParams.fromRequest(Request request) {
+    return new EditGetAssistsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    result["length"] = length;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "edit.getAssists", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetAssistsParams) {
+      return file == other.file &&
+          offset == other.offset &&
+          length == other.length;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getAssists result
+ *
+ * {
+ *   "assists": List<SourceChange>
+ * }
+ */
+class EditGetAssistsResult implements HasToJson {
+  /**
+   * The assists that are available at the given location.
+   */
+  List<SourceChange> assists;
+
+  EditGetAssistsResult(this.assists);
+
+  factory EditGetAssistsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<SourceChange> assists;
+      if (json.containsKey("assists")) {
+        assists = jsonDecoder._decodeList(jsonPath + ".assists", json["assists"], (String jsonPath, Object json) => new SourceChange.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "assists");
+      }
+      return new EditGetAssistsResult(assists);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getAssists result");
+    }
+  }
+
+  factory EditGetAssistsResult.fromResponse(Response response) {
+    return new EditGetAssistsResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["assists"] = assists.map((SourceChange value) => value.toJson()).toList();
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetAssistsResult) {
+      return _listEqual(assists, other.assists, (SourceChange a, SourceChange b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, assists.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getAvailableRefactorings params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ *   "length": int
+ * }
+ */
+class EditGetAvailableRefactoringsParams implements HasToJson {
+  /**
+   * The file containing the code on which the refactoring would be based.
+   */
+  String file;
+
+  /**
+   * The offset of the code on which the refactoring would be based.
+   */
+  int offset;
+
+  /**
+   * The length of the code on which the refactoring would be based.
+   */
+  int length;
+
+  EditGetAvailableRefactoringsParams(this.file, this.offset, this.length);
+
+  factory EditGetAvailableRefactoringsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      return new EditGetAvailableRefactoringsParams(file, offset, length);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getAvailableRefactorings params");
+    }
+  }
+
+  factory EditGetAvailableRefactoringsParams.fromRequest(Request request) {
+    return new EditGetAvailableRefactoringsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    result["length"] = length;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "edit.getAvailableRefactorings", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetAvailableRefactoringsParams) {
+      return file == other.file &&
+          offset == other.offset &&
+          length == other.length;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getAvailableRefactorings result
+ *
+ * {
+ *   "kinds": List<RefactoringKind>
+ * }
+ */
+class EditGetAvailableRefactoringsResult implements HasToJson {
+  /**
+   * The kinds of refactorings that are valid for the given selection.
+   */
+  List<RefactoringKind> kinds;
+
+  EditGetAvailableRefactoringsResult(this.kinds);
+
+  factory EditGetAvailableRefactoringsResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<RefactoringKind> kinds;
+      if (json.containsKey("kinds")) {
+        kinds = jsonDecoder._decodeList(jsonPath + ".kinds", json["kinds"], (String jsonPath, Object json) => new RefactoringKind.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kinds");
+      }
+      return new EditGetAvailableRefactoringsResult(kinds);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getAvailableRefactorings result");
+    }
+  }
+
+  factory EditGetAvailableRefactoringsResult.fromResponse(Response response) {
+    return new EditGetAvailableRefactoringsResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kinds"] = kinds.map((RefactoringKind value) => value.toJson()).toList();
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetAvailableRefactoringsResult) {
+      return _listEqual(kinds, other.kinds, (RefactoringKind a, RefactoringKind b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, kinds.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getFixes params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ * }
+ */
+class EditGetFixesParams implements HasToJson {
+  /**
+   * The file containing the errors for which fixes are being requested.
+   */
+  String file;
+
+  /**
+   * The offset used to select the errors for which fixes will be returned.
+   */
+  int offset;
+
+  EditGetFixesParams(this.file, this.offset);
+
+  factory EditGetFixesParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      return new EditGetFixesParams(file, offset);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getFixes params");
+    }
+  }
+
+  factory EditGetFixesParams.fromRequest(Request request) {
+    return new EditGetFixesParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "edit.getFixes", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetFixesParams) {
+      return file == other.file &&
+          offset == other.offset;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getFixes result
+ *
+ * {
+ *   "fixes": List<AnalysisErrorFixes>
+ * }
+ */
+class EditGetFixesResult implements HasToJson {
+  /**
+   * The fixes that are available for the errors at the given offset.
+   */
+  List<AnalysisErrorFixes> fixes;
+
+  EditGetFixesResult(this.fixes);
+
+  factory EditGetFixesResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<AnalysisErrorFixes> fixes;
+      if (json.containsKey("fixes")) {
+        fixes = jsonDecoder._decodeList(jsonPath + ".fixes", json["fixes"], (String jsonPath, Object json) => new AnalysisErrorFixes.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "fixes");
+      }
+      return new EditGetFixesResult(fixes);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getFixes result");
+    }
+  }
+
+  factory EditGetFixesResult.fromResponse(Response response) {
+    return new EditGetFixesResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["fixes"] = fixes.map((AnalysisErrorFixes value) => value.toJson()).toList();
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetFixesResult) {
+      return _listEqual(fixes, other.fixes, (AnalysisErrorFixes a, AnalysisErrorFixes b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, fixes.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getRefactoring params
+ *
+ * {
+ *   "kind": RefactoringKind
+ *   "file": FilePath
+ *   "offset": int
+ *   "length": int
+ *   "validateOnly": bool
+ *   "options": optional RefactoringOptions
+ * }
+ */
+class EditGetRefactoringParams implements HasToJson {
+  /**
+   * The kind of refactoring to be performed.
+   */
+  RefactoringKind kind;
+
+  /**
+   * The file containing the code involved in the refactoring.
+   */
+  String file;
+
+  /**
+   * The offset of the region involved in the refactoring.
+   */
+  int offset;
+
+  /**
+   * The length of the region involved in the refactoring.
+   */
+  int length;
+
+  /**
+   * True if the client is only requesting that the values of the options be
+   * validated and no change be generated.
+   */
+  bool validateOnly;
+
+  /**
+   * Data used to provide values provided by the user. The structure of the
+   * data is dependent on the kind of refactoring being performed. The data
+   * that is expected is documented in the section titled Refactorings, labeled
+   * as “Options”. This field can be omitted if the refactoring does not
+   * require any options or if the values of those options are not known.
+   */
+  RefactoringOptions options;
+
+  EditGetRefactoringParams(this.kind, this.file, this.offset, this.length, this.validateOnly, {this.options});
+
+  factory EditGetRefactoringParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      RefactoringKind kind;
+      if (json.containsKey("kind")) {
+        kind = new RefactoringKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      bool validateOnly;
+      if (json.containsKey("validateOnly")) {
+        validateOnly = jsonDecoder._decodeBool(jsonPath + ".validateOnly", json["validateOnly"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "validateOnly");
+      }
+      RefactoringOptions options;
+      if (json.containsKey("options")) {
+        options = new RefactoringOptions.fromJson(jsonDecoder, jsonPath + ".options", json["options"], kind);
+      }
+      return new EditGetRefactoringParams(kind, file, offset, length, validateOnly, options: options);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getRefactoring params");
+    }
+  }
+
+  factory EditGetRefactoringParams.fromRequest(Request request) {
+    var params = new EditGetRefactoringParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+    REQUEST_ID_REFACTORING_KINDS[request.id] = params.kind;
+    return params;
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kind"] = kind.toJson();
+    result["file"] = file;
+    result["offset"] = offset;
+    result["length"] = length;
+    result["validateOnly"] = validateOnly;
+    if (options != null) {
+      result["options"] = options.toJson();
+    }
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "edit.getRefactoring", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetRefactoringParams) {
+      return kind == other.kind &&
+          file == other.file &&
+          offset == other.offset &&
+          length == other.length &&
+          validateOnly == other.validateOnly &&
+          options == other.options;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, validateOnly.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, options.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * edit.getRefactoring result
+ *
+ * {
+ *   "initialProblems": List<RefactoringProblem>
+ *   "optionsProblems": List<RefactoringProblem>
+ *   "finalProblems": List<RefactoringProblem>
+ *   "feedback": optional RefactoringFeedback
+ *   "change": optional SourceChange
+ *   "potentialEdits": optional List<String>
+ * }
+ */
+class EditGetRefactoringResult implements HasToJson {
+  /**
+   * The initial status of the refactoring, i.e. problems related to the
+   * context in which the refactoring is requested. The array will be empty if
+   * there are no known problems.
+   */
+  List<RefactoringProblem> initialProblems;
+
+  /**
+   * The options validation status, i.e. problems in the given options, such as
+   * light-weight validation of a new name, flags compatibility, etc. The array
+   * will be empty if there are no known problems.
+   */
+  List<RefactoringProblem> optionsProblems;
+
+  /**
+   * The final status of the refactoring, i.e. problems identified in the
+   * result of a full, potentially expensive validation and / or change
+   * creation. The array will be empty if there are no known problems.
+   */
+  List<RefactoringProblem> finalProblems;
+
+  /**
+   * Data used to provide feedback to the user. The structure of the data is
+   * dependent on the kind of refactoring being created. The data that is
+   * returned is documented in the section titled Refactorings, labeled as
+   * “Feedback”.
+   */
+  RefactoringFeedback feedback;
+
+  /**
+   * The changes that are to be applied to affect the refactoring. This field
+   * will be omitted if there are problems that prevent a set of changes from
+   * being computed, such as having no options specified for a refactoring that
+   * requires them, or if only validation was requested.
+   */
+  SourceChange change;
+
+  /**
+   * The ids of source edits that are not known to be valid. An edit is not
+   * known to be valid if there was insufficient type information for the
+   * server to be able to determine whether or not the code needs to be
+   * modified, such as when a member is being renamed and there is a reference
+   * to a member from an unknown type. This field will be omitted if the change
+   * field is omitted or if there are no potential edits for the refactoring.
+   */
+  List<String> potentialEdits;
+
+  EditGetRefactoringResult(this.initialProblems, this.optionsProblems, this.finalProblems, {this.feedback, this.change, this.potentialEdits}) {
+    if (potentialEdits == null) {
+      potentialEdits = <String>[];
+    }
+  }
+
+  factory EditGetRefactoringResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<RefactoringProblem> initialProblems;
+      if (json.containsKey("initialProblems")) {
+        initialProblems = jsonDecoder._decodeList(jsonPath + ".initialProblems", json["initialProblems"], (String jsonPath, Object json) => new RefactoringProblem.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "initialProblems");
+      }
+      List<RefactoringProblem> optionsProblems;
+      if (json.containsKey("optionsProblems")) {
+        optionsProblems = jsonDecoder._decodeList(jsonPath + ".optionsProblems", json["optionsProblems"], (String jsonPath, Object json) => new RefactoringProblem.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "optionsProblems");
+      }
+      List<RefactoringProblem> finalProblems;
+      if (json.containsKey("finalProblems")) {
+        finalProblems = jsonDecoder._decodeList(jsonPath + ".finalProblems", json["finalProblems"], (String jsonPath, Object json) => new RefactoringProblem.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "finalProblems");
+      }
+      RefactoringFeedback feedback;
+      if (json.containsKey("feedback")) {
+        feedback = new RefactoringFeedback.fromJson(jsonDecoder, jsonPath + ".feedback", json["feedback"], json);
+      }
+      SourceChange change;
+      if (json.containsKey("change")) {
+        change = new SourceChange.fromJson(jsonDecoder, jsonPath + ".change", json["change"]);
+      }
+      List<String> potentialEdits;
+      if (json.containsKey("potentialEdits")) {
+        potentialEdits = jsonDecoder._decodeList(jsonPath + ".potentialEdits", json["potentialEdits"], jsonDecoder._decodeString);
+      } else {
+        potentialEdits = <String>[];
+      }
+      return new EditGetRefactoringResult(initialProblems, optionsProblems, finalProblems, feedback: feedback, change: change, potentialEdits: potentialEdits);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "edit.getRefactoring result");
+    }
+  }
+
+  factory EditGetRefactoringResult.fromResponse(Response response) {
+    return new EditGetRefactoringResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["initialProblems"] = initialProblems.map((RefactoringProblem value) => value.toJson()).toList();
+    result["optionsProblems"] = optionsProblems.map((RefactoringProblem value) => value.toJson()).toList();
+    result["finalProblems"] = finalProblems.map((RefactoringProblem value) => value.toJson()).toList();
+    if (feedback != null) {
+      result["feedback"] = feedback.toJson();
+    }
+    if (change != null) {
+      result["change"] = change.toJson();
+    }
+    if (potentialEdits.isNotEmpty) {
+      result["potentialEdits"] = potentialEdits;
+    }
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is EditGetRefactoringResult) {
+      return _listEqual(initialProblems, other.initialProblems, (RefactoringProblem a, RefactoringProblem b) => a == b) &&
+          _listEqual(optionsProblems, other.optionsProblems, (RefactoringProblem a, RefactoringProblem b) => a == b) &&
+          _listEqual(finalProblems, other.finalProblems, (RefactoringProblem a, RefactoringProblem b) => a == b) &&
+          feedback == other.feedback &&
+          change == other.change &&
+          _listEqual(potentialEdits, other.potentialEdits, (String a, String b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, initialProblems.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, optionsProblems.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, finalProblems.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, feedback.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, change.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, potentialEdits.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * execution.createContext params
+ *
+ * {
+ *   "contextRoot": FilePath
+ * }
+ */
+class ExecutionCreateContextParams implements HasToJson {
+  /**
+   * The path of the Dart or HTML file that will be launched.
+   */
+  String contextRoot;
+
+  ExecutionCreateContextParams(this.contextRoot);
+
+  factory ExecutionCreateContextParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String contextRoot;
+      if (json.containsKey("contextRoot")) {
+        contextRoot = jsonDecoder._decodeString(jsonPath + ".contextRoot", json["contextRoot"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "contextRoot");
+      }
+      return new ExecutionCreateContextParams(contextRoot);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "execution.createContext params");
+    }
+  }
+
+  factory ExecutionCreateContextParams.fromRequest(Request request) {
+    return new ExecutionCreateContextParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["contextRoot"] = contextRoot;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "execution.createContext", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExecutionCreateContextParams) {
+      return contextRoot == other.contextRoot;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, contextRoot.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * execution.createContext result
+ *
+ * {
+ *   "id": ExecutionContextId
+ * }
+ */
+class ExecutionCreateContextResult implements HasToJson {
+  /**
+   * The identifier used to refer to the execution context that was created.
+   */
+  String id;
+
+  ExecutionCreateContextResult(this.id);
+
+  factory ExecutionCreateContextResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      return new ExecutionCreateContextResult(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "execution.createContext result");
+    }
+  }
+
+  factory ExecutionCreateContextResult.fromResponse(Response response) {
+    return new ExecutionCreateContextResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExecutionCreateContextResult) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * execution.deleteContext params
+ *
+ * {
+ *   "id": ExecutionContextId
+ * }
+ */
+class ExecutionDeleteContextParams implements HasToJson {
+  /**
+   * The identifier of the execution context that is to be deleted.
+   */
+  String id;
+
+  ExecutionDeleteContextParams(this.id);
+
+  factory ExecutionDeleteContextParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      return new ExecutionDeleteContextParams(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "execution.deleteContext params");
+    }
+  }
+
+  factory ExecutionDeleteContextParams.fromRequest(Request request) {
+    return new ExecutionDeleteContextParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "execution.deleteContext", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExecutionDeleteContextParams) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * execution.deleteContext result
+ */
+class ExecutionDeleteContextResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is ExecutionDeleteContextResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 479954425;
+  }
+}
+
+/**
+ * execution.mapUri params
+ *
+ * {
+ *   "id": ExecutionContextId
+ *   "file": optional FilePath
+ *   "uri": optional String
+ * }
+ */
+class ExecutionMapUriParams implements HasToJson {
+  /**
+   * The identifier of the execution context in which the URI is to be mapped.
+   */
+  String id;
+
+  /**
+   * The path of the file to be mapped into a URI.
+   */
+  String file;
+
+  /**
+   * The URI to be mapped into a file path.
+   */
+  String uri;
+
+  ExecutionMapUriParams(this.id, {this.file, this.uri});
+
+  factory ExecutionMapUriParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "id");
+      }
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      }
+      String uri;
+      if (json.containsKey("uri")) {
+        uri = jsonDecoder._decodeString(jsonPath + ".uri", json["uri"]);
+      }
+      return new ExecutionMapUriParams(id, file: file, uri: uri);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "execution.mapUri params");
+    }
+  }
+
+  factory ExecutionMapUriParams.fromRequest(Request request) {
+    return new ExecutionMapUriParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    if (file != null) {
+      result["file"] = file;
+    }
+    if (uri != null) {
+      result["uri"] = uri;
+    }
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "execution.mapUri", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExecutionMapUriParams) {
+      return id == other.id &&
+          file == other.file &&
+          uri == other.uri;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, uri.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * execution.mapUri result
+ *
+ * {
+ *   "file": optional FilePath
+ *   "uri": optional String
+ * }
+ */
+class ExecutionMapUriResult implements HasToJson {
+  /**
+   * The file to which the URI was mapped. This field is omitted if the uri
+   * field was not given in the request.
+   */
+  String file;
+
+  /**
+   * The URI to which the file path was mapped. This field is omitted if the
+   * file field was not given in the request.
+   */
+  String uri;
+
+  ExecutionMapUriResult({this.file, this.uri});
+
+  factory ExecutionMapUriResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      }
+      String uri;
+      if (json.containsKey("uri")) {
+        uri = jsonDecoder._decodeString(jsonPath + ".uri", json["uri"]);
+      }
+      return new ExecutionMapUriResult(file: file, uri: uri);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "execution.mapUri result");
+    }
+  }
+
+  factory ExecutionMapUriResult.fromResponse(Response response) {
+    return new ExecutionMapUriResult.fromJson(
+        new ResponseDecoder(response), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (file != null) {
+      result["file"] = file;
+    }
+    if (uri != null) {
+      result["uri"] = uri;
+    }
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExecutionMapUriResult) {
+      return file == other.file &&
+          uri == other.uri;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, uri.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * execution.setSubscriptions params
+ *
+ * {
+ *   "subscriptions": List<ExecutionService>
+ * }
+ */
+class ExecutionSetSubscriptionsParams implements HasToJson {
+  /**
+   * A list of the services being subscribed to.
+   */
+  List<ExecutionService> subscriptions;
+
+  ExecutionSetSubscriptionsParams(this.subscriptions);
+
+  factory ExecutionSetSubscriptionsParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<ExecutionService> subscriptions;
+      if (json.containsKey("subscriptions")) {
+        subscriptions = jsonDecoder._decodeList(jsonPath + ".subscriptions", json["subscriptions"], (String jsonPath, Object json) => new ExecutionService.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "subscriptions");
+      }
+      return new ExecutionSetSubscriptionsParams(subscriptions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "execution.setSubscriptions params");
+    }
+  }
+
+  factory ExecutionSetSubscriptionsParams.fromRequest(Request request) {
+    return new ExecutionSetSubscriptionsParams.fromJson(
+        new RequestDecoder(request), "params", request._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["subscriptions"] = subscriptions.map((ExecutionService value) => value.toJson()).toList();
+    return result;
+  }
+
+  Request toRequest(String id) {
+    return new Request(id, "execution.setSubscriptions", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExecutionSetSubscriptionsParams) {
+      return _listEqual(subscriptions, other.subscriptions, (ExecutionService a, ExecutionService b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, subscriptions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * execution.setSubscriptions result
+ */
+class ExecutionSetSubscriptionsResult {
+  Response toResponse(String id) {
+    return new Response(id, result: null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is ExecutionSetSubscriptionsResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 287678780;
+  }
+}
+
+/**
+ * execution.launchData params
+ *
+ * {
+ *   "executables": List<ExecutableFile>
+ *   "dartToHtml": Map<FilePath, List<FilePath>>
+ *   "htmlToDart": Map<FilePath, List<FilePath>>
+ * }
+ */
+class ExecutionLaunchDataParams implements HasToJson {
+  /**
+   * A list of the files that are executable. This list replaces any previous
+   * list provided.
+   */
+  List<ExecutableFile> executables;
+
+  /**
+   * A mapping from the paths of Dart files that are referenced by HTML files
+   * to a list of the HTML files that reference the Dart files.
+   */
+  Map<String, List<String>> dartToHtml;
+
+  /**
+   * A mapping from the paths of HTML files that reference Dart files to a list
+   * of the Dart files they reference.
+   */
+  Map<String, List<String>> htmlToDart;
+
+  ExecutionLaunchDataParams(this.executables, this.dartToHtml, this.htmlToDart);
+
+  factory ExecutionLaunchDataParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<ExecutableFile> executables;
+      if (json.containsKey("executables")) {
+        executables = jsonDecoder._decodeList(jsonPath + ".executables", json["executables"], (String jsonPath, Object json) => new ExecutableFile.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "executables");
+      }
+      Map<String, List<String>> dartToHtml;
+      if (json.containsKey("dartToHtml")) {
+        dartToHtml = jsonDecoder._decodeMap(jsonPath + ".dartToHtml", json["dartToHtml"], valueDecoder: (String jsonPath, Object json) => jsonDecoder._decodeList(jsonPath, json, jsonDecoder._decodeString));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "dartToHtml");
+      }
+      Map<String, List<String>> htmlToDart;
+      if (json.containsKey("htmlToDart")) {
+        htmlToDart = jsonDecoder._decodeMap(jsonPath + ".htmlToDart", json["htmlToDart"], valueDecoder: (String jsonPath, Object json) => jsonDecoder._decodeList(jsonPath, json, jsonDecoder._decodeString));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "htmlToDart");
+      }
+      return new ExecutionLaunchDataParams(executables, dartToHtml, htmlToDart);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "execution.launchData params");
+    }
+  }
+
+  factory ExecutionLaunchDataParams.fromNotification(Notification notification) {
+    return new ExecutionLaunchDataParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["executables"] = executables.map((ExecutableFile value) => value.toJson()).toList();
+    result["dartToHtml"] = dartToHtml;
+    result["htmlToDart"] = htmlToDart;
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("execution.launchData", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExecutionLaunchDataParams) {
+      return _listEqual(executables, other.executables, (ExecutableFile a, ExecutableFile b) => a == b) &&
+          _mapEqual(dartToHtml, other.dartToHtml, (List<String> a, List<String> b) => _listEqual(a, b, (String a, String b) => a == b)) &&
+          _mapEqual(htmlToDart, other.htmlToDart, (List<String> a, List<String> b) => _listEqual(a, b, (String a, String b) => a == b));
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, executables.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, dartToHtml.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, htmlToDart.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * AddContentOverlay
+ *
+ * {
+ *   "type": "add"
+ *   "content": String
+ * }
+ */
+class AddContentOverlay implements HasToJson {
+  /**
+   * The new content of the file.
+   */
+  String content;
+
+  AddContentOverlay(this.content);
+
+  factory AddContentOverlay.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      if (json["type"] != "add") {
+        throw jsonDecoder.mismatch(jsonPath, "equal " + "add");
+      }
+      String content;
+      if (json.containsKey("content")) {
+        content = jsonDecoder._decodeString(jsonPath + ".content", json["content"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "content");
+      }
+      return new AddContentOverlay(content);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "AddContentOverlay");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["type"] = "add";
+    result["content"] = content;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AddContentOverlay) {
+      return content == other.content;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, 704418402);
+    hash = _JenkinsSmiHash.combine(hash, content.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * AnalysisError
+ *
+ * {
+ *   "severity": AnalysisErrorSeverity
+ *   "type": AnalysisErrorType
+ *   "location": Location
+ *   "message": String
+ *   "correction": optional String
+ * }
+ */
+class AnalysisError implements HasToJson {
+
+  /**
+   * The severity of the error.
+   */
+  AnalysisErrorSeverity severity;
+
+  /**
+   * The type of the error.
+   */
+  AnalysisErrorType type;
+
+  /**
+   * The location associated with the error.
+   */
+  Location location;
+
+  /**
+   * The message to be displayed for this error. The message should indicate
+   * what is wrong with the code and why it is wrong.
+   */
+  String message;
+
+  /**
+   * The correction message to be displayed for this error. The correction
+   * message should indicate how the user can fix the error. The field is
+   * omitted if there is no correction message associated with the error code.
+   */
+  String correction;
+
+  AnalysisError(this.severity, this.type, this.location, this.message, {this.correction});
+
+  factory AnalysisError.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      AnalysisErrorSeverity severity;
+      if (json.containsKey("severity")) {
+        severity = new AnalysisErrorSeverity.fromJson(jsonDecoder, jsonPath + ".severity", json["severity"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "severity");
+      }
+      AnalysisErrorType type;
+      if (json.containsKey("type")) {
+        type = new AnalysisErrorType.fromJson(jsonDecoder, jsonPath + ".type", json["type"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "type");
+      }
+      Location location;
+      if (json.containsKey("location")) {
+        location = new Location.fromJson(jsonDecoder, jsonPath + ".location", json["location"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "location");
+      }
+      String message;
+      if (json.containsKey("message")) {
+        message = jsonDecoder._decodeString(jsonPath + ".message", json["message"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "message");
+      }
+      String correction;
+      if (json.containsKey("correction")) {
+        correction = jsonDecoder._decodeString(jsonPath + ".correction", json["correction"]);
+      }
+      return new AnalysisError(severity, type, location, message, correction: correction);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "AnalysisError");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["severity"] = severity.toJson();
+    result["type"] = type.toJson();
+    result["location"] = location.toJson();
+    result["message"] = message;
+    if (correction != null) {
+      result["correction"] = correction;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisError) {
+      return severity == other.severity &&
+          type == other.type &&
+          location == other.location &&
+          message == other.message &&
+          correction == other.correction;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, severity.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, type.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, location.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, correction.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * AnalysisErrorFixes
+ *
+ * {
+ *   "error": AnalysisError
+ *   "fixes": List<SourceChange>
+ * }
+ */
+class AnalysisErrorFixes implements HasToJson {
+  /**
+   * The error with which the fixes are associated.
+   */
+  AnalysisError error;
+
+  /**
+   * The fixes associated with the error.
+   */
+  List<SourceChange> fixes;
+
+  AnalysisErrorFixes(this.error, {this.fixes}) {
+    if (fixes == null) {
+      fixes = <SourceChange>[];
+    }
+  }
+
+  factory AnalysisErrorFixes.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      AnalysisError error;
+      if (json.containsKey("error")) {
+        error = new AnalysisError.fromJson(jsonDecoder, jsonPath + ".error", json["error"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "error");
+      }
+      List<SourceChange> fixes;
+      if (json.containsKey("fixes")) {
+        fixes = jsonDecoder._decodeList(jsonPath + ".fixes", json["fixes"], (String jsonPath, Object json) => new SourceChange.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "fixes");
+      }
+      return new AnalysisErrorFixes(error, fixes: fixes);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "AnalysisErrorFixes");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["error"] = error.toJson();
+    result["fixes"] = fixes.map((SourceChange value) => value.toJson()).toList();
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisErrorFixes) {
+      return error == other.error &&
+          _listEqual(fixes, other.fixes, (SourceChange a, SourceChange b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, error.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, fixes.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * AnalysisErrorSeverity
+ *
+ * enum {
+ *   INFO
+ *   WARNING
+ *   ERROR
+ * }
+ */
+class AnalysisErrorSeverity {
+  static const INFO = const AnalysisErrorSeverity._("INFO");
+
+  static const WARNING = const AnalysisErrorSeverity._("WARNING");
+
+  static const ERROR = const AnalysisErrorSeverity._("ERROR");
+
+  final String name;
+
+  const AnalysisErrorSeverity._(this.name);
+
+  factory AnalysisErrorSeverity(String name) {
+    switch (name) {
+      case "INFO":
+        return INFO;
+      case "WARNING":
+        return WARNING;
+      case "ERROR":
+        return ERROR;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory AnalysisErrorSeverity.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new AnalysisErrorSeverity(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "AnalysisErrorSeverity");
+  }
+
+  @override
+  String toString() => "AnalysisErrorSeverity.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * AnalysisErrorType
+ *
+ * enum {
+ *   ANGULAR
+ *   COMPILE_TIME_ERROR
+ *   HINT
+ *   POLYMER
+ *   STATIC_TYPE_WARNING
+ *   STATIC_WARNING
+ *   SYNTACTIC_ERROR
+ *   TODO
+ * }
+ */
+class AnalysisErrorType {
+  static const ANGULAR = const AnalysisErrorType._("ANGULAR");
+
+  static const COMPILE_TIME_ERROR = const AnalysisErrorType._("COMPILE_TIME_ERROR");
+
+  static const HINT = const AnalysisErrorType._("HINT");
+
+  static const POLYMER = const AnalysisErrorType._("POLYMER");
+
+  static const STATIC_TYPE_WARNING = const AnalysisErrorType._("STATIC_TYPE_WARNING");
+
+  static const STATIC_WARNING = const AnalysisErrorType._("STATIC_WARNING");
+
+  static const SYNTACTIC_ERROR = const AnalysisErrorType._("SYNTACTIC_ERROR");
+
+  static const TODO = const AnalysisErrorType._("TODO");
+
+  final String name;
+
+  const AnalysisErrorType._(this.name);
+
+  factory AnalysisErrorType(String name) {
+    switch (name) {
+      case "ANGULAR":
+        return ANGULAR;
+      case "COMPILE_TIME_ERROR":
+        return COMPILE_TIME_ERROR;
+      case "HINT":
+        return HINT;
+      case "POLYMER":
+        return POLYMER;
+      case "STATIC_TYPE_WARNING":
+        return STATIC_TYPE_WARNING;
+      case "STATIC_WARNING":
+        return STATIC_WARNING;
+      case "SYNTACTIC_ERROR":
+        return SYNTACTIC_ERROR;
+      case "TODO":
+        return TODO;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory AnalysisErrorType.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new AnalysisErrorType(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "AnalysisErrorType");
+  }
+
+  @override
+  String toString() => "AnalysisErrorType.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * AnalysisOptions
+ *
+ * {
+ *   "enableAsync": optional bool
+ *   "enableDeferredLoading": optional bool
+ *   "enableEnums": optional bool
+ *   "generateDart2jsHints": optional bool
+ *   "generateHints": optional bool
+ * }
+ */
+class AnalysisOptions implements HasToJson {
+  /**
+   * True if the client wants to enable support for the proposed async feature.
+   */
+  bool enableAsync;
+
+  /**
+   * True if the client wants to enable support for the proposed deferred
+   * loading feature.
+   */
+  bool enableDeferredLoading;
+
+  /**
+   * True if the client wants to enable support for the proposed enum feature.
+   */
+  bool enableEnums;
+
+  /**
+   * True if hints that are specific to dart2js should be generated. This
+   * option is ignored if generateHints is false.
+   */
+  bool generateDart2jsHints;
+
+  /**
+   * True is hints should be generated as part of generating errors and
+   * warnings.
+   */
+  bool generateHints;
+
+  AnalysisOptions({this.enableAsync, this.enableDeferredLoading, this.enableEnums, this.generateDart2jsHints, this.generateHints});
+
+  factory AnalysisOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      bool enableAsync;
+      if (json.containsKey("enableAsync")) {
+        enableAsync = jsonDecoder._decodeBool(jsonPath + ".enableAsync", json["enableAsync"]);
+      }
+      bool enableDeferredLoading;
+      if (json.containsKey("enableDeferredLoading")) {
+        enableDeferredLoading = jsonDecoder._decodeBool(jsonPath + ".enableDeferredLoading", json["enableDeferredLoading"]);
+      }
+      bool enableEnums;
+      if (json.containsKey("enableEnums")) {
+        enableEnums = jsonDecoder._decodeBool(jsonPath + ".enableEnums", json["enableEnums"]);
+      }
+      bool generateDart2jsHints;
+      if (json.containsKey("generateDart2jsHints")) {
+        generateDart2jsHints = jsonDecoder._decodeBool(jsonPath + ".generateDart2jsHints", json["generateDart2jsHints"]);
+      }
+      bool generateHints;
+      if (json.containsKey("generateHints")) {
+        generateHints = jsonDecoder._decodeBool(jsonPath + ".generateHints", json["generateHints"]);
+      }
+      return new AnalysisOptions(enableAsync: enableAsync, enableDeferredLoading: enableDeferredLoading, enableEnums: enableEnums, generateDart2jsHints: generateDart2jsHints, generateHints: generateHints);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "AnalysisOptions");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (enableAsync != null) {
+      result["enableAsync"] = enableAsync;
+    }
+    if (enableDeferredLoading != null) {
+      result["enableDeferredLoading"] = enableDeferredLoading;
+    }
+    if (enableEnums != null) {
+      result["enableEnums"] = enableEnums;
+    }
+    if (generateDart2jsHints != null) {
+      result["generateDart2jsHints"] = generateDart2jsHints;
+    }
+    if (generateHints != null) {
+      result["generateHints"] = generateHints;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisOptions) {
+      return enableAsync == other.enableAsync &&
+          enableDeferredLoading == other.enableDeferredLoading &&
+          enableEnums == other.enableEnums &&
+          generateDart2jsHints == other.generateDart2jsHints &&
+          generateHints == other.generateHints;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, enableAsync.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, enableDeferredLoading.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, enableEnums.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, generateDart2jsHints.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, generateHints.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * AnalysisService
+ *
+ * enum {
+ *   FOLDING
+ *   HIGHLIGHTS
+ *   NAVIGATION
+ *   OCCURRENCES
+ *   OUTLINE
+ *   OVERRIDES
+ * }
+ */
+class AnalysisService {
+  static const FOLDING = const AnalysisService._("FOLDING");
+
+  static const HIGHLIGHTS = const AnalysisService._("HIGHLIGHTS");
+
+  static const NAVIGATION = const AnalysisService._("NAVIGATION");
+
+  static const OCCURRENCES = const AnalysisService._("OCCURRENCES");
+
+  static const OUTLINE = const AnalysisService._("OUTLINE");
+
+  static const OVERRIDES = const AnalysisService._("OVERRIDES");
+
+  final String name;
+
+  const AnalysisService._(this.name);
+
+  factory AnalysisService(String name) {
+    switch (name) {
+      case "FOLDING":
+        return FOLDING;
+      case "HIGHLIGHTS":
+        return HIGHLIGHTS;
+      case "NAVIGATION":
+        return NAVIGATION;
+      case "OCCURRENCES":
+        return OCCURRENCES;
+      case "OUTLINE":
+        return OUTLINE;
+      case "OVERRIDES":
+        return OVERRIDES;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory AnalysisService.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new AnalysisService(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "AnalysisService");
+  }
+
+  @override
+  String toString() => "AnalysisService.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * AnalysisStatus
+ *
+ * {
+ *   "isAnalyzing": bool
+ *   "analysisTarget": optional String
+ * }
+ */
+class AnalysisStatus implements HasToJson {
+  /**
+   * True if analysis is currently being performed.
+   */
+  bool isAnalyzing;
+
+  /**
+   * The name of the current target of analysis. This field is omitted if
+   * analyzing is false.
+   */
+  String analysisTarget;
+
+  AnalysisStatus(this.isAnalyzing, {this.analysisTarget});
+
+  factory AnalysisStatus.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      bool isAnalyzing;
+      if (json.containsKey("isAnalyzing")) {
+        isAnalyzing = jsonDecoder._decodeBool(jsonPath + ".isAnalyzing", json["isAnalyzing"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isAnalyzing");
+      }
+      String analysisTarget;
+      if (json.containsKey("analysisTarget")) {
+        analysisTarget = jsonDecoder._decodeString(jsonPath + ".analysisTarget", json["analysisTarget"]);
+      }
+      return new AnalysisStatus(isAnalyzing, analysisTarget: analysisTarget);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "AnalysisStatus");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["isAnalyzing"] = isAnalyzing;
+    if (analysisTarget != null) {
+      result["analysisTarget"] = analysisTarget;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisStatus) {
+      return isAnalyzing == other.isAnalyzing &&
+          analysisTarget == other.analysisTarget;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, isAnalyzing.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, analysisTarget.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * ChangeContentOverlay
+ *
+ * {
+ *   "type": "change"
+ *   "edits": List<SourceEdit>
+ * }
+ */
+class ChangeContentOverlay implements HasToJson {
+  /**
+   * The edits to be applied to the file.
+   */
+  List<SourceEdit> edits;
+
+  ChangeContentOverlay(this.edits);
+
+  factory ChangeContentOverlay.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      if (json["type"] != "change") {
+        throw jsonDecoder.mismatch(jsonPath, "equal " + "change");
+      }
+      List<SourceEdit> edits;
+      if (json.containsKey("edits")) {
+        edits = jsonDecoder._decodeList(jsonPath + ".edits", json["edits"], (String jsonPath, Object json) => new SourceEdit.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "edits");
+      }
+      return new ChangeContentOverlay(edits);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "ChangeContentOverlay");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["type"] = "change";
+    result["edits"] = edits.map((SourceEdit value) => value.toJson()).toList();
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ChangeContentOverlay) {
+      return _listEqual(edits, other.edits, (SourceEdit a, SourceEdit b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, 873118866);
+    hash = _JenkinsSmiHash.combine(hash, edits.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * CompletionRelevance
+ *
+ * enum {
+ *   LOW
+ *   DEFAULT
+ *   HIGH
+ * }
+ */
+class CompletionRelevance {
+  static const LOW = const CompletionRelevance._("LOW");
+
+  static const DEFAULT = const CompletionRelevance._("DEFAULT");
+
+  static const HIGH = const CompletionRelevance._("HIGH");
+
+  final String name;
+
+  const CompletionRelevance._(this.name);
+
+  factory CompletionRelevance(String name) {
+    switch (name) {
+      case "LOW":
+        return LOW;
+      case "DEFAULT":
+        return DEFAULT;
+      case "HIGH":
+        return HIGH;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory CompletionRelevance.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new CompletionRelevance(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "CompletionRelevance");
+  }
+
+  @override
+  String toString() => "CompletionRelevance.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * CompletionSuggestion
+ *
+ * {
+ *   "kind": CompletionSuggestionKind
+ *   "relevance": CompletionRelevance
+ *   "completion": String
+ *   "selectionOffset": int
+ *   "selectionLength": int
+ *   "isDeprecated": bool
+ *   "isPotential": bool
+ *   "docSummary": optional String
+ *   "docComplete": optional String
+ *   "declaringType": optional String
+ *   "element": optional Element
+ *   "returnType": optional String
+ *   "parameterNames": optional List<String>
+ *   "parameterTypes": optional List<String>
+ *   "requiredParameterCount": optional int
+ *   "positionalParameterCount": optional int
+ *   "parameterName": optional String
+ *   "parameterType": optional String
+ * }
+ */
+class CompletionSuggestion implements HasToJson {
+  /**
+   * The kind of element being suggested.
+   */
+  CompletionSuggestionKind kind;
+
+  /**
+   * The relevance of this completion suggestion.
+   */
+  CompletionRelevance relevance;
+
+  /**
+   * The identifier to be inserted if the suggestion is selected. If the
+   * suggestion is for a method or function, the client might want to
+   * additionally insert a template for the parameters. The information
+   * required in order to do so is contained in other fields.
+   */
+  String completion;
+
+  /**
+   * The offset, relative to the beginning of the completion, of where the
+   * selection should be placed after insertion.
+   */
+  int selectionOffset;
+
+  /**
+   * The number of characters that should be selected after insertion.
+   */
+  int selectionLength;
+
+  /**
+   * True if the suggested element is deprecated.
+   */
+  bool isDeprecated;
+
+  /**
+   * True if the element is not known to be valid for the target. This happens
+   * if the type of the target is dynamic.
+   */
+  bool isPotential;
+
+  /**
+   * An abbreviated version of the Dartdoc associated with the element being
+   * suggested, This field is omitted if there is no Dartdoc associated with
+   * the element.
+   */
+  String docSummary;
+
+  /**
+   * The Dartdoc associated with the element being suggested, This field is
+   * omitted if there is no Dartdoc associated with the element.
+   */
+  String docComplete;
+
+  /**
+   * The class that declares the element being suggested. This field is omitted
+   * if the suggested element is not a member of a class.
+   */
+  String declaringType;
+
+  /**
+   * Information about the element reference being suggested.
+   */
+  Element element;
+
+  /**
+   * The return type of the getter, function or method being suggested. This
+   * field is omitted if the suggested element is not a getter, function or
+   * method.
+   */
+  String returnType;
+
+  /**
+   * The names of the parameters of the function or method being suggested.
+   * This field is omitted if the suggested element is not a setter, function
+   * or method.
+   */
+  List<String> parameterNames;
+
+  /**
+   * The types of the parameters of the function or method being suggested.
+   * This field is omitted if the parameterNames field is omitted.
+   */
+  List<String> parameterTypes;
+
+  /**
+   * The number of required parameters for the function or method being
+   * suggested. This field is omitted if the parameterNames field is omitted.
+   */
+  int requiredParameterCount;
+
+  /**
+   * The number of positional parameters for the function or method being
+   * suggested. This field is omitted if the parameterNames field is omitted.
+   */
+  int positionalParameterCount;
+
+  /**
+   * The name of the optional parameter being suggested. This field is omitted
+   * if the suggestion is not the addition of an optional argument within an
+   * argument list.
+   */
+  String parameterName;
+
+  /**
+   * The type of the options parameter being suggested. This field is omitted
+   * if the parameterName field is omitted.
+   */
+  String parameterType;
+
+  CompletionSuggestion(this.kind, this.relevance, this.completion, this.selectionOffset, this.selectionLength, this.isDeprecated, this.isPotential, {this.docSummary, this.docComplete, this.declaringType, this.element, this.returnType, this.parameterNames, this.parameterTypes, this.requiredParameterCount, this.positionalParameterCount, this.parameterName, this.parameterType}) {
+    if (parameterNames == null) {
+      parameterNames = <String>[];
+    }
+    if (parameterTypes == null) {
+      parameterTypes = <String>[];
+    }
+  }
+
+  factory CompletionSuggestion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      CompletionSuggestionKind kind;
+      if (json.containsKey("kind")) {
+        kind = new CompletionSuggestionKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      CompletionRelevance relevance;
+      if (json.containsKey("relevance")) {
+        relevance = new CompletionRelevance.fromJson(jsonDecoder, jsonPath + ".relevance", json["relevance"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "relevance");
+      }
+      String completion;
+      if (json.containsKey("completion")) {
+        completion = jsonDecoder._decodeString(jsonPath + ".completion", json["completion"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "completion");
+      }
+      int selectionOffset;
+      if (json.containsKey("selectionOffset")) {
+        selectionOffset = jsonDecoder._decodeInt(jsonPath + ".selectionOffset", json["selectionOffset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "selectionOffset");
+      }
+      int selectionLength;
+      if (json.containsKey("selectionLength")) {
+        selectionLength = jsonDecoder._decodeInt(jsonPath + ".selectionLength", json["selectionLength"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "selectionLength");
+      }
+      bool isDeprecated;
+      if (json.containsKey("isDeprecated")) {
+        isDeprecated = jsonDecoder._decodeBool(jsonPath + ".isDeprecated", json["isDeprecated"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isDeprecated");
+      }
+      bool isPotential;
+      if (json.containsKey("isPotential")) {
+        isPotential = jsonDecoder._decodeBool(jsonPath + ".isPotential", json["isPotential"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isPotential");
+      }
+      String docSummary;
+      if (json.containsKey("docSummary")) {
+        docSummary = jsonDecoder._decodeString(jsonPath + ".docSummary", json["docSummary"]);
+      }
+      String docComplete;
+      if (json.containsKey("docComplete")) {
+        docComplete = jsonDecoder._decodeString(jsonPath + ".docComplete", json["docComplete"]);
+      }
+      String declaringType;
+      if (json.containsKey("declaringType")) {
+        declaringType = jsonDecoder._decodeString(jsonPath + ".declaringType", json["declaringType"]);
+      }
+      Element element;
+      if (json.containsKey("element")) {
+        element = new Element.fromJson(jsonDecoder, jsonPath + ".element", json["element"]);
+      }
+      String returnType;
+      if (json.containsKey("returnType")) {
+        returnType = jsonDecoder._decodeString(jsonPath + ".returnType", json["returnType"]);
+      }
+      List<String> parameterNames;
+      if (json.containsKey("parameterNames")) {
+        parameterNames = jsonDecoder._decodeList(jsonPath + ".parameterNames", json["parameterNames"], jsonDecoder._decodeString);
+      } else {
+        parameterNames = <String>[];
+      }
+      List<String> parameterTypes;
+      if (json.containsKey("parameterTypes")) {
+        parameterTypes = jsonDecoder._decodeList(jsonPath + ".parameterTypes", json["parameterTypes"], jsonDecoder._decodeString);
+      } else {
+        parameterTypes = <String>[];
+      }
+      int requiredParameterCount;
+      if (json.containsKey("requiredParameterCount")) {
+        requiredParameterCount = jsonDecoder._decodeInt(jsonPath + ".requiredParameterCount", json["requiredParameterCount"]);
+      }
+      int positionalParameterCount;
+      if (json.containsKey("positionalParameterCount")) {
+        positionalParameterCount = jsonDecoder._decodeInt(jsonPath + ".positionalParameterCount", json["positionalParameterCount"]);
+      }
+      String parameterName;
+      if (json.containsKey("parameterName")) {
+        parameterName = jsonDecoder._decodeString(jsonPath + ".parameterName", json["parameterName"]);
+      }
+      String parameterType;
+      if (json.containsKey("parameterType")) {
+        parameterType = jsonDecoder._decodeString(jsonPath + ".parameterType", json["parameterType"]);
+      }
+      return new CompletionSuggestion(kind, relevance, completion, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary: docSummary, docComplete: docComplete, declaringType: declaringType, element: element, returnType: returnType, parameterNames: parameterNames, parameterTypes: parameterTypes, requiredParameterCount: requiredParameterCount, positionalParameterCount: positionalParameterCount, parameterName: parameterName, parameterType: parameterType);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "CompletionSuggestion");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kind"] = kind.toJson();
+    result["relevance"] = relevance.toJson();
+    result["completion"] = completion;
+    result["selectionOffset"] = selectionOffset;
+    result["selectionLength"] = selectionLength;
+    result["isDeprecated"] = isDeprecated;
+    result["isPotential"] = isPotential;
+    if (docSummary != null) {
+      result["docSummary"] = docSummary;
+    }
+    if (docComplete != null) {
+      result["docComplete"] = docComplete;
+    }
+    if (declaringType != null) {
+      result["declaringType"] = declaringType;
+    }
+    if (element != null) {
+      result["element"] = element.toJson();
+    }
+    if (returnType != null) {
+      result["returnType"] = returnType;
+    }
+    if (parameterNames.isNotEmpty) {
+      result["parameterNames"] = parameterNames;
+    }
+    if (parameterTypes.isNotEmpty) {
+      result["parameterTypes"] = parameterTypes;
+    }
+    if (requiredParameterCount != null) {
+      result["requiredParameterCount"] = requiredParameterCount;
+    }
+    if (positionalParameterCount != null) {
+      result["positionalParameterCount"] = positionalParameterCount;
+    }
+    if (parameterName != null) {
+      result["parameterName"] = parameterName;
+    }
+    if (parameterType != null) {
+      result["parameterType"] = parameterType;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is CompletionSuggestion) {
+      return kind == other.kind &&
+          relevance == other.relevance &&
+          completion == other.completion &&
+          selectionOffset == other.selectionOffset &&
+          selectionLength == other.selectionLength &&
+          isDeprecated == other.isDeprecated &&
+          isPotential == other.isPotential &&
+          docSummary == other.docSummary &&
+          docComplete == other.docComplete &&
+          declaringType == other.declaringType &&
+          element == other.element &&
+          returnType == other.returnType &&
+          _listEqual(parameterNames, other.parameterNames, (String a, String b) => a == b) &&
+          _listEqual(parameterTypes, other.parameterTypes, (String a, String b) => a == b) &&
+          requiredParameterCount == other.requiredParameterCount &&
+          positionalParameterCount == other.positionalParameterCount &&
+          parameterName == other.parameterName &&
+          parameterType == other.parameterType;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, relevance.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, completion.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, selectionOffset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, selectionLength.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, isDeprecated.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, isPotential.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, docSummary.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, docComplete.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, declaringType.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, element.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, returnType.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameterNames.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameterTypes.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, requiredParameterCount.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, positionalParameterCount.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameterName.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameterType.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * CompletionSuggestionKind
+ *
+ * enum {
+ *   ARGUMENT_LIST
+ *   CLASS
+ *   CLASS_ALIAS
+ *   CONSTRUCTOR
+ *   FIELD
+ *   FUNCTION
+ *   FUNCTION_TYPE_ALIAS
+ *   GETTER
+ *   IMPORT
+ *   KEYWORD
+ *   LABEL
+ *   LIBRARY_PREFIX
+ *   LOCAL_VARIABLE
+ *   METHOD
+ *   METHOD_NAME
+ *   NAMED_ARGUMENT
+ *   OPTIONAL_ARGUMENT
+ *   PARAMETER
+ *   SETTER
+ *   TOP_LEVEL_VARIABLE
+ *   TYPE_PARAMETER
+ * }
+ */
+class CompletionSuggestionKind {
+  static const ARGUMENT_LIST = const CompletionSuggestionKind._("ARGUMENT_LIST");
+
+  static const CLASS = const CompletionSuggestionKind._("CLASS");
+
+  static const CLASS_ALIAS = const CompletionSuggestionKind._("CLASS_ALIAS");
+
+  static const CONSTRUCTOR = const CompletionSuggestionKind._("CONSTRUCTOR");
+
+  static const FIELD = const CompletionSuggestionKind._("FIELD");
+
+  static const FUNCTION = const CompletionSuggestionKind._("FUNCTION");
+
+  static const FUNCTION_TYPE_ALIAS = const CompletionSuggestionKind._("FUNCTION_TYPE_ALIAS");
+
+  static const GETTER = const CompletionSuggestionKind._("GETTER");
+
+  static const IMPORT = const CompletionSuggestionKind._("IMPORT");
+
+  static const KEYWORD = const CompletionSuggestionKind._("KEYWORD");
+
+  static const LABEL = const CompletionSuggestionKind._("LABEL");
+
+  static const LIBRARY_PREFIX = const CompletionSuggestionKind._("LIBRARY_PREFIX");
+
+  static const LOCAL_VARIABLE = const CompletionSuggestionKind._("LOCAL_VARIABLE");
+
+  static const METHOD = const CompletionSuggestionKind._("METHOD");
+
+  static const METHOD_NAME = const CompletionSuggestionKind._("METHOD_NAME");
+
+  static const NAMED_ARGUMENT = const CompletionSuggestionKind._("NAMED_ARGUMENT");
+
+  static const OPTIONAL_ARGUMENT = const CompletionSuggestionKind._("OPTIONAL_ARGUMENT");
+
+  static const PARAMETER = const CompletionSuggestionKind._("PARAMETER");
+
+  static const SETTER = const CompletionSuggestionKind._("SETTER");
+
+  static const TOP_LEVEL_VARIABLE = const CompletionSuggestionKind._("TOP_LEVEL_VARIABLE");
+
+  static const TYPE_PARAMETER = const CompletionSuggestionKind._("TYPE_PARAMETER");
+
+  final String name;
+
+  const CompletionSuggestionKind._(this.name);
+
+  factory CompletionSuggestionKind(String name) {
+    switch (name) {
+      case "ARGUMENT_LIST":
+        return ARGUMENT_LIST;
+      case "CLASS":
+        return CLASS;
+      case "CLASS_ALIAS":
+        return CLASS_ALIAS;
+      case "CONSTRUCTOR":
+        return CONSTRUCTOR;
+      case "FIELD":
+        return FIELD;
+      case "FUNCTION":
+        return FUNCTION;
+      case "FUNCTION_TYPE_ALIAS":
+        return FUNCTION_TYPE_ALIAS;
+      case "GETTER":
+        return GETTER;
+      case "IMPORT":
+        return IMPORT;
+      case "KEYWORD":
+        return KEYWORD;
+      case "LABEL":
+        return LABEL;
+      case "LIBRARY_PREFIX":
+        return LIBRARY_PREFIX;
+      case "LOCAL_VARIABLE":
+        return LOCAL_VARIABLE;
+      case "METHOD":
+        return METHOD;
+      case "METHOD_NAME":
+        return METHOD_NAME;
+      case "NAMED_ARGUMENT":
+        return NAMED_ARGUMENT;
+      case "OPTIONAL_ARGUMENT":
+        return OPTIONAL_ARGUMENT;
+      case "PARAMETER":
+        return PARAMETER;
+      case "SETTER":
+        return SETTER;
+      case "TOP_LEVEL_VARIABLE":
+        return TOP_LEVEL_VARIABLE;
+      case "TYPE_PARAMETER":
+        return TYPE_PARAMETER;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory CompletionSuggestionKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new CompletionSuggestionKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "CompletionSuggestionKind");
+  }
+
+  @override
+  String toString() => "CompletionSuggestionKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * Element
+ *
+ * {
+ *   "kind": ElementKind
+ *   "name": String
+ *   "location": optional Location
+ *   "flags": int
+ *   "parameters": optional String
+ *   "returnType": optional String
+ * }
+ */
+class Element implements HasToJson {
+  static const int FLAG_ABSTRACT = 0x01;
+  static const int FLAG_CONST = 0x02;
+  static const int FLAG_FINAL = 0x04;
+  static const int FLAG_STATIC = 0x08;
+  static const int FLAG_PRIVATE = 0x10;
+  static const int FLAG_DEPRECATED = 0x20;
+
+  static int makeFlags({isAbstract: false, isConst: false, isFinal: false, isStatic: false, isPrivate: false, isDeprecated: false}) {
+    int flags = 0;
+    if (isAbstract) flags |= FLAG_ABSTRACT;
+    if (isConst) flags |= FLAG_CONST;
+    if (isFinal) flags |= FLAG_FINAL;
+    if (isStatic) flags |= FLAG_STATIC;
+    if (isPrivate) flags |= FLAG_PRIVATE;
+    if (isDeprecated) flags |= FLAG_DEPRECATED;
+    return flags;
+  }
+
+  /**
+   * The kind of the element.
+   */
+  ElementKind kind;
+
+  /**
+   * The name of the element. This is typically used as the label in the
+   * outline.
+   */
+  String name;
+
+  /**
+   * The location of the name in the declaration of the element.
+   */
+  Location location;
+
+  /**
+   * A bit-map containing the following flags:
+   *
+   * - 0x01 - set if the element is explicitly or implicitly abstract
+   * - 0x02 - set if the element was declared to be ‘const’
+   * - 0x04 - set if the element was declared to be ‘final’
+   * - 0x08 - set if the element is a static member of a class or is a
+   *   top-level function or field
+   * - 0x10 - set if the element is private
+   * - 0x20 - set if the element is deprecated
+   */
+  int flags;
+
+  /**
+   * The parameter list for the element. If the element is not a method or
+   * function this field will not be defined. If the element has zero
+   * parameters, this field will have a value of "()".
+   */
+  String parameters;
+
+  /**
+   * The return type of the element. If the element is not a method or function
+   * this field will not be defined. If the element does not have a declared
+   * return type, this field will contain an empty string.
+   */
+  String returnType;
+
+  Element(this.kind, this.name, this.flags, {this.location, this.parameters, this.returnType});
+
+  factory Element.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      ElementKind kind;
+      if (json.containsKey("kind")) {
+        kind = new ElementKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      Location location;
+      if (json.containsKey("location")) {
+        location = new Location.fromJson(jsonDecoder, jsonPath + ".location", json["location"]);
+      }
+      int flags;
+      if (json.containsKey("flags")) {
+        flags = jsonDecoder._decodeInt(jsonPath + ".flags", json["flags"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "flags");
+      }
+      String parameters;
+      if (json.containsKey("parameters")) {
+        parameters = jsonDecoder._decodeString(jsonPath + ".parameters", json["parameters"]);
+      }
+      String returnType;
+      if (json.containsKey("returnType")) {
+        returnType = jsonDecoder._decodeString(jsonPath + ".returnType", json["returnType"]);
+      }
+      return new Element(kind, name, flags, location: location, parameters: parameters, returnType: returnType);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Element");
+    }
+  }
+
+  bool get isAbstract => (flags & FLAG_ABSTRACT) != 0;
+  bool get isConst => (flags & FLAG_CONST) != 0;
+  bool get isFinal => (flags & FLAG_FINAL) != 0;
+  bool get isStatic => (flags & FLAG_STATIC) != 0;
+  bool get isPrivate => (flags & FLAG_PRIVATE) != 0;
+  bool get isDeprecated => (flags & FLAG_DEPRECATED) != 0;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kind"] = kind.toJson();
+    result["name"] = name;
+    if (location != null) {
+      result["location"] = location.toJson();
+    }
+    result["flags"] = flags;
+    if (parameters != null) {
+      result["parameters"] = parameters;
+    }
+    if (returnType != null) {
+      result["returnType"] = returnType;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Element) {
+      return kind == other.kind &&
+          name == other.name &&
+          location == other.location &&
+          flags == other.flags &&
+          parameters == other.parameters &&
+          returnType == other.returnType;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, location.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, flags.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameters.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, returnType.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * ElementKind
+ *
+ * enum {
+ *   CLASS
+ *   CLASS_TYPE_ALIAS
+ *   COMPILATION_UNIT
+ *   CONSTRUCTOR
+ *   FIELD
+ *   FUNCTION
+ *   FUNCTION_TYPE_ALIAS
+ *   GETTER
+ *   LABEL
+ *   LIBRARY
+ *   LOCAL_VARIABLE
+ *   METHOD
+ *   PARAMETER
+ *   SETTER
+ *   TOP_LEVEL_VARIABLE
+ *   TYPE_PARAMETER
+ *   UNIT_TEST_GROUP
+ *   UNIT_TEST_TEST
+ *   UNKNOWN
+ * }
+ */
+class ElementKind {
+  static const CLASS = const ElementKind._("CLASS");
+
+  static const CLASS_TYPE_ALIAS = const ElementKind._("CLASS_TYPE_ALIAS");
+
+  static const COMPILATION_UNIT = const ElementKind._("COMPILATION_UNIT");
+
+  static const CONSTRUCTOR = const ElementKind._("CONSTRUCTOR");
+
+  static const FIELD = const ElementKind._("FIELD");
+
+  static const FUNCTION = const ElementKind._("FUNCTION");
+
+  static const FUNCTION_TYPE_ALIAS = const ElementKind._("FUNCTION_TYPE_ALIAS");
+
+  static const GETTER = const ElementKind._("GETTER");
+
+  static const LABEL = const ElementKind._("LABEL");
+
+  static const LIBRARY = const ElementKind._("LIBRARY");
+
+  static const LOCAL_VARIABLE = const ElementKind._("LOCAL_VARIABLE");
+
+  static const METHOD = const ElementKind._("METHOD");
+
+  static const PARAMETER = const ElementKind._("PARAMETER");
+
+  static const SETTER = const ElementKind._("SETTER");
+
+  static const TOP_LEVEL_VARIABLE = const ElementKind._("TOP_LEVEL_VARIABLE");
+
+  static const TYPE_PARAMETER = const ElementKind._("TYPE_PARAMETER");
+
+  static const UNIT_TEST_GROUP = const ElementKind._("UNIT_TEST_GROUP");
+
+  static const UNIT_TEST_TEST = const ElementKind._("UNIT_TEST_TEST");
+
+  static const UNKNOWN = const ElementKind._("UNKNOWN");
+
+  final String name;
+
+  const ElementKind._(this.name);
+
+  factory ElementKind(String name) {
+    switch (name) {
+      case "CLASS":
+        return CLASS;
+      case "CLASS_TYPE_ALIAS":
+        return CLASS_TYPE_ALIAS;
+      case "COMPILATION_UNIT":
+        return COMPILATION_UNIT;
+      case "CONSTRUCTOR":
+        return CONSTRUCTOR;
+      case "FIELD":
+        return FIELD;
+      case "FUNCTION":
+        return FUNCTION;
+      case "FUNCTION_TYPE_ALIAS":
+        return FUNCTION_TYPE_ALIAS;
+      case "GETTER":
+        return GETTER;
+      case "LABEL":
+        return LABEL;
+      case "LIBRARY":
+        return LIBRARY;
+      case "LOCAL_VARIABLE":
+        return LOCAL_VARIABLE;
+      case "METHOD":
+        return METHOD;
+      case "PARAMETER":
+        return PARAMETER;
+      case "SETTER":
+        return SETTER;
+      case "TOP_LEVEL_VARIABLE":
+        return TOP_LEVEL_VARIABLE;
+      case "TYPE_PARAMETER":
+        return TYPE_PARAMETER;
+      case "UNIT_TEST_GROUP":
+        return UNIT_TEST_GROUP;
+      case "UNIT_TEST_TEST":
+        return UNIT_TEST_TEST;
+      case "UNKNOWN":
+        return UNKNOWN;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory ElementKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new ElementKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "ElementKind");
+  }
+
+  @override
+  String toString() => "ElementKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * ExecutableFile
+ *
+ * {
+ *   "file": FilePath
+ *   "kind": ExecutableKind
+ * }
+ */
+class ExecutableFile implements HasToJson {
+  /**
+   * The path of the executable file.
+   */
+  String file;
+
+  /**
+   * The kind of the executable file.
+   */
+  ExecutableKind kind;
+
+  ExecutableFile(this.file, this.kind);
+
+  factory ExecutableFile.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      ExecutableKind kind;
+      if (json.containsKey("kind")) {
+        kind = new ExecutableKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      return new ExecutableFile(file, kind);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "ExecutableFile");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["kind"] = kind.toJson();
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExecutableFile) {
+      return file == other.file &&
+          kind == other.kind;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * ExecutableKind
+ *
+ * enum {
+ *   CLIENT
+ *   EITHER
+ *   SERVER
+ * }
+ */
+class ExecutableKind {
+  static const CLIENT = const ExecutableKind._("CLIENT");
+
+  static const EITHER = const ExecutableKind._("EITHER");
+
+  static const SERVER = const ExecutableKind._("SERVER");
+
+  final String name;
+
+  const ExecutableKind._(this.name);
+
+  factory ExecutableKind(String name) {
+    switch (name) {
+      case "CLIENT":
+        return CLIENT;
+      case "EITHER":
+        return EITHER;
+      case "SERVER":
+        return SERVER;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory ExecutableKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new ExecutableKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "ExecutableKind");
+  }
+
+  @override
+  String toString() => "ExecutableKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * ExecutionService
+ *
+ * enum {
+ *   LAUNCH_DATA
+ * }
+ */
+class ExecutionService {
+  static const LAUNCH_DATA = const ExecutionService._("LAUNCH_DATA");
+
+  final String name;
+
+  const ExecutionService._(this.name);
+
+  factory ExecutionService(String name) {
+    switch (name) {
+      case "LAUNCH_DATA":
+        return LAUNCH_DATA;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory ExecutionService.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new ExecutionService(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "ExecutionService");
+  }
+
+  @override
+  String toString() => "ExecutionService.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * FoldingKind
+ *
+ * enum {
+ *   COMMENT
+ *   CLASS_MEMBER
+ *   DIRECTIVES
+ *   DOCUMENTATION_COMMENT
+ *   TOP_LEVEL_DECLARATION
+ * }
+ */
+class FoldingKind {
+  static const COMMENT = const FoldingKind._("COMMENT");
+
+  static const CLASS_MEMBER = const FoldingKind._("CLASS_MEMBER");
+
+  static const DIRECTIVES = const FoldingKind._("DIRECTIVES");
+
+  static const DOCUMENTATION_COMMENT = const FoldingKind._("DOCUMENTATION_COMMENT");
+
+  static const TOP_LEVEL_DECLARATION = const FoldingKind._("TOP_LEVEL_DECLARATION");
+
+  final String name;
+
+  const FoldingKind._(this.name);
+
+  factory FoldingKind(String name) {
+    switch (name) {
+      case "COMMENT":
+        return COMMENT;
+      case "CLASS_MEMBER":
+        return CLASS_MEMBER;
+      case "DIRECTIVES":
+        return DIRECTIVES;
+      case "DOCUMENTATION_COMMENT":
+        return DOCUMENTATION_COMMENT;
+      case "TOP_LEVEL_DECLARATION":
+        return TOP_LEVEL_DECLARATION;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory FoldingKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new FoldingKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "FoldingKind");
+  }
+
+  @override
+  String toString() => "FoldingKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * FoldingRegion
+ *
+ * {
+ *   "kind": FoldingKind
+ *   "offset": int
+ *   "length": int
+ * }
+ */
+class FoldingRegion implements HasToJson {
+  /**
+   * The kind of the region.
+   */
+  FoldingKind kind;
+
+  /**
+   * The offset of the region to be folded.
+   */
+  int offset;
+
+  /**
+   * The length of the region to be folded.
+   */
+  int length;
+
+  FoldingRegion(this.kind, this.offset, this.length);
+
+  factory FoldingRegion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      FoldingKind kind;
+      if (json.containsKey("kind")) {
+        kind = new FoldingKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      return new FoldingRegion(kind, offset, length);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "FoldingRegion");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kind"] = kind.toJson();
+    result["offset"] = offset;
+    result["length"] = length;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is FoldingRegion) {
+      return kind == other.kind &&
+          offset == other.offset &&
+          length == other.length;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * HighlightRegion
+ *
+ * {
+ *   "type": HighlightRegionType
+ *   "offset": int
+ *   "length": int
+ * }
+ */
+class HighlightRegion implements HasToJson {
+  /**
+   * The type of highlight associated with the region.
+   */
+  HighlightRegionType type;
+
+  /**
+   * The offset of the region to be highlighted.
+   */
+  int offset;
+
+  /**
+   * The length of the region to be highlighted.
+   */
+  int length;
+
+  HighlightRegion(this.type, this.offset, this.length);
+
+  factory HighlightRegion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      HighlightRegionType type;
+      if (json.containsKey("type")) {
+        type = new HighlightRegionType.fromJson(jsonDecoder, jsonPath + ".type", json["type"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "type");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      return new HighlightRegion(type, offset, length);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "HighlightRegion");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["type"] = type.toJson();
+    result["offset"] = offset;
+    result["length"] = length;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is HighlightRegion) {
+      return type == other.type &&
+          offset == other.offset &&
+          length == other.length;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, type.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * HighlightRegionType
+ *
+ * enum {
+ *   ANNOTATION
+ *   BUILT_IN
+ *   CLASS
+ *   COMMENT_BLOCK
+ *   COMMENT_DOCUMENTATION
+ *   COMMENT_END_OF_LINE
+ *   CONSTRUCTOR
+ *   DIRECTIVE
+ *   DYNAMIC_TYPE
+ *   FIELD
+ *   FIELD_STATIC
+ *   FUNCTION
+ *   FUNCTION_DECLARATION
+ *   FUNCTION_TYPE_ALIAS
+ *   GETTER_DECLARATION
+ *   IDENTIFIER_DEFAULT
+ *   IMPORT_PREFIX
+ *   KEYWORD
+ *   LABEL
+ *   LITERAL_BOOLEAN
+ *   LITERAL_DOUBLE
+ *   LITERAL_INTEGER
+ *   LITERAL_LIST
+ *   LITERAL_MAP
+ *   LITERAL_STRING
+ *   LOCAL_VARIABLE
+ *   LOCAL_VARIABLE_DECLARATION
+ *   METHOD
+ *   METHOD_DECLARATION
+ *   METHOD_DECLARATION_STATIC
+ *   METHOD_STATIC
+ *   PARAMETER
+ *   SETTER_DECLARATION
+ *   TOP_LEVEL_VARIABLE
+ *   TYPE_NAME_DYNAMIC
+ *   TYPE_PARAMETER
+ * }
+ */
+class HighlightRegionType {
+  static const ANNOTATION = const HighlightRegionType._("ANNOTATION");
+
+  static const BUILT_IN = const HighlightRegionType._("BUILT_IN");
+
+  static const CLASS = const HighlightRegionType._("CLASS");
+
+  static const COMMENT_BLOCK = const HighlightRegionType._("COMMENT_BLOCK");
+
+  static const COMMENT_DOCUMENTATION = const HighlightRegionType._("COMMENT_DOCUMENTATION");
+
+  static const COMMENT_END_OF_LINE = const HighlightRegionType._("COMMENT_END_OF_LINE");
+
+  static const CONSTRUCTOR = const HighlightRegionType._("CONSTRUCTOR");
+
+  static const DIRECTIVE = const HighlightRegionType._("DIRECTIVE");
+
+  static const DYNAMIC_TYPE = const HighlightRegionType._("DYNAMIC_TYPE");
+
+  static const FIELD = const HighlightRegionType._("FIELD");
+
+  static const FIELD_STATIC = const HighlightRegionType._("FIELD_STATIC");
+
+  static const FUNCTION = const HighlightRegionType._("FUNCTION");
+
+  static const FUNCTION_DECLARATION = const HighlightRegionType._("FUNCTION_DECLARATION");
+
+  static const FUNCTION_TYPE_ALIAS = const HighlightRegionType._("FUNCTION_TYPE_ALIAS");
+
+  static const GETTER_DECLARATION = const HighlightRegionType._("GETTER_DECLARATION");
+
+  static const IDENTIFIER_DEFAULT = const HighlightRegionType._("IDENTIFIER_DEFAULT");
+
+  static const IMPORT_PREFIX = const HighlightRegionType._("IMPORT_PREFIX");
+
+  static const KEYWORD = const HighlightRegionType._("KEYWORD");
+
+  static const LABEL = const HighlightRegionType._("LABEL");
+
+  static const LITERAL_BOOLEAN = const HighlightRegionType._("LITERAL_BOOLEAN");
+
+  static const LITERAL_DOUBLE = const HighlightRegionType._("LITERAL_DOUBLE");
+
+  static const LITERAL_INTEGER = const HighlightRegionType._("LITERAL_INTEGER");
+
+  static const LITERAL_LIST = const HighlightRegionType._("LITERAL_LIST");
+
+  static const LITERAL_MAP = const HighlightRegionType._("LITERAL_MAP");
+
+  static const LITERAL_STRING = const HighlightRegionType._("LITERAL_STRING");
+
+  static const LOCAL_VARIABLE = const HighlightRegionType._("LOCAL_VARIABLE");
+
+  static const LOCAL_VARIABLE_DECLARATION = const HighlightRegionType._("LOCAL_VARIABLE_DECLARATION");
+
+  static const METHOD = const HighlightRegionType._("METHOD");
+
+  static const METHOD_DECLARATION = const HighlightRegionType._("METHOD_DECLARATION");
+
+  static const METHOD_DECLARATION_STATIC = const HighlightRegionType._("METHOD_DECLARATION_STATIC");
+
+  static const METHOD_STATIC = const HighlightRegionType._("METHOD_STATIC");
+
+  static const PARAMETER = const HighlightRegionType._("PARAMETER");
+
+  static const SETTER_DECLARATION = const HighlightRegionType._("SETTER_DECLARATION");
+
+  static const TOP_LEVEL_VARIABLE = const HighlightRegionType._("TOP_LEVEL_VARIABLE");
+
+  static const TYPE_NAME_DYNAMIC = const HighlightRegionType._("TYPE_NAME_DYNAMIC");
+
+  static const TYPE_PARAMETER = const HighlightRegionType._("TYPE_PARAMETER");
+
+  final String name;
+
+  const HighlightRegionType._(this.name);
+
+  factory HighlightRegionType(String name) {
+    switch (name) {
+      case "ANNOTATION":
+        return ANNOTATION;
+      case "BUILT_IN":
+        return BUILT_IN;
+      case "CLASS":
+        return CLASS;
+      case "COMMENT_BLOCK":
+        return COMMENT_BLOCK;
+      case "COMMENT_DOCUMENTATION":
+        return COMMENT_DOCUMENTATION;
+      case "COMMENT_END_OF_LINE":
+        return COMMENT_END_OF_LINE;
+      case "CONSTRUCTOR":
+        return CONSTRUCTOR;
+      case "DIRECTIVE":
+        return DIRECTIVE;
+      case "DYNAMIC_TYPE":
+        return DYNAMIC_TYPE;
+      case "FIELD":
+        return FIELD;
+      case "FIELD_STATIC":
+        return FIELD_STATIC;
+      case "FUNCTION":
+        return FUNCTION;
+      case "FUNCTION_DECLARATION":
+        return FUNCTION_DECLARATION;
+      case "FUNCTION_TYPE_ALIAS":
+        return FUNCTION_TYPE_ALIAS;
+      case "GETTER_DECLARATION":
+        return GETTER_DECLARATION;
+      case "IDENTIFIER_DEFAULT":
+        return IDENTIFIER_DEFAULT;
+      case "IMPORT_PREFIX":
+        return IMPORT_PREFIX;
+      case "KEYWORD":
+        return KEYWORD;
+      case "LABEL":
+        return LABEL;
+      case "LITERAL_BOOLEAN":
+        return LITERAL_BOOLEAN;
+      case "LITERAL_DOUBLE":
+        return LITERAL_DOUBLE;
+      case "LITERAL_INTEGER":
+        return LITERAL_INTEGER;
+      case "LITERAL_LIST":
+        return LITERAL_LIST;
+      case "LITERAL_MAP":
+        return LITERAL_MAP;
+      case "LITERAL_STRING":
+        return LITERAL_STRING;
+      case "LOCAL_VARIABLE":
+        return LOCAL_VARIABLE;
+      case "LOCAL_VARIABLE_DECLARATION":
+        return LOCAL_VARIABLE_DECLARATION;
+      case "METHOD":
+        return METHOD;
+      case "METHOD_DECLARATION":
+        return METHOD_DECLARATION;
+      case "METHOD_DECLARATION_STATIC":
+        return METHOD_DECLARATION_STATIC;
+      case "METHOD_STATIC":
+        return METHOD_STATIC;
+      case "PARAMETER":
+        return PARAMETER;
+      case "SETTER_DECLARATION":
+        return SETTER_DECLARATION;
+      case "TOP_LEVEL_VARIABLE":
+        return TOP_LEVEL_VARIABLE;
+      case "TYPE_NAME_DYNAMIC":
+        return TYPE_NAME_DYNAMIC;
+      case "TYPE_PARAMETER":
+        return TYPE_PARAMETER;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory HighlightRegionType.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new HighlightRegionType(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "HighlightRegionType");
+  }
+
+  @override
+  String toString() => "HighlightRegionType.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * HoverInformation
+ *
+ * {
+ *   "offset": int
+ *   "length": int
+ *   "containingLibraryPath": optional String
+ *   "containingLibraryName": optional String
+ *   "dartdoc": optional String
+ *   "elementDescription": optional String
+ *   "elementKind": optional String
+ *   "parameter": optional String
+ *   "propagatedType": optional String
+ *   "staticType": optional String
+ * }
+ */
+class HoverInformation implements HasToJson {
+  /**
+   * The offset of the range of characters that encompases the cursor position
+   * and has the same hover information as the cursor position.
+   */
+  int offset;
+
+  /**
+   * The length of the range of characters that encompases the cursor position
+   * and has the same hover information as the cursor position.
+   */
+  int length;
+
+  /**
+   * The path to the defining compilation unit of the library in which the
+   * referenced element is declared. This data is omitted if there is no
+   * referenced element, or if the element is declared inside an HTML file.
+   */
+  String containingLibraryPath;
+
+  /**
+   * The name of the library in which the referenced element is declared. This
+   * data is omitted if there is no referenced element, or if the element is
+   * declared inside an HTML file.
+   */
+  String containingLibraryName;
+
+  /**
+   * The dartdoc associated with the referenced element. Other than the removal
+   * of the comment delimiters, including leading asterisks in the case of a
+   * block comment, the dartdoc is unprocessed markdown. This data is omitted
+   * if there is no referenced element, or if the element has no dartdoc.
+   */
+  String dartdoc;
+
+  /**
+   * A human-readable description of the element being referenced. This data is
+   * omitted if there is no referenced element.
+   */
+  String elementDescription;
+
+  /**
+   * A human-readable description of the kind of element being referenced (such
+   * as “class” or “function type alias”). This data is omitted if there is no
+   * referenced element.
+   */
+  String elementKind;
+
+  /**
+   * A human-readable description of the parameter corresponding to the
+   * expression being hovered over. This data is omitted if the location is not
+   * in an argument to a function.
+   */
+  String parameter;
+
+  /**
+   * The name of the propagated type of the expression. This data is omitted if
+   * the location does not correspond to an expression or if there is no
+   * propagated type information.
+   */
+  String propagatedType;
+
+  /**
+   * The name of the static type of the expression. This data is omitted if the
+   * location does not correspond to an expression.
+   */
+  String staticType;
+
+  HoverInformation(this.offset, this.length, {this.containingLibraryPath, this.containingLibraryName, this.dartdoc, this.elementDescription, this.elementKind, this.parameter, this.propagatedType, this.staticType});
+
+  factory HoverInformation.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      String containingLibraryPath;
+      if (json.containsKey("containingLibraryPath")) {
+        containingLibraryPath = jsonDecoder._decodeString(jsonPath + ".containingLibraryPath", json["containingLibraryPath"]);
+      }
+      String containingLibraryName;
+      if (json.containsKey("containingLibraryName")) {
+        containingLibraryName = jsonDecoder._decodeString(jsonPath + ".containingLibraryName", json["containingLibraryName"]);
+      }
+      String dartdoc;
+      if (json.containsKey("dartdoc")) {
+        dartdoc = jsonDecoder._decodeString(jsonPath + ".dartdoc", json["dartdoc"]);
+      }
+      String elementDescription;
+      if (json.containsKey("elementDescription")) {
+        elementDescription = jsonDecoder._decodeString(jsonPath + ".elementDescription", json["elementDescription"]);
+      }
+      String elementKind;
+      if (json.containsKey("elementKind")) {
+        elementKind = jsonDecoder._decodeString(jsonPath + ".elementKind", json["elementKind"]);
+      }
+      String parameter;
+      if (json.containsKey("parameter")) {
+        parameter = jsonDecoder._decodeString(jsonPath + ".parameter", json["parameter"]);
+      }
+      String propagatedType;
+      if (json.containsKey("propagatedType")) {
+        propagatedType = jsonDecoder._decodeString(jsonPath + ".propagatedType", json["propagatedType"]);
+      }
+      String staticType;
+      if (json.containsKey("staticType")) {
+        staticType = jsonDecoder._decodeString(jsonPath + ".staticType", json["staticType"]);
+      }
+      return new HoverInformation(offset, length, containingLibraryPath: containingLibraryPath, containingLibraryName: containingLibraryName, dartdoc: dartdoc, elementDescription: elementDescription, elementKind: elementKind, parameter: parameter, propagatedType: propagatedType, staticType: staticType);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "HoverInformation");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["offset"] = offset;
+    result["length"] = length;
+    if (containingLibraryPath != null) {
+      result["containingLibraryPath"] = containingLibraryPath;
+    }
+    if (containingLibraryName != null) {
+      result["containingLibraryName"] = containingLibraryName;
+    }
+    if (dartdoc != null) {
+      result["dartdoc"] = dartdoc;
+    }
+    if (elementDescription != null) {
+      result["elementDescription"] = elementDescription;
+    }
+    if (elementKind != null) {
+      result["elementKind"] = elementKind;
+    }
+    if (parameter != null) {
+      result["parameter"] = parameter;
+    }
+    if (propagatedType != null) {
+      result["propagatedType"] = propagatedType;
+    }
+    if (staticType != null) {
+      result["staticType"] = staticType;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is HoverInformation) {
+      return offset == other.offset &&
+          length == other.length &&
+          containingLibraryPath == other.containingLibraryPath &&
+          containingLibraryName == other.containingLibraryName &&
+          dartdoc == other.dartdoc &&
+          elementDescription == other.elementDescription &&
+          elementKind == other.elementKind &&
+          parameter == other.parameter &&
+          propagatedType == other.propagatedType &&
+          staticType == other.staticType;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, containingLibraryPath.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, containingLibraryName.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, dartdoc.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, elementDescription.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, elementKind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameter.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, propagatedType.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, staticType.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * LinkedEditGroup
+ *
+ * {
+ *   "positions": List<Position>
+ *   "length": int
+ *   "suggestions": List<LinkedEditSuggestion>
+ * }
+ */
+class LinkedEditGroup implements HasToJson {
+  /**
+   * The positions of the regions that should be edited simultaneously.
+   */
+  List<Position> positions;
+
+  /**
+   * The length of the regions that should be edited simultaneously.
+   */
+  int length;
+
+  /**
+   * Pre-computed suggestions for what every region might want to be changed
+   * to.
+   */
+  List<LinkedEditSuggestion> suggestions;
+
+  LinkedEditGroup(this.positions, this.length, this.suggestions);
+
+  factory LinkedEditGroup.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<Position> positions;
+      if (json.containsKey("positions")) {
+        positions = jsonDecoder._decodeList(jsonPath + ".positions", json["positions"], (String jsonPath, Object json) => new Position.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "positions");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      List<LinkedEditSuggestion> suggestions;
+      if (json.containsKey("suggestions")) {
+        suggestions = jsonDecoder._decodeList(jsonPath + ".suggestions", json["suggestions"], (String jsonPath, Object json) => new LinkedEditSuggestion.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "suggestions");
+      }
+      return new LinkedEditGroup(positions, length, suggestions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "LinkedEditGroup");
+    }
+  }
+
+  /**
+   * Construct an empty LinkedEditGroup.
+   */
+  LinkedEditGroup.empty() : this(<Position>[], 0, <LinkedEditSuggestion>[]);
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["positions"] = positions.map((Position value) => value.toJson()).toList();
+    result["length"] = length;
+    result["suggestions"] = suggestions.map((LinkedEditSuggestion value) => value.toJson()).toList();
+    return result;
+  }
+
+  /**
+   * Add a new position and change the length.
+   */
+  void addPosition(Position position, int length) {
+    positions.add(position);
+    this.length = length;
+  }
+
+  /**
+   * Add a new suggestion.
+   */
+  void addSuggestion(LinkedEditSuggestion suggestion) {
+    suggestions.add(suggestion);
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is LinkedEditGroup) {
+      return _listEqual(positions, other.positions, (Position a, Position b) => a == b) &&
+          length == other.length &&
+          _listEqual(suggestions, other.suggestions, (LinkedEditSuggestion a, LinkedEditSuggestion b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, positions.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, suggestions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * LinkedEditSuggestion
+ *
+ * {
+ *   "value": String
+ *   "kind": LinkedEditSuggestionKind
+ * }
+ */
+class LinkedEditSuggestion implements HasToJson {
+  /**
+   * The value that could be used to replace all of the linked edit regions.
+   */
+  String value;
+
+  /**
+   * The kind of value being proposed.
+   */
+  LinkedEditSuggestionKind kind;
+
+  LinkedEditSuggestion(this.value, this.kind);
+
+  factory LinkedEditSuggestion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String value;
+      if (json.containsKey("value")) {
+        value = jsonDecoder._decodeString(jsonPath + ".value", json["value"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "value");
+      }
+      LinkedEditSuggestionKind kind;
+      if (json.containsKey("kind")) {
+        kind = new LinkedEditSuggestionKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      return new LinkedEditSuggestion(value, kind);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "LinkedEditSuggestion");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["value"] = value;
+    result["kind"] = kind.toJson();
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is LinkedEditSuggestion) {
+      return value == other.value &&
+          kind == other.kind;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, value.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * LinkedEditSuggestionKind
+ *
+ * enum {
+ *   METHOD
+ *   PARAMETER
+ *   TYPE
+ *   VARIABLE
+ * }
+ */
+class LinkedEditSuggestionKind {
+  static const METHOD = const LinkedEditSuggestionKind._("METHOD");
+
+  static const PARAMETER = const LinkedEditSuggestionKind._("PARAMETER");
+
+  static const TYPE = const LinkedEditSuggestionKind._("TYPE");
+
+  static const VARIABLE = const LinkedEditSuggestionKind._("VARIABLE");
+
+  final String name;
+
+  const LinkedEditSuggestionKind._(this.name);
+
+  factory LinkedEditSuggestionKind(String name) {
+    switch (name) {
+      case "METHOD":
+        return METHOD;
+      case "PARAMETER":
+        return PARAMETER;
+      case "TYPE":
+        return TYPE;
+      case "VARIABLE":
+        return VARIABLE;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory LinkedEditSuggestionKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new LinkedEditSuggestionKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "LinkedEditSuggestionKind");
+  }
+
+  @override
+  String toString() => "LinkedEditSuggestionKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * Location
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ *   "length": int
+ *   "startLine": int
+ *   "startColumn": int
+ * }
+ */
+class Location implements HasToJson {
+  /**
+   * The file containing the range.
+   */
+  String file;
+
+  /**
+   * The offset of the range.
+   */
+  int offset;
+
+  /**
+   * The length of the range.
+   */
+  int length;
+
+  /**
+   * The one-based index of the line containing the first character of the
+   * range.
+   */
+  int startLine;
+
+  /**
+   * The one-based index of the column containing the first character of the
+   * range.
+   */
+  int startColumn;
+
+  Location(this.file, this.offset, this.length, this.startLine, this.startColumn);
+
+  factory Location.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      int startLine;
+      if (json.containsKey("startLine")) {
+        startLine = jsonDecoder._decodeInt(jsonPath + ".startLine", json["startLine"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "startLine");
+      }
+      int startColumn;
+      if (json.containsKey("startColumn")) {
+        startColumn = jsonDecoder._decodeInt(jsonPath + ".startColumn", json["startColumn"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "startColumn");
+      }
+      return new Location(file, offset, length, startLine, startColumn);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Location");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    result["length"] = length;
+    result["startLine"] = startLine;
+    result["startColumn"] = startColumn;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Location) {
+      return file == other.file &&
+          offset == other.offset &&
+          length == other.length &&
+          startLine == other.startLine &&
+          startColumn == other.startColumn;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, startLine.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, startColumn.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * NavigationRegion
+ *
+ * {
+ *   "offset": int
+ *   "length": int
+ *   "targets": List<Element>
+ * }
+ */
+class NavigationRegion implements HasToJson {
+  /**
+   * The offset of the region from which the user can navigate.
+   */
+  int offset;
+
+  /**
+   * The length of the region from which the user can navigate.
+   */
+  int length;
+
+  /**
+   * The elements to which the given region is bound. By opening the
+   * declaration of the elements, clients can implement one form of navigation.
+   */
+  List<Element> targets;
+
+  NavigationRegion(this.offset, this.length, this.targets);
+
+  factory NavigationRegion.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      List<Element> targets;
+      if (json.containsKey("targets")) {
+        targets = jsonDecoder._decodeList(jsonPath + ".targets", json["targets"], (String jsonPath, Object json) => new Element.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "targets");
+      }
+      return new NavigationRegion(offset, length, targets);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "NavigationRegion");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["offset"] = offset;
+    result["length"] = length;
+    result["targets"] = targets.map((Element value) => value.toJson()).toList();
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is NavigationRegion) {
+      return offset == other.offset &&
+          length == other.length &&
+          _listEqual(targets, other.targets, (Element a, Element b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, targets.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * Occurrences
+ *
+ * {
+ *   "element": Element
+ *   "offsets": List<int>
+ *   "length": int
+ * }
+ */
+class Occurrences implements HasToJson {
+  /**
+   * The element that was referenced.
+   */
+  Element element;
+
+  /**
+   * The offsets of the name of the referenced element within the file.
+   */
+  List<int> offsets;
+
+  /**
+   * The length of the name of the referenced element.
+   */
+  int length;
+
+  Occurrences(this.element, this.offsets, this.length);
+
+  factory Occurrences.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Element element;
+      if (json.containsKey("element")) {
+        element = new Element.fromJson(jsonDecoder, jsonPath + ".element", json["element"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "element");
+      }
+      List<int> offsets;
+      if (json.containsKey("offsets")) {
+        offsets = jsonDecoder._decodeList(jsonPath + ".offsets", json["offsets"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offsets");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      return new Occurrences(element, offsets, length);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Occurrences");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["element"] = element.toJson();
+    result["offsets"] = offsets;
+    result["length"] = length;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Occurrences) {
+      return element == other.element &&
+          _listEqual(offsets, other.offsets, (int a, int b) => a == b) &&
+          length == other.length;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, element.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offsets.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * Outline
+ *
+ * {
+ *   "element": Element
+ *   "offset": int
+ *   "length": int
+ *   "children": optional List<Outline>
+ * }
+ */
+class Outline implements HasToJson {
+  /**
+   * A description of the element represented by this node.
+   */
+  Element element;
+
+  /**
+   * The offset of the first character of the element. This is different than
+   * the offset in the Element, which if the offset of the name of the element.
+   * It can be used, for example, to map locations in the file back to an
+   * outline.
+   */
+  int offset;
+
+  /**
+   * The length of the element.
+   */
+  int length;
+
+  /**
+   * The children of the node. The field will be omitted if the node has no
+   * children.
+   */
+  List<Outline> children;
+
+  Outline(this.element, this.offset, this.length, {this.children}) {
+    if (children == null) {
+      children = <Outline>[];
+    }
+  }
+
+  factory Outline.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Element element;
+      if (json.containsKey("element")) {
+        element = new Element.fromJson(jsonDecoder, jsonPath + ".element", json["element"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "element");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      List<Outline> children;
+      if (json.containsKey("children")) {
+        children = jsonDecoder._decodeList(jsonPath + ".children", json["children"], (String jsonPath, Object json) => new Outline.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        children = <Outline>[];
+      }
+      return new Outline(element, offset, length, children: children);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Outline");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["element"] = element.toJson();
+    result["offset"] = offset;
+    result["length"] = length;
+    if (children.isNotEmpty) {
+      result["children"] = children.map((Outline value) => value.toJson()).toList();
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Outline) {
+      return element == other.element &&
+          offset == other.offset &&
+          length == other.length &&
+          _listEqual(children, other.children, (Outline a, Outline b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, element.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, children.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * Override
+ *
+ * {
+ *   "offset": int
+ *   "length": int
+ *   "superclassMember": optional OverriddenMember
+ *   "interfaceMembers": optional List<OverriddenMember>
+ * }
+ */
+class Override implements HasToJson {
+  /**
+   * The offset of the name of the overriding member.
+   */
+  int offset;
+
+  /**
+   * The length of the name of the overriding member.
+   */
+  int length;
+
+  /**
+   * The member inherited from a superclass that is overridden by the
+   * overriding member. The field is omitted if there is no superclass member,
+   * in which case there must be at least one interface member.
+   */
+  OverriddenMember superclassMember;
+
+  /**
+   * The members inherited from interfaces that are overridden by the
+   * overriding member. The field is omitted if there are no interface members,
+   * in which case there must be a superclass member.
+   */
+  List<OverriddenMember> interfaceMembers;
+
+  Override(this.offset, this.length, {this.superclassMember, this.interfaceMembers}) {
+    if (interfaceMembers == null) {
+      interfaceMembers = <OverriddenMember>[];
+    }
+  }
+
+  factory Override.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      OverriddenMember superclassMember;
+      if (json.containsKey("superclassMember")) {
+        superclassMember = new OverriddenMember.fromJson(jsonDecoder, jsonPath + ".superclassMember", json["superclassMember"]);
+      }
+      List<OverriddenMember> interfaceMembers;
+      if (json.containsKey("interfaceMembers")) {
+        interfaceMembers = jsonDecoder._decodeList(jsonPath + ".interfaceMembers", json["interfaceMembers"], (String jsonPath, Object json) => new OverriddenMember.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        interfaceMembers = <OverriddenMember>[];
+      }
+      return new Override(offset, length, superclassMember: superclassMember, interfaceMembers: interfaceMembers);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Override");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["offset"] = offset;
+    result["length"] = length;
+    if (superclassMember != null) {
+      result["superclassMember"] = superclassMember.toJson();
+    }
+    if (interfaceMembers.isNotEmpty) {
+      result["interfaceMembers"] = interfaceMembers.map((OverriddenMember value) => value.toJson()).toList();
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Override) {
+      return offset == other.offset &&
+          length == other.length &&
+          superclassMember == other.superclassMember &&
+          _listEqual(interfaceMembers, other.interfaceMembers, (OverriddenMember a, OverriddenMember b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, superclassMember.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, interfaceMembers.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * OverriddenMember
+ *
+ * {
+ *   "element": Element
+ *   "className": String
+ * }
+ */
+class OverriddenMember implements HasToJson {
+  /**
+   * The element that is being overridden.
+   */
+  Element element;
+
+  /**
+   * The name of the class in which the member is defined.
+   */
+  String className;
+
+  OverriddenMember(this.element, this.className);
+
+  factory OverriddenMember.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Element element;
+      if (json.containsKey("element")) {
+        element = new Element.fromJson(jsonDecoder, jsonPath + ".element", json["element"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "element");
+      }
+      String className;
+      if (json.containsKey("className")) {
+        className = jsonDecoder._decodeString(jsonPath + ".className", json["className"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "className");
+      }
+      return new OverriddenMember(element, className);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "OverriddenMember");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["element"] = element.toJson();
+    result["className"] = className;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is OverriddenMember) {
+      return element == other.element &&
+          className == other.className;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, element.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, className.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * Position
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ * }
+ */
+class Position implements HasToJson {
+  /**
+   * The file containing the position.
+   */
+  String file;
+
+  /**
+   * The offset of the position.
+   */
+  int offset;
+
+  Position(this.file, this.offset);
+
+  factory Position.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      return new Position(file, offset);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "Position");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is Position) {
+      return file == other.file &&
+          offset == other.offset;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * RefactoringKind
+ *
+ * enum {
+ *   CONVERT_GETTER_TO_METHOD
+ *   CONVERT_METHOD_TO_GETTER
+ *   EXTRACT_LOCAL_VARIABLE
+ *   EXTRACT_METHOD
+ *   INLINE_LOCAL_VARIABLE
+ *   INLINE_METHOD
+ *   RENAME
+ * }
+ */
+class RefactoringKind {
+  static const CONVERT_GETTER_TO_METHOD = const RefactoringKind._("CONVERT_GETTER_TO_METHOD");
+
+  static const CONVERT_METHOD_TO_GETTER = const RefactoringKind._("CONVERT_METHOD_TO_GETTER");
+
+  static const EXTRACT_LOCAL_VARIABLE = const RefactoringKind._("EXTRACT_LOCAL_VARIABLE");
+
+  static const EXTRACT_METHOD = const RefactoringKind._("EXTRACT_METHOD");
+
+  static const INLINE_LOCAL_VARIABLE = const RefactoringKind._("INLINE_LOCAL_VARIABLE");
+
+  static const INLINE_METHOD = const RefactoringKind._("INLINE_METHOD");
+
+  static const RENAME = const RefactoringKind._("RENAME");
+
+  final String name;
+
+  const RefactoringKind._(this.name);
+
+  factory RefactoringKind(String name) {
+    switch (name) {
+      case "CONVERT_GETTER_TO_METHOD":
+        return CONVERT_GETTER_TO_METHOD;
+      case "CONVERT_METHOD_TO_GETTER":
+        return CONVERT_METHOD_TO_GETTER;
+      case "EXTRACT_LOCAL_VARIABLE":
+        return EXTRACT_LOCAL_VARIABLE;
+      case "EXTRACT_METHOD":
+        return EXTRACT_METHOD;
+      case "INLINE_LOCAL_VARIABLE":
+        return INLINE_LOCAL_VARIABLE;
+      case "INLINE_METHOD":
+        return INLINE_METHOD;
+      case "RENAME":
+        return RENAME;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory RefactoringKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new RefactoringKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "RefactoringKind");
+  }
+
+  @override
+  String toString() => "RefactoringKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * RefactoringMethodParameter
+ *
+ * {
+ *   "id": optional String
+ *   "kind": RefactoringMethodParameterKind
+ *   "type": String
+ *   "name": String
+ *   "parameters": optional String
+ * }
+ */
+class RefactoringMethodParameter implements HasToJson {
+  /**
+   * The unique identifier of the parameter. Clients may omit this field for
+   * the parameters they want to add.
+   */
+  String id;
+
+  /**
+   * The kind of the parameter.
+   */
+  RefactoringMethodParameterKind kind;
+
+  /**
+   * The type that should be given to the parameter, or the return type of the
+   * parameter's function type.
+   */
+  String type;
+
+  /**
+   * The name that should be given to the parameter.
+   */
+  String name;
+
+  /**
+   * The parameter list of the parameter's function type. If the parameter is
+   * not of a function type, this field will not be defined. If the function
+   * type has zero parameters, this field will have a value of "()".
+   */
+  String parameters;
+
+  RefactoringMethodParameter(this.kind, this.type, this.name, {this.id, this.parameters});
+
+  factory RefactoringMethodParameter.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      }
+      RefactoringMethodParameterKind kind;
+      if (json.containsKey("kind")) {
+        kind = new RefactoringMethodParameterKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      String type;
+      if (json.containsKey("type")) {
+        type = jsonDecoder._decodeString(jsonPath + ".type", json["type"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "type");
+      }
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      String parameters;
+      if (json.containsKey("parameters")) {
+        parameters = jsonDecoder._decodeString(jsonPath + ".parameters", json["parameters"]);
+      }
+      return new RefactoringMethodParameter(kind, type, name, id: id, parameters: parameters);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "RefactoringMethodParameter");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (id != null) {
+      result["id"] = id;
+    }
+    result["kind"] = kind.toJson();
+    result["type"] = type;
+    result["name"] = name;
+    if (parameters != null) {
+      result["parameters"] = parameters;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RefactoringMethodParameter) {
+      return id == other.id &&
+          kind == other.kind &&
+          type == other.type &&
+          name == other.name &&
+          parameters == other.parameters;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, type.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameters.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * RefactoringFeedback
+ *
+ * {
+ * }
+ */
+class RefactoringFeedback implements HasToJson {
+  RefactoringFeedback();
+
+  factory RefactoringFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json, Map responseJson) {
+    return _refactoringFeedbackFromJson(jsonDecoder, jsonPath, json, responseJson);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RefactoringFeedback) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * RefactoringOptions
+ *
+ * {
+ * }
+ */
+class RefactoringOptions implements HasToJson {
+  RefactoringOptions();
+
+  factory RefactoringOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json, RefactoringKind kind) {
+    return _refactoringOptionsFromJson(jsonDecoder, jsonPath, json, kind);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RefactoringOptions) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * RefactoringMethodParameterKind
+ *
+ * enum {
+ *   REQUIRED
+ *   POSITIONAL
+ *   NAMED
+ * }
+ */
+class RefactoringMethodParameterKind {
+  static const REQUIRED = const RefactoringMethodParameterKind._("REQUIRED");
+
+  static const POSITIONAL = const RefactoringMethodParameterKind._("POSITIONAL");
+
+  static const NAMED = const RefactoringMethodParameterKind._("NAMED");
+
+  final String name;
+
+  const RefactoringMethodParameterKind._(this.name);
+
+  factory RefactoringMethodParameterKind(String name) {
+    switch (name) {
+      case "REQUIRED":
+        return REQUIRED;
+      case "POSITIONAL":
+        return POSITIONAL;
+      case "NAMED":
+        return NAMED;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory RefactoringMethodParameterKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new RefactoringMethodParameterKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "RefactoringMethodParameterKind");
+  }
+
+  @override
+  String toString() => "RefactoringMethodParameterKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * RefactoringProblem
+ *
+ * {
+ *   "severity": RefactoringProblemSeverity
+ *   "message": String
+ *   "location": optional Location
+ * }
+ */
+class RefactoringProblem implements HasToJson {
+  /**
+   * The severity of the problem being represented.
+   */
+  RefactoringProblemSeverity severity;
+
+  /**
+   * A human-readable description of the problem being represented.
+   */
+  String message;
+
+  /**
+   * The location of the problem being represented. This field is omitted
+   * unless there is a specific location associated with the problem (such as a
+   * location where an element being renamed will be shadowed).
+   */
+  Location location;
+
+  RefactoringProblem(this.severity, this.message, {this.location});
+
+  factory RefactoringProblem.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      RefactoringProblemSeverity severity;
+      if (json.containsKey("severity")) {
+        severity = new RefactoringProblemSeverity.fromJson(jsonDecoder, jsonPath + ".severity", json["severity"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "severity");
+      }
+      String message;
+      if (json.containsKey("message")) {
+        message = jsonDecoder._decodeString(jsonPath + ".message", json["message"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "message");
+      }
+      Location location;
+      if (json.containsKey("location")) {
+        location = new Location.fromJson(jsonDecoder, jsonPath + ".location", json["location"]);
+      }
+      return new RefactoringProblem(severity, message, location: location);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "RefactoringProblem");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["severity"] = severity.toJson();
+    result["message"] = message;
+    if (location != null) {
+      result["location"] = location.toJson();
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RefactoringProblem) {
+      return severity == other.severity &&
+          message == other.message &&
+          location == other.location;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, severity.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, location.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * RefactoringProblemSeverity
+ *
+ * enum {
+ *   INFO
+ *   WARNING
+ *   ERROR
+ *   FATAL
+ * }
+ */
+class RefactoringProblemSeverity {
+  static const INFO = const RefactoringProblemSeverity._("INFO");
+
+  static const WARNING = const RefactoringProblemSeverity._("WARNING");
+
+  static const ERROR = const RefactoringProblemSeverity._("ERROR");
+
+  static const FATAL = const RefactoringProblemSeverity._("FATAL");
+
+  final String name;
+
+  const RefactoringProblemSeverity._(this.name);
+
+  factory RefactoringProblemSeverity(String name) {
+    switch (name) {
+      case "INFO":
+        return INFO;
+      case "WARNING":
+        return WARNING;
+      case "ERROR":
+        return ERROR;
+      case "FATAL":
+        return FATAL;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory RefactoringProblemSeverity.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new RefactoringProblemSeverity(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "RefactoringProblemSeverity");
+  }
+
+  /**
+   * Returns the [RefactoringProblemSeverity] with the maximal severity.
+   */
+  static RefactoringProblemSeverity max(RefactoringProblemSeverity a, RefactoringProblemSeverity b) =>
+      _maxRefactoringProblemSeverity(a, b);
+
+  @override
+  String toString() => "RefactoringProblemSeverity.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * RemoveContentOverlay
+ *
+ * {
+ *   "type": "remove"
+ * }
+ */
+class RemoveContentOverlay implements HasToJson {
+  RemoveContentOverlay();
+
+  factory RemoveContentOverlay.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      if (json["type"] != "remove") {
+        throw jsonDecoder.mismatch(jsonPath, "equal " + "remove");
+      }
+      return new RemoveContentOverlay();
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "RemoveContentOverlay");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["type"] = "remove";
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RemoveContentOverlay) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, 114870849);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * RequestError
+ *
+ * {
+ *   "code": RequestErrorCode
+ *   "message": String
+ *   "stackTrace": optional String
+ * }
+ */
+class RequestError implements HasToJson {
+  /**
+   * A code that uniquely identifies the error that occurred.
+   */
+  RequestErrorCode code;
+
+  /**
+   * A short description of the error.
+   */
+  String message;
+
+  /**
+   * The stack trace associated with processing the request, used for debugging
+   * the server.
+   */
+  String stackTrace;
+
+  RequestError(this.code, this.message, {this.stackTrace});
+
+  factory RequestError.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      RequestErrorCode code;
+      if (json.containsKey("code")) {
+        code = new RequestErrorCode.fromJson(jsonDecoder, jsonPath + ".code", json["code"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "code");
+      }
+      String message;
+      if (json.containsKey("message")) {
+        message = jsonDecoder._decodeString(jsonPath + ".message", json["message"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "message");
+      }
+      String stackTrace;
+      if (json.containsKey("stackTrace")) {
+        stackTrace = jsonDecoder._decodeString(jsonPath + ".stackTrace", json["stackTrace"]);
+      }
+      return new RequestError(code, message, stackTrace: stackTrace);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "RequestError");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["code"] = code.toJson();
+    result["message"] = message;
+    if (stackTrace != null) {
+      result["stackTrace"] = stackTrace;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RequestError) {
+      return code == other.code &&
+          message == other.message &&
+          stackTrace == other.stackTrace;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, code.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, stackTrace.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * RequestErrorCode
+ *
+ * enum {
+ *   GET_ERRORS_INVALID_FILE
+ *   INVALID_OVERLAY_CHANGE
+ *   INVALID_PARAMETER
+ *   INVALID_REQUEST
+ *   SERVER_ALREADY_STARTED
+ *   SERVER_ERROR
+ *   UNANALYZED_PRIORITY_FILES
+ *   UNKNOWN_REQUEST
+ *   UNSUPPORTED_FEATURE
+ * }
+ */
+class RequestErrorCode {
+  /**
+   * An "analysis.getErrors" request specified a FilePath which does not match
+   * a file currently subject to analysis.
+   */
+  static const GET_ERRORS_INVALID_FILE = const RequestErrorCode._("GET_ERRORS_INVALID_FILE");
+
+  /**
+   * An analysis.updateContent request contained a ChangeContentOverlay object
+   * which can't be applied, due to an edit having an offset or length that is
+   * out of range.
+   */
+  static const INVALID_OVERLAY_CHANGE = const RequestErrorCode._("INVALID_OVERLAY_CHANGE");
+
+  /**
+   * One of the method parameters was invalid.
+   */
+  static const INVALID_PARAMETER = const RequestErrorCode._("INVALID_PARAMETER");
+
+  /**
+   * A malformed request was received.
+   */
+  static const INVALID_REQUEST = const RequestErrorCode._("INVALID_REQUEST");
+
+  /**
+   * The analysis server has already been started (and hence won't accept new
+   * connections).
+   *
+   * This error is included for future expansion; at present the analysis
+   * server can only speak to one client at a time so this error will never
+   * occur.
+   */
+  static const SERVER_ALREADY_STARTED = const RequestErrorCode._("SERVER_ALREADY_STARTED");
+
+  /**
+   * An internal error occurred in the analysis server. Also see the
+   * server.error notification.
+   */
+  static const SERVER_ERROR = const RequestErrorCode._("SERVER_ERROR");
+
+  /**
+   * An "analysis.setPriorityFiles" request includes one or more files that are
+   * not being analyzed.
+   *
+   * This is a legacy error; it will be removed before the API reaches version
+   * 1.0.
+   */
+  static const UNANALYZED_PRIORITY_FILES = const RequestErrorCode._("UNANALYZED_PRIORITY_FILES");
+
+  /**
+   * A request was received which the analysis server does not recognize, or
+   * cannot handle in its current configuation.
+   */
+  static const UNKNOWN_REQUEST = const RequestErrorCode._("UNKNOWN_REQUEST");
+
+  /**
+   * The analysis server was requested to perform an action which is not
+   * supported.
+   *
+   * This is a legacy error; it will be removed before the API reaches version
+   * 1.0.
+   */
+  static const UNSUPPORTED_FEATURE = const RequestErrorCode._("UNSUPPORTED_FEATURE");
+
+  final String name;
+
+  const RequestErrorCode._(this.name);
+
+  factory RequestErrorCode(String name) {
+    switch (name) {
+      case "GET_ERRORS_INVALID_FILE":
+        return GET_ERRORS_INVALID_FILE;
+      case "INVALID_OVERLAY_CHANGE":
+        return INVALID_OVERLAY_CHANGE;
+      case "INVALID_PARAMETER":
+        return INVALID_PARAMETER;
+      case "INVALID_REQUEST":
+        return INVALID_REQUEST;
+      case "SERVER_ALREADY_STARTED":
+        return SERVER_ALREADY_STARTED;
+      case "SERVER_ERROR":
+        return SERVER_ERROR;
+      case "UNANALYZED_PRIORITY_FILES":
+        return UNANALYZED_PRIORITY_FILES;
+      case "UNKNOWN_REQUEST":
+        return UNKNOWN_REQUEST;
+      case "UNSUPPORTED_FEATURE":
+        return UNSUPPORTED_FEATURE;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory RequestErrorCode.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new RequestErrorCode(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "RequestErrorCode");
+  }
+
+  @override
+  String toString() => "RequestErrorCode.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * SearchResult
+ *
+ * {
+ *   "location": Location
+ *   "kind": SearchResultKind
+ *   "isPotential": bool
+ *   "path": List<Element>
+ * }
+ */
+class SearchResult implements HasToJson {
+  /**
+   * The location of the code that matched the search criteria.
+   */
+  Location location;
+
+  /**
+   * The kind of element that was found or the kind of reference that was
+   * found.
+   */
+  SearchResultKind kind;
+
+  /**
+   * True if the result is a potential match but cannot be confirmed to be a
+   * match. For example, if all references to a method m defined in some class
+   * were requested, and a reference to a method m from an unknown class were
+   * found, it would be marked as being a potential match.
+   */
+  bool isPotential;
+
+  /**
+   * The elements that contain the result, starting with the most immediately
+   * enclosing ancestor and ending with the library.
+   */
+  List<Element> path;
+
+  SearchResult(this.location, this.kind, this.isPotential, this.path);
+
+  factory SearchResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Location location;
+      if (json.containsKey("location")) {
+        location = new Location.fromJson(jsonDecoder, jsonPath + ".location", json["location"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "location");
+      }
+      SearchResultKind kind;
+      if (json.containsKey("kind")) {
+        kind = new SearchResultKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "kind");
+      }
+      bool isPotential;
+      if (json.containsKey("isPotential")) {
+        isPotential = jsonDecoder._decodeBool(jsonPath + ".isPotential", json["isPotential"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isPotential");
+      }
+      List<Element> path;
+      if (json.containsKey("path")) {
+        path = jsonDecoder._decodeList(jsonPath + ".path", json["path"], (String jsonPath, Object json) => new Element.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "path");
+      }
+      return new SearchResult(location, kind, isPotential, path);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "SearchResult");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["location"] = location.toJson();
+    result["kind"] = kind.toJson();
+    result["isPotential"] = isPotential;
+    result["path"] = path.map((Element value) => value.toJson()).toList();
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SearchResult) {
+      return location == other.location &&
+          kind == other.kind &&
+          isPotential == other.isPotential &&
+          _listEqual(path, other.path, (Element a, Element b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, location.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, isPotential.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, path.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * SearchResultKind
+ *
+ * enum {
+ *   DECLARATION
+ *   INVOCATION
+ *   READ
+ *   READ_WRITE
+ *   REFERENCE
+ *   UNKNOWN
+ *   WRITE
+ * }
+ */
+class SearchResultKind {
+  /**
+   * The declaration of an element.
+   */
+  static const DECLARATION = const SearchResultKind._("DECLARATION");
+
+  /**
+   * The invocation of a function or method.
+   */
+  static const INVOCATION = const SearchResultKind._("INVOCATION");
+
+  /**
+   * A reference to a field, parameter or variable where it is being read.
+   */
+  static const READ = const SearchResultKind._("READ");
+
+  /**
+   * A reference to a field, parameter or variable where it is being read and
+   * written.
+   */
+  static const READ_WRITE = const SearchResultKind._("READ_WRITE");
+
+  /**
+   * A reference to an element.
+   */
+  static const REFERENCE = const SearchResultKind._("REFERENCE");
+
+  /**
+   * Some other kind of search result.
+   */
+  static const UNKNOWN = const SearchResultKind._("UNKNOWN");
+
+  /**
+   * A reference to a field, parameter or variable where it is being written.
+   */
+  static const WRITE = const SearchResultKind._("WRITE");
+
+  final String name;
+
+  const SearchResultKind._(this.name);
+
+  factory SearchResultKind(String name) {
+    switch (name) {
+      case "DECLARATION":
+        return DECLARATION;
+      case "INVOCATION":
+        return INVOCATION;
+      case "READ":
+        return READ;
+      case "READ_WRITE":
+        return READ_WRITE;
+      case "REFERENCE":
+        return REFERENCE;
+      case "UNKNOWN":
+        return UNKNOWN;
+      case "WRITE":
+        return WRITE;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory SearchResultKind.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new SearchResultKind(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "SearchResultKind");
+  }
+
+  @override
+  String toString() => "SearchResultKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * ServerService
+ *
+ * enum {
+ *   STATUS
+ * }
+ */
+class ServerService {
+  static const STATUS = const ServerService._("STATUS");
+
+  final String name;
+
+  const ServerService._(this.name);
+
+  factory ServerService(String name) {
+    switch (name) {
+      case "STATUS":
+        return STATUS;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory ServerService.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new ServerService(json);
+      } catch(_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(jsonPath, "ServerService");
+  }
+
+  @override
+  String toString() => "ServerService.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * SourceChange
+ *
+ * {
+ *   "message": String
+ *   "edits": List<SourceFileEdit>
+ *   "linkedEditGroups": List<LinkedEditGroup>
+ *   "selection": optional Position
+ * }
+ */
+class SourceChange implements HasToJson {
+  /**
+   * A human-readable description of the change to be applied.
+   */
+  String message;
+
+  /**
+   * A list of the edits used to effect the change, grouped by file.
+   */
+  List<SourceFileEdit> edits;
+
+  /**
+   * A list of the linked editing groups used to customize the changes that
+   * were made.
+   */
+  List<LinkedEditGroup> linkedEditGroups;
+
+  /**
+   * The position that should be selected after the edits have been applied.
+   */
+  Position selection;
+
+  SourceChange(this.message, {this.edits, this.linkedEditGroups, this.selection}) {
+    if (edits == null) {
+      edits = <SourceFileEdit>[];
+    }
+    if (linkedEditGroups == null) {
+      linkedEditGroups = <LinkedEditGroup>[];
+    }
+  }
+
+  factory SourceChange.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String message;
+      if (json.containsKey("message")) {
+        message = jsonDecoder._decodeString(jsonPath + ".message", json["message"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "message");
+      }
+      List<SourceFileEdit> edits;
+      if (json.containsKey("edits")) {
+        edits = jsonDecoder._decodeList(jsonPath + ".edits", json["edits"], (String jsonPath, Object json) => new SourceFileEdit.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "edits");
+      }
+      List<LinkedEditGroup> linkedEditGroups;
+      if (json.containsKey("linkedEditGroups")) {
+        linkedEditGroups = jsonDecoder._decodeList(jsonPath + ".linkedEditGroups", json["linkedEditGroups"], (String jsonPath, Object json) => new LinkedEditGroup.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "linkedEditGroups");
+      }
+      Position selection;
+      if (json.containsKey("selection")) {
+        selection = new Position.fromJson(jsonDecoder, jsonPath + ".selection", json["selection"]);
+      }
+      return new SourceChange(message, edits: edits, linkedEditGroups: linkedEditGroups, selection: selection);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "SourceChange");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["message"] = message;
+    result["edits"] = edits.map((SourceFileEdit value) => value.toJson()).toList();
+    result["linkedEditGroups"] = linkedEditGroups.map((LinkedEditGroup value) => value.toJson()).toList();
+    if (selection != null) {
+      result["selection"] = selection.toJson();
+    }
+    return result;
+  }
+
+  /**
+   * Adds [edit] to the [FileEdit] for the given [file].
+   */
+  void addEdit(String file, int fileStamp, SourceEdit edit) =>
+      _addEditToSourceChange(this, file, fileStamp, edit);
+
+  /**
+   * Adds the given [FileEdit].
+   */
+  void addFileEdit(SourceFileEdit edit) {
+    edits.add(edit);
+  }
+
+  /**
+   * Adds the given [LinkedEditGroup].
+   */
+  void addLinkedEditGroup(LinkedEditGroup linkedEditGroup) {
+    linkedEditGroups.add(linkedEditGroup);
+  }
+
+  /**
+   * Returns the [FileEdit] for the given [file], maybe `null`.
+   */
+  SourceFileEdit getFileEdit(String file) =>
+      _getChangeFileEdit(this, file);
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SourceChange) {
+      return message == other.message &&
+          _listEqual(edits, other.edits, (SourceFileEdit a, SourceFileEdit b) => a == b) &&
+          _listEqual(linkedEditGroups, other.linkedEditGroups, (LinkedEditGroup a, LinkedEditGroup b) => a == b) &&
+          selection == other.selection;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, edits.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, linkedEditGroups.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, selection.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * SourceEdit
+ *
+ * {
+ *   "offset": int
+ *   "length": int
+ *   "replacement": String
+ *   "id": optional String
+ * }
+ */
+class SourceEdit implements HasToJson {
+  /**
+   * Get the result of applying a set of [edits] to the given [code]. Edits are
+   * applied in the order they appear in [edits].
+   */
+  static String applySequence(String code, Iterable<SourceEdit> edits) =>
+      _applySequence(code, edits);
+
+  /**
+   * The offset of the region to be modified.
+   */
+  int offset;
+
+  /**
+   * The length of the region to be modified.
+   */
+  int length;
+
+  /**
+   * The code that is to replace the specified region in the original code.
+   */
+  String replacement;
+
+  /**
+   * An identifier that uniquely identifies this source edit from other edits
+   * in the same response. This field is omitted unless a containing structure
+   * needs to be able to identify the edit for some reason.
+   *
+   * For example, some refactoring operations can produce edits that might not
+   * be appropriate (referred to as potential edits). Such edits will have an
+   * id so that they can be referenced. Edits in the same response that do not
+   * need to be referenced will not have an id.
+   */
+  String id;
+
+  SourceEdit(this.offset, this.length, this.replacement, {this.id});
+
+  factory SourceEdit.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      String replacement;
+      if (json.containsKey("replacement")) {
+        replacement = jsonDecoder._decodeString(jsonPath + ".replacement", json["replacement"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "replacement");
+      }
+      String id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder._decodeString(jsonPath + ".id", json["id"]);
+      }
+      return new SourceEdit(offset, length, replacement, id: id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "SourceEdit");
+    }
+  }
+
+  /**
+   * The end of the region to be modified.
+   */
+  int get end => offset + length;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["offset"] = offset;
+    result["length"] = length;
+    result["replacement"] = replacement;
+    if (id != null) {
+      result["id"] = id;
+    }
+    return result;
+  }
+
+  /**
+   * Get the result of applying the edit to the given [code].
+   */
+  String apply(String code) => _applyEdit(code, this);
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SourceEdit) {
+      return offset == other.offset &&
+          length == other.length &&
+          replacement == other.replacement &&
+          id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, replacement.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, id.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * SourceFileEdit
+ *
+ * {
+ *   "file": FilePath
+ *   "fileStamp": long
+ *   "edits": List<SourceEdit>
+ * }
+ */
+class SourceFileEdit implements HasToJson {
+  /**
+   * The file containing the code to be modified.
+   */
+  String file;
+
+  /**
+   * The modification stamp of the file at the moment when the change was
+   * created, in milliseconds since the "Unix epoch". Will be -1 if the file
+   * did not exist and should be created. The client may use this field to make
+   * sure that the file was not changed since then, so it is safe to apply the
+   * change.
+   */
+  int fileStamp;
+
+  /**
+   * A list of the edits used to effect the change.
+   */
+  List<SourceEdit> edits;
+
+  SourceFileEdit(this.file, this.fileStamp, {this.edits}) {
+    if (edits == null) {
+      edits = <SourceEdit>[];
+    }
+  }
+
+  factory SourceFileEdit.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "file");
+      }
+      int fileStamp;
+      if (json.containsKey("fileStamp")) {
+        fileStamp = jsonDecoder._decodeInt(jsonPath + ".fileStamp", json["fileStamp"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "fileStamp");
+      }
+      List<SourceEdit> edits;
+      if (json.containsKey("edits")) {
+        edits = jsonDecoder._decodeList(jsonPath + ".edits", json["edits"], (String jsonPath, Object json) => new SourceEdit.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "edits");
+      }
+      return new SourceFileEdit(file, fileStamp, edits: edits);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "SourceFileEdit");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["fileStamp"] = fileStamp;
+    result["edits"] = edits.map((SourceEdit value) => value.toJson()).toList();
+    return result;
+  }
+
+  /**
+   * Adds the given [Edit] to the list.
+   */
+  void add(SourceEdit edit) => _addEditForSource(this, edit);
+
+  /**
+   * Adds the given [Edit]s.
+   */
+  void addAll(Iterable<SourceEdit> edits) =>
+      _addAllEditsForSource(this, edits);
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is SourceFileEdit) {
+      return file == other.file &&
+          fileStamp == other.fileStamp &&
+          _listEqual(edits, other.edits, (SourceEdit a, SourceEdit b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, fileStamp.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, edits.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * TypeHierarchyItem
+ *
+ * {
+ *   "classElement": Element
+ *   "displayName": optional String
+ *   "memberElement": optional Element
+ *   "superclass": optional int
+ *   "interfaces": List<int>
+ *   "mixins": List<int>
+ *   "subclasses": List<int>
+ * }
+ */
+class TypeHierarchyItem implements HasToJson {
+  /**
+   * The class element represented by this item.
+   */
+  Element classElement;
+
+  /**
+   * The name to be displayed for the class. This field will be omitted if the
+   * display name is the same as the name of the element. The display name is
+   * different if there is additional type information to be displayed, such as
+   * type arguments.
+   */
+  String displayName;
+
+  /**
+   * The member in the class corresponding to the member on which the hierarchy
+   * was requested. This field will be omitted if the hierarchy was not
+   * requested for a member or if the class does not have a corresponding
+   * member.
+   */
+  Element memberElement;
+
+  /**
+   * The index of the item representing the superclass of this class. This
+   * field will be omitted if this item represents the class Object.
+   */
+  int superclass;
+
+  /**
+   * The indexes of the items representing the interfaces implemented by this
+   * class. The list will be empty if there are no implemented interfaces.
+   */
+  List<int> interfaces;
+
+  /**
+   * The indexes of the items representing the mixins referenced by this class.
+   * The list will be empty if there are no classes mixed in to this class.
+   */
+  List<int> mixins;
+
+  /**
+   * The indexes of the items representing the subtypes of this class. The list
+   * will be empty if there are no subtypes or if this item represents a
+   * supertype of the pivot type.
+   */
+  List<int> subclasses;
+
+  TypeHierarchyItem(this.classElement, {this.displayName, this.memberElement, this.superclass, this.interfaces, this.mixins, this.subclasses}) {
+    if (interfaces == null) {
+      interfaces = <int>[];
+    }
+    if (mixins == null) {
+      mixins = <int>[];
+    }
+    if (subclasses == null) {
+      subclasses = <int>[];
+    }
+  }
+
+  factory TypeHierarchyItem.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      Element classElement;
+      if (json.containsKey("classElement")) {
+        classElement = new Element.fromJson(jsonDecoder, jsonPath + ".classElement", json["classElement"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "classElement");
+      }
+      String displayName;
+      if (json.containsKey("displayName")) {
+        displayName = jsonDecoder._decodeString(jsonPath + ".displayName", json["displayName"]);
+      }
+      Element memberElement;
+      if (json.containsKey("memberElement")) {
+        memberElement = new Element.fromJson(jsonDecoder, jsonPath + ".memberElement", json["memberElement"]);
+      }
+      int superclass;
+      if (json.containsKey("superclass")) {
+        superclass = jsonDecoder._decodeInt(jsonPath + ".superclass", json["superclass"]);
+      }
+      List<int> interfaces;
+      if (json.containsKey("interfaces")) {
+        interfaces = jsonDecoder._decodeList(jsonPath + ".interfaces", json["interfaces"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "interfaces");
+      }
+      List<int> mixins;
+      if (json.containsKey("mixins")) {
+        mixins = jsonDecoder._decodeList(jsonPath + ".mixins", json["mixins"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "mixins");
+      }
+      List<int> subclasses;
+      if (json.containsKey("subclasses")) {
+        subclasses = jsonDecoder._decodeList(jsonPath + ".subclasses", json["subclasses"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "subclasses");
+      }
+      return new TypeHierarchyItem(classElement, displayName: displayName, memberElement: memberElement, superclass: superclass, interfaces: interfaces, mixins: mixins, subclasses: subclasses);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "TypeHierarchyItem");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["classElement"] = classElement.toJson();
+    if (displayName != null) {
+      result["displayName"] = displayName;
+    }
+    if (memberElement != null) {
+      result["memberElement"] = memberElement.toJson();
+    }
+    if (superclass != null) {
+      result["superclass"] = superclass;
+    }
+    result["interfaces"] = interfaces;
+    result["mixins"] = mixins;
+    result["subclasses"] = subclasses;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is TypeHierarchyItem) {
+      return classElement == other.classElement &&
+          displayName == other.displayName &&
+          memberElement == other.memberElement &&
+          superclass == other.superclass &&
+          _listEqual(interfaces, other.interfaces, (int a, int b) => a == b) &&
+          _listEqual(mixins, other.mixins, (int a, int b) => a == b) &&
+          _listEqual(subclasses, other.subclasses, (int a, int b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, classElement.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, displayName.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, memberElement.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, superclass.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, interfaces.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, mixins.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, subclasses.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * convertGetterToMethod feedback
+ */
+class ConvertGetterToMethodFeedback {
+  @override
+  bool operator==(other) {
+    if (other is ConvertGetterToMethodFeedback) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 616032599;
+  }
+}
+/**
+ * convertGetterToMethod options
+ */
+class ConvertGetterToMethodOptions {
+  @override
+  bool operator==(other) {
+    if (other is ConvertGetterToMethodOptions) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 488848400;
+  }
+}
+/**
+ * convertMethodToGetter feedback
+ */
+class ConvertMethodToGetterFeedback {
+  @override
+  bool operator==(other) {
+    if (other is ConvertMethodToGetterFeedback) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 165291526;
+  }
+}
+/**
+ * convertMethodToGetter options
+ */
+class ConvertMethodToGetterOptions {
+  @override
+  bool operator==(other) {
+    if (other is ConvertMethodToGetterOptions) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 27952290;
+  }
+}
+
+/**
+ * extractLocalVariable feedback
+ *
+ * {
+ *   "names": List<String>
+ *   "offsets": List<int>
+ *   "lengths": List<int>
+ * }
+ */
+class ExtractLocalVariableFeedback extends RefactoringFeedback implements HasToJson {
+  /**
+   * The proposed names for the local variable.
+   */
+  List<String> names;
+
+  /**
+   * The offsets of the expressions that would be replaced by a reference to
+   * the variable.
+   */
+  List<int> offsets;
+
+  /**
+   * The lengths of the expressions that would be replaced by a reference to
+   * the variable. The lengths correspond to the offsets. In other words, for a
+   * given expression, if the offset of that expression is offsets[i], then the
+   * length of that expression is lengths[i].
+   */
+  List<int> lengths;
+
+  ExtractLocalVariableFeedback(this.names, this.offsets, this.lengths);
+
+  factory ExtractLocalVariableFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      List<String> names;
+      if (json.containsKey("names")) {
+        names = jsonDecoder._decodeList(jsonPath + ".names", json["names"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "names");
+      }
+      List<int> offsets;
+      if (json.containsKey("offsets")) {
+        offsets = jsonDecoder._decodeList(jsonPath + ".offsets", json["offsets"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offsets");
+      }
+      List<int> lengths;
+      if (json.containsKey("lengths")) {
+        lengths = jsonDecoder._decodeList(jsonPath + ".lengths", json["lengths"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "lengths");
+      }
+      return new ExtractLocalVariableFeedback(names, offsets, lengths);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "extractLocalVariable feedback");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["names"] = names;
+    result["offsets"] = offsets;
+    result["lengths"] = lengths;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExtractLocalVariableFeedback) {
+      return _listEqual(names, other.names, (String a, String b) => a == b) &&
+          _listEqual(offsets, other.offsets, (int a, int b) => a == b) &&
+          _listEqual(lengths, other.lengths, (int a, int b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, names.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offsets.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, lengths.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * extractLocalVariable options
+ *
+ * {
+ *   "name": String
+ *   "extractAll": bool
+ * }
+ */
+class ExtractLocalVariableOptions extends RefactoringOptions implements HasToJson {
+  /**
+   * The name that the local variable should be given.
+   */
+  String name;
+
+  /**
+   * True if all occurrences of the expression within the scope in which the
+   * variable will be defined should be replaced by a reference to the local
+   * variable. The expression used to initiate the refactoring will always be
+   * replaced.
+   */
+  bool extractAll;
+
+  ExtractLocalVariableOptions(this.name, this.extractAll);
+
+  factory ExtractLocalVariableOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      bool extractAll;
+      if (json.containsKey("extractAll")) {
+        extractAll = jsonDecoder._decodeBool(jsonPath + ".extractAll", json["extractAll"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "extractAll");
+      }
+      return new ExtractLocalVariableOptions(name, extractAll);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "extractLocalVariable options");
+    }
+  }
+
+  factory ExtractLocalVariableOptions.fromRefactoringParams(EditGetRefactoringParams refactoringParams, Request request) {
+    return new ExtractLocalVariableOptions.fromJson(
+        new RequestDecoder(request), "options", refactoringParams.options);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["name"] = name;
+    result["extractAll"] = extractAll;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExtractLocalVariableOptions) {
+      return name == other.name &&
+          extractAll == other.extractAll;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, extractAll.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * extractMethod feedback
+ *
+ * {
+ *   "offset": int
+ *   "length": int
+ *   "returnType": String
+ *   "names": List<String>
+ *   "canCreateGetter": bool
+ *   "parameters": List<RefactoringMethodParameter>
+ *   "offsets": List<int>
+ *   "lengths": List<int>
+ * }
+ */
+class ExtractMethodFeedback extends RefactoringFeedback implements HasToJson {
+  /**
+   * The offset to the beginning of the expression or statements that will be
+   * extracted.
+   */
+  int offset;
+
+  /**
+   * The length of the expression or statements that will be extracted.
+   */
+  int length;
+
+  /**
+   * The proposed return type for the method.
+   */
+  String returnType;
+
+  /**
+   * The proposed names for the method.
+   */
+  List<String> names;
+
+  /**
+   * True if a getter could be created rather than a method.
+   */
+  bool canCreateGetter;
+
+  /**
+   * The proposed parameters for the method.
+   */
+  List<RefactoringMethodParameter> parameters;
+
+  /**
+   * The offsets of the expressions or statements that would be replaced by an
+   * invocation of the method.
+   */
+  List<int> offsets;
+
+  /**
+   * The lengths of the expressions or statements that would be replaced by an
+   * invocation of the method. The lengths correspond to the offsets. In other
+   * words, for a given expression (or block of statements), if the offset of
+   * that expression is offsets[i], then the length of that expression is
+   * lengths[i].
+   */
+  List<int> lengths;
+
+  ExtractMethodFeedback(this.offset, this.length, this.returnType, this.names, this.canCreateGetter, this.parameters, this.offsets, this.lengths);
+
+  factory ExtractMethodFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      String returnType;
+      if (json.containsKey("returnType")) {
+        returnType = jsonDecoder._decodeString(jsonPath + ".returnType", json["returnType"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "returnType");
+      }
+      List<String> names;
+      if (json.containsKey("names")) {
+        names = jsonDecoder._decodeList(jsonPath + ".names", json["names"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "names");
+      }
+      bool canCreateGetter;
+      if (json.containsKey("canCreateGetter")) {
+        canCreateGetter = jsonDecoder._decodeBool(jsonPath + ".canCreateGetter", json["canCreateGetter"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "canCreateGetter");
+      }
+      List<RefactoringMethodParameter> parameters;
+      if (json.containsKey("parameters")) {
+        parameters = jsonDecoder._decodeList(jsonPath + ".parameters", json["parameters"], (String jsonPath, Object json) => new RefactoringMethodParameter.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "parameters");
+      }
+      List<int> offsets;
+      if (json.containsKey("offsets")) {
+        offsets = jsonDecoder._decodeList(jsonPath + ".offsets", json["offsets"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offsets");
+      }
+      List<int> lengths;
+      if (json.containsKey("lengths")) {
+        lengths = jsonDecoder._decodeList(jsonPath + ".lengths", json["lengths"], jsonDecoder._decodeInt);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "lengths");
+      }
+      return new ExtractMethodFeedback(offset, length, returnType, names, canCreateGetter, parameters, offsets, lengths);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "extractMethod feedback");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["offset"] = offset;
+    result["length"] = length;
+    result["returnType"] = returnType;
+    result["names"] = names;
+    result["canCreateGetter"] = canCreateGetter;
+    result["parameters"] = parameters.map((RefactoringMethodParameter value) => value.toJson()).toList();
+    result["offsets"] = offsets;
+    result["lengths"] = lengths;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExtractMethodFeedback) {
+      return offset == other.offset &&
+          length == other.length &&
+          returnType == other.returnType &&
+          _listEqual(names, other.names, (String a, String b) => a == b) &&
+          canCreateGetter == other.canCreateGetter &&
+          _listEqual(parameters, other.parameters, (RefactoringMethodParameter a, RefactoringMethodParameter b) => a == b) &&
+          _listEqual(offsets, other.offsets, (int a, int b) => a == b) &&
+          _listEqual(lengths, other.lengths, (int a, int b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, returnType.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, names.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, canCreateGetter.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameters.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, offsets.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, lengths.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * extractMethod options
+ *
+ * {
+ *   "returnType": String
+ *   "createGetter": bool
+ *   "name": String
+ *   "parameters": List<RefactoringMethodParameter>
+ *   "extractAll": bool
+ * }
+ */
+class ExtractMethodOptions extends RefactoringOptions implements HasToJson {
+  /**
+   * The return type that should be defined for the method.
+   */
+  String returnType;
+
+  /**
+   * True if a getter should be created rather than a method. It is an error if
+   * this field is true and the list of parameters is non-empty.
+   */
+  bool createGetter;
+
+  /**
+   * The name that the method should be given.
+   */
+  String name;
+
+  /**
+   * The parameters that should be defined for the method.
+   *
+   * It is an error if a REQUIRED or NAMED parameter follows a POSITIONAL
+   * parameter. It is an error if a REQUIRED or POSITIONAL parameter follows a
+   * NAMED parameter.
+   *
+   * - To change the order and/or update proposed parameters, add parameters
+   *   with the same identifiers as proposed.
+   * - To add new parameters, omit their identifier.
+   * - To remove some parameters, omit them in this list.
+   */
+  List<RefactoringMethodParameter> parameters;
+
+  /**
+   * True if all occurrences of the expression or statements should be replaced
+   * by an invocation of the method. The expression or statements used to
+   * initiate the refactoring will always be replaced.
+   */
+  bool extractAll;
+
+  ExtractMethodOptions(this.returnType, this.createGetter, this.name, this.parameters, this.extractAll);
+
+  factory ExtractMethodOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String returnType;
+      if (json.containsKey("returnType")) {
+        returnType = jsonDecoder._decodeString(jsonPath + ".returnType", json["returnType"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "returnType");
+      }
+      bool createGetter;
+      if (json.containsKey("createGetter")) {
+        createGetter = jsonDecoder._decodeBool(jsonPath + ".createGetter", json["createGetter"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "createGetter");
+      }
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      List<RefactoringMethodParameter> parameters;
+      if (json.containsKey("parameters")) {
+        parameters = jsonDecoder._decodeList(jsonPath + ".parameters", json["parameters"], (String jsonPath, Object json) => new RefactoringMethodParameter.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "parameters");
+      }
+      bool extractAll;
+      if (json.containsKey("extractAll")) {
+        extractAll = jsonDecoder._decodeBool(jsonPath + ".extractAll", json["extractAll"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "extractAll");
+      }
+      return new ExtractMethodOptions(returnType, createGetter, name, parameters, extractAll);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "extractMethod options");
+    }
+  }
+
+  factory ExtractMethodOptions.fromRefactoringParams(EditGetRefactoringParams refactoringParams, Request request) {
+    return new ExtractMethodOptions.fromJson(
+        new RequestDecoder(request), "options", refactoringParams.options);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["returnType"] = returnType;
+    result["createGetter"] = createGetter;
+    result["name"] = name;
+    result["parameters"] = parameters.map((RefactoringMethodParameter value) => value.toJson()).toList();
+    result["extractAll"] = extractAll;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is ExtractMethodOptions) {
+      return returnType == other.returnType &&
+          createGetter == other.createGetter &&
+          name == other.name &&
+          _listEqual(parameters, other.parameters, (RefactoringMethodParameter a, RefactoringMethodParameter b) => a == b) &&
+          extractAll == other.extractAll;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, returnType.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, createGetter.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, parameters.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, extractAll.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * inlineLocalVariable feedback
+ *
+ * {
+ *   "name": String
+ *   "occurrences": int
+ * }
+ */
+class InlineLocalVariableFeedback extends RefactoringFeedback implements HasToJson {
+  /**
+   * The name of the variable being inlined.
+   */
+  String name;
+
+  /**
+   * The number of times the variable occurs.
+   */
+  int occurrences;
+
+  InlineLocalVariableFeedback(this.name, this.occurrences);
+
+  factory InlineLocalVariableFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder._decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "name");
+      }
+      int occurrences;
+      if (json.containsKey("occurrences")) {
+        occurrences = jsonDecoder._decodeInt(jsonPath + ".occurrences", json["occurrences"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "occurrences");
+      }
+      return new InlineLocalVariableFeedback(name, occurrences);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "inlineLocalVariable feedback");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["name"] = name;
+    result["occurrences"] = occurrences;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is InlineLocalVariableFeedback) {
+      return name == other.name &&
+          occurrences == other.occurrences;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, occurrences.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+/**
+ * inlineLocalVariable options
+ */
+class InlineLocalVariableOptions {
+  @override
+  bool operator==(other) {
+    if (other is InlineLocalVariableOptions) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 540364977;
+  }
+}
+
+/**
+ * inlineMethod feedback
+ *
+ * {
+ *   "className": optional String
+ *   "methodName": String
+ *   "isDeclaration": bool
+ * }
+ */
+class InlineMethodFeedback extends RefactoringFeedback implements HasToJson {
+  /**
+   * The name of the class enclosing the method being inlined. If not a class
+   * member is being inlined, this field will be absent.
+   */
+  String className;
+
+  /**
+   * The name of the method (or function) being inlined.
+   */
+  String methodName;
+
+  /**
+   * True if the declaration of the method is selected. So all references
+   * should be inlined.
+   */
+  bool isDeclaration;
+
+  InlineMethodFeedback(this.methodName, this.isDeclaration, {this.className});
+
+  factory InlineMethodFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String className;
+      if (json.containsKey("className")) {
+        className = jsonDecoder._decodeString(jsonPath + ".className", json["className"]);
+      }
+      String methodName;
+      if (json.containsKey("methodName")) {
+        methodName = jsonDecoder._decodeString(jsonPath + ".methodName", json["methodName"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "methodName");
+      }
+      bool isDeclaration;
+      if (json.containsKey("isDeclaration")) {
+        isDeclaration = jsonDecoder._decodeBool(jsonPath + ".isDeclaration", json["isDeclaration"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "isDeclaration");
+      }
+      return new InlineMethodFeedback(methodName, isDeclaration, className: className);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "inlineMethod feedback");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (className != null) {
+      result["className"] = className;
+    }
+    result["methodName"] = methodName;
+    result["isDeclaration"] = isDeclaration;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is InlineMethodFeedback) {
+      return className == other.className &&
+          methodName == other.methodName &&
+          isDeclaration == other.isDeclaration;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, className.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, methodName.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, isDeclaration.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * inlineMethod options
+ *
+ * {
+ *   "deleteSource": bool
+ *   "inlineAll": bool
+ * }
+ */
+class InlineMethodOptions extends RefactoringOptions implements HasToJson {
+  /**
+   * True if the method being inlined should be removed. It is an error if this
+   * field is true and inlineAll is false.
+   */
+  bool deleteSource;
+
+  /**
+   * True if all invocations of the method should be inlined, or false if only
+   * the invocation site used to create this refactoring should be inlined.
+   */
+  bool inlineAll;
+
+  InlineMethodOptions(this.deleteSource, this.inlineAll);
+
+  factory InlineMethodOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      bool deleteSource;
+      if (json.containsKey("deleteSource")) {
+        deleteSource = jsonDecoder._decodeBool(jsonPath + ".deleteSource", json["deleteSource"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "deleteSource");
+      }
+      bool inlineAll;
+      if (json.containsKey("inlineAll")) {
+        inlineAll = jsonDecoder._decodeBool(jsonPath + ".inlineAll", json["inlineAll"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "inlineAll");
+      }
+      return new InlineMethodOptions(deleteSource, inlineAll);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "inlineMethod options");
+    }
+  }
+
+  factory InlineMethodOptions.fromRefactoringParams(EditGetRefactoringParams refactoringParams, Request request) {
+    return new InlineMethodOptions.fromJson(
+        new RequestDecoder(request), "options", refactoringParams.options);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["deleteSource"] = deleteSource;
+    result["inlineAll"] = inlineAll;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is InlineMethodOptions) {
+      return deleteSource == other.deleteSource &&
+          inlineAll == other.inlineAll;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, deleteSource.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, inlineAll.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * rename feedback
+ *
+ * {
+ *   "offset": int
+ *   "length": int
+ *   "elementKindName": String
+ *   "oldName": String
+ * }
+ */
+class RenameFeedback extends RefactoringFeedback implements HasToJson {
+  /**
+   * The offset to the beginning of the name selected to be renamed.
+   */
+  int offset;
+
+  /**
+   * The length of the name selected to be renamed.
+   */
+  int length;
+
+  /**
+   * The human-readable description of the kind of element being renamed (such
+   * as “class” or “function type alias”).
+   */
+  String elementKindName;
+
+  /**
+   * The old name of the element before the refactoring.
+   */
+  String oldName;
+
+  RenameFeedback(this.offset, this.length, this.elementKindName, this.oldName);
+
+  factory RenameFeedback.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int offset;
+      if (json.containsKey("offset")) {
+        offset = jsonDecoder._decodeInt(jsonPath + ".offset", json["offset"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "offset");
+      }
+      int length;
+      if (json.containsKey("length")) {
+        length = jsonDecoder._decodeInt(jsonPath + ".length", json["length"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "length");
+      }
+      String elementKindName;
+      if (json.containsKey("elementKindName")) {
+        elementKindName = jsonDecoder._decodeString(jsonPath + ".elementKindName", json["elementKindName"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "elementKindName");
+      }
+      String oldName;
+      if (json.containsKey("oldName")) {
+        oldName = jsonDecoder._decodeString(jsonPath + ".oldName", json["oldName"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "oldName");
+      }
+      return new RenameFeedback(offset, length, elementKindName, oldName);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "rename feedback");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["offset"] = offset;
+    result["length"] = length;
+    result["elementKindName"] = elementKindName;
+    result["oldName"] = oldName;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RenameFeedback) {
+      return offset == other.offset &&
+          length == other.length &&
+          elementKindName == other.elementKindName &&
+          oldName == other.oldName;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, offset.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, length.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, elementKindName.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, oldName.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * rename options
+ *
+ * {
+ *   "newName": String
+ * }
+ */
+class RenameOptions extends RefactoringOptions implements HasToJson {
+  /**
+   * The name that the element should have after the refactoring.
+   */
+  String newName;
+
+  RenameOptions(this.newName);
+
+  factory RenameOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String newName;
+      if (json.containsKey("newName")) {
+        newName = jsonDecoder._decodeString(jsonPath + ".newName", json["newName"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "newName");
+      }
+      return new RenameOptions(newName);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "rename options");
+    }
+  }
+
+  factory RenameOptions.fromRefactoringParams(EditGetRefactoringParams refactoringParams, Request request) {
+    return new RenameOptions.fromJson(
+        new RequestDecoder(request), "options", refactoringParams.options);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["newName"] = newName;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is RenameOptions) {
+      return newName == other.newName;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, newName.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
diff --git a/pkg/analysis_server/bin/fuzz/json.dart b/pkg/analysis_server/bin/fuzz/json.dart
new file mode 100644
index 0000000..462bea8
--- /dev/null
+++ b/pkg/analysis_server/bin/fuzz/json.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 services.json;
+
+/**
+ * Instances of the class [HasToJson] implement [toJson] method that returns
+ * a JSON presentation.
+ */
+abstract class HasToJson {
+  /**
+   * Returns a JSON presentation of the object.
+   */
+  Map<String, Object> toJson();
+}
diff --git a/pkg/analysis_server/bin/fuzz/logging_client_channel.dart b/pkg/analysis_server/bin/fuzz/logging_client_channel.dart
new file mode 100644
index 0000000..941646d
--- /dev/null
+++ b/pkg/analysis_server/bin/fuzz/logging_client_channel.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of server.manager;
+
+/**
+ * A client channel that logs communication to stdout
+ * and handles errors received from the server.
+ */
+class LoggingClientChannel implements ClientCommunicationChannel {
+  final ClientCommunicationChannel channel;
+  int serverErrorCount = 0;
+
+  LoggingClientChannel(this.channel) {
+    channel.notificationStream.listen((Notification notification) {
+      _logNotification(notification);
+      if (notification.event == 'server.error') {
+        ServerErrorParams error =
+            new ServerErrorParams.fromNotification(notification);
+        _handleError(
+            'Server reported error: ${error.message}',
+            error.stackTrace);
+      }
+    });
+  }
+
+  @override
+  Stream<Notification> get notificationStream => channel.notificationStream;
+
+  @override
+  void set notificationStream(Stream<Notification> _notificationStream) {
+    throw 'invalid operation';
+  }
+
+  @override
+  Stream<Response> get responseStream => channel.responseStream;
+
+  @override
+  void set responseStream(Stream<Response> _responseStream) {
+    throw 'invalid operation';
+  }
+
+  @override
+  Future close() {
+    print('Requesting client channel be closed');
+    return channel.close().then((_) {
+      print('Client channel closed');
+    });
+  }
+
+  @override
+  Future<Response> sendRequest(Request request) {
+    _logOperation('=>', request);
+    return channel.sendRequest(request).then((Response response) {
+      RequestError error = response.error;
+      if (error != null) {
+        error.code;
+        stderr.write('Server Error ${error.code}: ${error.message}');
+        print(error.stackTrace);
+        exitCode = 31;
+      }
+      _logOperation('<=', request);
+      return response;
+    });
+  }
+
+  void _handleError(String errMsg, String stackTrace) {
+    //error.isFatal;
+    stderr.writeln('>>> Server reported exception');
+    stderr.writeln(errMsg);
+    print(stackTrace);
+    serverErrorCount++;
+  }
+
+  void _logNotification(Notification notification) {
+    print('<=       ${notification.event}');
+  }
+
+  void _logOperation(String direction, Request request) {
+    String id = request.id.padLeft(5);
+    String method = request.method.padRight(20);
+    print('$direction $id $method');
+  }
+}
diff --git a/pkg/analysis_server/bin/fuzz/protocol.dart b/pkg/analysis_server/bin/fuzz/protocol.dart
new file mode 100644
index 0000000..b41b28e
--- /dev/null
+++ b/pkg/analysis_server/bin/fuzz/protocol.dart
@@ -0,0 +1,771 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library protocol;
+
+import 'dart:collection';
+import 'dart:convert';
+
+import 'json.dart';
+
+part 'generated_protocol.dart';
+
+
+final Map<String, RefactoringKind> REQUEST_ID_REFACTORING_KINDS =
+    new HashMap<String, RefactoringKind>();
+
+/**
+ * Translate the input [map], applying [keyCallback] to all its keys, and
+ * [valueCallback] to all its values.
+ */
+mapMap(Map map, {dynamic keyCallback(key), dynamic valueCallback(value)}) {
+  Map result = {};
+  map.forEach((key, value) {
+    if (keyCallback != null) {
+      key = keyCallback(key);
+    }
+    if (valueCallback != null) {
+      value = valueCallback(value);
+    }
+    result[key] = value;
+  });
+  return result;
+}
+
+/**
+ * Adds the given [sourceEdits] to the list in [sourceFileEdit].
+ */
+void _addAllEditsForSource(SourceFileEdit sourceFileEdit,
+    Iterable<SourceEdit> edits) {
+  edits.forEach(sourceFileEdit.add);
+}
+
+/**
+ * Adds the given [sourceEdit] to the list in [sourceFileEdit].
+ */
+void _addEditForSource(SourceFileEdit sourceFileEdit, SourceEdit sourceEdit) {
+  List<SourceEdit> edits = sourceFileEdit.edits;
+  int index = 0;
+  while (index < edits.length && edits[index].offset > sourceEdit.offset) {
+    index++;
+  }
+  edits.insert(index, sourceEdit);
+}
+
+/**
+ * Adds [edit] to the [FileEdit] for the given [file].
+ */
+void _addEditToSourceChange(SourceChange change, String file, int fileStamp,
+    SourceEdit edit) {
+  SourceFileEdit fileEdit = change.getFileEdit(file);
+  if (fileEdit == null) {
+    fileEdit = new SourceFileEdit(file, fileStamp);
+    change.addFileEdit(fileEdit);
+  }
+  fileEdit.add(edit);
+}
+
+/**
+ * Get the result of applying the edit to the given [code].  Access via
+ * SourceEdit.apply().
+ */
+String _applyEdit(String code, SourceEdit edit) {
+  if (edit.length < 0) {
+    throw new RangeError('length is negative');
+  }
+  return code.substring(0, edit.offset) +
+      edit.replacement +
+      code.substring(edit.end);
+}
+
+/**
+ * Get the result of applying a set of [edits] to the given [code].  Edits
+ * are applied in the order they appear in [edits].  Access via
+ * SourceEdit.applySequence().
+ */
+String _applySequence(String code, Iterable<SourceEdit> edits) {
+  edits.forEach((SourceEdit edit) {
+    code = edit.apply(code);
+  });
+  return code;
+}
+
+/**
+ * Returns the [FileEdit] for the given [file], maybe `null`.
+ */
+SourceFileEdit _getChangeFileEdit(SourceChange change, String file) {
+  for (SourceFileEdit fileEdit in change.edits) {
+    if (fileEdit.file == file) {
+      return fileEdit;
+    }
+  }
+  return null;
+}
+
+/**
+ * Compare the lists [listA] and [listB], using [itemEqual] to compare
+ * list elements.
+ */
+bool _listEqual(List listA, List listB, bool itemEqual(a, b)) {
+  if (listA.length != listB.length) {
+    return false;
+  }
+  for (int i = 0; i < listA.length; i++) {
+    if (!itemEqual(listA[i], listB[i])) {
+      return false;
+    }
+  }
+  return true;
+}
+
+/**
+ * Compare the maps [mapA] and [mapB], using [valueEqual] to compare map
+ * values.
+ */
+bool _mapEqual(Map mapA, Map mapB, bool valueEqual(a, b)) {
+  if (mapA.length != mapB.length) {
+    return false;
+  }
+  for (var key in mapA.keys) {
+    if (!mapB.containsKey(key)) {
+      return false;
+    }
+    if (!valueEqual(mapA[key], mapB[key])) {
+      return false;
+    }
+  }
+  return true;
+}
+
+RefactoringProblemSeverity
+    _maxRefactoringProblemSeverity(RefactoringProblemSeverity a,
+    RefactoringProblemSeverity b) {
+  if (b == null) {
+    return a;
+  }
+  if (a == null) {
+    return b;
+  } else if (a == RefactoringProblemSeverity.INFO) {
+    return b;
+  } else if (a == RefactoringProblemSeverity.WARNING) {
+    if (b == RefactoringProblemSeverity.ERROR ||
+        b == RefactoringProblemSeverity.FATAL) {
+      return b;
+    }
+  } else if (a == RefactoringProblemSeverity.ERROR) {
+    if (b == RefactoringProblemSeverity.FATAL) {
+      return b;
+    }
+  }
+  return a;
+}
+
+/**
+ * Create a [RefactoringFeedback] corresponding the given [kind].
+ */
+RefactoringFeedback _refactoringFeedbackFromJson(JsonDecoder jsonDecoder,
+    String jsonPath, Object json, Map feedbackJson) {
+  String requestId;
+  if (jsonDecoder is ResponseDecoder) {
+    requestId = jsonDecoder.response.id;
+  }
+  RefactoringKind kind = REQUEST_ID_REFACTORING_KINDS.remove(requestId);
+  if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE) {
+    return new ExtractLocalVariableFeedback.fromJson(
+        jsonDecoder,
+        jsonPath,
+        json);
+  }
+  if (kind == RefactoringKind.EXTRACT_METHOD) {
+    return new ExtractMethodFeedback.fromJson(jsonDecoder, jsonPath, json);
+  }
+  if (kind == RefactoringKind.INLINE_LOCAL_VARIABLE) {
+    return new InlineLocalVariableFeedback.fromJson(
+        jsonDecoder,
+        jsonPath,
+        json);
+  }
+  if (kind == RefactoringKind.INLINE_METHOD) {
+    return new InlineMethodFeedback.fromJson(jsonDecoder, jsonPath, json);
+  }
+  if (kind == RefactoringKind.RENAME) {
+    return new RenameFeedback.fromJson(jsonDecoder, jsonPath, json);
+  }
+  return null;
+}
+
+
+/**
+ * Create a [RefactoringOptions] corresponding the given [kind].
+ */
+RefactoringOptions _refactoringOptionsFromJson(JsonDecoder jsonDecoder,
+    String jsonPath, Object json, RefactoringKind kind) {
+  if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE) {
+    return new ExtractLocalVariableOptions.fromJson(
+        jsonDecoder,
+        jsonPath,
+        json);
+  }
+  if (kind == RefactoringKind.EXTRACT_METHOD) {
+    return new ExtractMethodOptions.fromJson(jsonDecoder, jsonPath, json);
+  }
+  if (kind == RefactoringKind.INLINE_METHOD) {
+    return new InlineMethodOptions.fromJson(jsonDecoder, jsonPath, json);
+  }
+  if (kind == RefactoringKind.RENAME) {
+    return new RenameOptions.fromJson(jsonDecoder, jsonPath, json);
+  }
+  return null;
+}
+
+/**
+ * Type of callbacks used to decode parts of JSON objects.  [jsonPath] is a
+ * string describing the part of the JSON object being decoded, and [value] is
+ * the part to decode.
+ */
+typedef Object JsonDecoderCallback(String jsonPath, Object value);
+
+/**
+ * Base class for decoding JSON objects.  The derived class must implement
+ * error reporting logic.
+ */
+abstract class JsonDecoder {
+  /**
+   * Create an exception to throw if the JSON object at [jsonPath] fails to
+   * match the API definition of [expected].
+   */
+  dynamic mismatch(String jsonPath, String expected);
+
+  /**
+   * Create an exception to throw if the JSON object at [jsonPath] is missing
+   * the key [key].
+   */
+  dynamic missingKey(String jsonPath, String key);
+
+  /**
+   * Decode a JSON object that is expected to be a boolean.  The strings "true"
+   * and "false" are also accepted.
+   */
+  bool _decodeBool(String jsonPath, Object json) {
+    if (json is bool) {
+      return json;
+    } else if (json == 'true') {
+      return true;
+    } else if (json == 'false') {
+      return false;
+    }
+    throw mismatch(jsonPath, 'bool');
+  }
+
+  /**
+   * Decode a JSON object that is expected to be an integer.  A string
+   * representation of an integer is also accepted.
+   */
+  int _decodeInt(String jsonPath, Object json) {
+    if (json is int) {
+      return json;
+    } else if (json is String) {
+      return int.parse(json, onError: (String value) {
+        throw mismatch(jsonPath, 'int');
+      });
+    }
+    throw mismatch(jsonPath, 'int');
+  }
+
+  /**
+   * Decode a JSON object that is expected to be a List.  [decoder] is used to
+   * decode the items in the list.
+   */
+  List _decodeList(String jsonPath, Object json,
+      [JsonDecoderCallback decoder]) {
+    if (json == null) {
+      return [];
+    } else if (json is List) {
+      List result = [];
+      for (int i = 0; i < json.length; i++) {
+        result.add(decoder('$jsonPath[$i]', json[i]));
+      }
+      return result;
+    } else {
+      throw mismatch(jsonPath, 'List');
+    }
+  }
+
+  /**
+   * Decode a JSON object that is expected to be a Map.  [keyDecoder] is used
+   * to decode the keys, and [valueDecoder] is used to decode the values.
+   */
+  Map _decodeMap(String jsonPath, Object json, {JsonDecoderCallback keyDecoder,
+      JsonDecoderCallback valueDecoder}) {
+    if (json == null) {
+      return {};
+    } else if (json is Map) {
+      Map result = {};
+      json.forEach((String key, value) {
+        Object decodedKey;
+        if (keyDecoder != null) {
+          decodedKey = keyDecoder('$jsonPath.key', key);
+        } else {
+          decodedKey = key;
+        }
+        if (valueDecoder != null) {
+          value = valueDecoder('$jsonPath[${JSON.encode(key)}]', value);
+        }
+        result[decodedKey] = value;
+      });
+      return result;
+    } else {
+      throw mismatch(jsonPath, 'Map');
+    }
+  }
+
+  /**
+   * Decode a JSON object that is expected to be a string.
+   */
+  String _decodeString(String jsonPath, Object json) {
+    if (json is String) {
+      return json;
+    } else {
+      throw mismatch(jsonPath, 'String');
+    }
+  }
+
+  /**
+   * Decode a JSON object that is expected to be one of several choices,
+   * where the choices are disambiguated by the contents of the field [field].
+   * [decoders] is a map from each possible string in the field to the decoder
+   * that should be used to decode the JSON object.
+   */
+  Object _decodeUnion(String jsonPath, Map json, String field, Map<String,
+      JsonDecoderCallback> decoders) {
+    if (json is Map) {
+      if (!json.containsKey(field)) {
+        throw missingKey(jsonPath, field);
+      }
+      var disambiguatorPath = '$jsonPath[${JSON.encode(field)}]';
+      String disambiguator = _decodeString(disambiguatorPath, json[field]);
+      if (!decoders.containsKey(disambiguator)) {
+        throw mismatch(disambiguatorPath, 'One of: ${decoders.keys.toList()}');
+      }
+      return decoders[disambiguator](jsonPath, json);
+    } else {
+      throw mismatch(jsonPath, 'Map');
+    }
+  }
+}
+
+
+/**
+ * Instances of the class [Notification] represent a notification from the
+ * server about an event that occurred.
+ */
+class Notification {
+  /**
+   * The name of the JSON attribute containing the name of the event that
+   * triggered the notification.
+   */
+  static const String EVENT = 'event';
+
+  /**
+   * The name of the JSON attribute containing the result values.
+   */
+  static const String PARAMS = 'params';
+
+  /**
+   * The name of the event that triggered the notification.
+   */
+  final String event;
+
+  /**
+   * A table mapping the names of notification parameters to their values, or
+   * null if there are no notification parameters.
+   */
+  Map<String, Object> _params;
+
+  /**
+   * Initialize a newly created [Notification] to have the given [event] name.
+   * If [_params] is provided, it will be used as the params; otherwise no
+   * params will be used.
+   */
+  Notification(this.event, [this._params]);
+
+  /**
+   * Initialize a newly created instance based upon the given JSON data
+   */
+  factory Notification.fromJson(Map<String, Object> json) {
+    return new Notification(
+        json[Notification.EVENT],
+        json[Notification.PARAMS]);
+  }
+
+  /**
+   * Return a table representing the structure of the Json object that will be
+   * sent to the client to represent this response.
+   */
+  Map<String, Object> toJson() {
+    Map<String, Object> jsonObject = {};
+    jsonObject[EVENT] = event;
+    if (_params != null) {
+      jsonObject[PARAMS] = _params;
+    }
+    return jsonObject;
+  }
+}
+
+
+/**
+ * Instances of the class [Request] represent a request that was received.
+ */
+class Request {
+  /**
+   * The name of the JSON attribute containing the id of the request.
+   */
+  static const String ID = 'id';
+
+  /**
+   * The name of the JSON attribute containing the name of the request.
+   */
+  static const String METHOD = 'method';
+
+  /**
+   * The name of the JSON attribute containing the request parameters.
+   */
+  static const String PARAMS = 'params';
+
+  /**
+   * The unique identifier used to identify this request.
+   */
+  final String id;
+
+  /**
+   * The method being requested.
+   */
+  final String method;
+
+  /**
+   * A table mapping the names of request parameters to their values.
+   */
+  final Map<String, Object> _params;
+
+  /**
+   * Initialize a newly created [Request] to have the given [id] and [method]
+   * name.  If [params] is supplied, it is used as the "params" map for the
+   * request.  Otherwise an empty "params" map is allocated.
+   */
+  Request(this.id, this.method, [Map<String, Object> params])
+      : _params = params != null ? params : new HashMap<String, Object>();
+
+  /**
+   * Return a request parsed from the given [data], or `null` if the [data] is
+   * not a valid json representation of a request. The [data] is expected to
+   * have the following format:
+   *
+   *   {
+   *     'id': String,
+   *     'method': methodName,
+   *     'params': {
+   *       paramter_name: value
+   *     }
+   *   }
+   *
+   * where the parameters are optional and can contain any number of name/value
+   * pairs.
+   */
+  factory Request.fromString(String data) {
+    try {
+      var result = JSON.decode(data);
+      if (result is! Map) {
+        return null;
+      }
+      var id = result[Request.ID];
+      var method = result[Request.METHOD];
+      if (id is! String || method is! String) {
+        return null;
+      }
+      var params = result[Request.PARAMS];
+      if (params is Map || params == null) {
+        return new Request(id, method, params);
+      } else {
+        return null;
+      }
+    } catch (exception) {
+      return null;
+    }
+  }
+
+  /**
+   * Return a table representing the structure of the Json object that will be
+   * sent to the client to represent this response.
+   */
+  Map<String, Object> toJson() {
+    Map<String, Object> jsonObject = new HashMap<String, Object>();
+    jsonObject[ID] = id;
+    jsonObject[METHOD] = method;
+    if (_params.isNotEmpty) {
+      jsonObject[PARAMS] = _params;
+    }
+    return jsonObject;
+  }
+}
+
+/**
+ * JsonDecoder for decoding requests.  Errors are reporting by throwing a
+ * [RequestFailure].
+ */
+class RequestDecoder extends JsonDecoder {
+  /**
+   * The request being deserialized.
+   */
+  final Request _request;
+
+  RequestDecoder(this._request);
+
+  @override
+  dynamic mismatch(String jsonPath, String expected) {
+    return new RequestFailure(
+        new Response.invalidParameter(_request, jsonPath, 'be $expected'));
+  }
+
+  @override
+  dynamic missingKey(String jsonPath, String key) {
+    return new RequestFailure(
+        new Response.invalidParameter(
+            _request,
+            jsonPath,
+            'contain key ${JSON.encode(key)}'));
+  }
+}
+
+
+/**
+ * Instances of the class [RequestFailure] represent an exception that occurred
+ * during the handling of a request that requires that an error be returned to
+ * the client.
+ */
+class RequestFailure implements Exception {
+  /**
+   * The response to be returned as a result of the failure.
+   */
+  final Response response;
+
+  /**
+   * Initialize a newly created exception to return the given reponse.
+   */
+  RequestFailure(this.response);
+}
+
+/**
+ * Instances of the class [RequestHandler] implement a handler that can handle
+ * requests and produce responses for them.
+ */
+abstract class RequestHandler {
+  /**
+   * Attempt to handle the given [request]. If the request is not recognized by
+   * this handler, return `null` so that other handlers will be given a chance
+   * to handle it. Otherwise, return the response that should be passed back to
+   * the client.
+   */
+  Response handleRequest(Request request);
+}
+
+/**
+ * Instances of the class [Response] represent a response to a request.
+ */
+class Response {
+  /**
+   * The [Response] instance that is returned when a real [Response] cannot
+   * be provided at the moment.
+   */
+  static final Response DELAYED_RESPONSE = new Response('DELAYED_RESPONSE');
+
+  /**
+   * The name of the JSON attribute containing the id of the request for which
+   * this is a response.
+   */
+  static const String ID = 'id';
+
+  /**
+   * The name of the JSON attribute containing the error message.
+   */
+  static const String ERROR = 'error';
+
+  /**
+   * The name of the JSON attribute containing the result values.
+   */
+  static const String RESULT = 'result';
+
+  /**
+   * The unique identifier used to identify the request that this response is
+   * associated with.
+   */
+  final String id;
+
+  /**
+   * The error that was caused by attempting to handle the request, or `null` if
+   * there was no error.
+   */
+  final RequestError error;
+
+  /**
+   * A table mapping the names of result fields to their values.  Should be
+   * null if there is no result to send.
+   */
+  Map<String, Object> _result;
+
+  /**
+   * Initialize a newly created instance to represent a response to a request
+   * with the given [id].  If [_result] is provided, it will be used as the
+   * result; otherwise an empty result will be used.  If an [error] is provided
+   * then the response will represent an error condition.
+   */
+  Response(this.id, {Map<String, Object> result, this.error})
+      : _result = result;
+
+  /**
+   * Initialize a newly created instance based upon the given JSON data
+   */
+  factory Response.fromJson(Map<String, Object> json) {
+    try {
+      Object id = json[Response.ID];
+      if (id is! String) {
+        return null;
+      }
+      Object error = json[Response.ERROR];
+      RequestError decodedError;
+      if (error is Map) {
+        decodedError =
+            new RequestError.fromJson(new ResponseDecoder(null), '.error', error);
+      }
+      Object result = json[Response.RESULT];
+      Map<String, Object> decodedResult;
+      if (result is Map) {
+        decodedResult = result;
+      }
+      return new Response(id, error: decodedError, result: decodedResult);
+    } catch (exception) {
+      return null;
+    }
+  }
+
+  /**
+   * Initialize a newly created instance to represent the
+   * GET_ERRORS_INVALID_FILE error condition.
+   */
+  Response.getErrorsInvalidFile(Request request)
+      : this(
+          request.id,
+          error: new RequestError(
+              RequestErrorCode.GET_ERRORS_INVALID_FILE,
+              'Error during `analysis.getErrors`: invalid file.'));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a [request] that had invalid parameter.  [path] is the path to the
+   * invalid parameter, in Javascript notation (e.g. "foo.bar" means that the
+   * parameter "foo" contained a key "bar" whose value was the wrong type).
+   * [expectation] is a description of the type of data that was expected.
+   */
+  Response.invalidParameter(Request request, String path, String expectation)
+      : this(
+          request.id,
+          error: new RequestError(
+              RequestErrorCode.INVALID_PARAMETER,
+              "Expected parameter $path to $expectation"));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a malformed request.
+   */
+  Response.invalidRequestFormat()
+      : this(
+          '',
+          error: new RequestError(RequestErrorCode.INVALID_REQUEST, 'Invalid request'));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a `analysis.setPriorityFiles` [request] that includes one or more files
+   * that are not being analyzed.
+   */
+  Response.unanalyzedPriorityFiles(Request request, String fileNames)
+      : this(
+          request.id,
+          error: new RequestError(
+              RequestErrorCode.UNANALYZED_PRIORITY_FILES,
+              "Unanalyzed files cannot be a priority: '$fileNames'"));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a [request] that cannot be handled by any known handlers.
+   */
+  Response.unknownRequest(Request request)
+      : this(
+          request.id,
+          error: new RequestError(RequestErrorCode.UNKNOWN_REQUEST, 'Unknown request'));
+
+  Response.unsupportedFeature(String requestId, String message)
+      : this(
+          requestId,
+          error: new RequestError(RequestErrorCode.UNSUPPORTED_FEATURE, message));
+
+  /**
+   * Return a table representing the structure of the Json object that will be
+   * sent to the client to represent this response.
+   */
+  Map<String, Object> toJson() {
+    Map<String, Object> jsonObject = new HashMap<String, Object>();
+    jsonObject[ID] = id;
+    if (error != null) {
+      jsonObject[ERROR] = error.toJson();
+    }
+    if (_result != null) {
+      jsonObject[RESULT] = _result;
+    }
+    return jsonObject;
+  }
+}
+
+/**
+ * JsonDecoder for decoding responses from the server.  This is intended to be
+ * used only for testing.  Errors are reported using bare [Exception] objects.
+ */
+class ResponseDecoder extends JsonDecoder {
+  final Response response;
+
+  ResponseDecoder(this.response);
+
+  @override
+  dynamic mismatch(String jsonPath, String expected) {
+    return new Exception('Expected $expected at $jsonPath');
+  }
+
+  @override
+  dynamic missingKey(String jsonPath, String key) {
+    return new Exception('Missing key $key at $jsonPath');
+  }
+}
+
+/**
+ * Jenkins hash function, optimized for small integers.  Borrowed from
+ * sdk/lib/math/jenkins_smi_hash.dart.
+ *
+ * TODO(paulberry): Move to somewhere that can be shared with other code.
+ */
+class _JenkinsSmiHash {
+  static int combine(int hash, int value) {
+    hash = 0x1fffffff & (hash + value);
+    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
+    return hash ^ (hash >> 6);
+  }
+
+  static int finish(int hash) {
+    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
+    hash = hash ^ (hash >> 11);
+    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
+  }
+
+  static int hash2(a, b) => finish(combine(combine(0, a), b));
+
+  static int hash4(a, b, c, d) =>
+      finish(combine(combine(combine(combine(0, a), b), c), d));
+}
diff --git a/pkg/analysis_server/bin/fuzz/server_manager.dart b/pkg/analysis_server/bin/fuzz/server_manager.dart
new file mode 100644
index 0000000..c59e18c
--- /dev/null
+++ b/pkg/analysis_server/bin/fuzz/server_manager.dart
@@ -0,0 +1,365 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library server.manager;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:matcher/matcher.dart';
+
+import 'byte_stream_channel.dart';
+import 'channel.dart';
+import 'protocol.dart';
+
+part 'logging_client_channel.dart';
+
+/**
+ * The results returned by [ServerManager].analyze(...) once analysis
+ * has finished.
+ */
+class AnalysisResults {
+  Duration elapsed;
+  int errorCount = 0;
+  int hintCount = 0;
+  int warningCount = 0;
+}
+
+
+/**
+ * [CompletionResults] contains the completion results returned by the server
+ * along with the elapse time to receive those completions.
+ */
+class CompletionResults {
+  final Duration elapsed;
+  final CompletionResultsParams params;
+
+  CompletionResults(this.elapsed, this.params);
+
+  int get suggestionCount => params.results.length;
+}
+
+/**
+ * [Editor] is a virtual editor for inspecting and modifying a file's content
+ * and updating the server with those modifications.
+ */
+class Editor {
+  final ServerManager manager;
+  final File file;
+  int offset = 0;
+  String _content = null;
+
+  Editor(this.manager, this.file);
+
+  /// Return a future that returns the file content
+  Future<String> get content {
+    if (_content != null) {
+      return new Future.value(_content);
+    }
+    return file.readAsString().then((String content) {
+      _content = content;
+      return _content;
+    });
+  }
+
+  /**
+   * Request completion suggestions from the server.
+   * Return a future that completes with the completions sent.
+   */
+  Future<List<CompletionResults>> getSuggestions() {
+    Request request = new CompletionGetSuggestionsParams(
+        file.path,
+        offset).toRequest(manager._nextRequestId);
+    Stopwatch stopwatch = new Stopwatch()..start();
+    return manager.channel.sendRequest(request).then((Response response) {
+      String completionId =
+          new CompletionGetSuggestionsResult.fromResponse(response).id;
+      var completer = new Completer<List<CompletionResults>>();
+      List<CompletionResults> results = [];
+
+      // Listen for completion suggestions
+      StreamSubscription<Notification> subscription;
+      subscription =
+          manager.channel.notificationStream.listen((Notification notification) {
+        if (notification.event == 'completion.results') {
+          CompletionResultsParams params =
+              new CompletionResultsParams.fromNotification(notification);
+          if (params.id == completionId) {
+            results.add(new CompletionResults(stopwatch.elapsed, params));
+            if (params.isLast) {
+              stopwatch.stop();
+              subscription.cancel();
+              completer.complete(results);
+            }
+          }
+        }
+      });
+
+      return completer.future;
+    });
+  }
+
+  /**
+   * Move the virtual cursor after the given pattern in the source.
+   * Return a future that completes once the cursor has been moved.
+   */
+  Future<Editor> moveAfter(String pattern) {
+    return content.then((String content) {
+      offset = content.indexOf(pattern);
+      return this;
+    });
+  }
+
+  /**
+   * Replace the specified number of characters at the current cursor location
+   * with the given text, but do not save that content to disk.
+   * Return a future that completes once the server has been notified.
+   */
+  Future<Editor> replace(int replacementLength, String text) {
+    return content.then((String oldContent) {
+      StringBuffer sb = new StringBuffer();
+      sb.write(oldContent.substring(0, offset));
+      sb.write(text);
+      sb.write(oldContent.substring(offset));
+      _content = sb.toString();
+      SourceEdit sourceEdit = new SourceEdit(offset, replacementLength, text);
+      Request request = new AnalysisUpdateContentParams({
+        file.path: new ChangeContentOverlay([sourceEdit])
+      }).toRequest(manager._nextRequestId);
+      offset += text.length;
+      return manager.channel.sendRequest(request).then((Response response) {
+        return this;
+      });
+    });
+  }
+}
+
+/**
+ * [ServerManager] is used to launch and manage an analysis server
+ * running in a separate process.
+ */
+class ServerManager {
+
+  /**
+   * The analysis server process being managed or `null` if not started.
+   */
+  Process process;
+
+  /**
+   * The root directory containing the Dart source files to be analyzed.
+   */
+  Directory appDir;
+
+  /**
+   * The channel used to communicate with the analysis server.
+   */
+  LoggingClientChannel _channel;
+
+  /**
+   * The identifier used in the most recent request to the server.
+   * See [_nextRequestId].
+   */
+  int _lastRequestId = 0;
+
+  /**
+   * `true` if a server exception was detected on stderr as opposed to an
+   * exception that the server reported via the server.error notification.
+   */
+  bool _unreportedServerException = false;
+
+  /**
+   * `true` if the [stop] method has been called.
+   */
+  bool _stopRequested = false;
+
+  /**
+   * Return the channel used to communicate with the analysis server.
+   */
+  ClientCommunicationChannel get channel => _channel;
+
+  /**
+   * Return `true` if a server error occurred.
+   */
+  bool get errorOccurred =>
+      _unreportedServerException || (_channel.serverErrorCount > 0);
+
+  String get _nextRequestId => (++_lastRequestId).toString();
+
+  /**
+   * Direct the server to analyze all sources in the given directory,
+   * all sub directories recursively, and any source referenced sources
+   * outside this directory hierarch such as referenced packages.
+   * Return a future that completes when the analysis is finished.
+   */
+  Future<AnalysisResults> analyze(Directory appDir) {
+    this.appDir = appDir;
+    Stopwatch stopwatch = new Stopwatch()..start();
+    Request request =
+        new AnalysisSetAnalysisRootsParams([appDir.path], []).toRequest(_nextRequestId);
+
+    // Request analysis
+    return channel.sendRequest(request).then((Response response) {
+      AnalysisResults results = new AnalysisResults();
+      StreamSubscription<Notification> subscription;
+      Completer<AnalysisResults> completer = new Completer<AnalysisResults>();
+      subscription =
+          channel.notificationStream.listen((Notification notification) {
+
+        // Gather analysis results
+        if (notification.event == 'analysis.errors') {
+          AnalysisErrorsParams params =
+              new AnalysisErrorsParams.fromNotification(notification);
+          params.errors.forEach((AnalysisError error) {
+            AnalysisErrorSeverity severity = error.severity;
+            if (severity == AnalysisErrorSeverity.ERROR) {
+              results.errorCount += 1;
+            } else if (severity == AnalysisErrorSeverity.WARNING) {
+              results.warningCount += 1;
+            } else if (severity == AnalysisErrorSeverity.INFO) {
+              results.hintCount += 1;
+            } else {
+              print('Unknown error severity: ${severity.name}');
+            }
+          });
+        }
+
+        // Stop gathering once analysis is complete
+        if (notification.event == 'server.status') {
+          ServerStatusParams status =
+              new ServerStatusParams.fromNotification(notification);
+          AnalysisStatus analysis = status.analysis;
+          if (analysis != null && !analysis.isAnalyzing) {
+            stopwatch.stop();
+            results.elapsed = stopwatch.elapsed;
+            subscription.cancel();
+            completer.complete(results);
+          }
+        }
+      });
+      return completer.future;
+    });
+  }
+
+  /**
+   * Send a request to the server for its version information
+   * and return a future that completes with the result.
+   */
+  Future<ServerGetVersionResult> getVersion() {
+    Request request = new ServerGetVersionParams().toRequest(_nextRequestId);
+    return channel.sendRequest(request).then((Response response) {
+      return new ServerGetVersionResult.fromResponse(response);
+    });
+  }
+
+  /**
+   * Notify the server that the given file will be edited.
+   * Return a virtual editor for inspecting and modifying the file's content.
+   */
+  Future<Editor> openFileNamed(String fileName) {
+    return _findFile(fileName, appDir).then((File file) {
+      if (file == null) {
+        throw 'Failed to find file named $fileName in ${appDir.path}';
+      }
+      file = file.absolute;
+      Request request =
+          new AnalysisSetPriorityFilesParams([file.path]).toRequest(_nextRequestId);
+      return channel.sendRequest(request).then((Response response) {
+        return new Editor(this, file);
+      });
+    });
+  }
+
+  /**
+   * Send a request for notifications.
+   * Return when the server has acknowledged that request.
+   */
+  Future setSubscriptions() {
+    Request request =
+        new ServerSetSubscriptionsParams([ServerService.STATUS]).toRequest(_nextRequestId);
+    return channel.sendRequest(request);
+  }
+
+  /**
+   * Stop the analysis server.
+   * Return a future that completes when the server is terminated.
+   */
+  Future stop([_]) {
+    _stopRequested = true;
+    print("Requesting server shutdown");
+    Request request = new ServerShutdownParams().toRequest(_nextRequestId);
+    Duration waitTime = new Duration(seconds: 5);
+    return channel.sendRequest(request).timeout(waitTime, onTimeout: () {
+      print('Expected shutdown response');
+    }).then((Response response) {
+      return channel.close().then((_) => process.exitCode);
+    }).timeout(new Duration(seconds: 2), onTimeout: () {
+      print('Expected server to shutdown');
+      process.kill();
+    });
+  }
+
+  /**
+   * Locate the given file in the directory tree.
+   */
+  Future<File> _findFile(String fileName, Directory appDir) {
+    return appDir.list(recursive: true).firstWhere((FileSystemEntity entity) {
+      return entity is File && entity.path.endsWith(fileName);
+    });
+  }
+
+  /**
+   * Launch an analysis server and open a connection to that server.
+   */
+  Future<ServerManager> _launchServer(String pathToServer) {
+    List<String> serverArgs = [pathToServer];
+    return Process.start(Platform.executable, serverArgs).catchError((error) {
+      exitCode = 21;
+      throw 'Failed to launch analysis server: $error';
+    }).then((Process process) {
+      this.process = process;
+      _channel = new LoggingClientChannel(
+          new ByteStreamClientChannel(process.stdout, process.stdin));
+
+      // simple out of band exception handling
+      process.stderr.transform(
+          new Utf8Codec().decoder).transform(new LineSplitter()).listen((String line) {
+        if (!_unreportedServerException) {
+          _unreportedServerException = true;
+          stderr.writeln('>>> Unreported server exception');
+        }
+        stderr.writeln('server.stderr: $line');
+      });
+
+      // watch for unexpected process termination and catch the exit code
+      process.exitCode.then((int code) {
+        if (!_stopRequested) {
+          fail('Unexpected server termination: $code');
+        }
+        if (code != null && code != 0) {
+          exitCode = code;
+        }
+        print('Server stopped: $code');
+      });
+
+      return channel.notificationStream.first.then((Notification notification) {
+        print('Server connection established');
+        return setSubscriptions().then((_) {
+          return getVersion().then((ServerGetVersionResult result) {
+            print('Server version ${result.version}');
+            return this;
+          });
+        });
+      });
+    });
+  }
+
+  /**
+   * Launch analysis server in a separate process
+   * and return a future with a manager for that analysis server.
+   */
+  static Future<ServerManager> start(String serverPath) {
+    return new ServerManager()._launchServer(serverPath);
+  }
+}
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index d5a60b7..2406df0 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -1398,7 +1398,9 @@
   "id": String
   "error": <span style="color:#999999">optional</span> <a href="#type_RequestError">RequestError</a>
   "result": {
-    "<b>problems</b>": List&lt;<a href="#type_RefactoringProblem">RefactoringProblem</a>&gt;
+    "<b>initialProblems</b>": List&lt;<a href="#type_RefactoringProblem">RefactoringProblem</a>&gt;
+    "<b>optionsProblems</b>": List&lt;<a href="#type_RefactoringProblem">RefactoringProblem</a>&gt;
+    "<b>finalProblems</b>": List&lt;<a href="#type_RefactoringProblem">RefactoringProblem</a>&gt;
     "<b>feedback</b>": <span style="color:#999999">optional</span> <a href="#type_RefactoringFeedback">RefactoringFeedback</a>
     "<b>change</b>": <span style="color:#999999">optional</span> <a href="#type_SourceChange">SourceChange</a>
     "<b>potentialEdits</b>": <span style="color:#999999">optional</span> List&lt;String&gt;
@@ -1447,11 +1449,28 @@
               does not require any options or if the values of those
               options are not known.
             </p>
-          </dd></dl><h4>Returns</h4><dl><dt class="field"><b><i>problems ( List&lt;<a href="#type_RefactoringProblem">RefactoringProblem</a>&gt; )</i></b></dt><dd>
+          </dd></dl><h4>Returns</h4><dl><dt class="field"><b><i>initialProblems ( List&lt;<a href="#type_RefactoringProblem">RefactoringProblem</a>&gt; )</i></b></dt><dd>
             
             <p>
-              The status of the refactoring. The array will be empty
-              if there are no known problems.
+              The initial status of the refactoring, i.e. problems related to
+              the context in which the refactoring is requested.
+              The array will be empty if there are no known problems.
+            </p>
+          </dd><dt class="field"><b><i>optionsProblems ( List&lt;<a href="#type_RefactoringProblem">RefactoringProblem</a>&gt; )</i></b></dt><dd>
+            
+            <p>
+              The options validation status, i.e. problems in the given options,
+              such as light-weight validation of a new name, flags
+              compatibility, etc.
+              The array will be empty if there are no known problems.
+            </p>
+          </dd><dt class="field"><b><i>finalProblems ( List&lt;<a href="#type_RefactoringProblem">RefactoringProblem</a>&gt; )</i></b></dt><dd>
+            
+            <p>
+              The final status of the refactoring, i.e. problems identified in
+              the result of a full, potentially expensive validation and / or
+              change creation.
+              The array will be empty if there are no known problems.
             </p>
           </dd><dt class="field"><b><i>feedback ( <span style="color:#999999">optional</span> <a href="#type_RefactoringFeedback">RefactoringFeedback</a> )</i></b></dt><dd>
             
@@ -1629,13 +1648,13 @@
           </dd></dl></dd></dl><h3>Notifications</h3><dl><dt class="notification">execution.launchData</dt><dd><div class="box"><pre>notification: {
   "event": "execution.launchData"
   "params": {
-    "<b>executables</b>": List&lt;<a href="#type_ExecutableFile">ExecutableFile</a>&gt;
-    "<b>dartToHtml</b>": Map&lt;<a href="#type_FilePath">FilePath</a>, List&lt;<a href="#type_FilePath">FilePath</a>&gt;&gt;
-    "<b>htmlToDart</b>": Map&lt;<a href="#type_FilePath">FilePath</a>, List&lt;<a href="#type_FilePath">FilePath</a>&gt;&gt;
+    "<b>file</b>": <a href="#type_FilePath">FilePath</a>
+    "<b>kind</b>": <span style="color:#999999">optional</span> <a href="#type_ExecutableKind">ExecutableKind</a>
+    "<b>referencedFiles</b>": <span style="color:#999999">optional</span> List&lt;<a href="#type_FilePath">FilePath</a>&gt;
   }
 }</pre></div>
         <p>
-          Reports information needed to allow applications to be launched.
+          Reports information needed to allow a single file to be launched.
         </p>
         <p>
           This notification is not subscribed to by default. Clients can
@@ -1643,23 +1662,23 @@
           passed in an <tt>execution.setSubscriptions</tt> request.
         </p>
         
-      <h4>Parameters</h4><dl><dt class="field"><b><i>executables ( List&lt;<a href="#type_ExecutableFile">ExecutableFile</a>&gt; )</i></b></dt><dd>
+      <h4>Parameters</h4><dl><dt class="field"><b><i>file ( <a href="#type_FilePath">FilePath</a> )</i></b></dt><dd>
             
             <p>
-              A list of the files that are executable. This list replaces any
-              previous list provided.
+              The file for which launch data is being provided. This will either
+              be a Dart library or an HTML file.
             </p>
-          </dd><dt class="field"><b><i>dartToHtml ( Map&lt;<a href="#type_FilePath">FilePath</a>, List&lt;<a href="#type_FilePath">FilePath</a>&gt;&gt; )</i></b></dt><dd>
+          </dd><dt class="field"><b><i>kind ( <span style="color:#999999">optional</span> <a href="#type_ExecutableKind">ExecutableKind</a> )</i></b></dt><dd>
             
             <p>
-              A mapping from the paths of Dart files that are referenced by HTML
-              files to a list of the HTML files that reference the Dart files.
+              The kind of the executable file. This field is omitted if the file
+              is not a Dart file.
             </p>
-          </dd><dt class="field"><b><i>htmlToDart ( Map&lt;<a href="#type_FilePath">FilePath</a>, List&lt;<a href="#type_FilePath">FilePath</a>&gt;&gt; )</i></b></dt><dd>
+          </dd><dt class="field"><b><i>referencedFiles ( <span style="color:#999999">optional</span> List&lt;<a href="#type_FilePath">FilePath</a>&gt; )</i></b></dt><dd>
             
             <p>
-              A mapping from the paths of HTML files that reference Dart files
-              to a list of the Dart files they reference.
+              A list of the Dart files that are referenced by the file. This
+              field is omitted if the file is not an HTML file.
             </p>
           </dd></dl></dd></dl>
     
@@ -1966,6 +1985,11 @@
               field is omitted if the suggested element is not a member
               of a class.
             </p>
+          </dd><dt class="field"><b><i>element ( <span style="color:#999999">optional</span> <a href="#type_Element">Element</a> )</i></b></dt><dd>
+            
+            <p>
+              Information about the element reference being suggested.
+            </p>
           </dd><dt class="field"><b><i>returnType ( <span style="color:#999999">optional</span> String )</i></b></dt><dd>
             
             <p>
@@ -2077,7 +2101,7 @@
           An enumeration of the kinds of elements.
         </p>
         
-      <dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">FIELD</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_ExecutableFile">ExecutableFile: object</a></dt><dd>
+      <dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">FIELD</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">PARAMETER</dt><dt class="value">PREFIX</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_ExecutableFile">ExecutableFile: object</a></dt><dd>
         <p>
           A description of an executable file.
         </p>
@@ -2097,7 +2121,7 @@
           An enumeration of the kinds of executable files.
         </p>
         
-      <dl><dt class="value">CLIENT</dt><dt class="value">EITHER</dt><dt class="value">SERVER</dt></dl></dd><dt class="typeDefinition"><a name="type_ExecutionContextId">ExecutionContextId: String</a></dt><dd>
+      <dl><dt class="value">CLIENT</dt><dt class="value">EITHER</dt><dt class="value">NOT_EXECUTABLE</dt><dt class="value">SERVER</dt></dl></dd><dt class="typeDefinition"><a name="type_ExecutionContextId">ExecutionContextId: String</a></dt><dd>
         
         <p>
           The identifier for a execution context.
@@ -2472,7 +2496,7 @@
           created.
         </p>
         
-      <dl><dt class="value">CONVERT_GETTER_TO_METHOD</dt><dt class="value">CONVERT_METHOD_TO_GETTER</dt><dt class="value">EXTRACT_LOCAL_VARIABLE</dt><dt class="value">EXTRACT_METHOD</dt><dt class="value">INLINE_LOCAL_VARIABLE</dt><dt class="value">INLINE_METHOD</dt><dt class="value">RENAME</dt></dl></dd><dt class="typeDefinition"><a name="type_RefactoringMethodParameter">RefactoringMethodParameter: object</a></dt><dd>
+      <dl><dt class="value">CONVERT_GETTER_TO_METHOD</dt><dt class="value">CONVERT_METHOD_TO_GETTER</dt><dt class="value">EXTRACT_LOCAL_VARIABLE</dt><dt class="value">EXTRACT_METHOD</dt><dt class="value">INLINE_LOCAL_VARIABLE</dt><dt class="value">INLINE_METHOD</dt><dt class="value">MOVE_FILE</dt><dt class="value">RENAME</dt><dt class="value">SORT_MEMBERS</dt></dl></dd><dt class="typeDefinition"><a name="type_RefactoringMethodParameter">RefactoringMethodParameter: object</a></dt><dd>
         <p>
           A description of a parameter in a method refactoring.
         </p>
@@ -2821,6 +2845,15 @@
             <p>
               The file containing the code to be modified.
             </p>
+          </dd><dt class="field"><b><i>fileStamp ( long )</i></b></dt><dd>
+            
+            <p>
+              The modification stamp of the file at the moment when the change
+              was created, in milliseconds since the "Unix epoch". Will be -1 if
+              the file did not exist and should be created. The client may use
+              this field to make sure that the file was not changed since then,
+              so it is safe to apply the change.
+            </p>
           </dd><dt class="field"><b><i>edits ( List&lt;<a href="#type_SourceEdit">SourceEdit</a>&gt; )</i></b></dt><dd>
             
             <p>
@@ -2900,6 +2933,8 @@
       
       
       
+      
+      
     <dl><dt class="refactoring">CONVERT_GETTER_TO_METHOD</dt><dd>
         <p>
           Convert a getter into a method by removing the keyword get
@@ -3130,6 +3165,27 @@
               or false if only the invocation site used to create this
               refactoring should be inlined.
             </p>
+          </dd></dl></dd><dt class="refactoring">MOVE_FILE</dt><dd>
+        <p>
+          Move the given file and update all of the references to that file
+          and from it. The move operation is supported in general case - for
+          renaming a file in the same folder, moving it to a different folder
+          or both.
+        </p>
+        <p>
+          The refactoring must be activated before an actual file moving
+          operation is performed.
+        </p>
+        <p>
+          The "offset" and "length" fields from the request are ignored, but the
+          file specified in the request specifies the file to be moved.
+        </p>
+        
+      <h4>Feedback</h4><p>none</p><h4>Options</h4><dl><dt class="field"><b><i>newFile ( <a href="#type_FilePath">FilePath</a> )</i></b></dt><dd>
+            
+            <p>
+              The new file path to which the given file is being moved.
+            </p>
           </dd></dl></dd><dt class="refactoring">RENAME</dt><dd>
         <p>
           Rename a given element and all of the references to that
@@ -3172,7 +3228,16 @@
               The name that the element should have after the
               refactoring.
             </p>
-          </dd></dl></dd></dl>
+          </dd></dl></dd><dt class="refactoring">SORT_MEMBERS</dt><dd>
+        <p>
+          Sort all of the directives, unit and class members
+          of the given Dart file.
+        </p>
+        <p>
+          The "offset" and "length" fields from the request are ignored, but the
+          file specified in the request specifies the file to be sorted.
+        </p>
+      <h4>Feedback</h4><p>none</p><h4>Options</h4><p>none</p></dd></dl>
     <h2>Errors</h2>
     <p>
       This section contains a list of all of the errors that are
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 1236eb9..3900965 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -208,9 +208,19 @@
       new HashMap<AnalysisContext, Completer<AnalysisDoneReason>>();
 
   /**
-   * The listeners that are listening for lifecycle events from this server.
+   * The controller that is notified when analysis is started.
    */
-  List<AnalysisServerListener> listeners = <AnalysisServerListener>[];
+  StreamController<AnalysisContext> _onAnalysisStartedController;
+
+  /**
+   * The controller that is notified when analysis is complete.
+   */
+  StreamController _onAnalysisCompleteController;
+
+  /**
+   * The controller that is notified when a single file has been analyzed.
+   */
+  StreamController<ChangeNotice> _onFileAnalyzedController;
 
   /**
    * True if any exceptions thrown by analysis should be propagated up the call
@@ -235,6 +245,9 @@
     contextDirectoryManager =
         new ServerContextManager(this, resourceProvider, packageMapProvider);
     AnalysisEngine.instance.logger = new AnalysisLogger();
+    _onAnalysisStartedController = new StreamController.broadcast();
+    _onAnalysisCompleteController = new StreamController.broadcast();
+    _onFileAnalyzedController = new StreamController.broadcast();
     running = true;
     Notification notification = new ServerConnectedParams().toNotification();
     channel.sendNotification(notification);
@@ -242,6 +255,17 @@
   }
 
   /**
+   * If the given notice applies to a file contained within an analysis root,
+   * notify interested parties that the file has been (at least partially)
+   * analyzed.
+   */
+  void fileAnalyzed(ChangeNotice notice) {
+    if (contextDirectoryManager.isInAnalysisRoot(notice.source.fullName)) {
+      _onFileAnalyzedController.add(notice);
+    }
+  }
+
+  /**
    * Schedules execution of the given [ServerOperation].
    */
   void scheduleOperation(ServerOperation operation) {
@@ -256,6 +280,7 @@
    * Schedules analysis of the given context.
    */
   void schedulePerformAnalysisOperation(AnalysisContext context) {
+    _onAnalysisStartedController.add(context);
     scheduleOperation(new PerformAnalysisOperation(context, false));
   }
 
@@ -334,16 +359,23 @@
   }
 
   /**
-   * Add the given [listener] to the list of listeners that are listening for
-   * lifecycle events from this server.
+   * The stream that is notified when analysis of a context is started.
    */
-  void addAnalysisServerListener(AnalysisServerListener listener) {
-    if (!listeners.contains(listener)) {
-      listeners.add(listener);
-    }
+  Stream<AnalysisContext> get onAnalysisStarted {
+    return _onAnalysisStartedController.stream;
   }
 
   /**
+   * The stream that is notified when analysis is complete.
+   */
+  Stream get onAnalysisComplete => _onAnalysisCompleteController.stream;
+
+  /**
+   * The stream that is notified when a single file has been analyzed.
+   */
+  Stream get onFileAnalyzed => _onFileAnalyzedController.stream;
+
+  /**
    * Adds the given [ServerOperation] to the queue, but does not schedule
    * operations execution.
    */
@@ -482,7 +514,7 @@
         _schedulePerformOperation();
       } else {
         sendStatusNotification(null);
-        _notifyAnalysisComplete();
+        _onAnalysisCompleteController.add(null);
       }
     }
   }
@@ -499,14 +531,6 @@
   }
 
   /**
-   * Remove the given [listener] from the list of listeners that are listening
-   * for lifecycle events from this server.
-   */
-  void removeAnalysisServerListener(AnalysisServerListener listener) {
-    listeners.remove(listener);
-  }
-
-  /**
    * Send status notification to the client. The `operation` is the operation
    * being performed or `null` if analysis is complete.
    */
@@ -903,15 +927,6 @@
   }
 
   /**
-   * Notify all listeners that analysis is complete.
-   */
-  void _notifyAnalysisComplete() {
-    listeners.forEach((AnalysisServerListener listener) {
-      listener.analysisComplete();
-    });
-  }
-
-  /**
    * Schedules [performOperation] exection.
    */
   void _schedulePerformOperation() {
@@ -945,14 +960,4 @@
   }
 }
 
-/**
- * An object that is listening for lifecycle events from an analysis server.
- */
-abstract class AnalysisServerListener {
-  /**
-   * Analysis is complete.
-   */
-  void analysisComplete();
-}
-
 typedef void OptionUpdater(AnalysisOptionsImpl options);
diff --git a/pkg/analysis_server/lib/src/computer/element.dart b/pkg/analysis_server/lib/src/computer/element.dart
index f61e631..ad2720c 100644
--- a/pkg/analysis_server/lib/src/computer/element.dart
+++ b/pkg/analysis_server/lib/src/computer/element.dart
@@ -9,14 +9,6 @@
 import 'package:analyzer/src/generated/utilities_dart.dart' as engine;
 
 
-/**
- * Returns a JSON correponding to the given Engine element.
- */
-Map<String, Object> engineElementToJson(engine.Element element) {
-  return new Element.fromEngine(element).toJson();
-}
-
-
 Element elementFromEngine(engine.Element element) {
   String name = element.displayName;
   String elementParameters = _getParametersString(element);
@@ -64,8 +56,12 @@
 }
 
 String _getReturnTypeString(engine.Element element) {
-  if ((element is engine.ExecutableElement)) {
-    return element.returnType.toString();
+  if (element is engine.ExecutableElement) {
+    if (element.kind == engine.ElementKind.SETTER) {
+      return null;
+    } else {
+      return element.returnType.toString();
+    }
   } else {
     return null;
   }
diff --git a/pkg/analysis_server/lib/src/computer/error.dart b/pkg/analysis_server/lib/src/computer/error.dart
deleted file mode 100644
index 11f6d68..0000000
--- a/pkg/analysis_server/lib/src/computer/error.dart
+++ /dev/null
@@ -1,21 +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 computer.error;
-
-import 'package:analysis_server/src/protocol.dart';
-import 'package:analyzer/src/generated/engine.dart' as engine;
-import 'package:analyzer/src/generated/error.dart' as engine;
-import 'package:analyzer/src/generated/source.dart' as engine;
-
-
-/**
- * Returns a JSON correponding to the given list of Engine errors.
- */
-List<Map<String, Object>> engineErrorsToJson(engine.LineInfo lineInfo,
-    List<engine.AnalysisError> errors) {
-  return errors.map((engine.AnalysisError error) {
-    return new AnalysisError.fromEngine(lineInfo, error).toJson();
-  }).toList();
-}
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index fbecfe9..97faaf4 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -125,6 +125,7 @@
 const String ERRORS = 'errors';
 const String FATAL = 'fatal';
 const String FILE = 'file';
+const String FILE_STAMP = 'fileStamp';
 const String FILES = 'files';
 const String FIXES = 'fixes';
 const String FLAGS = 'flags';
diff --git a/pkg/analysis_server/lib/src/domain_execution.dart b/pkg/analysis_server/lib/src/domain_execution.dart
index 9fb599f..3461cd5 100644
--- a/pkg/analysis_server/lib/src/domain_execution.dart
+++ b/pkg/analysis_server/lib/src/domain_execution.dart
@@ -4,10 +4,12 @@
 
 library domain.execution;
 
+import 'dart:async';
+import 'dart:collection';
+
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'dart:collection';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -32,9 +34,10 @@
   Map<String, String> contextMap = new HashMap<String, String>();
 
   /**
-   * The listener used to send notifications when
+   * The subscription to the 'onAnalysisComplete' events,
+   * used to send notifications when
    */
-  LaunchDataNotificationListener launchDataListener;
+  StreamSubscription onFileAnalyzed;
 
   /**
    * Initialize a newly created handler to handle requests for the given [server].
@@ -123,87 +126,91 @@
     List<ExecutionService> subscriptions =
         new ExecutionSetSubscriptionsParams.fromRequest(request).subscriptions;
     if (subscriptions.contains(ExecutionService.LAUNCH_DATA)) {
-      if (launchDataListener == null) {
-        launchDataListener = new LaunchDataNotificationListener(server);
-        server.addAnalysisServerListener(launchDataListener);
-        if (server.isAnalysisComplete()) {
-          launchDataListener.analysisComplete();
-        }
+      if (onFileAnalyzed == null) {
+        onFileAnalyzed = server.onFileAnalyzed.listen(_fileAnalyzed);
+        _reportCurrentFileStatus();
       }
     } else {
-      if (launchDataListener != null) {
-        server.removeAnalysisServerListener(launchDataListener);
-        launchDataListener = null;
+      if (onFileAnalyzed != null) {
+        onFileAnalyzed.cancel();
+        onFileAnalyzed = null;
       }
     }
     return new ExecutionSetSubscriptionsResult().toResponse(request.id);
   }
-}
 
-/**
- * Instances of the class [LaunchDataNotificationListener] listen for analysis
- * to be complete and then notify the client of the launch data that has been
- * computed.
- */
-class LaunchDataNotificationListener implements AnalysisServerListener {
-  /**
-   * The analysis server used to send notifications.
-   */
-  final AnalysisServer server;
+  void _fileAnalyzed(ChangeNotice notice) {
+    Source source = notice.source;
+    String filePath = source.fullName;
+    AnalysisContext context = server.getAnalysisContext(filePath);
+    if (AnalysisEngine.isDartFileName(filePath)) {
+      ExecutableKind kind = ExecutableKind.NOT_EXECUTABLE;
+      if (context.isClientLibrary(source)) {
+        kind = ExecutableKind.CLIENT;
+        if (context.isServerLibrary(source)) {
+          kind = ExecutableKind.EITHER;
+        }
+      } else if (context.isServerLibrary(source)) {
+        kind = ExecutableKind.SERVER;
+      }
+      server.sendNotification(
+          new ExecutionLaunchDataParams(
+              filePath,
+              kind: kind).toNotification());
+    } else if (AnalysisEngine.isHtmlFileName(filePath)) {
+      List<Source> libraries = context.getLibrariesReferencedFromHtml(source);
+      server.sendNotification(
+          new ExecutionLaunchDataParams(
+              filePath,
+              referencedFiles: _getFullNames(libraries)).toNotification());
+    }
+  }
 
-  /**
-   * Initialize a newly created listener to send notifications through the given
-   * [server] when analysis is complete.
-   */
-  LaunchDataNotificationListener(this.server);
-
-  @override
-  void analysisComplete() {
-    List<ExecutableFile> executables = [];
+  void _reportCurrentFileStatus() {
     Map<String, List<String>> dartToHtml = new HashMap<String, List<String>>();
     Map<String, List<String>> htmlToDart = new HashMap<String, List<String>>();
     for (AnalysisContext context in server.getAnalysisContexts()) {
+      List<Source> librarySources = context.librarySources;
       List<Source> clientSources = context.launchableClientLibrarySources;
       List<Source> serverSources = context.launchableServerLibrarySources;
       for (Source source in clientSources) {
-        ExecutableKind kind = ExecutableKind.CLIENT;
         if (serverSources.remove(source)) {
-          kind = ExecutableKind.EITHER;
+          server.sendNotification(
+              new ExecutionLaunchDataParams(
+                  source.fullName,
+                  kind: ExecutableKind.EITHER).toNotification());
+        } else {
+          server.sendNotification(
+              new ExecutionLaunchDataParams(
+                  source.fullName,
+                  kind: ExecutableKind.CLIENT).toNotification());
         }
-        executables.add(new ExecutableFile(source.fullName, kind));
+        librarySources.remove(source);
       }
       for (Source source in serverSources) {
-        executables.add(
-            new ExecutableFile(source.fullName, ExecutableKind.SERVER));
+        server.sendNotification(
+            new ExecutionLaunchDataParams(
+                source.fullName,
+                kind: ExecutableKind.SERVER).toNotification());
+        librarySources.remove(source);
       }
-
-      for (Source librarySource in context.librarySources) {
-        List<Source> files = context.getHtmlFilesReferencing(librarySource);
-        if (files.isNotEmpty) {
-          // TODO(brianwilkerson) Handle the case where the same library is
-          // being analyzed in multiple contexts.
-          dartToHtml[librarySource.fullName] = getFullNames(files);
-        }
+      for (Source source in librarySources) {
+        server.sendNotification(
+            new ExecutionLaunchDataParams(
+                source.fullName,
+                kind: ExecutableKind.NOT_EXECUTABLE).toNotification());
       }
-
-      for (Source htmlSource in context.htmlSources) {
-        List<Source> libraries =
-            context.getLibrariesReferencedFromHtml(htmlSource);
-        if (libraries.isNotEmpty) {
-          // TODO(brianwilkerson) Handle the case where the same HTML file is
-          // being analyzed in multiple contexts.
-          htmlToDart[htmlSource.fullName] = getFullNames(libraries);
-        }
+      for (Source source in context.htmlSources) {
+        List<Source> libraries = context.getLibrariesReferencedFromHtml(source);
+        server.sendNotification(
+            new ExecutionLaunchDataParams(
+                source.fullName,
+                referencedFiles: _getFullNames(libraries)).toNotification());
       }
     }
-    server.sendNotification(
-        new ExecutionLaunchDataParams(
-            executables,
-            dartToHtml,
-            htmlToDart).toNotification());
   }
 
-  List<String> getFullNames(List<Source> sources) {
+  static List<String> _getFullNames(List<Source> sources) {
     return sources.map((Source source) => source.fullName).toList();
   }
 }
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index a576772..d39e55c 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -20,6 +20,7 @@
 import 'package:analyzer/src/generated/engine.dart' as engine;
 import 'package:analyzer/src/generated/error.dart' as engine;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/engine.dart';
 
 
 /**
@@ -159,6 +160,10 @@
  * is invalidated and a new one is created and initialized.
  */
 class _RefactoringManager {
+  static const List<RefactoringProblem> EMPTY_PROBLEM_LIST = const
+      <RefactoringProblem>[
+      ];
+
   final AnalysisServer server;
   final SearchEngine searchEngine;
 
@@ -176,6 +181,7 @@
   EditGetRefactoringResult result;
 
   _RefactoringManager(this.server, this.searchEngine) {
+    server.onAnalysisStarted.listen(_reset);
     _reset();
   }
 
@@ -189,7 +195,8 @@
    * Checks if [refactoring] requires options.
    */
   bool get _requiresOptions {
-    if (refactoring is InlineLocalRefactoring) {
+    if (refactoring is ConvertMethodToGetterRefactoring ||
+        refactoring is InlineLocalRefactoring) {
       return false;
     }
     return true;
@@ -198,7 +205,10 @@
   void getRefactoring(Request request) {
     // prepare for processing the request
     requestId = request.id;
-    result = new EditGetRefactoringResult(<RefactoringProblem>[]);
+    result = new EditGetRefactoringResult(
+        EMPTY_PROBLEM_LIST,
+        EMPTY_PROBLEM_LIST,
+        EMPTY_PROBLEM_LIST);
     // process the request
     var params = new EditGetRefactoringParams.fromRequest(request);
     _init(params.kind, params.file, params.offset, params.length).then((_) {
@@ -227,6 +237,7 @@
         if (_hasFatalError) {
           return _sendResultResponse();
         }
+        // create change
         return refactoring.createChange().then((change) {
           result.change = new SourceChange(change.message, edits: change.edits);
           return _sendResultResponse();
@@ -255,6 +266,16 @@
     this.offset = offset;
     this.length = length;
     // create a new Refactoring instance
+    if (kind == RefactoringKind.CONVERT_METHOD_TO_GETTER) {
+      List<Element> elements = server.getElementsAtOffset(file, offset);
+      if (elements.isNotEmpty) {
+        Element element = elements[0];
+        if (element is ExecutableElement) {
+          refactoring =
+              new ConvertMethodToGetterRefactoring(searchEngine, element);
+        }
+      }
+    }
     if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE) {
       List<CompilationUnit> units = server.getResolvedCompilationUnits(file);
       if (units.isNotEmpty) {
@@ -285,6 +306,15 @@
             new InlineMethodRefactoring(searchEngine, units[0], offset);
       }
     }
+    if (kind == RefactoringKind.MOVE_FILE) {
+      engine.AnalysisContext context = server.getAnalysisContext(file);
+      Source source = server.getSource(file);
+      refactoring = new MoveFileRefactoring(
+          server.resourceProvider.pathContext,
+          searchEngine,
+          context,
+          source);
+    }
     if (kind == RefactoringKind.RENAME) {
       List<AstNode> nodes = server.getNodesAtOffset(file, offset);
       List<Element> elements = server.getElementsAtOffset(file, offset);
@@ -348,7 +378,10 @@
     });
   }
 
-  void _reset() {
+  void _reset([AnalysisContext context]) {
+    kind = null;
+    offset = null;
+    length = null;
     refactoring = null;
     feedback = null;
     initStatus = new RefactoringStatus();
@@ -361,13 +394,9 @@
       result.feedback = feedback;
     }
     // set problems
-    {
-      RefactoringStatus status = new RefactoringStatus();
-      status.addStatus(initStatus);
-      status.addStatus(optionsStatus);
-      status.addStatus(finalStatus);
-      result.problems = status.problems;
-    }
+    result.initialProblems = initStatus.problems;
+    result.optionsProblems = optionsStatus.problems;
+    result.finalProblems = finalStatus.problems;
     // send the response
     server.sendResponse(result.toResponse(requestId));
     // done with this request
@@ -402,6 +431,12 @@
       inlineRefactoring.inlineAll = inlineOptions.inlineAll;
       return new RefactoringStatus();
     }
+    if (refactoring is MoveFileRefactoring) {
+      MoveFileRefactoring moveRefactoring = this.refactoring;
+      MoveFileOptions moveOptions = params.options;
+      moveRefactoring.newFile = moveOptions.newFile;
+      return new RefactoringStatus();
+    }
     if (refactoring is RenameRefactoring) {
       RenameRefactoring renameRefactoring = refactoring;
       RenameOptions renameOptions = params.options;
diff --git a/pkg/analysis_server/lib/src/generated_protocol.dart b/pkg/analysis_server/lib/src/generated_protocol.dart
index f4105b2..371b00c 100644
--- a/pkg/analysis_server/lib/src/generated_protocol.dart
+++ b/pkg/analysis_server/lib/src/generated_protocol.dart
@@ -3577,7 +3577,9 @@
  * edit.getRefactoring result
  *
  * {
- *   "problems": List<RefactoringProblem>
+ *   "initialProblems": List<RefactoringProblem>
+ *   "optionsProblems": List<RefactoringProblem>
+ *   "finalProblems": List<RefactoringProblem>
  *   "feedback": optional RefactoringFeedback
  *   "change": optional SourceChange
  *   "potentialEdits": optional List<String>
@@ -3585,10 +3587,25 @@
  */
 class EditGetRefactoringResult implements HasToJson {
   /**
-   * The status of the refactoring. The array will be empty if there are no
-   * known problems.
+   * The initial status of the refactoring, i.e. problems related to the
+   * context in which the refactoring is requested. The array will be empty if
+   * there are no known problems.
    */
-  List<RefactoringProblem> problems;
+  List<RefactoringProblem> initialProblems;
+
+  /**
+   * The options validation status, i.e. problems in the given options, such as
+   * light-weight validation of a new name, flags compatibility, etc. The array
+   * will be empty if there are no known problems.
+   */
+  List<RefactoringProblem> optionsProblems;
+
+  /**
+   * The final status of the refactoring, i.e. problems identified in the
+   * result of a full, potentially expensive validation and / or change
+   * creation. The array will be empty if there are no known problems.
+   */
+  List<RefactoringProblem> finalProblems;
 
   /**
    * Data used to provide feedback to the user. The structure of the data is
@@ -3616,7 +3633,7 @@
    */
   List<String> potentialEdits;
 
-  EditGetRefactoringResult(this.problems, {this.feedback, this.change, this.potentialEdits}) {
+  EditGetRefactoringResult(this.initialProblems, this.optionsProblems, this.finalProblems, {this.feedback, this.change, this.potentialEdits}) {
     if (potentialEdits == null) {
       potentialEdits = <String>[];
     }
@@ -3627,11 +3644,23 @@
       json = {};
     }
     if (json is Map) {
-      List<RefactoringProblem> problems;
-      if (json.containsKey("problems")) {
-        problems = jsonDecoder._decodeList(jsonPath + ".problems", json["problems"], (String jsonPath, Object json) => new RefactoringProblem.fromJson(jsonDecoder, jsonPath, json));
+      List<RefactoringProblem> initialProblems;
+      if (json.containsKey("initialProblems")) {
+        initialProblems = jsonDecoder._decodeList(jsonPath + ".initialProblems", json["initialProblems"], (String jsonPath, Object json) => new RefactoringProblem.fromJson(jsonDecoder, jsonPath, json));
       } else {
-        throw jsonDecoder.missingKey(jsonPath, "problems");
+        throw jsonDecoder.missingKey(jsonPath, "initialProblems");
+      }
+      List<RefactoringProblem> optionsProblems;
+      if (json.containsKey("optionsProblems")) {
+        optionsProblems = jsonDecoder._decodeList(jsonPath + ".optionsProblems", json["optionsProblems"], (String jsonPath, Object json) => new RefactoringProblem.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "optionsProblems");
+      }
+      List<RefactoringProblem> finalProblems;
+      if (json.containsKey("finalProblems")) {
+        finalProblems = jsonDecoder._decodeList(jsonPath + ".finalProblems", json["finalProblems"], (String jsonPath, Object json) => new RefactoringProblem.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "finalProblems");
       }
       RefactoringFeedback feedback;
       if (json.containsKey("feedback")) {
@@ -3647,7 +3676,7 @@
       } else {
         potentialEdits = <String>[];
       }
-      return new EditGetRefactoringResult(problems, feedback: feedback, change: change, potentialEdits: potentialEdits);
+      return new EditGetRefactoringResult(initialProblems, optionsProblems, finalProblems, feedback: feedback, change: change, potentialEdits: potentialEdits);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "edit.getRefactoring result");
     }
@@ -3660,7 +3689,9 @@
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["problems"] = problems.map((RefactoringProblem value) => value.toJson()).toList();
+    result["initialProblems"] = initialProblems.map((RefactoringProblem value) => value.toJson()).toList();
+    result["optionsProblems"] = optionsProblems.map((RefactoringProblem value) => value.toJson()).toList();
+    result["finalProblems"] = finalProblems.map((RefactoringProblem value) => value.toJson()).toList();
     if (feedback != null) {
       result["feedback"] = feedback.toJson();
     }
@@ -3683,7 +3714,9 @@
   @override
   bool operator==(other) {
     if (other is EditGetRefactoringResult) {
-      return _listEqual(problems, other.problems, (RefactoringProblem a, RefactoringProblem b) => a == b) &&
+      return _listEqual(initialProblems, other.initialProblems, (RefactoringProblem a, RefactoringProblem b) => a == b) &&
+          _listEqual(optionsProblems, other.optionsProblems, (RefactoringProblem a, RefactoringProblem b) => a == b) &&
+          _listEqual(finalProblems, other.finalProblems, (RefactoringProblem a, RefactoringProblem b) => a == b) &&
           feedback == other.feedback &&
           change == other.change &&
           _listEqual(potentialEdits, other.potentialEdits, (String a, String b) => a == b);
@@ -3694,7 +3727,9 @@
   @override
   int get hashCode {
     int hash = 0;
-    hash = _JenkinsSmiHash.combine(hash, problems.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, initialProblems.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, optionsProblems.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, finalProblems.hashCode);
     hash = _JenkinsSmiHash.combine(hash, feedback.hashCode);
     hash = _JenkinsSmiHash.combine(hash, change.hashCode);
     hash = _JenkinsSmiHash.combine(hash, potentialEdits.hashCode);
@@ -4191,56 +4226,58 @@
  * execution.launchData params
  *
  * {
- *   "executables": List<ExecutableFile>
- *   "dartToHtml": Map<FilePath, List<FilePath>>
- *   "htmlToDart": Map<FilePath, List<FilePath>>
+ *   "file": FilePath
+ *   "kind": optional ExecutableKind
+ *   "referencedFiles": optional List<FilePath>
  * }
  */
 class ExecutionLaunchDataParams implements HasToJson {
   /**
-   * A list of the files that are executable. This list replaces any previous
-   * list provided.
+   * The file for which launch data is being provided. This will either be a
+   * Dart library or an HTML file.
    */
-  List<ExecutableFile> executables;
+  String file;
 
   /**
-   * A mapping from the paths of Dart files that are referenced by HTML files
-   * to a list of the HTML files that reference the Dart files.
+   * The kind of the executable file. This field is omitted if the file is not
+   * a Dart file.
    */
-  Map<String, List<String>> dartToHtml;
+  ExecutableKind kind;
 
   /**
-   * A mapping from the paths of HTML files that reference Dart files to a list
-   * of the Dart files they reference.
+   * A list of the Dart files that are referenced by the file. This field is
+   * omitted if the file is not an HTML file.
    */
-  Map<String, List<String>> htmlToDart;
+  List<String> referencedFiles;
 
-  ExecutionLaunchDataParams(this.executables, this.dartToHtml, this.htmlToDart);
+  ExecutionLaunchDataParams(this.file, {this.kind, this.referencedFiles}) {
+    if (referencedFiles == null) {
+      referencedFiles = <String>[];
+    }
+  }
 
   factory ExecutionLaunchDataParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
       json = {};
     }
     if (json is Map) {
-      List<ExecutableFile> executables;
-      if (json.containsKey("executables")) {
-        executables = jsonDecoder._decodeList(jsonPath + ".executables", json["executables"], (String jsonPath, Object json) => new ExecutableFile.fromJson(jsonDecoder, jsonPath, json));
+      String file;
+      if (json.containsKey("file")) {
+        file = jsonDecoder._decodeString(jsonPath + ".file", json["file"]);
       } else {
-        throw jsonDecoder.missingKey(jsonPath, "executables");
+        throw jsonDecoder.missingKey(jsonPath, "file");
       }
-      Map<String, List<String>> dartToHtml;
-      if (json.containsKey("dartToHtml")) {
-        dartToHtml = jsonDecoder._decodeMap(jsonPath + ".dartToHtml", json["dartToHtml"], valueDecoder: (String jsonPath, Object json) => jsonDecoder._decodeList(jsonPath, json, jsonDecoder._decodeString));
+      ExecutableKind kind;
+      if (json.containsKey("kind")) {
+        kind = new ExecutableKind.fromJson(jsonDecoder, jsonPath + ".kind", json["kind"]);
+      }
+      List<String> referencedFiles;
+      if (json.containsKey("referencedFiles")) {
+        referencedFiles = jsonDecoder._decodeList(jsonPath + ".referencedFiles", json["referencedFiles"], jsonDecoder._decodeString);
       } else {
-        throw jsonDecoder.missingKey(jsonPath, "dartToHtml");
+        referencedFiles = <String>[];
       }
-      Map<String, List<String>> htmlToDart;
-      if (json.containsKey("htmlToDart")) {
-        htmlToDart = jsonDecoder._decodeMap(jsonPath + ".htmlToDart", json["htmlToDart"], valueDecoder: (String jsonPath, Object json) => jsonDecoder._decodeList(jsonPath, json, jsonDecoder._decodeString));
-      } else {
-        throw jsonDecoder.missingKey(jsonPath, "htmlToDart");
-      }
-      return new ExecutionLaunchDataParams(executables, dartToHtml, htmlToDart);
+      return new ExecutionLaunchDataParams(file, kind: kind, referencedFiles: referencedFiles);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "execution.launchData params");
     }
@@ -4253,9 +4290,13 @@
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["executables"] = executables.map((ExecutableFile value) => value.toJson()).toList();
-    result["dartToHtml"] = dartToHtml;
-    result["htmlToDart"] = htmlToDart;
+    result["file"] = file;
+    if (kind != null) {
+      result["kind"] = kind.toJson();
+    }
+    if (referencedFiles.isNotEmpty) {
+      result["referencedFiles"] = referencedFiles;
+    }
     return result;
   }
 
@@ -4269,9 +4310,9 @@
   @override
   bool operator==(other) {
     if (other is ExecutionLaunchDataParams) {
-      return _listEqual(executables, other.executables, (ExecutableFile a, ExecutableFile b) => a == b) &&
-          _mapEqual(dartToHtml, other.dartToHtml, (List<String> a, List<String> b) => _listEqual(a, b, (String a, String b) => a == b)) &&
-          _mapEqual(htmlToDart, other.htmlToDart, (List<String> a, List<String> b) => _listEqual(a, b, (String a, String b) => a == b));
+      return file == other.file &&
+          kind == other.kind &&
+          _listEqual(referencedFiles, other.referencedFiles, (String a, String b) => a == b);
     }
     return false;
   }
@@ -4279,9 +4320,9 @@
   @override
   int get hashCode {
     int hash = 0;
-    hash = _JenkinsSmiHash.combine(hash, executables.hashCode);
-    hash = _JenkinsSmiHash.combine(hash, dartToHtml.hashCode);
-    hash = _JenkinsSmiHash.combine(hash, htmlToDart.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, referencedFiles.hashCode);
     return _JenkinsSmiHash.finish(hash);
   }
 }
@@ -5071,6 +5112,7 @@
  *   "docSummary": optional String
  *   "docComplete": optional String
  *   "declaringType": optional String
+ *   "element": optional Element
  *   "returnType": optional String
  *   "parameterNames": optional List<String>
  *   "parameterTypes": optional List<String>
@@ -5141,6 +5183,11 @@
   String declaringType;
 
   /**
+   * Information about the element reference being suggested.
+   */
+  Element element;
+
+  /**
    * The return type of the getter, function or method being suggested. This
    * field is omitted if the suggested element is not a getter, function or
    * method.
@@ -5185,7 +5232,7 @@
    */
   String parameterType;
 
-  CompletionSuggestion(this.kind, this.relevance, this.completion, this.selectionOffset, this.selectionLength, this.isDeprecated, this.isPotential, {this.docSummary, this.docComplete, this.declaringType, this.returnType, this.parameterNames, this.parameterTypes, this.requiredParameterCount, this.positionalParameterCount, this.parameterName, this.parameterType}) {
+  CompletionSuggestion(this.kind, this.relevance, this.completion, this.selectionOffset, this.selectionLength, this.isDeprecated, this.isPotential, {this.docSummary, this.docComplete, this.declaringType, this.element, this.returnType, this.parameterNames, this.parameterTypes, this.requiredParameterCount, this.positionalParameterCount, this.parameterName, this.parameterType}) {
     if (parameterNames == null) {
       parameterNames = <String>[];
     }
@@ -5253,6 +5300,10 @@
       if (json.containsKey("declaringType")) {
         declaringType = jsonDecoder._decodeString(jsonPath + ".declaringType", json["declaringType"]);
       }
+      Element element;
+      if (json.containsKey("element")) {
+        element = new Element.fromJson(jsonDecoder, jsonPath + ".element", json["element"]);
+      }
       String returnType;
       if (json.containsKey("returnType")) {
         returnType = jsonDecoder._decodeString(jsonPath + ".returnType", json["returnType"]);
@@ -5285,7 +5336,7 @@
       if (json.containsKey("parameterType")) {
         parameterType = jsonDecoder._decodeString(jsonPath + ".parameterType", json["parameterType"]);
       }
-      return new CompletionSuggestion(kind, relevance, completion, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary: docSummary, docComplete: docComplete, declaringType: declaringType, returnType: returnType, parameterNames: parameterNames, parameterTypes: parameterTypes, requiredParameterCount: requiredParameterCount, positionalParameterCount: positionalParameterCount, parameterName: parameterName, parameterType: parameterType);
+      return new CompletionSuggestion(kind, relevance, completion, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary: docSummary, docComplete: docComplete, declaringType: declaringType, element: element, returnType: returnType, parameterNames: parameterNames, parameterTypes: parameterTypes, requiredParameterCount: requiredParameterCount, positionalParameterCount: positionalParameterCount, parameterName: parameterName, parameterType: parameterType);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "CompletionSuggestion");
     }
@@ -5309,6 +5360,9 @@
     if (declaringType != null) {
       result["declaringType"] = declaringType;
     }
+    if (element != null) {
+      result["element"] = element.toJson();
+    }
     if (returnType != null) {
       result["returnType"] = returnType;
     }
@@ -5349,6 +5403,7 @@
           docSummary == other.docSummary &&
           docComplete == other.docComplete &&
           declaringType == other.declaringType &&
+          element == other.element &&
           returnType == other.returnType &&
           _listEqual(parameterNames, other.parameterNames, (String a, String b) => a == b) &&
           _listEqual(parameterTypes, other.parameterTypes, (String a, String b) => a == b) &&
@@ -5373,6 +5428,7 @@
     hash = _JenkinsSmiHash.combine(hash, docSummary.hashCode);
     hash = _JenkinsSmiHash.combine(hash, docComplete.hashCode);
     hash = _JenkinsSmiHash.combine(hash, declaringType.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, element.hashCode);
     hash = _JenkinsSmiHash.combine(hash, returnType.hashCode);
     hash = _JenkinsSmiHash.combine(hash, parameterNames.hashCode);
     hash = _JenkinsSmiHash.combine(hash, parameterTypes.hashCode);
@@ -5722,6 +5778,7 @@
  *   LOCAL_VARIABLE
  *   METHOD
  *   PARAMETER
+ *   PREFIX
  *   SETTER
  *   TOP_LEVEL_VARIABLE
  *   TYPE_PARAMETER
@@ -5757,6 +5814,8 @@
 
   static const PARAMETER = const ElementKind._("PARAMETER");
 
+  static const PREFIX = const ElementKind._("PREFIX");
+
   static const SETTER = const ElementKind._("SETTER");
 
   static const TOP_LEVEL_VARIABLE = const ElementKind._("TOP_LEVEL_VARIABLE");
@@ -5801,6 +5860,8 @@
         return METHOD;
       case "PARAMETER":
         return PARAMETER;
+      case "PREFIX":
+        return PREFIX;
       case "SETTER":
         return SETTER;
       case "TOP_LEVEL_VARIABLE":
@@ -5918,6 +5979,7 @@
  * enum {
  *   CLIENT
  *   EITHER
+ *   NOT_EXECUTABLE
  *   SERVER
  * }
  */
@@ -5926,6 +5988,8 @@
 
   static const EITHER = const ExecutableKind._("EITHER");
 
+  static const NOT_EXECUTABLE = const ExecutableKind._("NOT_EXECUTABLE");
+
   static const SERVER = const ExecutableKind._("SERVER");
 
   final String name;
@@ -5938,6 +6002,8 @@
         return CLIENT;
       case "EITHER":
         return EITHER;
+      case "NOT_EXECUTABLE":
+        return NOT_EXECUTABLE;
       case "SERVER":
         return SERVER;
     }
@@ -7592,7 +7658,9 @@
  *   EXTRACT_METHOD
  *   INLINE_LOCAL_VARIABLE
  *   INLINE_METHOD
+ *   MOVE_FILE
  *   RENAME
+ *   SORT_MEMBERS
  * }
  */
 class RefactoringKind {
@@ -7608,8 +7676,12 @@
 
   static const INLINE_METHOD = const RefactoringKind._("INLINE_METHOD");
 
+  static const MOVE_FILE = const RefactoringKind._("MOVE_FILE");
+
   static const RENAME = const RefactoringKind._("RENAME");
 
+  static const SORT_MEMBERS = const RefactoringKind._("SORT_MEMBERS");
+
   final String name;
 
   const RefactoringKind._(this.name);
@@ -7628,8 +7700,12 @@
         return INLINE_LOCAL_VARIABLE;
       case "INLINE_METHOD":
         return INLINE_METHOD;
+      case "MOVE_FILE":
+        return MOVE_FILE;
       case "RENAME":
         return RENAME;
+      case "SORT_MEMBERS":
+        return SORT_MEMBERS;
     }
     throw new Exception('Illegal enum value: $name');
   }
@@ -8640,8 +8716,21 @@
   /**
    * Adds [edit] to the [FileEdit] for the given [file].
    */
-  void addEdit(String file, SourceEdit edit) =>
-      _addEditToSourceChange(this, file, edit);
+  void addEdit(String file, int fileStamp, SourceEdit edit) =>
+      _addEditToSourceChange(this, file, fileStamp, edit);
+
+  /**
+   * Adds [edit] to the [FileEdit] for the given [source].
+   */
+  void addSourceEdit(engine.AnalysisContext context,
+      engine.Source source, SourceEdit edit) =>
+      _addSourceEditToSourceChange(this, context, source, edit);
+
+  /**
+   * Adds [edit] to the [FileEdit] for the given [element].
+   */
+  void addElementEdit(engine.Element element, SourceEdit edit) =>
+      _addElementEditToSourceChange(this, element, edit);
 
   /**
    * Adds the given [FileEdit].
@@ -8825,6 +8914,7 @@
  *
  * {
  *   "file": FilePath
+ *   "fileStamp": long
  *   "edits": List<SourceEdit>
  * }
  */
@@ -8835,11 +8925,20 @@
   String file;
 
   /**
+   * The modification stamp of the file at the moment when the change was
+   * created, in milliseconds since the "Unix epoch". Will be -1 if the file
+   * did not exist and should be created. The client may use this field to make
+   * sure that the file was not changed since then, so it is safe to apply the
+   * change.
+   */
+  int fileStamp;
+
+  /**
    * A list of the edits used to effect the change.
    */
   List<SourceEdit> edits;
 
-  SourceFileEdit(this.file, {this.edits}) {
+  SourceFileEdit(this.file, this.fileStamp, {this.edits}) {
     if (edits == null) {
       edits = <SourceEdit>[];
     }
@@ -8856,13 +8955,19 @@
       } else {
         throw jsonDecoder.missingKey(jsonPath, "file");
       }
+      int fileStamp;
+      if (json.containsKey("fileStamp")) {
+        fileStamp = jsonDecoder._decodeInt(jsonPath + ".fileStamp", json["fileStamp"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "fileStamp");
+      }
       List<SourceEdit> edits;
       if (json.containsKey("edits")) {
         edits = jsonDecoder._decodeList(jsonPath + ".edits", json["edits"], (String jsonPath, Object json) => new SourceEdit.fromJson(jsonDecoder, jsonPath, json));
       } else {
         throw jsonDecoder.missingKey(jsonPath, "edits");
       }
-      return new SourceFileEdit(file, edits: edits);
+      return new SourceFileEdit(file, fileStamp, edits: edits);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "SourceFileEdit");
     }
@@ -8871,6 +8976,7 @@
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
     result["file"] = file;
+    result["fileStamp"] = fileStamp;
     result["edits"] = edits.map((SourceEdit value) => value.toJson()).toList();
     return result;
   }
@@ -8893,6 +8999,7 @@
   bool operator==(other) {
     if (other is SourceFileEdit) {
       return file == other.file &&
+          fileStamp == other.fileStamp &&
           _listEqual(edits, other.edits, (SourceEdit a, SourceEdit b) => a == b);
     }
     return false;
@@ -8902,6 +9009,7 @@
   int get hashCode {
     int hash = 0;
     hash = _JenkinsSmiHash.combine(hash, file.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, fileStamp.hashCode);
     hash = _JenkinsSmiHash.combine(hash, edits.hashCode);
     return _JenkinsSmiHash.finish(hash);
   }
@@ -9872,6 +9980,85 @@
     return _JenkinsSmiHash.finish(hash);
   }
 }
+/**
+ * moveFile feedback
+ */
+class MoveFileFeedback {
+  @override
+  bool operator==(other) {
+    if (other is MoveFileFeedback) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 438975893;
+  }
+}
+
+/**
+ * moveFile options
+ *
+ * {
+ *   "newFile": FilePath
+ * }
+ */
+class MoveFileOptions extends RefactoringOptions implements HasToJson {
+  /**
+   * The new file path to which the given file is being moved.
+   */
+  String newFile;
+
+  MoveFileOptions(this.newFile);
+
+  factory MoveFileOptions.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String newFile;
+      if (json.containsKey("newFile")) {
+        newFile = jsonDecoder._decodeString(jsonPath + ".newFile", json["newFile"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "newFile");
+      }
+      return new MoveFileOptions(newFile);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "moveFile options");
+    }
+  }
+
+  factory MoveFileOptions.fromRefactoringParams(EditGetRefactoringParams refactoringParams, Request request) {
+    return new MoveFileOptions.fromJson(
+        new RequestDecoder(request), "options", refactoringParams.options);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["newFile"] = newFile;
+    return result;
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is MoveFileOptions) {
+      return newFile == other.newFile;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, newFile.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
 
 /**
  * rename feedback
@@ -10037,3 +10224,37 @@
     return _JenkinsSmiHash.finish(hash);
   }
 }
+/**
+ * sortMembers feedback
+ */
+class SortMembersFeedback {
+  @override
+  bool operator==(other) {
+    if (other is SortMembersFeedback) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 173473419;
+  }
+}
+/**
+ * sortMembers options
+ */
+class SortMembersOptions {
+  @override
+  bool operator==(other) {
+    if (other is SortMembersOptions) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 99705880;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index 11cb226..2940664 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -140,6 +140,7 @@
             notice.lineInfo,
             notice.errors);
       }
+      server.fileAnalyzed(notice);
     }
   }
 
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index fc2d35a..65c4d0e 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -68,15 +68,32 @@
 /**
  * Adds [edit] to the [FileEdit] for the given [file].
  */
-void _addEditToSourceChange(SourceChange change, String file, SourceEdit edit) {
+void _addEditToSourceChange(SourceChange change, String file, int fileStamp,
+                            SourceEdit edit) {
   SourceFileEdit fileEdit = change.getFileEdit(file);
   if (fileEdit == null) {
-    fileEdit = new SourceFileEdit(file);
+    fileEdit = new SourceFileEdit(file, fileStamp);
     change.addFileEdit(fileEdit);
   }
   fileEdit.add(edit);
 }
 
+
+void _addElementEditToSourceChange(SourceChange change, engine.Element element,
+    SourceEdit edit) {
+  engine.AnalysisContext context = element.context;
+  engine.Source source = element.source;
+  _addSourceEditToSourceChange(change, context, source, edit);
+}
+
+
+void _addSourceEditToSourceChange(SourceChange change,
+    engine.AnalysisContext context, engine.Source source, SourceEdit edit) {
+  String file = source.fullName;
+  int fileStamp = context.getModificationStamp(source);
+  change.addEdit(file, fileStamp, edit);
+}
+
 /**
  * Create an AnalysisError based on error information from the analyzer
  * engine.  Access via AnalysisError.fromEngine().
@@ -234,6 +251,9 @@
   if (kind == engine.ElementKind.PARAMETER) {
     return ElementKind.PARAMETER;
   }
+  if (kind == engine.ElementKind.PREFIX) {
+    return ElementKind.PREFIX;
+  }
   if (kind == engine.ElementKind.SETTER) {
     return ElementKind.SETTER;
   }
@@ -448,6 +468,9 @@
   if (kind == RefactoringKind.INLINE_METHOD) {
     return new InlineMethodOptions.fromJson(jsonDecoder, jsonPath, json);
   }
+  if (kind == RefactoringKind.MOVE_FILE) {
+    return new MoveFileOptions.fromJson(jsonDecoder, jsonPath, json);
+  }
   if (kind == RefactoringKind.RENAME) {
     return new RenameOptions.fromJson(jsonDecoder, jsonPath, json);
   }
diff --git a/pkg/analysis_server/lib/src/search/element_references.dart b/pkg/analysis_server/lib/src/search/element_references.dart
index 669fbdc..5959ad7 100644
--- a/pkg/analysis_server/lib/src/search/element_references.dart
+++ b/pkg/analysis_server/lib/src/search/element_references.dart
@@ -83,7 +83,7 @@
    */
   Future<Iterable<Element>> _getRefElements(Element element) {
     if (element is ClassMemberElement) {
-      return getHierarchyMembers(searchEngine, element, true);
+      return getHierarchyMembers(searchEngine, element);
     }
     return new Future.value([element]);
   }
@@ -122,6 +122,9 @@
     if (element is ParameterElement) {
       return true;
     }
+    if (element is PrefixElement) {
+      return true;
+    }
     if (element is PropertyInducingElement) {
       return !element.isSynthetic;
     }
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
index fe5fe14..14d11b6 100644
--- a/pkg/analysis_server/lib/src/search/search_domain.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -45,6 +45,9 @@
     List<Element> elements = server.getElementsAtOffset(params.file,
         params.offset);
     elements = elements.map((Element element) {
+      if (element is ImportElement) {
+        return element.prefix;
+      }
       if (element is FieldFormalParameterElement) {
         return element.field;
       }
diff --git a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
index a8f5ab4..ceed8ff 100644
--- a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
@@ -6,7 +6,8 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/protocol.dart' as protocol show Element, ElementKind;
+import 'package:analysis_server/src/protocol.dart' hide Element, ElementKind;
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/completion/suggestion_builder.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
@@ -161,6 +162,8 @@
                   element.isDeprecated,
                   false);
 
+              suggestion.element = new protocol.Element.fromEngine(element);
+
               DartType type;
               if (element is TopLevelVariableElement) {
                 type = element.type;
diff --git a/pkg/analysis_server/lib/src/services/completion/local_computer.dart b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
index 06f299c..84edaef 100644
--- a/pkg/analysis_server/lib/src/services/completion/local_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
@@ -6,9 +6,11 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/protocol.dart' as protocol show Element, ElementKind;
+import 'package:analysis_server/src/protocol.dart' hide Element, ElementKind;
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/scanner.dart';
 
 /**
  * A computer for calculating `completion.getSuggestions` request results
@@ -43,6 +45,16 @@
  * that contains the completion offset to the [CompilationUnit].
  */
 class _LocalVisitor extends GeneralizingAstVisitor<dynamic> {
+  static const DYNAMIC = 'dynamic';
+
+  static final TypeName NO_RETURN_TYPE = new TypeName(
+      new SimpleIdentifier(new StringToken(TokenType.IDENTIFIER, '', 0)),
+      null);
+
+  static final TypeName STACKTRACE_TYPE = new TypeName(
+      new SimpleIdentifier(new StringToken(TokenType.IDENTIFIER, 'StackTrace', 0)),
+      null);
+
   final DartCompletionRequest request;
 
   _LocalVisitor(this.request);
@@ -56,15 +68,11 @@
 //            _addSuggestion(label.label, CompletionSuggestionKind.LABEL);
           });
         } else if (stmt is VariableDeclarationStatement) {
-          VariableDeclarationList varList = stmt.variables;
+          var varList = stmt.variables;
           if (varList != null) {
             varList.variables.forEach((VariableDeclaration varDecl) {
               if (varDecl.end < request.offset) {
-                _addSuggestion(
-                    varDecl.name,
-                    CompletionSuggestionKind.LOCAL_VARIABLE,
-                    varList.type,
-                    null);
+                _addLocalVarSuggestion(varDecl.name, varList.type);
               }
             });
           }
@@ -76,17 +84,9 @@
 
   @override
   visitCatchClause(CatchClause node) {
-    _addSuggestion(
-        node.exceptionParameter,
-        CompletionSuggestionKind.PARAMETER,
-        node.exceptionType,
-        null);
-    // TODO (danrubel) add stack trace types
-    _addSuggestion(
-        node.stackTraceParameter,
-        CompletionSuggestionKind.PARAMETER,
-        null,
-        null);
+    _addParamSuggestion(node.exceptionParameter, node.exceptionType);
+    CompletionSuggestion suggestion =
+        _addParamSuggestion(node.stackTraceParameter, STACKTRACE_TYPE);
     visitNode(node);
   }
 
@@ -94,16 +94,9 @@
   visitClassDeclaration(ClassDeclaration node) {
     node.members.forEach((ClassMember classMbr) {
       if (classMbr is FieldDeclaration) {
-        _addVarListSuggestions(
-            classMbr.fields,
-            CompletionSuggestionKind.FIELD,
-            node);
+        _addFieldSuggestions(node, classMbr);
       } else if (classMbr is MethodDeclaration) {
-        _addSuggestion(
-            classMbr.name,
-            CompletionSuggestionKind.METHOD_NAME,
-            classMbr.returnType,
-            node);
+        _addMethodSuggestion(node, classMbr);
       }
     });
     visitNode(node);
@@ -113,33 +106,18 @@
   visitCompilationUnit(CompilationUnit node) {
     node.directives.forEach((Directive directive) {
       if (directive is ImportDirective) {
-        _addSuggestion(
-            directive.prefix,
-            CompletionSuggestionKind.LIBRARY_PREFIX,
-            null,
-            null);
+        _addLibraryPrefixSuggestion(directive);
       }
     });
     node.declarations.forEach((Declaration declaration) {
       if (declaration is ClassDeclaration) {
-        _addSuggestion(
-            declaration.name,
-            CompletionSuggestionKind.CLASS,
-            null,
-            null);
+        _addClassSuggestion(declaration);
       } else if (declaration is EnumDeclaration) {
 //        _addSuggestion(d.name, CompletionSuggestionKind.ENUM);
       } else if (declaration is FunctionDeclaration) {
-        _addSuggestion(
-            declaration.name,
-            CompletionSuggestionKind.FUNCTION,
-            declaration.returnType,
-            null);
+        _addFunctionSuggestion(declaration);
       } else if (declaration is TopLevelVariableDeclaration) {
-        _addVarListSuggestions(
-            declaration.variables,
-            CompletionSuggestionKind.TOP_LEVEL_VARIABLE,
-            null);
+        _addTopLevelVarSuggestions(declaration.variables);
       } else if (declaration is ClassTypeAlias) {
         _addSuggestion(
             declaration.name,
@@ -171,21 +149,28 @@
 
   @override
   visitForEachStatement(ForEachStatement node) {
-    // TODO (danrubel) supply type of local variable
-    _addSuggestion(
-        node.identifier,
-        CompletionSuggestionKind.LOCAL_VARIABLE,
-        null,
-        null);
+    SimpleIdentifier id;
+    TypeName type;
+    DeclaredIdentifier loopVar = node.loopVariable;
+    if (loopVar != null) {
+      id = loopVar.identifier;
+      type = loopVar.type;
+    } else {
+      id = node.identifier;
+      type = null;
+    }
+    _addLocalVarSuggestion(id, type);
     visitNode(node);
   }
 
   @override
   visitForStatement(ForStatement node) {
-    _addVarListSuggestions(
-        node.variables,
-        CompletionSuggestionKind.LOCAL_VARIABLE,
-        null);
+    var varList = node.variables;
+    if (varList != null) {
+      varList.variables.forEach((VariableDeclaration varDecl) {
+        _addLocalVarSuggestion(varDecl.name, varList.type);
+      });
+    }
     visitNode(node);
   }
 
@@ -224,6 +209,106 @@
     }
   }
 
+  void _addClassSuggestion(ClassDeclaration declaration) {
+    CompletionSuggestion suggestion =
+        _addSuggestion(declaration.name, CompletionSuggestionKind.CLASS, null, null);
+    if (suggestion != null) {
+      suggestion.element = _createElement(
+          protocol.ElementKind.CLASS,
+          declaration.name,
+          NO_RETURN_TYPE,
+          declaration.isAbstract,
+          _isDeprecated(declaration.metadata));
+    }
+  }
+
+  void _addFieldSuggestions(ClassDeclaration node, FieldDeclaration fieldDecl) {
+    bool isDeprecated = _isDeprecated(fieldDecl.metadata);
+    fieldDecl.fields.variables.forEach((VariableDeclaration varDecl) {
+      CompletionSuggestion suggestion = _addSuggestion(
+          varDecl.name,
+          CompletionSuggestionKind.GETTER,
+          fieldDecl.fields.type,
+          node);
+      if (suggestion != null) {
+        suggestion.element = _createElement(
+            protocol.ElementKind.GETTER,
+            varDecl.name,
+            fieldDecl.fields.type,
+            false,
+            isDeprecated || _isDeprecated(varDecl.metadata));
+      }
+    });
+  }
+
+  void _addFunctionSuggestion(FunctionDeclaration declaration) {
+    CompletionSuggestion suggestion = _addSuggestion(
+        declaration.name,
+        CompletionSuggestionKind.FUNCTION,
+        declaration.returnType,
+        null);
+    if (suggestion != null) {
+      suggestion.element = _createElement(
+          protocol.ElementKind.FUNCTION,
+          declaration.name,
+          declaration.returnType,
+          false,
+          _isDeprecated(declaration.metadata));
+    }
+  }
+
+  void _addLibraryPrefixSuggestion(ImportDirective directive) {
+    CompletionSuggestion suggestion = _addSuggestion(
+        directive.prefix,
+        CompletionSuggestionKind.LIBRARY_PREFIX,
+        null,
+        null);
+    if (suggestion != null) {
+      suggestion.element = _createElement(
+          protocol.ElementKind.LIBRARY,
+          directive.prefix,
+          NO_RETURN_TYPE,
+          false,
+          false);
+    }
+  }
+
+  void _addLocalVarSuggestion(SimpleIdentifier id, TypeName returnType) {
+    CompletionSuggestion suggestion =
+        _addSuggestion(id, CompletionSuggestionKind.LOCAL_VARIABLE, returnType, null);
+    if (suggestion != null) {
+      suggestion.element = _createElement(
+          protocol.ElementKind.LOCAL_VARIABLE,
+          id,
+          returnType,
+          false,
+          false);
+    }
+  }
+
+  void _addMethodSuggestion(ClassDeclaration node, MethodDeclaration classMbr) {
+    protocol.ElementKind kind;
+    CompletionSuggestionKind csKind;
+    if (classMbr.isGetter) {
+      kind = protocol.ElementKind.GETTER;
+      csKind = CompletionSuggestionKind.GETTER;
+    } else if (classMbr.isSetter) {
+      kind = protocol.ElementKind.SETTER;
+      csKind = CompletionSuggestionKind.SETTER;
+    } else {
+      kind = protocol.ElementKind.METHOD;
+      csKind = CompletionSuggestionKind.METHOD;
+    }
+    CompletionSuggestion suggestion =
+        _addSuggestion(classMbr.name, csKind, classMbr.returnType, node);
+    suggestion.element = _createElement(
+        kind,
+        classMbr.name,
+        classMbr.returnType,
+        classMbr.isAbstract,
+        _isDeprecated(classMbr.metadata));
+  }
+
   void _addParamListSuggestions(FormalParameterList paramList) {
     if (paramList != null) {
       paramList.parameters.forEach((FormalParameter param) {
@@ -241,17 +326,24 @@
         } else if (normalParam is SimpleFormalParameter) {
           type = normalParam.type;
         }
-        _addSuggestion(
-            param.identifier,
-            CompletionSuggestionKind.PARAMETER,
-            type,
-            null);
+        _addParamSuggestion(param.identifier, type);
       });
     }
   }
 
-  void _addSuggestion(SimpleIdentifier id, CompletionSuggestionKind kind,
-      TypeName typeName, ClassDeclaration classDecl) {
+  CompletionSuggestion _addParamSuggestion(SimpleIdentifier identifier,
+      TypeName type) {
+    CompletionSuggestion suggestion =
+        _addSuggestion(identifier, CompletionSuggestionKind.PARAMETER, type, null);
+    if (suggestion != null) {
+      suggestion.element =
+          _createElement(protocol.ElementKind.PARAMETER, identifier, type, false, false);
+    }
+    return suggestion;
+  }
+
+  CompletionSuggestion _addSuggestion(SimpleIdentifier id,
+      CompletionSuggestionKind kind, TypeName typeName, ClassDeclaration classDecl) {
     if (id != null) {
       String completion = id.name;
       if (completion != null && completion.length > 0) {
@@ -282,14 +374,80 @@
           }
         }
         request.suggestions.add(suggestion);
+        return suggestion;
       }
     }
+    return null;
+  }
+
+  void _addTopLevelVarSuggestions(VariableDeclarationList varList) {
+    if (varList != null) {
+      bool isDeprecated = _isDeprecated(varList.metadata);
+      varList.variables.forEach((VariableDeclaration varDecl) {
+        CompletionSuggestion suggestion = _addSuggestion(
+            varDecl.name,
+            CompletionSuggestionKind.TOP_LEVEL_VARIABLE,
+            varList.type,
+            null);
+        if (suggestion != null) {
+          suggestion.element = _createElement(
+              protocol.ElementKind.TOP_LEVEL_VARIABLE,
+              varDecl.name,
+              varList.type,
+              false,
+              isDeprecated || _isDeprecated(varDecl.metadata));
+        }
+      });
+    }
   }
 
-  void _addVarListSuggestions(VariableDeclarationList variables,
-      CompletionSuggestionKind kind, ClassDeclaration classDecl) {
-    variables.variables.forEach((VariableDeclaration varDecl) {
-      _addSuggestion(varDecl.name, kind, variables.type, classDecl);
-    });
+  /**
+   * Create a new protocol Element for inclusion in a completion suggestion.
+   */
+  protocol.Element _createElement(protocol.ElementKind kind,
+      SimpleIdentifier id, TypeName returnType, bool isAbstract, bool isDeprecated) {
+    String name = id.name;
+    int flags = protocol.Element.makeFlags(
+        isAbstract: isAbstract,
+        isDeprecated: isDeprecated,
+        isPrivate: Identifier.isPrivateName(name));
+    return new protocol.Element(
+        kind,
+        name,
+        flags,
+        returnType: _nameForType(returnType));
+  }
+
+  /**
+   * Return `true` if the @deprecated annotation is present
+   */
+  bool _isDeprecated(NodeList<Annotation> metadata) =>
+      metadata != null &&
+          metadata.any(
+              (Annotation a) => a.name is SimpleIdentifier && a.name.name == 'deprecated');
+
+  /**
+   * Return the name for the given type.
+   */
+  String _nameForType(TypeName type) {
+    if (type == NO_RETURN_TYPE) {
+      return null;
+    }
+    if (type == null) {
+      return DYNAMIC;
+    }
+    Identifier id = type.name;
+    if (id == null) {
+      return DYNAMIC;
+    }
+    String name = id.name;
+    if (name == null || name.length <= 0) {
+      return DYNAMIC;
+    }
+    TypeArgumentList typeArgs = type.typeArguments;
+    if (typeArgs != null) {
+      //TODO (danrubel) include type arguments
+    }
+    return name;
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
index b2a4453..b664d7b 100644
--- a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
@@ -4,7 +4,8 @@
 
 library services.completion.suggestion.builder;
 
-import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/protocol.dart' as protocol show Element, ElementKind;
+import 'package:analysis_server/src/protocol.dart' hide Element, ElementKind;
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analyzer/src/generated/element.dart';
 
@@ -36,7 +37,7 @@
   visitFieldElement(FieldElement element) {
     _addSuggestion(
         element,
-        CompletionSuggestionKind.FIELD,
+        CompletionSuggestionKind.GETTER,
         element.type,
         element.enclosingElement);
   }
@@ -87,7 +88,7 @@
         !_completions.add(completion)) {
       return;
     }
-    var suggestion = new CompletionSuggestion(
+    CompletionSuggestion suggestion = new CompletionSuggestion(
         kind,
         CompletionRelevance.DEFAULT,
         completion,
@@ -95,6 +96,14 @@
         0,
         element.isDeprecated,
         false);
+    suggestion.element = new protocol.Element.fromEngine(element);
+    if (suggestion.element != null) {
+      if (element is FieldElement) {
+        suggestion.element.kind = protocol.ElementKind.GETTER;
+        suggestion.element.returnType =
+            element.type != null ? element.type.displayName : 'dynamic';
+      }
+    }
     if (enclosingElement != null) {
       suggestion.declaringType = enclosingElement.displayName;
     }
@@ -157,15 +166,18 @@
     if (element != null) {
       String completion = element.name;
       if (completion != null && completion.length > 0) {
-        request.suggestions.add(
-            new CompletionSuggestion(
-                new CompletionSuggestionKind.fromElementKind(element.kind),
-                CompletionRelevance.DEFAULT,
-                completion,
-                completion.length,
-                0,
-                element.isDeprecated,
-                false));
+        CompletionSuggestion suggestion = new CompletionSuggestion(
+            new CompletionSuggestionKind.fromElementKind(element.kind),
+            CompletionRelevance.DEFAULT,
+            completion,
+            completion.length,
+            0,
+            element.isDeprecated,
+            false);
+
+        suggestion.element = new protocol.Element.fromEngine(element);
+
+        request.suggestions.add(suggestion);
       }
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 9cc5675..b9ef38e 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -34,6 +34,7 @@
   final SearchEngine searchEngine;
   final Source source;
   final String file;
+  int fileStamp;
   final CompilationUnit unit;
   final int selectionOffset;
   final int selectionLength;
@@ -58,6 +59,7 @@
     unitLibraryElement = unitElement.library;
     unitLibraryFile = unitLibraryElement.source.fullName;
     unitLibraryFolder = dirname(unitLibraryFile);
+    fileStamp = unitElement.context.getModificationStamp(source);
     selectionEnd = selectionOffset + selectionLength;
   }
 
@@ -131,7 +133,7 @@
       return;
     }
     // prepare file edit
-    SourceFileEdit fileEdit = new SourceFileEdit(file);
+    SourceFileEdit fileEdit = new SourceFileEdit(file, fileStamp);
     fileEdit.addAll(edits);
     // prepare Change
     String message = formatList(kind.message, args);
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 8b20c9a..89c9f6b 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -5,11 +5,10 @@
 library services.correction.fix;
 
 import 'package:analysis_server/src/protocol.dart' show SourceChange;
-import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/error.dart';
-import 'package:analyzer/src/generated/source.dart';
 
 
 /**
@@ -19,9 +18,7 @@
  */
 List<Fix> computeFixes(SearchEngine searchEngine, CompilationUnit unit,
     AnalysisError error) {
-  Source source = unit.element.source;
-  String file = source.fullName;
-  var processor = new FixProcessor(searchEngine, source, file, unit, error);
+  var processor = new FixProcessor(searchEngine, unit, error);
   return processor.compute();
 }
 
@@ -48,38 +45,39 @@
 class FixKind {
   static const ADD_PACKAGE_DEPENDENCY =
       const FixKind('ADD_PACKAGE_DEPENDENCY', 50, "Add dependency on package '{0}'");
-  static const ADD_SUPER_CONSTRUCTOR_INVOCATION =
-      const FixKind(
-          'ADD_SUPER_CONSTRUCTOR_INVOCATION',
-          50,
-          "Add super constructor {0} invocation");
+  static const ADD_SUPER_CONSTRUCTOR_INVOCATION = const FixKind(
+      'ADD_SUPER_CONSTRUCTOR_INVOCATION',
+      50,
+      "Add super constructor {0} invocation");
   static const CHANGE_TO = const FixKind('CHANGE_TO', 51, "Change to '{0}'");
-  static const CHANGE_TO_STATIC_ACCESS =
-      const FixKind(
-          'CHANGE_TO_STATIC_ACCESS',
-          50,
-          "Change access to static using '{0}'");
+  static const CHANGE_TO_STATIC_ACCESS = const FixKind(
+      'CHANGE_TO_STATIC_ACCESS',
+      50,
+      "Change access to static using '{0}'");
   static const CREATE_CLASS =
       const FixKind('CREATE_CLASS', 50, "Create class '{0}'");
   static const CREATE_CONSTRUCTOR =
       const FixKind('CREATE_CONSTRUCTOR', 50, "Create constructor '{0}'");
-  static const CREATE_CONSTRUCTOR_SUPER =
-      const FixKind('CREATE_CONSTRUCTOR_SUPER', 50, "Create constructor to call {0}");
+  static const CREATE_CONSTRUCTOR_SUPER = const FixKind(
+      'CREATE_CONSTRUCTOR_SUPER',
+      50,
+      "Create constructor to call {0}");
+  static const CREATE_FILE =
+      const FixKind('CREATE_FILE', 50, "Create file '{0}'");
   static const CREATE_FUNCTION =
       const FixKind('CREATE_FUNCTION', 49, "Create function '{0}'");
   static const CREATE_METHOD =
       const FixKind('CREATE_METHOD', 50, "Create method '{0}'");
-  static const CREATE_MISSING_OVERRIDES =
-      const FixKind('CREATE_MISSING_OVERRIDES', 50, "Create {0} missing override(s)");
+  static const CREATE_MISSING_OVERRIDES = const FixKind(
+      'CREATE_MISSING_OVERRIDES',
+      50,
+      "Create {0} missing override(s)");
   static const CREATE_NO_SUCH_METHOD =
       const FixKind('CREATE_NO_SUCH_METHOD', 49, "Create 'noSuchMethod' method");
-  static const CREATE_PART =
-      const FixKind('CREATE_PART', 50, "Create part '{0}'");
-  static const IMPORT_LIBRARY_PREFIX =
-      const FixKind(
-          'IMPORT_LIBRARY_PREFIX',
-          51,
-          "Use imported library '{0}' with prefix '{1}'");
+  static const IMPORT_LIBRARY_PREFIX = const FixKind(
+      'IMPORT_LIBRARY_PREFIX',
+      51,
+      "Use imported library '{0}' with prefix '{1}'");
   static const IMPORT_LIBRARY_PROJECT =
       const FixKind('IMPORT_LIBRARY_PROJECT', 51, "Import library '{0}'");
   static const IMPORT_LIBRARY_SDK =
@@ -90,32 +88,31 @@
       const FixKind('INSERT_SEMICOLON', 50, "Insert ';'");
   static const MAKE_CLASS_ABSTRACT =
       const FixKind('MAKE_CLASS_ABSTRACT', 50, "Make class '{0}' abstract");
-  static const REMOVE_PARAMETERS_IN_GETTER_DECLARATION =
-      const FixKind(
-          'REMOVE_PARAMETERS_IN_GETTER_DECLARATION',
-          50,
-          "Remove parameters in getter declaration");
-  static const REMOVE_PARENTHESIS_IN_GETTER_INVOCATION =
-      const FixKind(
-          'REMOVE_PARENTHESIS_IN_GETTER_INVOCATION',
-          50,
-          "Remove parentheses in getter invocation");
+  static const REMOVE_PARAMETERS_IN_GETTER_DECLARATION = const FixKind(
+      'REMOVE_PARAMETERS_IN_GETTER_DECLARATION',
+      50,
+      "Remove parameters in getter declaration");
+  static const REMOVE_PARENTHESIS_IN_GETTER_INVOCATION = const FixKind(
+      'REMOVE_PARENTHESIS_IN_GETTER_INVOCATION',
+      50,
+      "Remove parentheses in getter invocation");
   static const REMOVE_UNNECASSARY_CAST =
       const FixKind('REMOVE_UNNECASSARY_CAST', 50, "Remove unnecessary cast");
   static const REMOVE_UNUSED_IMPORT =
       const FixKind('REMOVE_UNUSED_IMPORT', 50, "Remove unused import");
-  static const REPLACE_BOOLEAN_WITH_BOOL =
-      const FixKind('REPLACE_BOOLEAN_WITH_BOOL', 50, "Replace 'boolean' with 'bool'");
+  static const REPLACE_BOOLEAN_WITH_BOOL = const FixKind(
+      'REPLACE_BOOLEAN_WITH_BOOL',
+      50,
+      "Replace 'boolean' with 'bool'");
   static const REPLACE_IMPORT_URI =
       const FixKind('REPLACE_IMPORT_URI', 50, "Replace with '{0}'");
   static const REPLACE_VAR_WITH_DYNAMIC =
       const FixKind('REPLACE_VAR_WITH_DYNAMIC', 50, "Replace 'var' with 'dynamic'");
   static const USE_CONST = const FixKind('USE_CONST', 50, "Change to constant");
-  static const USE_EFFECTIVE_INTEGER_DIVISION =
-      const FixKind(
-          'USE_EFFECTIVE_INTEGER_DIVISION',
-          50,
-          "Use effective integer division ~/");
+  static const USE_EFFECTIVE_INTEGER_DIVISION = const FixKind(
+      'USE_EFFECTIVE_INTEGER_DIVISION',
+      50,
+      "Use effective integer division ~/");
   static const USE_EQ_EQ_NULL =
       const FixKind('USE_EQ_EQ_NULL', 50, "Use == null instead of 'is Null'");
   static const USE_NOT_EQ_NULL =
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 08239cf..2c9e07c 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -45,10 +45,11 @@
   static const int MAX_LEVENSHTEIN_DISTANCE = 3;
 
   final SearchEngine searchEngine;
-  final Source source;
-  final String file;
   final CompilationUnit unit;
   final AnalysisError error;
+  AnalysisContext context;
+  String file;
+  int fileStamp;
   CompilationUnitElement unitElement;
   Source unitSource;
   LibraryElement unitLibraryElement;
@@ -68,10 +69,12 @@
   AstNode node;
   AstNode coveredNode;
 
-  FixProcessor(this.searchEngine, this.source, this.file, this.unit, this.error)
-      {
+  FixProcessor(this.searchEngine, this.unit, this.error) {
     unitElement = unit.element;
+    context = unitElement.context;
     unitSource = unitElement.source;
+    file = unitSource.fullName;
+    fileStamp = context.getModificationStamp(unitSource);
     unitLibraryElement = unitElement.library;
     unitLibraryFile = unitLibraryElement.source.fullName;
     unitLibraryFolder = dirname(unitLibraryFile);
@@ -131,6 +134,7 @@
       _addFix_createConstructorSuperExplicit();
     }
     if (errorCode == CompileTimeErrorCode.URI_DOES_NOT_EXIST) {
+      _addFix_createImportUri();
       _addFix_replaceImportUri();
     }
     if (errorCode == HintCode.DIVISION_OPTIMIZATION) {
@@ -227,11 +231,13 @@
     return fixes;
   }
 
-  void _addFix(FixKind kind, List args, {String fixFile}) {
-    if (fixFile == null) {
-      fixFile = file;
+  void _addFix(FixKind kind, List args, {String file, int fileStamp}) {
+    if (file == null || fileStamp == null) {
+      file = this.file;
+      fileStamp = this.fileStamp;
     }
-    SourceFileEdit fileEdit = new SourceFileEdit(file);
+    // prepare SourceFileEdit
+    SourceFileEdit fileEdit = new SourceFileEdit(file, fileStamp);
     fileEdit.addAll(edits);
     // prepare Change
     String message = formatList(kind.message, args);
@@ -249,6 +255,13 @@
     exitPosition = null;
   }
 
+  void _addFixToElement(FixKind kind, List args, Element element) {
+    Source source = element.source;
+    String file = source.fullName;
+    int fileStamp = element.context.getModificationStamp(source);
+    _addFix(kind, args, file: file, fileStamp: fileStamp);
+  }
+
   void _addFix_boolInsteadOfBoolean() {
     SourceRange range = rf.rangeError(error);
     _addReplaceEdit(range, "bool");
@@ -488,7 +501,10 @@
     // insert source
     _insertBuilder(sb);
     // add proposal
-    _addFix(FixKind.CREATE_CONSTRUCTOR, [constructorName], fixFile: targetFile);
+    _addFixToElement(
+        FixKind.CREATE_CONSTRUCTOR,
+        [constructorName],
+        targetElement);
   }
 
   void _addFix_createConstructor_named() {
@@ -553,7 +569,10 @@
       _addLinkedPosition("NAME", rf.rangeNode(name));
     }
     // add proposal
-    _addFix(FixKind.CREATE_CONSTRUCTOR, [constructorName], fixFile: targetFile);
+    _addFixToElement(
+        FixKind.CREATE_CONSTRUCTOR,
+        [constructorName],
+        targetElement);
   }
 
   void _addFix_createFunction_forFunctionType() {
@@ -605,6 +624,22 @@
     }
   }
 
+  void _addFix_createImportUri() {
+    if (node is SimpleStringLiteral && node.parent is ImportDirective) {
+      ImportDirective importDirective = node.parent;
+      Source source = importDirective.source;
+      if (source != null) {
+        String file = source.fullName;
+        if (isAbsolute(file)) {
+          String libName = removeEnd(source.shortName, '.dart');
+          libName = libName.replaceAll('_', '.');
+          edits.add(new SourceEdit(0, 0, 'library $libName;$eol$eol'));
+        }
+        _addFix(FixKind.CREATE_FILE, [file], file: file, fileStamp: -1);
+      }
+    }
+  }
+
   void _addFix_createMissingOverrides(List<ExecutableElement> elements) {
     elements = elements.toList();
     int numElements = elements.length;
@@ -773,7 +808,7 @@
     String importSource = "${prefix}import '${importPath}';${suffix}";
     _addInsertEdit(offset, importSource);
     // add proposal
-    _addFix(kind, [importPath], fixFile: libraryUnitElement.source.fullName);
+    _addFixToElement(kind, [importPath], libraryUnitElement);
   }
 
   void _addFix_importLibrary_withElement(String name, ElementKind kind) {
@@ -824,16 +859,15 @@
         // update library
         String newShowCode = "show ${StringUtils.join(showNames, ", ")}";
         _addReplaceEdit(rf.rangeOffsetEnd(showCombinator), newShowCode);
-        _addFix(
+        _addFixToElement(
             FixKind.IMPORT_LIBRARY_SHOW,
             [libraryName],
-            fixFile: unitLibraryFile);
+            unitLibraryElement);
         // we support only one import without prefix
         return;
       }
     }
     // check SDK libraries
-    AnalysisContext context = unitLibraryElement.context;
     {
       DartSdk sdk = context.sourceFactory.dartSdk;
       List<SdkLibrary> sdkLibraries = sdk.sdkLibraries;
@@ -1021,7 +1055,6 @@
       SimpleStringLiteral stringLiteral = node;
       String uri = stringLiteral.value;
       String uriName = substringAfterLast(uri, '/');
-      AnalysisContext context = unitLibraryElement.context;
       for (Source libSource in context.librarySources) {
         String libFile = libSource.fullName;
         if (substringAfterLast(libFile, '/') == uriName) {
@@ -1167,7 +1200,7 @@
       String name = (node as SimpleIdentifier).name;
       MethodInvocation invocation = node.parent as MethodInvocation;
       // prepare environment
-      Source targetSource;
+      Element targetElement;
       String prefix;
       int insertOffset;
       String sourcePrefix;
@@ -1175,7 +1208,7 @@
       bool staticModifier = false;
       Expression target = invocation.realTarget;
       if (target == null) {
-        targetSource = source;
+        targetElement = unitElement;
         ClassMember enclosingMember =
             node.getAncestor((node) => node is ClassMember);
         staticModifier = _inStaticContext();
@@ -1189,24 +1222,24 @@
         if (targetType is! InterfaceType) {
           return;
         }
-        ClassElement targetElement = targetType.element as ClassElement;
-        targetSource = targetElement.source;
+        ClassElement targetClassElement = targetType.element as ClassElement;
+        targetElement = targetClassElement;
         // may be static
         if (target is Identifier) {
           staticModifier = target.bestElement.kind == ElementKind.CLASS;
         }
         // prepare insert offset
-        ClassDeclaration targetClass = targetElement.node;
+        ClassDeclaration targetClassNode = targetClassElement.node;
         prefix = "  ";
-        insertOffset = targetClass.end - 1;
-        if (targetClass.members.isEmpty) {
+        insertOffset = targetClassNode.end - 1;
+        if (targetClassNode.members.isEmpty) {
           sourcePrefix = "";
         } else {
           sourcePrefix = eol;
         }
         sourceSuffix = eol;
       }
-      String targetFile = targetSource.fullName;
+      String targetFile = targetElement.source.fullName;
       // build method source
       SourceBuilder sb = new SourceBuilder(targetFile, insertOffset);
       {
@@ -1231,11 +1264,11 @@
       // insert source
       _insertBuilder(sb);
       // add linked positions
-      if (targetSource == source) {
+      if (targetFile == file) {
         _addLinkedPosition3('NAME', sb, rf.rangeNode(node));
       }
       // add proposal
-      _addFix(FixKind.CREATE_METHOD, [name], fixFile: targetFile);
+      _addFixToElement(FixKind.CREATE_METHOD, [name], targetElement);
     }
   }
 
@@ -1453,7 +1486,7 @@
     // insert source
     _insertBuilder(sb);
     // add linked positions
-    if (targetSource == source) {
+    if (targetSource == unitSource) {
       _addLinkedPosition3("NAME", sb, rf.rangeNode(node));
     }
   }
@@ -1473,14 +1506,14 @@
     _addProposal_createFunction(
         functionType,
         name,
-        source,
+        unitSource,
         insertOffset,
         false,
         prefix,
         sourcePrefix,
         sourceSuffix);
     // add proposal
-    _addFix(FixKind.CREATE_FUNCTION, [name], fixFile: file);
+    _addFix(FixKind.CREATE_FUNCTION, [name]);
   }
 
   /**
@@ -1515,7 +1548,7 @@
         sourcePrefix,
         sourceSuffix);
     // add proposal
-    _addFix(FixKind.CREATE_METHOD, [name], fixFile: targetFile);
+    _addFixToElement(FixKind.CREATE_METHOD, [name], targetClassElement);
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index d7a7bf5..0af23c4 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -6,7 +6,8 @@
 
 import 'dart:math';
 
-import 'package:analysis_server/src/protocol.dart' show SourceEdit;
+import 'package:analysis_server/src/protocol.dart' show SourceChange,
+    SourceEdit;
 import 'package:analysis_server/src/services/correction/source_range.dart';
 import 'package:analysis_server/src/services/correction/strings.dart';
 import 'package:analyzer/src/generated/ast.dart';
@@ -80,6 +81,7 @@
 }
 
 
+
 /**
  * Returns the name to display in the UI for the given [Element].
  */
@@ -92,7 +94,6 @@
   }
 }
 
-
 /**
  * If the given [AstNode] is in a [ClassDeclaration], returns the
  * [ClassElement]. Otherwise returns `null`.
@@ -107,7 +108,6 @@
 }
 
 
-
 /**
  * Returns a class or an unit member enclosing the given [node].
  */
@@ -126,6 +126,7 @@
   return null;
 }
 
+
 /**
  * @return the [ExecutableElement] of the enclosing executable [AstNode].
  */
@@ -166,6 +167,7 @@
 }
 
 
+
 /**
  * Returns [getExpressionPrecedence] for the parent of [node],
  * or `0` if the parent node is [ParenthesizedExpression].
@@ -192,7 +194,6 @@
 }
 
 
-
 /**
  * Returns the namespace of the given [ImportElement].
  */
@@ -219,7 +220,6 @@
   return line.substring(0, index);
 }
 
-
 /**
  * @return the [LocalVariableElement] or [ParameterElement] if given
  *         [SimpleIdentifier] is the reference to local variable or parameter, or
@@ -236,7 +236,6 @@
   return null;
 }
 
-
 /**
  * @return the [LocalVariableElement] if given [SimpleIdentifier] is the reference to
  *         local variable, or <code>null</code> in the other case.
@@ -249,6 +248,7 @@
   return null;
 }
 
+
 /**
  * @return the nearest common ancestor [AstNode] of the given [AstNode]s.
  */
@@ -277,6 +277,7 @@
   return parents[0][i - 1];
 }
 
+
 /**
  * Returns the [Expression] qualifier if given node is the name part of a
  * [PropertyAccess] or a [PrefixedIdentifier]. Maybe `null`.
@@ -395,7 +396,6 @@
   return context.getContents(source).data;
 }
 
-
 /**
  * Returns the given [Statement] if not a [Block], or all the children
  * [Statement]s if a [Block].
@@ -418,6 +418,7 @@
   return element.displayName == name;
 }
 
+
 /**
  * Checks if the given [PropertyAccessorElement] is an accessor of a
  * [FieldElement].
diff --git a/pkg/analysis_server/lib/src/services/index/index_contributor.dart b/pkg/analysis_server/lib/src/services/index/index_contributor.dart
index 2283bee..7d94a30 100644
--- a/pkg/analysis_server/lib/src/services/index/index_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/index/index_contributor.dart
@@ -705,6 +705,7 @@
         element is TypeParameterElement) {
       recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
     } else if (element is PrefixElement) {
+      recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
       _recordImportElementReferenceWithPrefix(node);
     } else if (element is ParameterElement || element is LocalVariableElement) {
       bool inGetterContext = node.inGetterContext();
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
new file mode 100644
index 0000000..900989f
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
@@ -0,0 +1,122 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.src.refactoring.convert_getter_to_getter;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/source_range.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
+import 'package:analysis_server/src/services/search/hierarchy.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+
+
+/**
+ * [ConvertMethodToGetterRefactoring] implementation.
+ */
+class ConvertGetterToMethodRefactoringImpl extends RefactoringImpl implements
+    ConvertGetterToMethodRefactoring {
+  final SearchEngine searchEngine;
+  final PropertyAccessorElement element;
+
+  SourceChange change;
+
+  ConvertGetterToMethodRefactoringImpl(this.searchEngine, this.element);
+
+  @override
+  String get refactoringName => 'Convert Getter To Method';
+
+  @override
+  Future<RefactoringStatus> checkFinalConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    return new Future.value(result);
+  }
+
+  @override
+  Future<RefactoringStatus> checkInitialConditions() {
+    RefactoringStatus result = _checkInitialConditions();
+    return new Future.value(result);
+  }
+
+  @override
+  Future<SourceChange> createChange() {
+    change = new SourceChange(refactoringName);
+    // function
+    if (element.enclosingElement is CompilationUnitElement) {
+      _updateElementDeclaration(element);
+      return _updateElementReferences(element).then((_) => change);
+    }
+    // method
+    if (element.enclosingElement is ClassElement) {
+      FieldElement field = element.variable;
+      return getHierarchyMembers(searchEngine, field).then((elements) {
+        return Future.forEach(elements, (FieldElement field) {
+          PropertyAccessorElement getter = field.getter;
+          if (!getter.isSynthetic) {
+            _updateElementDeclaration(getter);
+            return _updateElementReferences(getter);
+          }
+        });
+      }).then((_) => change);
+    }
+    // not reachable
+    return null;
+  }
+
+  @override
+  bool requiresPreview() => false;
+
+  RefactoringStatus _checkInitialConditions() {
+    if (!element.isGetter || element.isSynthetic) {
+      return new RefactoringStatus.fatal(
+          'Only explicit getters can be converted to methods.');
+    }
+    return new RefactoringStatus();
+  }
+
+  void _updateElementDeclaration(PropertyAccessorElement element) {
+    // prepare "get" keyword
+    Token getKeyword = null;
+    {
+      AstNode node = element.node;
+      if (node is MethodDeclaration) {
+        getKeyword = node.propertyKeyword;
+      } else if (node is FunctionDeclaration) {
+        getKeyword = node.propertyKeyword;
+      }
+    }
+    // remove "get "
+    if (getKeyword != null) {
+      SourceRange getRange = rangeStartEnd(getKeyword, element.nameOffset);
+      SourceEdit edit = new SourceEdit.range(getRange, '');
+      change.addElementEdit(element, edit);
+    }
+    // add parameters "()"
+    {
+      SourceEdit edit = new SourceEdit(rangeElementName(element).end, 0, '()');
+      change.addElementEdit(element, edit);
+    }
+  }
+
+  Future _updateElementReferences(Element element) {
+    return searchEngine.searchReferences(element).then((matches) {
+      List<SourceReference> references = getSourceReferences(matches);
+      for (SourceReference reference in references) {
+        Element refElement = reference.element;
+        SourceRange refRange = reference.range;
+        // insert "()"
+        change.addElementEdit(
+            refElement,
+            new SourceEdit(refRange.end, 0, "()"));
+      }
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
new file mode 100644
index 0000000..c8fe460
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
@@ -0,0 +1,140 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.src.refactoring.convert_method_to_getter;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/source_range.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
+import 'package:analysis_server/src/services/search/hierarchy.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * [ConvertMethodToGetterRefactoring] implementation.
+ */
+class ConvertMethodToGetterRefactoringImpl extends RefactoringImpl implements
+    ConvertMethodToGetterRefactoring {
+  final SearchEngine searchEngine;
+  final ExecutableElement element;
+
+  SourceChange change;
+
+  ConvertMethodToGetterRefactoringImpl(this.searchEngine, this.element);
+
+  @override
+  String get refactoringName => 'Convert Method To Getter';
+
+  @override
+  Future<RefactoringStatus> checkFinalConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    return new Future.value(result);
+  }
+
+  @override
+  Future<RefactoringStatus> checkInitialConditions() {
+    RefactoringStatus result = _checkInitialConditions();
+    return new Future.value(result);
+  }
+
+  @override
+  Future<SourceChange> createChange() {
+    change = new SourceChange(refactoringName);
+    // FunctionElement
+    if (element is FunctionElement) {
+      _updateElementDeclaration(element);
+      return _updateElementReferences(element).then((_) => change);
+    }
+    // MethodElement
+    if (element is MethodElement) {
+      MethodElement method = element;
+      return getHierarchyMembers(searchEngine, method).then((elements) {
+        return Future.forEach(elements, (Element element) {
+          _updateElementDeclaration(element);
+          return _updateElementReferences(element);
+        });
+      }).then((_) => change);
+    }
+    // not reachable
+    return null;
+  }
+
+  @override
+  bool requiresPreview() => false;
+
+  RefactoringStatus _checkInitialConditions() {
+    // check Element type
+    if (element is FunctionElement) {
+      if (element.enclosingElement is! CompilationUnitElement) {
+        return new RefactoringStatus.fatal(
+            'Only top-level functions can be converted to getters.');
+      }
+    } else if (element is! MethodElement) {
+      return new RefactoringStatus.fatal(
+          'Only class methods or top-level functions can be converted to getters.');
+    }
+    // no parameters
+    if (element.parameters.isNotEmpty) {
+      return new RefactoringStatus.fatal(
+          'Only methods without parameters can be converted to getters.');
+    }
+    // OK
+    return new RefactoringStatus();
+  }
+
+  void _updateElementDeclaration(Element element) {
+    // prepare parameters
+    FormalParameterList parameters;
+    {
+      AstNode node = element.node;
+      if (node is MethodDeclaration) {
+        parameters = node.parameters;
+      }
+      if (node is FunctionDeclaration) {
+        parameters = node.functionExpression.parameters;
+      }
+    }
+    // insert "get "
+    {
+      SourceEdit edit = new SourceEdit(element.nameOffset, 0, 'get ');
+      change.addElementEdit(element, edit);
+    }
+    // remove parameters
+    {
+      SourceEdit edit = new SourceEdit.range(rangeNode(parameters), '');
+      change.addElementEdit(element, edit);
+    }
+  }
+
+  Future _updateElementReferences(Element element) {
+    return searchEngine.searchReferences(element).then((matches) {
+      List<SourceReference> references = getSourceReferences(matches);
+      for (SourceReference reference in references) {
+        Element refElement = reference.element;
+        SourceRange refRange = reference.range;
+        // prepare invocation
+        MethodInvocation invocation;
+        {
+          CompilationUnit refUnit = refElement.unit;
+          AstNode refNode =
+              new NodeLocator.con1(refRange.offset).searchWithin(refUnit);
+          invocation = refNode.getAncestor((node) => node is MethodInvocation);
+        }
+        // we need invocation
+        if (invocation != null) {
+          SourceRange range = rangeEndEnd(refRange, invocation);
+          SourceEdit edit = new SourceEdit.range(range, '');
+          change.addElementEdit(refElement, edit);
+        }
+      }
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index 0bbda87..3c41ff0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -35,6 +35,7 @@
   final CompilationUnit unit;
   final int selectionOffset;
   final int selectionLength;
+  CompilationUnitElement unitElement;
   String file;
   SourceRange selectionRange;
   CorrectionUtils utils;
@@ -54,7 +55,7 @@
 
   ExtractLocalRefactoringImpl(this.unit, this.selectionOffset,
       this.selectionLength) {
-    file = unit.element.source.fullName;
+    unitElement = unit.element;
     selectionRange = new SourceRange(selectionOffset, selectionLength);
     utils = new CorrectionUtils(unit);
   }
@@ -122,7 +123,7 @@
       String declarationSource = '$keyword $name = ';
       SourceEdit edit =
           new SourceEdit(singleExpression.offset, 0, declarationSource);
-      change.addEdit(file, edit);
+      change.addElementEdit(unitElement, edit);
       return new Future.value(change);
     }
     // add variable declaration
@@ -158,21 +159,21 @@
         String prefix = utils.getNodePrefix(target);
         SourceEdit edit =
             new SourceEdit(target.offset, 0, declarationSource + eol + prefix);
-        change.addEdit(file, edit);
+        change.addElementEdit(unitElement, edit);
       } else if (target is ExpressionFunctionBody) {
         String prefix = utils.getNodePrefix(target.parent);
         String indent = utils.getIndent(1);
         String declStatement = prefix + indent + declarationSource + eol;
         String exprStatement = prefix + indent + 'return ';
         Expression expr = target.expression;
-        change.addEdit(
-            file,
+        change.addElementEdit(
+            unitElement,
             new SourceEdit(
                 target.offset,
                 expr.offset - target.offset,
                 '{' + eol + declStatement + exprStatement));
-        change.addEdit(
-            file,
+        change.addElementEdit(
+            unitElement,
             new SourceEdit(expr.end, 0, ';' + eol + prefix + '}'));
       }
     }
@@ -184,7 +185,7 @@
     // replace occurrences with variable reference
     for (SourceRange range in occurrences) {
       SourceEdit edit = new SourceEdit.range(range, occurrenceReplacement);
-      change.addEdit(file, edit);
+      change.addElementEdit(unitElement, edit);
     }
     // done
     return new Future.value(change);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index d76aa53..28e616a 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -61,7 +61,7 @@
   final CompilationUnit unit;
   final int selectionOffset;
   final int selectionLength;
-  String file;
+  CompilationUnitElement unitElement;
   SourceRange selectionRange;
   CorrectionUtils utils;
 
@@ -91,7 +91,7 @@
 
   ExtractMethodRefactoringImpl(this.searchEngine, this.unit,
       this.selectionOffset, this.selectionLength) {
-    file = unit.element.source.fullName;
+    unitElement = unit.element;
     selectionRange = new SourceRange(selectionOffset, selectionLength);
     utils = new CorrectionUtils(unit);
   }
@@ -276,7 +276,7 @@
       }
       // add replace edit
       SourceEdit edit = new SourceEdit.range(range, invocationSource);
-      change.addEdit(file, edit);
+      change.addElementEdit(unitElement, edit);
     }
     // add method declaration
     {
@@ -333,7 +333,7 @@
         int offset = _parentMember.end;
         SourceEdit edit =
             new SourceEdit(offset, 0, '${eol}${eol}${prefix}${declarationSource}');
-        change.addEdit(file, edit);
+        change.addElementEdit(unitElement, edit);
       }
     }
     // done
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
index 2416f06..6e598dd 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
@@ -30,7 +30,7 @@
   final SearchEngine searchEngine;
   final CompilationUnit unit;
   final int offset;
-  String file;
+  CompilationUnitElement unitElement;
   CorrectionUtils utils;
 
   Element _variableElement;
@@ -38,7 +38,7 @@
   List<SearchMatch> _references;
 
   InlineLocalRefactoringImpl(this.searchEngine, this.unit, this.offset) {
-    file = unit.element.source.fullName;
+    unitElement = unit.element;
     utils = new CorrectionUtils(unit);
   }
 
@@ -131,7 +131,7 @@
       Statement declarationStatement =
           _variableNode.getAncestor((node) => node is VariableDeclarationStatement);
       SourceRange range = utils.getLinesRangeStatements([declarationStatement]);
-      change.addEdit(file, new SourceEdit.range(range, ''));
+      change.addElementEdit(unitElement, new SourceEdit.range(range, ''));
     }
     // prepare initializer
     Expression initializer = _variableNode.initializer;
@@ -142,7 +142,9 @@
       SourceRange range = reference.sourceRange;
       String sourceForReference =
           _getSourceForReference(range, initializerSource, initializerPrecedence);
-      change.addEdit(file, new SourceEdit.range(range, sourceForReference));
+      change.addElementEdit(
+          unitElement,
+          new SourceEdit.range(range, sourceForReference));
     }
     // done
     return new Future.value(change);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 1008e65..7958148 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -170,7 +170,6 @@
   final SearchEngine searchEngine;
   final CompilationUnit unit;
   final int offset;
-  String file;
   CorrectionUtils utils;
   SourceChange change;
 
@@ -192,7 +191,6 @@
   List<_ReferenceProcessor> _referenceProcessors = [];
 
   InlineMethodRefactoringImpl(this.searchEngine, this.unit, this.offset) {
-    file = unit.element.source.fullName;
     utils = new CorrectionUtils(unit);
   }
 
@@ -241,7 +239,9 @@
     if (deleteSource && inlineAll) {
       SourceRange methodRange = rangeNode(_methodNode);
       SourceRange linesRange = _methodUtils.getLinesRange(methodRange);
-      change.addEdit(_methodFile, new SourceEdit.range(linesRange, ""));
+      change.addElementEdit(
+          _methodElement,
+          new SourceEdit.range(linesRange, ''));
     }
     // done
     return new Future.value(result);
@@ -405,16 +405,14 @@
 class _ReferenceProcessor {
   final InlineMethodRefactoringImpl ref;
 
-  String _refFile;
+  Element refElement;
   CorrectionUtils _refUtils;
   SimpleIdentifier _node;
   SourceRange _refLineRange;
   String _refPrefix;
 
   _ReferenceProcessor(this.ref, SearchMatch reference) {
-    // prepare SourceChange to update
-    Element refElement = reference.element;
-    _refFile = refElement.source.fullName;
+    refElement = reference.element;
     // prepare CorrectionUtils
     CompilationUnit refUnit = refElement.unit;
     _refUtils = new CorrectionUtils(refUnit);
@@ -497,7 +495,7 @@
         // do insert
         SourceRange range = rangeStartLength(_refLineRange, 0);
         SourceEdit edit = new SourceEdit.range(range, source);
-        ref.change.addEdit(_refFile, edit);
+        _addRefEdit(edit);
       }
       // replace invocation with return expression
       if (ref._methodExpressionPart != null) {
@@ -515,10 +513,10 @@
         // do replace
         SourceRange methodUsageRange = rangeNode(usage);
         SourceEdit edit = new SourceEdit.range(methodUsageRange, source);
-        ref.change.addEdit(_refFile, edit);
+        _addRefEdit(edit);
       } else {
         SourceEdit edit = new SourceEdit.range(_refLineRange, "");
-        ref.change.addEdit(_refFile, edit);
+        _addRefEdit(edit);
       }
       return;
     }
@@ -535,7 +533,7 @@
     // do insert
     SourceRange range = rangeNode(_node);
     SourceEdit edit = new SourceEdit.range(range, source);
-    ref.change.addEdit(_refFile, edit);
+    _addRefEdit(edit);
   }
 
   void _process(RefactoringStatus status) {
@@ -606,10 +604,14 @@
       // do insert
       SourceRange range = rangeNode(_node);
       SourceEdit edit = new SourceEdit.range(range, source);
-      ref.change.addEdit(_refFile, edit);
+      _addRefEdit(edit);
     }
   }
 
+  void _addRefEdit(SourceEdit edit) {
+    ref.change.addElementEdit(refElement, edit);
+  }
+
   bool _shouldProcess() {
     if (!ref.inlineAll) {
       SourceRange parentRange = rangeNode(_node);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
new file mode 100644
index 0000000..178e7c4
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -0,0 +1,162 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.src.refactoring.move_file;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:path/path.dart' as pathos;
+
+
+/**
+ * [ExtractLocalRefactoring] implementation.
+ */
+class MoveFileRefactoringImpl extends RefactoringImpl implements
+    MoveFileRefactoring {
+  final pathos.Context pathContext;
+  final SearchEngine searchEngine;
+  final AnalysisContext context;
+  final Source source;
+
+  String oldFile;
+  String newFile;
+
+  SourceChange change;
+  LibraryElement library;
+  String oldLibraryDir;
+  String newLibraryDir;
+
+  MoveFileRefactoringImpl(this.pathContext, this.searchEngine, this.context,
+      this.source) {
+    oldFile = source.fullName;
+  }
+
+  @override
+  String get refactoringName => 'Move File';
+
+  @override
+  Future<RefactoringStatus> checkFinalConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    return new Future.value(result);
+  }
+
+  @override
+  Future<RefactoringStatus> checkInitialConditions() {
+    RefactoringStatus result = new RefactoringStatus();
+    return new Future.value(result);
+  }
+
+  @override
+  Future<SourceChange> createChange() {
+    change = new SourceChange('Update File References');
+    List<Source> librarySources = context.getLibrariesContaining(source);
+    return Future.forEach(librarySources, (Source librarySource) {
+      CompilationUnitElement unitElement =
+          context.getCompilationUnitElement(source, librarySource);
+      if (unitElement != null) {
+        // if a defining unit, update outgoing references
+        library = unitElement.library;
+        if (library.definingCompilationUnit == unitElement) {
+          oldLibraryDir = pathContext.dirname(oldFile);
+          newLibraryDir = pathContext.dirname(newFile);
+          _updateUriReferences(library.imports);
+          _updateUriReferences(library.exports);
+          _updateUriReferences(library.parts);
+        }
+        // update reference to the unit
+        return searchEngine.searchReferences(unitElement).then((matches) {
+          List<SourceReference> references = getSourceReferences(matches);
+          for (SourceReference reference in references) {
+            String newUri = _computeNewUri(reference);
+            reference.addEdit(change, "'$newUri'");
+          }
+        });
+      }
+    }).then((_) {
+      return change;
+    });
+  }
+
+  @override
+  bool requiresPreview() => false;
+
+  /**
+   * Computes the URI to use to reference [newFile] from [reference].
+   */
+  String _computeNewUri(SourceReference reference) {
+    String refDir = pathContext.dirname(reference.file);
+    // try to keep package: URI
+    if (_isPackageReference(reference)) {
+      Source newSource = new NonExistingSource(newFile, UriKind.FILE_URI);
+      Uri restoredUri = context.sourceFactory.restoreUri(newSource);
+      if (restoredUri != null) {
+        return restoredUri.toString();
+      }
+    }
+    // if no package: URI, prepare relative
+    return _getRelativeUri(newFile, refDir);
+  }
+
+  String _getRelativeUri(String path, String from) {
+    String uri = pathContext.relative(path, from: from);
+    List<String> parts = pathContext.split(uri);
+    return pathos.posix.joinAll(parts);
+  }
+
+  bool _isPackageReference(SourceReference reference) {
+    Source source = reference.element.source;
+    int offset = reference.range.offset + "'".length;
+    String content = context.getContents(source).data;
+    return content.startsWith('package:', offset);
+  }
+
+  /**
+   * Checks if the given [path] represents a relative URI.
+   *
+   * The following URI's are not relative:
+   *    `/absolute/path/file.dart`
+   *    `dart:math`
+   */
+  bool _isRelativeUri(String path) {
+    // absolute URI
+    if (Uri.parse(path).isAbsolute) {
+      return false;
+    }
+    // absolute path
+    if (pathContext.isAbsolute(path)) {
+      return false;
+    }
+    // OK
+    return true;
+  }
+
+  void _updateUriReference(UriReferencedElement element) {
+    if (!element.isSynthetic) {
+      String elementUri = element.uri;
+      if (_isRelativeUri(elementUri)) {
+        String elementPath = pathContext.join(oldLibraryDir, elementUri);
+        String newUri = _getRelativeUri(elementPath, newLibraryDir);
+        int uriOffset = element.uriOffset;
+        int uriLength = element.uriEnd - uriOffset;
+        change.addElementEdit(
+            library,
+            new SourceEdit(uriOffset, uriLength, "'$newUri'"));
+      }
+    }
+  }
+
+  void _updateUriReferences(List<UriReferencedElement> elements) {
+    for (UriReferencedElement element in elements) {
+      _updateUriReference(element);
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
index 8e3539f..617ced0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
@@ -12,7 +12,7 @@
  * Returns the [RefactoringStatus] with severity:
  *   OK if the name is valid;
  *   WARNING if the name is discouraged;
- *   ERROR if the name is illegal.
+ *   FATAL if the name is illegal.
  */
 RefactoringStatus validateClassName(String name) {
   return _validateUpperCamelCase(name, "Class");
@@ -22,7 +22,7 @@
  * Returns the [RefactoringStatus] with severity:
  *   OK if the name is valid;
  *   WARNING if the name is discouraged;
- *   ERROR if the name is illegal.
+ *   FATAL if the name is illegal.
  */
 RefactoringStatus validateConstantName(String name) {
   // null
@@ -56,7 +56,7 @@
  * Returns the [RefactoringStatus] with severity:
  *   OK if the name is valid;
  *   WARNING if the name is discouraged;
- *   ERROR if the name is illegal.
+ *   FATAL if the name is illegal.
  */
 RefactoringStatus validateConstructorName(String name) {
   if (name != null && name.isEmpty) {
@@ -69,7 +69,7 @@
  * Returns the [RefactoringStatus] with severity:
  *   OK if the name is valid;
  *   WARNING if the name is discouraged;
- *   ERROR if the name is illegal.
+ *   FATAL if the name is illegal.
  */
 RefactoringStatus validateFieldName(String name) {
   return _validateLowerCamelCase(name, "Field");
@@ -79,7 +79,7 @@
  * Returns the [RefactoringStatus] with severity:
  *   OK if the name is valid;
  *   WARNING if the name is discouraged;
- *   ERROR if the name is illegal.
+ *   FATAL if the name is illegal.
  */
 RefactoringStatus validateFunctionName(String name) {
   return _validateLowerCamelCase(name, "Function");
@@ -89,7 +89,7 @@
  * Returns the [RefactoringStatus] with severity:
  *   OK if the name is valid;
  *   WARNING if the name is discouraged;
- *   ERROR if the name is illegal.
+ *   FATAL if the name is illegal.
  */
 RefactoringStatus validateFunctionTypeAliasName(String name) {
   return _validateUpperCamelCase(name, "Function type alias");
@@ -99,7 +99,7 @@
  * Returns the [RefactoringStatus] with severity:
  *   OK if the name is valid;
  *   WARNING if the name is discouraged;
- *   ERROR if the name is illegal.
+ *   FATAL if the name is illegal.
  */
 RefactoringStatus validateImportPrefixName(String name) {
   if (name != null && name.isEmpty) {
@@ -112,7 +112,7 @@
  * Returns the [RefactoringStatus] with severity:
  *   OK if the name is valid;
  *   WARNING if the name is discouraged;
- *   ERROR if the name is illegal.
+ *   FATAL if the name is illegal.
  */
 RefactoringStatus validateLabelName(String name) {
   return _validateLowerCamelCase(name, "Label");
@@ -122,7 +122,7 @@
  * Returns the [RefactoringStatus] with severity:
  *   OK if the name is valid;
  *   WARNING if the name is discouraged;
- *   ERROR if the name is illegal.
+ *   FATAL if the name is illegal.
  */
 RefactoringStatus validateLibraryName(String name) {
   // null
@@ -162,7 +162,7 @@
  * Returns the [RefactoringStatus] with severity:
  *   OK if the name is valid;
  *   WARNING if the name is discouraged;
- *   ERROR if the name is illegal.
+ *   FATAL if the name is illegal.
  */
 RefactoringStatus validateMethodName(String name) {
   return _validateLowerCamelCase(name, "Method");
@@ -172,7 +172,7 @@
  * Returns the [RefactoringStatus] with severity:
  *   OK if the name is valid;
  *   WARNING if the name is discouraged;
- *   ERROR if the name is illegal.
+ *   FATAL if the name is illegal.
  */
 RefactoringStatus validateParameterName(String name) {
   return _validateLowerCamelCase(name, "Parameter");
@@ -182,7 +182,7 @@
  * Returns the [RefactoringStatus] with severity:
  *   OK if the name is valid;
  *   WARNING if the name is discouraged;
- *   ERROR if the name is illegal.
+ *   FATAL if the name is illegal.
  */
 RefactoringStatus validateVariableName(String name) {
   return _validateLowerCamelCase(name, "Variable");
@@ -194,7 +194,7 @@
   String trimmed = identifier.trim();
   if (identifier != trimmed) {
     String message = "$desc must not start or end with a blank.";
-    return new RefactoringStatus.error(message);
+    return new RefactoringStatus.fatal(message);
   }
   // empty
   int length = identifier.length;
@@ -207,7 +207,7 @@
       currentChar != CHAR_UNDERSCORE &&
       currentChar != CHAR_DOLLAR) {
     String message = "$desc must begin with $beginDesc.";
-    return new RefactoringStatus.error(message);
+    return new RefactoringStatus.fatal(message);
   }
   for (int i = 1; i < length; i++) {
     currentChar = identifier.codeUnitAt(i);
@@ -216,7 +216,7 @@
         currentChar != CHAR_DOLLAR) {
       String charStr = new String.fromCharCode(currentChar);
       String message = "$desc must not contain '$charStr'.";
-      return new RefactoringStatus.error(message);
+      return new RefactoringStatus.fatal(message);
     }
   }
   return new RefactoringStatus();
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index 25f76e9..187b233 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -9,10 +9,12 @@
 import 'package:analysis_server/src/protocol.dart' show
     RefactoringMethodParameter, SourceChange;
 import 'package:analysis_server/src/services/correction/status.dart';
+import 'package:analysis_server/src/services/refactoring/convert_method_to_getter.dart';
 import 'package:analysis_server/src/services/refactoring/extract_local.dart';
 import 'package:analysis_server/src/services/refactoring/extract_method.dart';
 import 'package:analysis_server/src/services/refactoring/inline_local.dart';
 import 'package:analysis_server/src/services/refactoring/inline_method.dart';
+import 'package:analysis_server/src/services/refactoring/move_file.dart';
 import 'package:analysis_server/src/services/refactoring/rename_class_member.dart';
 import 'package:analysis_server/src/services/refactoring/rename_constructor.dart';
 import 'package:analysis_server/src/services/refactoring/rename_import.dart';
@@ -23,6 +25,40 @@
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analysis_server/src/services/refactoring/convert_getter_to_method.dart';
+import 'package:path/path.dart' as pathos;
+
+
+/**
+ * [Refactoring] to convert getters into normal [MethodDeclaration]s.
+ */
+abstract class ConvertGetterToMethodRefactoring implements Refactoring {
+  /**
+   * Returns a new [ConvertMethodToGetterRefactoring] instance for converting
+   * [element] and all the corresponding hierarchy elements.
+   */
+  factory ConvertGetterToMethodRefactoring(SearchEngine searchEngine,
+      PropertyAccessorElement element) {
+    return new ConvertGetterToMethodRefactoringImpl(searchEngine, element);
+  }
+}
+
+
+/**
+ * [Refactoring] to convert normal [MethodDeclaration]s into getters.
+ */
+abstract class ConvertMethodToGetterRefactoring implements Refactoring {
+  /**
+   * Returns a new [ConvertMethodToGetterRefactoring] instance for converting
+   * [element] and all the corresponding hierarchy elements.
+   */
+  factory ConvertMethodToGetterRefactoring(SearchEngine searchEngine,
+      ExecutableElement element) {
+    return new ConvertMethodToGetterRefactoringImpl(searchEngine, element);
+  }
+}
 
 
 /**
@@ -248,6 +284,29 @@
 
 
 /**
+ * [Refactoring] to move/rename a file.
+ */
+abstract class MoveFileRefactoring implements Refactoring {
+  /**
+   * Returns a new [MoveFileRefactoring] instance.
+   */
+  factory MoveFileRefactoring(pathos.Context pathContext,
+      SearchEngine searchEngine, AnalysisContext context, Source source) {
+    return new MoveFileRefactoringImpl(
+        pathContext,
+        searchEngine,
+        context,
+        source);
+  }
+
+  /**
+   * The new file path to which the given file is being moved.
+   */
+  void set newFile(String newName);
+}
+
+
+/**
  * Abstract interface for all refactorings.
  */
 abstract class Refactoring {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
index 3276418..3f72744 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
@@ -5,9 +5,37 @@
 library services.src.refactoring;
 
 import 'dart:async';
+import 'dart:collection';
 
+import 'package:analysis_server/src/protocol.dart' hide Element;
 import 'package:analysis_server/src/services/correction/status.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * When a [Source] (a file) is used in more than one context, [SearchEngine]
+ * will return separate [SearchMatch]s for each context. But in rename
+ * refactorings we want to update each [Source] only once.
+ */
+List<SourceReference> getSourceReferences(List<SearchMatch> matches) {
+  var uniqueReferences = new HashMap<SourceReference, SourceReference>();
+  for (SearchMatch match in matches) {
+    Element element = match.element;
+    String file = element.source.fullName;
+    SourceRange range = match.sourceRange;
+    SourceReference newReference =
+        new SourceReference(file, range, element, match.isResolved, match.isQualified);
+    SourceReference oldReference = uniqueReferences[newReference];
+    if (oldReference == null) {
+      uniqueReferences[newReference] = newReference;
+      oldReference = newReference;
+    }
+  }
+  return uniqueReferences.keys.toList();
+}
 
 
 /**
@@ -31,3 +59,54 @@
     });
   }
 }
+
+
+/**
+ * The [SourceRange] in some [Source].
+ */
+class SourceReference {
+  final String file;
+  final SourceRange range;
+  final Element element;
+  final bool isResolved;
+  final bool isQualified;
+
+  SourceReference(this.file, this.range, this.element, this.isResolved,
+      this.isQualified);
+
+  @override
+  int get hashCode {
+    int hash = file.hashCode;
+    hash = ((hash << 16) & 0xFFFFFFFF) + range.hashCode;
+    return hash;
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (identical(other, this)) {
+      return true;
+    }
+    if (other is SourceReference) {
+      return other.file == file && other.range == range;
+    }
+    return false;
+  }
+
+  /**
+   * Adds the [SourceEdit] to replace this reference.
+   */
+  void addEdit(SourceChange change, String newText, {String id}) {
+    SourceEdit edit = createEdit(newText, id: id);
+    change.addElementEdit(element, edit);
+  }
+
+  /**
+   * Returns the [SourceEdit] to replace this reference.
+   */
+  SourceEdit createEdit(String newText, {String id}) {
+    return new SourceEdit.range(range, newText, id: id);
+  }
+
+  @override
+  String toString() => '${file}@${range}';
+}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index 0d6dafe..6b8062b 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -5,60 +5,19 @@
 library services.src.refactoring.rename;
 
 import 'dart:async';
-import 'dart:collection';
 
 import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/source_range.dart';
 import 'package:analysis_server/src/services/correction/status.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
-import 'package:analysis_server/src/services/correction/source_range.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 
 /**
- * Returns the [Edit] to replace the given [SearchMatch] reference.
- */
-SourceEdit createReferenceEdit(SourceReference reference, String newText,
-    {String id}) {
-  return new SourceEdit.range(reference.range, newText, id: id);
-}
-
-
-/**
- * Returns the file containing declaration of the given [Element].
- */
-String getElementFile(Element element) {
-  return element.source.fullName;
-}
-
-
-/**
- * When a [Source] (a file) is used in more than one context, [SearchEngine]
- * will return separate [SearchMatch]s for each context. But in rename
- * refactorings we want to update each [Source] only once.
- */
-List<SourceReference> getSourceReferences(List<SearchMatch> matches) {
-  var uniqueReferences = new HashMap<SourceReference, SourceReference>();
-  for (SearchMatch match in matches) {
-    Element element = match.element;
-    String file = getElementFile(element);
-    SourceRange range = match.sourceRange;
-    SourceReference newReference =
-        new SourceReference(file, range, element, match.isResolved, match.isQualified);
-    SourceReference oldReference = uniqueReferences[newReference];
-    if (oldReference == null) {
-      uniqueReferences[newReference] = newReference;
-      oldReference = newReference;
-    }
-  }
-  return uniqueReferences.keys.toList();
-}
-
-
-/**
  * Returns `true` if two given [Element]s are [LocalElement]s and have
  * intersecting with visibility ranges.
  */
@@ -156,6 +115,8 @@
   final String elementKindName;
   final String oldName;
 
+  SourceChange change;
+
   String newName;
 
   RenameRefactoringImpl(SearchEngine searchEngine, Element element)
@@ -166,27 +127,29 @@
         oldName = _getDisplayName(element);
 
   /**
-   * Adds the "Update declaration" [Edit] to [change].
+   * Adds a [SourceEdit] to update [element] name to [change].
    */
-  void addDeclarationEdit(SourceChange change, Element element) {
+  void addDeclarationEdit(Element element) {
     if (element != null) {
-      String file = getElementFile(element);
-      SourceEdit edit = new SourceEdit.range(rangeElementName(element), newName);
-      change.addEdit(file, edit);
+      SourceRange range = rangeElementName(element);
+      SourceEdit edit = new SourceEdit.range(range, newName);
+      change.addElementEdit(element, edit);
     }
   }
 
   /**
-   * Adds an "Update reference" [Edit] to [change].
+   * Adds [SourceEdit]s to update [matches] to [change].
    */
-  void addReferenceEdit(SourceChange change, SourceReference reference) {
-    SourceEdit edit = createReferenceEdit(reference, newName);
-    change.addEdit(reference.file, edit);
+  void addReferenceEdits(List<SearchMatch> matches) {
+    List<SourceReference> references = getSourceReferences(matches);
+    for (SourceReference reference in references) {
+      reference.addEdit(change, newName);
+    }
   }
 
   @override
   Future<RefactoringStatus> checkInitialConditions() {
-    var result = new RefactoringStatus();
+    RefactoringStatus result = new RefactoringStatus();
     return new Future.value(result);
   }
 
@@ -201,6 +164,17 @@
   }
 
   @override
+  Future<SourceChange> createChange() {
+    change = new SourceChange(refactoringName);
+    return fillChange().then((_) => change);
+  }
+
+  /**
+   * Adds individual edits to [change].
+   */
+  Future fillChange();
+
+  @override
   bool requiresPreview() {
     return false;
   }
@@ -215,39 +189,3 @@
     return element.displayName;
   }
 }
-
-
-/**
- * The [SourceRange] in some [Source].
- */
-class SourceReference {
-  final String file;
-  final SourceRange range;
-  final Element element;
-  final bool isResolved;
-  final bool isQualified;
-
-  SourceReference(this.file, this.range, this.element, this.isResolved,
-      this.isQualified);
-
-  @override
-  int get hashCode {
-    int hash = file.hashCode;
-    hash = ((hash << 16) & 0xFFFFFFFF) + range.hashCode;
-    return hash;
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (identical(other, this)) {
-      return true;
-    }
-    if (other is SourceReference) {
-      return other.file == file && other.range == range;
-    }
-    return false;
-  }
-
-  @override
-  String toString() => '${file}@${range}';
-}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 9491930..0269b83 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -11,6 +11,7 @@
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
 import 'package:analysis_server/src/services/refactoring/rename.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
@@ -85,23 +86,18 @@
   }
 
   @override
-  Future<SourceChange> createChange() {
-    SourceChange change = new SourceChange(refactoringName);
+  Future fillChange() {
     // update declarations
     for (Element renameElement in _validator.elements) {
       if (renameElement.isSynthetic && renameElement is FieldElement) {
-        addDeclarationEdit(change, renameElement.getter);
-        addDeclarationEdit(change, renameElement.setter);
+        addDeclarationEdit(renameElement.getter);
+        addDeclarationEdit(renameElement.setter);
       } else {
-        addDeclarationEdit(change, renameElement);
+        addDeclarationEdit(renameElement);
       }
     }
     // update references
-    List<SourceReference> references =
-        getSourceReferences(_validator.references);
-    for (SourceReference reference in references) {
-      addReferenceEdit(change, reference);
-    }
+    addReferenceEdits(_validator.references);
     // potential matches
     return searchEngine.searchMemberReferences(oldName).then((nameMatches) {
       List<SourceReference> nameRefs = getSourceReferences(nameMatches);
@@ -118,11 +114,9 @@
           }
         }
         // add edit
-        SourceEdit edit =
-            createReferenceEdit(reference, newName, id: _newPotentialId());
-        change.addEdit(reference.file, edit);
+        reference.addEdit(change, newName, id: _newPotentialId());
       }
-    }).then((_) => change);
+    });
   }
 
   String _newPotentialId() {
@@ -238,8 +232,7 @@
     if (element is ClassMemberElement) {
       return getHierarchyMembers(
           searchEngine,
-          element,
-          false).then((Set<Element> elements) {
+          element).then((Set<Element> elements) {
         this.elements = elements;
       });
     } else {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
index bb521f1..c62d564 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
@@ -8,12 +8,13 @@
 
 import 'package:analysis_server/src/protocol.dart' hide Element;
 import 'package:analysis_server/src/services/correction/status.dart';
-import 'package:analysis_server/src/services/refactoring/refactoring.dart';
-import 'package:analysis_server/src/services/search/hierarchy.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
 import 'package:analysis_server/src/services/refactoring/rename.dart';
+import 'package:analysis_server/src/services/search/hierarchy.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 
@@ -49,19 +50,16 @@
   }
 
   @override
-  Future<SourceChange> createChange() {
-    SourceChange change = new SourceChange(refactoringName);
+  Future fillChange() {
     String replacement = newName.isEmpty ? '' : '.${newName}';
     // update references
-    return searchEngine.searchReferences(element).then((refMatches) {
-      List<SourceReference> references = getSourceReferences(refMatches);
+    return searchEngine.searchReferences(element).then((matches) {
+      List<SourceReference> references = getSourceReferences(matches);
       if (!element.isSynthetic) {
         for (SourceReference reference in references) {
-          SourceEdit edit = createReferenceEdit(reference, replacement);
-          change.addEdit(reference.file, edit);
+          reference.addEdit(change, replacement);
         }
       }
-      return change;
     });
   }
 
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
index b30fab2..da46d19 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
@@ -7,12 +7,13 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_server/src/services/correction/status.dart';
-import 'package:analysis_server/src/services/refactoring/refactoring.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/services/correction/source_range.dart';
+import 'package:analysis_server/src/services/correction/status.dart';
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
 import 'package:analysis_server/src/services/refactoring/rename.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -46,11 +47,9 @@
   }
 
   @override
-  Future<SourceChange> createChange() {
-    SourceChange change = new SourceChange(refactoringName);
+  Future fillChange() {
     // update declaration
     {
-      String file = getElementFile(element);
       PrefixElement prefix = element.prefix;
       SourceEdit edit = null;
       if (newName.isEmpty) {
@@ -70,22 +69,19 @@
         }
       }
       if (edit != null) {
-        change.addEdit(file, edit);
+        change.addElementEdit(element, edit);
       }
     }
     // update references
     return searchEngine.searchReferences(element).then((refMatches) {
       List<SourceReference> references = getSourceReferences(refMatches);
       for (SourceReference reference in references) {
-        SourceEdit edit;
         if (newName.isEmpty) {
-          edit = createReferenceEdit(reference, newName);
+          reference.addEdit(change, newName);
         } else {
-          edit = createReferenceEdit(reference, "${newName}.");
+          reference.addEdit(change, "${newName}.");
         }
-        change.addEdit(reference.file, edit);
       }
-      return change;
     });
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
index 9824b0e..b417056 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
@@ -6,7 +6,6 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/protocol.dart' hide Element;
 import 'package:analysis_server/src/services/correction/status.dart';
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
@@ -42,17 +41,8 @@
   }
 
   @override
-  Future<SourceChange> createChange() {
-    SourceChange change = new SourceChange(refactoringName);
-    // update declaration
-    addDeclarationEdit(change, element);
-    // update references
-    return searchEngine.searchReferences(element).then((refMatches) {
-      List<SourceReference> references = getSourceReferences(refMatches);
-      for (SourceReference reference in references) {
-        addReferenceEdit(change, reference);
-      }
-      return change;
-    });
+  Future fillChange() {
+    addDeclarationEdit(element);
+    return searchEngine.searchReferences(element).then(addReferenceEdits);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
index 09f13ec..a787be3 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
@@ -8,10 +8,10 @@
 
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/correction/status.dart';
-import 'package:analysis_server/src/services/refactoring/refactoring.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/rename.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/src/generated/element.dart';
 
 
@@ -45,17 +45,8 @@
   }
 
   @override
-  Future<SourceChange> createChange() {
-    SourceChange change = new SourceChange(refactoringName);
-    // update declaration
-    addDeclarationEdit(change, element);
-    // update references
-    return searchEngine.searchReferences(element).then((refMatches) {
-      List<SourceReference> references = getSourceReferences(refMatches);
-      for (SourceReference reference in references) {
-        addReferenceEdit(change, reference);
-      }
-      return change;
-    });
+  Future<SourceChange> fillChange() {
+    addDeclarationEdit(element);
+    return searchEngine.searchReferences(element).then(addReferenceEdits);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index 9e1ab32..dd56413 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -71,18 +71,9 @@
   }
 
   @override
-  Future<SourceChange> createChange() {
-    SourceChange change = new SourceChange(refactoringName);
-    // update declaration
-    addDeclarationEdit(change, element);
-    // update references
-    return searchEngine.searchReferences(element).then((refMatches) {
-      List<SourceReference> references = getSourceReferences(refMatches);
-      for (SourceReference reference in references) {
-        addReferenceEdit(change, reference);
-      }
-      return change;
-    });
+  Future fillChange() {
+    addDeclarationEdit(element);
+    return searchEngine.searchReferences(element).then(addReferenceEdits);
   }
 
   void _analyzePossibleConflicts_inLibrary(RefactoringStatus result,
@@ -107,6 +98,7 @@
   final RenameLocalRefactoringImpl refactoring;
   final RefactoringStatus result;
   final SourceRange elementRange;
+  final Set<Element> conflictingLocals = new Set<Element>();
 
   _ConflictValidatorVisitor(this.refactoring, this.result, this.elementRange);
 
@@ -116,12 +108,17 @@
     String newName = refactoring.newName;
     if (nodeElement != null && nodeElement.name == newName) {
       // duplicate declaration
-      if (haveIntersectingRanges(refactoring.element, nodeElement)) {
+      if (node.inDeclarationContext() &&
+          haveIntersectingRanges(refactoring.element, nodeElement)) {
+        conflictingLocals.add(nodeElement);
         String nodeKind = nodeElement.kind.displayName;
         String message = "Duplicate ${nodeKind} '$newName'.";
         result.addError(message, new Location.fromElement(nodeElement));
         return;
       }
+      if (conflictingLocals.contains(nodeElement)) {
+        return;
+      }
       // shadowing referenced element
       if (elementRange.contains(node.offset) &&
           !node.isQualified &&
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index 3688f59..5744fb2 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -95,8 +95,7 @@
   }
 
   @override
-  Future<SourceChange> createChange() {
-    SourceChange change = new SourceChange(refactoringName);
+  Future fillChange() {
     // prepare elements
     List<Element> elements = [];
     if (element is PropertyInducingElement && element.isSynthetic) {
@@ -114,17 +113,8 @@
     }
     // update each element
     return Future.forEach(elements, (Element element) {
-      // update declaration
-      addDeclarationEdit(change, element);
-      // schedule updating references
-      return searchEngine.searchReferences(element).then((refMatches) {
-        List<SourceReference> references = getSourceReferences(refMatches);
-        for (SourceReference reference in references) {
-          addReferenceEdit(change, reference);
-        }
-      });
-    }).then((_) {
-      return change;
+      addDeclarationEdit(element);
+      return searchEngine.searchReferences(element).then(addReferenceEdits);
     });
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
index 729792c..bcc8092 100644
--- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -74,11 +74,11 @@
 
 
 /**
- * Returns all the declarations of the given [ClassMemberElement] in
- * superclasses of the declaring class, and its subclasses if not [onlySuper].
+ * @return all implementations of the given {@link ClassMemberElement} is its superclasses and
+ *         their subclasses.
  */
 Future<Set<ClassMemberElement>> getHierarchyMembers(SearchEngine searchEngine,
-    ClassMemberElement member, bool onlySuper) {
+    ClassMemberElement member) {
   Set<ClassMemberElement> result = new HashSet<ClassMemberElement>();
   // constructor
   if (member is ConstructorElement) {
@@ -92,22 +92,21 @@
   Set<ClassElement> searchClasses = getSuperClasses(memberClass);
   searchClasses.add(memberClass);
   for (ClassElement superClass in searchClasses) {
-    List<Element> superClassMembers = getChildren(superClass, name);
     // ignore if super- class does not declare member
-    if (superClassMembers.isEmpty) {
-      continue;
-    }
-    // add super- class members
-    _addClassMembers(result, superClassMembers);
-    if (onlySuper) {
+    if (getClassMembers(superClass, name).isEmpty) {
       continue;
     }
     // check all sub- classes
     var subClassFuture = getSubClasses(searchEngine, superClass);
     var membersFuture = subClassFuture.then((Set<ClassElement> subClasses) {
+      subClasses.add(superClass);
       for (ClassElement subClass in subClasses) {
         List<Element> subClassMembers = getChildren(subClass, name);
-        _addClassMembers(result, subClassMembers);
+        for (Element member in subClassMembers) {
+          if (member is ClassMemberElement) {
+            result.add(member);
+          }
+        }
       }
     });
     futures.add(membersFuture);
@@ -117,17 +116,6 @@
   });
 }
 
-/**
- * Adds [ClassMemberElement]s from [elements] to [result].
- */
-void _addClassMembers(Set<ClassMemberElement> result, List<Element> elements) {
-  for (Element member in elements) {
-    if (member is ClassMemberElement) {
-      result.add(member);
-    }
-  }
-}
-
 
 /**
  * Returns non-synthetic members of the given [ClassElement] and its super
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 712d8a4..adbab3d 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -64,10 +64,9 @@
         element.kind == ElementKind.ANGULAR_SELECTOR) {
       return _searchReferences_Angular(element as AngularElement);
     } else if (element.kind == ElementKind.CLASS) {
-      return _searchReferences_Class(element as ClassElement);
+      return _searchReferences(element);
     } else if (element.kind == ElementKind.COMPILATION_UNIT) {
-      return _searchReferences_CompilationUnit(
-          element as CompilationUnitElement);
+      return _searchReferences(element);
     } else if (element.kind == ElementKind.CONSTRUCTOR) {
       return _searchReferences_Constructor(element as ConstructorElement);
     } else if (element.kind == ElementKind.FIELD ||
@@ -77,25 +76,25 @@
       return _searchReferences_Function(element as FunctionElement);
     } else if (element.kind == ElementKind.GETTER ||
         element.kind == ElementKind.SETTER) {
-      return _searchReferences_PropertyAccessor(
-          element as PropertyAccessorElement);
+      return _searchReferences(element);
     } else if (element.kind == ElementKind.IMPORT) {
-      return _searchReferences_Import(element as ImportElement);
+      return _searchReferences(element);
     } else if (element.kind == ElementKind.LABEL) {
-      return _searchReferences_Label(element as LabelElement);
+      return _searchReferences(element);
     } else if (element.kind == ElementKind.LIBRARY) {
-      return _searchReferences_Library(element as LibraryElement);
+      return _searchReferences(element);
     } else if (element.kind == ElementKind.LOCAL_VARIABLE) {
       return _searchReferences_LocalVariable(element as LocalVariableElement);
     } else if (element.kind == ElementKind.METHOD) {
       return _searchReferences_Method(element as MethodElement);
     } else if (element.kind == ElementKind.PARAMETER) {
       return _searchReferences_Parameter(element as ParameterElement);
+    } else if (element.kind == ElementKind.PREFIX) {
+      return _searchReferences(element);
     } else if (element.kind == ElementKind.FUNCTION_TYPE_ALIAS) {
-      return _searchReferences_FunctionTypeAlias(
-          element as FunctionTypeAliasElement);
+      return _searchReferences(element);
     } else if (element.kind == ElementKind.TYPE_PARAMETER) {
-      return _searchReferences_TypeParameter(element as TypeParameterElement);
+      return _searchReferences(element);
     }
     return new Future.value(<SearchMatch>[]);
   }
@@ -123,6 +122,15 @@
     });
   }
 
+  Future<List<SearchMatch>> _searchReferences(Element element) {
+    _Requestor requestor = new _Requestor(_index);
+    requestor.add(
+        element,
+        IndexConstants.IS_REFERENCED_BY,
+        MatchKind.REFERENCE);
+    return requestor.merge();
+  }
+
   Future<List<SearchMatch>> _searchReferences_Angular(AngularElement element) {
     _Requestor requestor = new _Requestor(_index);
     requestor.add(
@@ -136,19 +144,6 @@
     return requestor.merge();
   }
 
-  Future<List<SearchMatch>> _searchReferences_Class(ClassElement clazz) {
-    _Requestor requestor = new _Requestor(_index);
-    requestor.add(clazz, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
-    return requestor.merge();
-  }
-
-  Future<List<SearchMatch>>
-      _searchReferences_CompilationUnit(CompilationUnitElement unit) {
-    _Requestor requestor = new _Requestor(_index);
-    requestor.add(unit, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
-    return requestor.merge();
-  }
-
   Future<List<SearchMatch>>
       _searchReferences_Constructor(ConstructorElement constructor) {
     _Requestor requestor = new _Requestor(_index);
@@ -195,37 +190,6 @@
   }
 
   Future<List<SearchMatch>>
-      _searchReferences_FunctionTypeAlias(FunctionTypeAliasElement alias) {
-    _Requestor requestor = new _Requestor(_index);
-    requestor.add(alias, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
-    return requestor.merge();
-  }
-
-  Future<List<SearchMatch>> _searchReferences_Import(ImportElement imp) {
-    _Requestor requestor = new _Requestor(_index);
-    requestor.add(imp, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
-    return requestor.merge();
-  }
-
-  Future<List<SearchMatch>> _searchReferences_Label(LabelElement variable) {
-    _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        variable,
-        IndexConstants.IS_REFERENCED_BY,
-        MatchKind.REFERENCE);
-    return requestor.merge();
-  }
-
-  Future<List<SearchMatch>> _searchReferences_Library(LibraryElement library) {
-    _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        library,
-        IndexConstants.IS_REFERENCED_BY,
-        MatchKind.REFERENCE);
-    return requestor.merge();
-  }
-
-  Future<List<SearchMatch>>
       _searchReferences_LocalVariable(LocalVariableElement variable) {
     _Requestor requestor = new _Requestor(_index);
     requestor.add(variable, IndexConstants.IS_READ_BY, MatchKind.READ);
@@ -267,26 +231,6 @@
         MatchKind.INVOCATION);
     return requestor.merge();
   }
-
-  Future<List<SearchMatch>>
-      _searchReferences_PropertyAccessor(PropertyAccessorElement accessor) {
-    _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        accessor,
-        IndexConstants.IS_REFERENCED_BY,
-        MatchKind.REFERENCE);
-    return requestor.merge();
-  }
-
-  Future<List<SearchMatch>>
-      _searchReferences_TypeParameter(TypeParameterElement typeParameter) {
-    _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        typeParameter,
-        IndexConstants.IS_REFERENCED_BY,
-        MatchKind.REFERENCE);
-    return requestor.merge();
-  }
 }
 
 
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 7f78af6..a994be0 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -11,7 +11,7 @@
 import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analysis_server/src/search/search_domain.dart';
 import 'package:analysis_server/src/domain_server.dart';
-import 'package:analyzer/source/package_map_provider.dart';
+import 'package:analyzer/source/pub_package_map_provider.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/generated/sdk_io.dart';
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index beb2d68..5dbb574 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -6,7 +6,7 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analyzer: '0.23.0-dev.4'
+  analyzer: 0.23.0-dev.6
   args: any
   logging: any
   path: any
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index 4239161..458eac0 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -4,7 +4,6 @@
 
 library test.services.src.index.abstract_single_file;
 
-import 'abstract_context.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/error.dart';
@@ -12,6 +11,8 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
 
+import 'abstract_context.dart';
+
 
 class AbstractSingleUnitTest extends AbstractContextTest {
   bool verifyNoTestUnitErrors = true;
@@ -23,6 +24,11 @@
   CompilationUnitElement testUnitElement;
   LibraryElement testLibraryElement;
 
+  void addTestSource(String code) {
+    testCode = code;
+    testSource = addSource(testFile, code);
+  }
+
   void assertNoErrorsInSource(Source source) {
     List<AnalysisError> errors = context.getErrors(source).errors;
     expect(errors, isEmpty);
@@ -32,6 +38,10 @@
     return findChildElement(testUnitElement, name, kind);
   }
 
+  int findEnd(String search) {
+    return findOffset(search) + search.length;
+  }
+
   /**
    * Returns the [SimpleIdentifier] at the given search pattern.
    */
@@ -61,10 +71,6 @@
     return ElementLocator.locate(node);
   }
 
-  int findEnd(String search) {
-    return findOffset(search) + search.length;
-  }
-
   int findOffset(String search) {
     int offset = testCode.indexOf(search);
     expect(offset, isNonNegative, reason: "Not found '$search' in\n$testCode");
@@ -93,8 +99,7 @@
   }
 
   void resolveTestUnit(String code) {
-    testCode = code;
-    testSource = addSource(testFile, code);
+    addTestSource(code);
     testUnit = resolveLibraryUnit(testSource);
     if (verifyNoTestUnitErrors) {
       assertNoErrorsInSource(testSource);
diff --git a/pkg/analysis_server/test/analysis/get_errors_test.dart b/pkg/analysis_server/test/analysis/get_errors_test.dart
index 43d2219..444f222 100644
--- a/pkg/analysis_server/test/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/get_errors_test.dart
@@ -8,11 +8,11 @@
 
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
-import '../reflective_tests.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
+import '../reflective_tests.dart';
 
 
 main() {
@@ -110,6 +110,14 @@
     });
   }
 
+  Future _checkInvalid(String file) {
+    Request request = _createGetErrorsRequest();
+    return serverChannel.sendRequest(request).then((Response response) {
+      expect(response.error, isNotNull);
+      expect(response.error.code, RequestErrorCode.GET_ERRORS_INVALID_FILE);
+    });
+  }
+
   Request _createGetErrorsRequest() {
     return new AnalysisGetErrorsParams(testFile).toRequest(requestId);
   }
@@ -120,12 +128,4 @@
       return new AnalysisGetErrorsResult.fromResponse(response).errors;
     });
   }
-
-  Future _checkInvalid(String file) {
-    Request request = _createGetErrorsRequest();
-    return serverChannel.sendRequest(request).then((Response response) {
-      expect(response.error, isNotNull);
-      expect(response.error.code, RequestErrorCode.GET_ERRORS_INVALID_FILE);
-    });
-  }
 }
diff --git a/pkg/analysis_server/test/analysis_hover_test.dart b/pkg/analysis_server/test/analysis/get_hover_test.dart
similarity index 96%
rename from pkg/analysis_server/test/analysis_hover_test.dart
rename to pkg/analysis_server/test/analysis/get_hover_test.dart
index e81d2d8..1fe91f1 100644
--- a/pkg/analysis_server/test/analysis_hover_test.dart
+++ b/pkg/analysis_server/test/analysis/get_hover_test.dart
@@ -7,10 +7,10 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/protocol.dart';
-import 'reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
-import 'analysis_abstract.dart';
+import '../analysis_abstract.dart';
+import '../reflective_tests.dart';
 
 
 main() {
@@ -28,8 +28,8 @@
 
   Future<HoverInformation> prepareHoverAt(int offset) {
     return waitForTasksFinished().then((_) {
-      Request request = new AnalysisGetHoverParams(testFile,
-          offset).toRequest('0');
+      Request request =
+          new AnalysisGetHoverParams(testFile, offset).toRequest('0');
       Response response = handleSuccessfulRequest(request);
       var result = new AnalysisGetHoverResult.fromResponse(response);
       List<HoverInformation> hovers = result.hovers;
diff --git a/pkg/analysis_server/test/analysis/notification_errors_test.dart b/pkg/analysis_server/test/analysis/notification_errors_test.dart
index d4fbe02..836ed9b 100644
--- a/pkg/analysis_server/test/analysis/notification_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_errors_test.dart
@@ -7,10 +7,10 @@
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
-import '../reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
 import '../analysis_abstract.dart';
+import '../reflective_tests.dart';
 
 
 main() {
diff --git a/pkg/analysis_server/test/analysis_notification_highlights_test.dart b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
similarity index 99%
rename from pkg/analysis_server/test/analysis_notification_highlights_test.dart
rename to pkg/analysis_server/test/analysis/notification_highlights_test.dart
index 721d72e..7be135a 100644
--- a/pkg/analysis_server/test/analysis_notification_highlights_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights_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 test.domain.analysis.notification.highlights;
+library test.analysis.notification.highlights;
 
 import 'dart:async';
 
@@ -10,8 +10,8 @@
 import 'package:analysis_server/src/protocol.dart';
 import 'package:unittest/unittest.dart';
 
-import 'analysis_abstract.dart';
-import 'reflective_tests.dart';
+import '../analysis_abstract.dart';
+import '../reflective_tests.dart';
 
 
 main() {
diff --git a/pkg/analysis_server/test/analysis_notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
similarity index 98%
rename from pkg/analysis_server/test/analysis_notification_navigation_test.dart
rename to pkg/analysis_server/test/analysis/notification_navigation_test.dart
index 6a1ddea..6b0148b 100644
--- a/pkg/analysis_server/test/analysis_notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_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 test.domain.analysis.notification.navigation;
+library test.analysis.notification.navigation;
 
 import 'dart:async';
 
@@ -10,8 +10,8 @@
 import 'package:analysis_server/src/protocol.dart';
 import 'package:unittest/unittest.dart';
 
-import 'analysis_abstract.dart';
-import 'reflective_tests.dart';
+import '../analysis_abstract.dart';
+import '../reflective_tests.dart';
 
 
 main() {
diff --git a/pkg/analysis_server/test/analysis_notification_occurrences_test.dart b/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
similarity index 97%
rename from pkg/analysis_server/test/analysis_notification_occurrences_test.dart
rename to pkg/analysis_server/test/analysis/notification_occurrences_test.dart
index 007ab38..34fcac7 100644
--- a/pkg/analysis_server/test/analysis_notification_occurrences_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
@@ -2,16 +2,16 @@
 // for details. 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.analysis.notification.occurrences;
+library test.analysis.notification.occurrences;
 
 import 'dart:async';
 
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
-import 'analysis_abstract.dart';
+import '../analysis_abstract.dart';
+import '../reflective_tests.dart';
 
 
 main() {
diff --git a/pkg/analysis_server/test/analysis_notification_outline_test.dart b/pkg/analysis_server/test/analysis/notification_outline_test.dart
similarity index 99%
rename from pkg/analysis_server/test/analysis_notification_outline_test.dart
rename to pkg/analysis_server/test/analysis/notification_outline_test.dart
index e547fee..5ab5182 100644
--- a/pkg/analysis_server/test/analysis_notification_outline_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_outline_test.dart
@@ -2,16 +2,16 @@
 // for details. 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.analysis.notification.outline;
+library test.analysis.notification.outline;
 
 import 'dart:async';
 
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
-import 'analysis_abstract.dart';
+import '../analysis_abstract.dart';
+import '../reflective_tests.dart';
 
 
 main() {
diff --git a/pkg/analysis_server/test/analysis_notification_overrides_test.dart b/pkg/analysis_server/test/analysis/notification_overrides_test.dart
similarity index 98%
rename from pkg/analysis_server/test/analysis_notification_overrides_test.dart
rename to pkg/analysis_server/test/analysis/notification_overrides_test.dart
index dfcfa48..4b18328 100644
--- a/pkg/analysis_server/test/analysis_notification_overrides_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_overrides_test.dart
@@ -2,16 +2,16 @@
 // for details. 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.analysis.notification.overrides;
+library test.analysis.notification.overrides;
 
 import 'dart:async';
 
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'reflective_tests.dart';
 import 'package:unittest/unittest.dart';
 
-import 'analysis_abstract.dart';
+import '../analysis_abstract.dart';
+import '../reflective_tests.dart';
 
 
 main() {
diff --git a/pkg/analysis_server/test/analysis/reanalyze_test.dart b/pkg/analysis_server/test/analysis/reanalyze_test.dart
index 181b49f..70b3258 100644
--- a/pkg/analysis_server/test/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/analysis/reanalyze_test.dart
@@ -34,4 +34,4 @@
     AnalysisContext newContext = contexts[0];
     expect(newContext, isNot(same(oldContext)));
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/analysis_server/test/analysis/test_all.dart b/pkg/analysis_server/test/analysis/test_all.dart
index 5029a51..83d013d 100644
--- a/pkg/analysis_server/test/analysis/test_all.dart
+++ b/pkg/analysis_server/test/analysis/test_all.dart
@@ -6,7 +6,13 @@
 import 'package:unittest/unittest.dart';
 
 import 'get_errors_test.dart' as get_errors_test;
+import 'get_hover_test.dart' as get_hover_test;
 import 'notification_errors_test.dart' as notification_errors_test;
+import 'notification_highlights_test.dart' as notification_highlights_test;
+import 'notification_navigation_test.dart' as notification_navigation_test;
+import 'notification_occurrences_test.dart' as notification_occurrences_test;
+import 'notification_outline_test.dart' as notification_outline_test;
+import 'notification_overrides_test.dart' as notification_overrides_test;
 
 /**
  * Utility for manually running all tests.
@@ -15,6 +21,12 @@
   groupSep = ' | ';
   group('search', () {
     get_errors_test.main();
+    get_hover_test.main();
     notification_errors_test.main();
+    notification_highlights_test.main();
+    notification_navigation_test.main();
+    notification_occurrences_test.main();
+    notification_outline_test.main();
+    notification_overrides_test.main();
   });
 }
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 518cffd..43703c4 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -84,6 +84,12 @@
     return testFile;
   }
 
+  String modifyTestFile(String content) {
+    addFile(testFile, content);
+    this.testCode = content;
+    return testFile;
+  }
+
   Index createIndex() {
     return null;
   }
diff --git a/pkg/analysis_server/test/computer/element_test.dart b/pkg/analysis_server/test/computer/element_test.dart
index 5539c22..d8765b3 100644
--- a/pkg/analysis_server/test/computer/element_test.dart
+++ b/pkg/analysis_server/test/computer/element_test.dart
@@ -283,6 +283,32 @@
     expect(element.flags, Element.FLAG_STATIC);
   }
 
+  void test_fromElement_SETTER() {
+    Source source = addSource('/test.dart', '''
+class A {
+  set mySetter(String x) {}
+}''');
+    CompilationUnit unit = resolveLibraryUnit(source);
+    engine.FieldElement engineFieldElement =
+        findElementInUnit(unit, 'mySetter', engine.ElementKind.FIELD);
+    engine.PropertyAccessorElement engineElement = engineFieldElement.setter;
+    // create notification Element
+    Element element = new Element.fromEngine(engineElement);
+    expect(element.kind, ElementKind.SETTER);
+    expect(element.name, 'mySetter');
+    {
+      Location location = element.location;
+      expect(location.file, '/test.dart');
+      expect(location.offset, 16);
+      expect(location.length, 'mySetter'.length);
+      expect(location.startLine, 2);
+      expect(location.startColumn, 7);
+    }
+    expect(element.parameters, '(String x)');
+    expect(element.returnType, isNull);
+    expect(element.flags, 0);
+  }
+
   void test_fromElement_dynamic() {
     var engineElement = engine.DynamicElementImpl.instance;
     // create notification Element
diff --git a/pkg/analysis_server/test/computer/error_test.dart b/pkg/analysis_server/test/computer/error_test.dart
index 8bdc6b6..e83f9b2 100644
--- a/pkg/analysis_server/test/computer/error_test.dart
+++ b/pkg/analysis_server/test/computer/error_test.dart
@@ -4,16 +4,16 @@
 
 library test.computer.error;
 
-import 'package:analysis_server/src/computer/error.dart';
-import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/constants.dart';
-import '../mocks.dart';
-import '../reflective_tests.dart';
+import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/src/generated/error.dart' as engine;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:typed_mock/typed_mock.dart';
 import 'package:unittest/unittest.dart';
 
+import '../mocks.dart';
+import '../reflective_tests.dart';
+
 
 
 main() {
@@ -103,20 +103,4 @@
       MESSAGE: 'my message'
     });
   }
-
-  void test_engineErrorsToJson() {
-    var json = engineErrorsToJson(lineInfo, [engineError]);
-    expect(json, unorderedEquals([{
-        'severity': 'ERROR',
-        'type': 'COMPILE_TIME_ERROR',
-        'location': {
-          'file': 'foo.dart',
-          'offset': 10,
-          'length': 20,
-          'startLine': 3,
-          'startColumn': 2
-        },
-        'message': 'my message'
-      }]));
-  }
 }
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 73b2607..9086618 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -106,12 +106,12 @@
     manager.setRoots(<String>[projPath], <String>[]);
     return pumpEventQueue().then((_) {
       expect(manager.currentContextPaths.toSet(),
-          [projPath, subdir1Path, subdir2Path].toSet());
+          [subdir1Path, subdir2Path, projPath].toSet());
       manager.now++;
       manager.refresh();
       return pumpEventQueue().then((_) {
         expect(manager.currentContextPaths.toSet(),
-          [projPath, subdir1Path, subdir2Path].toSet());
+          [subdir1Path, subdir2Path, projPath].toSet());
         expect(manager.currentContextTimestamps[projPath], manager.now);
         expect(manager.currentContextTimestamps[subdir1Path], manager.now);
         expect(manager.currentContextTimestamps[subdir2Path], manager.now);
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index f481215..7ef999e 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -176,9 +176,9 @@
       expect(replacementOffset, equals(completionOffset));
       expect(replacementLength, equals(0));
       assertHasResult(CompletionSuggestionKind.CLASS, 'A');
-      assertHasResult(CompletionSuggestionKind.FIELD, 'a');
+      assertHasResult(CompletionSuggestionKind.GETTER, 'a');
       assertHasResult(CompletionSuggestionKind.LOCAL_VARIABLE, 'b');
-      assertHasResult(CompletionSuggestionKind.METHOD_NAME, 'x');
+      assertHasResult(CompletionSuggestionKind.METHOD, 'x');
     });
   }
 
diff --git a/pkg/analysis_server/test/domain_execution_test.dart b/pkg/analysis_server/test/domain_execution_test.dart
index 3e45bfa..c074fa1 100644
--- a/pkg/analysis_server/test/domain_execution_test.dart
+++ b/pkg/analysis_server/test/domain_execution_test.dart
@@ -17,6 +17,7 @@
 import 'package:typed_mock/typed_mock.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'dart:async';
 
 main() {
   group('ExecutionDomainHandler', () {
@@ -131,35 +132,33 @@
 
     group('setSubscriptions', () {
       test('failure - invalid service name', () {
-        expect(handler.launchDataListener, isNull);
+        expect(handler.onFileAnalyzed, isNull);
 
         Request request = new Request('0', EXECUTION_SET_SUBSCRIPTIONS, {
           SUBSCRIPTIONS: ['noSuchService']
         });
         Response response = handler.handleRequest(request);
         expect(response, isResponseFailure('0'));
-        expect(handler.launchDataListener, isNull);
+        expect(handler.onFileAnalyzed, isNull);
       });
 
       test('success - setting and clearing', () {
-        expect(handler.launchDataListener, isNull);
+        expect(handler.onFileAnalyzed, isNull);
 
         Request request = new ExecutionSetSubscriptionsParams(
             [ExecutionService.LAUNCH_DATA]).toRequest('0');
         Response response = handler.handleRequest(request);
         expect(response, isResponseSuccess('0'));
-        expect(handler.launchDataListener, isNotNull);
+        expect(handler.onFileAnalyzed, isNotNull);
 
         request = new ExecutionSetSubscriptionsParams([]).toRequest('0');
         response = handler.handleRequest(request);
         expect(response, isResponseSuccess('0'));
-        expect(handler.launchDataListener, isNull);
+        expect(handler.onFileAnalyzed, isNull);
       });
     });
-  });
 
-  group('LaunchDataNotificationListener', () {
-    test('success - setting and clearing', () {
+    test('onAnalysisComplete - success - setting and clearing', () {
       Source source1 = new TestSource('/a.dart');
       Source source2 = new TestSource('/b.dart');
       Source source3 = new TestSource('/c.dart');
@@ -167,8 +166,6 @@
       Source source5 = new TestSource('/e.html');
       Source source6 = new TestSource('/f.html');
       Source source7 = new TestSource('/g.html');
-      Source source8 = new TestSource('/h.dart');
-      Source source9 = new TestSource('/i.dart');
 
       AnalysisContext context = new AnalysisContextMock();
       when(context.launchableClientLibrarySources)
@@ -176,54 +173,52 @@
       when(context.launchableServerLibrarySources)
           .thenReturn([source2, source3]);
       when(context.librarySources).thenReturn([source4]);
-      when(context.getHtmlFilesReferencing(anyObject))
-          .thenReturn([source5, source6]);
-      when(context.htmlSources).thenReturn([source7]);
+      when(context.htmlSources).thenReturn([source5]);
       when(context.getLibrariesReferencedFromHtml(anyObject))
-          .thenReturn([source8, source9]);
+          .thenReturn([source6, source7]);
 
       AnalysisServer server = new AnalysisServerMock();
       when(server.getAnalysisContexts()).thenReturn([context]);
-      bool notificationSent = false;
+      when(server.isAnalysisComplete()).thenReturn(false);
+
+      StreamController controller = new StreamController.broadcast(sync: true);
+      when(server.onFileAnalyzed).thenReturn(controller.stream);
+
+      List<String> unsentNotifications = <String>[
+          source1.fullName, source2.fullName, source3.fullName,
+          source4.fullName, source5.fullName];
       when(server.sendNotification(anyObject))
           .thenInvoke((Notification notification) {
         ExecutionLaunchDataParams params =
             new ExecutionLaunchDataParams.fromNotification(notification);
 
-        List<ExecutableFile> executables = params.executables;
-        expect(executables.length, equals(3));
-        expect(
-            executables[0],
-            isExecutableFile(source1, ExecutableKind.CLIENT));
-        expect(
-            executables[1],
-            isExecutableFile(source2, ExecutableKind.EITHER));
-        expect(
-            executables[2],
-            isExecutableFile(source3, ExecutableKind.SERVER));
+        String fileName = params.file;
+        expect(unsentNotifications.remove(fileName), isTrue);
 
-        Map<String, List<String>> dartToHtml = params.dartToHtml;
-        expect(dartToHtml.length, equals(1));
-        List<String> htmlFiles = dartToHtml[source4.fullName];
-        expect(htmlFiles, isNotNull);
-        expect(htmlFiles.length, equals(2));
-        expect(htmlFiles[0], equals(source5.fullName));
-        expect(htmlFiles[1], equals(source6.fullName));
-
-        Map<String, List<String>> htmlToDart = params.htmlToDart;
-        expect(htmlToDart.length, equals(1));
-        List<String> dartFiles = htmlToDart[source7.fullName];
-        expect(dartFiles, isNotNull);
-        expect(dartFiles.length, equals(2));
-        expect(dartFiles[0], equals(source8.fullName));
-        expect(dartFiles[1], equals(source9.fullName));
-
-        notificationSent = true;
+        if (fileName == source1.fullName) {
+          expect(params.kind, ExecutableKind.CLIENT);
+        } else if (fileName == source2.fullName) {
+          expect(params.kind, ExecutableKind.EITHER);
+        } else if (fileName == source3.fullName) {
+          expect(params.kind, ExecutableKind.SERVER);
+        } else if (fileName == source4.fullName) {
+          expect(params.kind, ExecutableKind.NOT_EXECUTABLE);
+        } else if (fileName == source5.fullName) {
+          var referencedFiles = params.referencedFiles;
+          expect(referencedFiles, isNotNull);
+          expect(referencedFiles.length, equals(2));
+          expect(referencedFiles[0], equals(source6.fullName));
+          expect(referencedFiles[1], equals(source7.fullName));
+        }
       });
-      LaunchDataNotificationListener listener =
-          new LaunchDataNotificationListener(server);
-      listener.analysisComplete();
-      expect(notificationSent, isTrue);
+
+      ExecutionDomainHandler handler = new ExecutionDomainHandler(server);
+      Request request = new ExecutionSetSubscriptionsParams(
+          [ExecutionService.LAUNCH_DATA]).toRequest('0');
+      Response response = handler.handleRequest(request);
+
+//      controller.add(null);
+      expect(unsentNotifications, isEmpty);
     });
   });
 }
diff --git a/pkg/analysis_server/test/edit/assists_test.dart b/pkg/analysis_server/test/edit/assists_test.dart
index 54f3acd..099b13f 100644
--- a/pkg/analysis_server/test/edit/assists_test.dart
+++ b/pkg/analysis_server/test/edit/assists_test.dart
@@ -34,17 +34,7 @@
         length).toRequest('0');
     Response response = handleSuccessfulRequest(request);
     var result = new EditGetAssistsResult.fromResponse(response);
-    List<SourceChange> sourceChangeList = result.assists;
-    // TODO(scheglov) consider using generated classes and decoders
-    changes = sourceChangeList.map((SourceChange sourceChange) {
-      SourceChange change = new SourceChange(sourceChange.message);
-      sourceChange.edits.forEach((SourceFileEdit sourceFileEdit) {
-        SourceFileEdit fileEdit = new SourceFileEdit(sourceFileEdit.file);
-        change.edits.add(fileEdit);
-        fileEdit.edits.addAll(sourceFileEdit.edits);
-      });
-      return change;
-    }).toList();
+    changes = result.assists;
   }
 
   @override
diff --git a/pkg/analysis_server/test/edit/fixes_test.dart b/pkg/analysis_server/test/edit/fixes_test.dart
index 2d2f1c0..be666fe 100644
--- a/pkg/analysis_server/test/edit/fixes_test.dart
+++ b/pkg/analysis_server/test/edit/fixes_test.dart
@@ -8,10 +8,10 @@
 
 import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analysis_server/src/protocol.dart';
-import '../reflective_tests.dart';
 import 'package:unittest/unittest.dart' hide ERROR;
 
 import '../analysis_abstract.dart';
+import '../reflective_tests.dart';
 
 
 main() {
@@ -74,11 +74,11 @@
     });
   }
 
-  void _isSyntacticErrorWithSingleFix(AnalysisErrorFixes fixes) {
-    AnalysisError error = fixes.error;
-    expect(error.severity, AnalysisErrorSeverity.ERROR);
-    expect(error.type, AnalysisErrorType.SYNTACTIC_ERROR);
-    expect(fixes.fixes, hasLength(1));
+  List<AnalysisErrorFixes> _getFixes(int offset) {
+    Request request = new EditGetFixesParams(testFile, offset).toRequest('0');
+    Response response = handleSuccessfulRequest(request);
+    var result = new EditGetFixesResult.fromResponse(response);
+    return result.fixes;
   }
 
   List<AnalysisErrorFixes> _getFixesAt(String search) {
@@ -87,10 +87,10 @@
   }
 
 
-  List<AnalysisErrorFixes> _getFixes(int offset) {
-    Request request = new EditGetFixesParams(testFile, offset).toRequest('0');
-    Response response = handleSuccessfulRequest(request);
-    var result = new EditGetFixesResult.fromResponse(response);
-    return result.fixes;
+  void _isSyntacticErrorWithSingleFix(AnalysisErrorFixes fixes) {
+    AnalysisError error = fixes.error;
+    expect(error.severity, AnalysisErrorSeverity.ERROR);
+    expect(error.type, AnalysisErrorType.SYNTACTIC_ERROR);
+    expect(fixes.fixes, hasLength(1));
   }
 }
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index e28c227..d23dff3 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -18,16 +18,132 @@
 
 main() {
   groupSep = ' | ';
+  runReflectiveTests(ConvertMethodToGetterTest);
   runReflectiveTests(ExtractLocalVariableTest);
   runReflectiveTests(ExtractMethodTest);
+  runReflectiveTests(GetAvailableRefactoringsTest);
   runReflectiveTests(InlineLocalTest);
   runReflectiveTests(InlineMethodTest);
-  runReflectiveTests(GetAvailableRefactoringsTest);
+  runReflectiveTests(MoveFileTest);
   runReflectiveTests(RenameTest);
 }
 
 
 @ReflectiveTestCase()
+class ConvertMethodToGetterTest extends _AbstractGetRefactoring_Test {
+  test_function() {
+    addTestFile('''
+int test() => 42;
+main() {
+  var a = 1 + test();
+  var b = 2 + test();
+}
+''');
+    return assertSuccessfulRefactoring(() {
+      return _sendConvertRequest('test() =>');
+    }, '''
+int get test => 42;
+main() {
+  var a = 1 + test;
+  var b = 2 + test;
+}
+''');
+  }
+
+  test_init_fatalError_hasParameters() {
+    addTestFile('''
+int test(p) => p + 1;
+main() {
+  var v = test(2);
+}
+''');
+    return getRefactoringResult(() {
+      return _sendConvertRequest('test(p)');
+    }).then((result) {
+      assertResultProblemsFatal(
+          result.initialProblems,
+          'Only methods without parameters can be converted to getters.');
+      // ...there is no any change
+      expect(result.change, isNull);
+    });
+  }
+
+  test_init_fatalError_notExecutableElement() {
+    addTestFile('''
+main() {
+  int abc = 1;
+  print(abc);
+}
+''');
+    return getRefactoringResult(() {
+      return _sendConvertRequest('abc');
+    }).then((result) {
+      assertResultProblemsFatal(
+          result.initialProblems,
+          'Unable to create a refactoring');
+      // ...there is no any change
+      expect(result.change, isNull);
+    });
+  }
+
+  test_method() {
+    addTestFile('''
+class A {
+  int test() => 1;
+}
+class B extends A {
+  int test() => 2;
+}
+class C extends B {
+  int test() => 3;
+}
+class D extends A {
+  int test() => 4;
+}
+main(A a, B b, C c, D d) {
+  var va = a.test();
+  var vb = b.test();
+  var vc = c.test();
+  var vd = d.test();
+}
+''');
+    return assertSuccessfulRefactoring(() {
+      return _sendConvertRequest('test() => 2');
+    }, '''
+class A {
+  int get test => 1;
+}
+class B extends A {
+  int get test => 2;
+}
+class C extends B {
+  int get test => 3;
+}
+class D extends A {
+  int get test => 4;
+}
+main(A a, B b, C c, D d) {
+  var va = a.test;
+  var vb = b.test;
+  var vc = c.test;
+  var vd = d.test;
+}
+''');
+  }
+
+  Future<Response> _sendConvertRequest(String search) {
+    Request request = new EditGetRefactoringParams(
+        RefactoringKind.CONVERT_METHOD_TO_GETTER,
+        testFile,
+        findOffset(search),
+        0,
+        false).toRequest('0');
+    return serverChannel.sendRequest(request);
+  }
+}
+
+
+@ReflectiveTestCase()
 class ExtractLocalVariableTest extends _AbstractGetRefactoring_Test {
   Future<Response> sendExtractRequest(int offset, int length, String name,
       bool extractAll) {
@@ -97,7 +213,7 @@
       return sendStringRequest('1 + 2', 'Name', true);
     }).then((result) {
       assertResultProblemsWarning(
-          result,
+          result.optionsProblems,
           'Variable name should start with a lowercase letter.');
       // ...but there is still a change
       assertTestRefactoringResult(result, '''
@@ -561,7 +677,7 @@
       return _sendInlineRequest('main() {}');
     }).then((result) {
       assertResultProblemsFatal(
-          result,
+          result.initialProblems,
           'Local variable declaration or reference must be selected to activate this refactoring.');
       // ...there is no any change
       expect(result.change, isNull);
@@ -612,7 +728,7 @@
       return _sendInlineRequest('// nothing');
     }).then((result) {
       assertResultProblemsFatal(
-          result,
+          result.initialProblems,
           'Method declaration or reference must be selected to activate this refactoring.');
       // ...there is no any change
       expect(result.change, isNull);
@@ -708,6 +824,38 @@
 
 
 @ReflectiveTestCase()
+class MoveFileTest extends _AbstractGetRefactoring_Test {
+  MoveFileOptions options = new MoveFileOptions(null);
+
+  test_OK() {
+    resourceProvider.newFile('/project/bin/lib.dart', '');
+    addTestFile('''
+import 'dart:math';
+import 'lib.dart';
+''');
+    options.newFile = '/project/test.dart';
+    return assertSuccessfulRefactoring(() {
+      return _sendMoveRequest();
+    }, '''
+import 'dart:math';
+import 'bin/lib.dart';
+''');
+  }
+
+  Future<Response> _sendMoveRequest() {
+    Request request = new EditGetRefactoringParams(
+        RefactoringKind.MOVE_FILE,
+        testFile,
+        0,
+        0,
+        false,
+        options: options).toRequest('0');
+    return serverChannel.sendRequest(request);
+  }
+}
+
+
+@ReflectiveTestCase()
 class RenameTest extends _AbstractGetRefactoring_Test {
   Future<Response> sendRenameRequest(String search, String newName,
       [bool validateOnly = false]) {
@@ -837,7 +985,9 @@
     return getRefactoringResult(() {
       return sendRenameRequest('Test {}', '');
     }).then((result) {
-      assertResultProblemsFatal(result, 'Class name must not be empty.');
+      assertResultProblemsFatal(
+          result.optionsProblems,
+          'Class name must not be empty.');
       // ...there is no any change
       expect(result.change, isNull);
     });
@@ -872,7 +1022,7 @@
       return sendRenameRequest('Test {}', 'newName');
     }).then((result) {
       assertResultProblemsWarning(
-          result,
+          result.optionsProblems,
           'Class name should start with an uppercase letter.');
       // ...but there is still a change
       assertTestRefactoringResult(result, '''
@@ -962,7 +1112,9 @@
     return getRefactoringResult(() {
       return sendRenameRequest('// nothing', null);
     }).then((result) {
-      assertResultProblemsFatal(result, 'Unable to create a refactoring');
+      assertResultProblemsFatal(
+          result.initialProblems,
+          'Unable to create a refactoring');
       // ...there is no any change
       expect(result.change, isNull);
     });
@@ -998,9 +1150,46 @@
 }
 ''');
     return getRefactoringResult(() {
-      return sendRenameRequest('test = 0', 'newName');
+      return sendRenameRequest('test = 0', 'newName', false);
     }).then((result) {
-      assertResultProblemsError(result, "Duplicate local variable 'newName'.");
+      List<RefactoringProblem> problems = result.finalProblems;
+      expect(problems, hasLength(1));
+      assertResultProblemsError(
+          problems,
+          "Duplicate local variable 'newName'.");
+    });
+  }
+
+  test_resetOnAnalysis() {
+    addTestFile('''
+main() {
+  int initialName = 0;
+  print(initialName);
+}
+''');
+    // send the first request
+    return getRefactoringResult(() {
+      return sendRenameRequest('initialName =', 'newName', true);
+    }).then((result) {
+      RenameFeedback feedback = result.feedback;
+      expect(feedback.oldName, 'initialName');
+      // update the file
+      modifyTestFile('''
+main() {
+  int otherName = 0;
+  print(otherName);
+}
+''');
+      // send the second request, with the same kind, file and offset
+      return waitForTasksFinished().then((_) {
+        return getRefactoringResult(() {
+          return sendRenameRequest('otherName =', 'newName', true);
+        }).then((result) {
+          RenameFeedback feedback = result.feedback;
+          // the refactoring was reset, so we don't get a stale result
+          expect(feedback.oldName, 'otherName');
+        });
+      });
     });
   }
 }
@@ -1009,13 +1198,11 @@
 @ReflectiveTestCase()
 class _AbstractGetRefactoring_Test extends AbstractAnalysisTest {
   /**
-   * Asserts that [result] has a single ERROR problem.
+   * Asserts that [problems] has a single ERROR problem.
    */
-  void assertResultProblemsError(EditGetRefactoringResult result,
+  void assertResultProblemsError(List<RefactoringProblem> problems,
       [String message]) {
-    List<RefactoringProblem> problems = result.problems;
     RefactoringProblem problem = problems[0];
-    expect(problems, hasLength(1));
     expect(
         problem.severity,
         RefactoringProblemSeverity.ERROR,
@@ -1028,9 +1215,8 @@
   /**
    * Asserts that [result] has a single FATAL problem.
    */
-  void assertResultProblemsFatal(EditGetRefactoringResult result,
+  void assertResultProblemsFatal(List<RefactoringProblem> problems,
       [String message]) {
-    List<RefactoringProblem> problems = result.problems;
     RefactoringProblem problem = problems[0];
     expect(problems, hasLength(1));
     expect(
@@ -1046,15 +1232,16 @@
    * Asserts that [result] has no problems at all.
    */
   void assertResultProblemsOK(EditGetRefactoringResult result) {
-    expect(result.problems, isEmpty);
+    expect(result.initialProblems, isEmpty);
+    expect(result.optionsProblems, isEmpty);
+    expect(result.finalProblems, isEmpty);
   }
 
   /**
    * Asserts that [result] has a single WARNING problem.
    */
-  void assertResultProblemsWarning(EditGetRefactoringResult result,
+  void assertResultProblemsWarning(List<RefactoringProblem> problems,
       [String message]) {
-    List<RefactoringProblem> problems = result.problems;
     RefactoringProblem problem = problems[0];
     expect(problems, hasLength(1));
     expect(
diff --git a/pkg/analysis_server/test/integration/integration_test_methods.dart b/pkg/analysis_server/test/integration/integration_test_methods.dart
index 8e0472a..7d0a90c 100644
--- a/pkg/analysis_server/test/integration/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/integration_test_methods.dart
@@ -1137,10 +1137,23 @@
    *
    * Returns
    *
-   * problems ( List<RefactoringProblem> )
+   * initialProblems ( List<RefactoringProblem> )
    *
-   *   The status of the refactoring. The array will be empty if there are no
-   *   known problems.
+   *   The initial status of the refactoring, i.e. problems related to the
+   *   context in which the refactoring is requested. The array will be empty
+   *   if there are no known problems.
+   *
+   * optionsProblems ( List<RefactoringProblem> )
+   *
+   *   The options validation status, i.e. problems in the given options, such
+   *   as light-weight validation of a new name, flags compatibility, etc. The
+   *   array will be empty if there are no known problems.
+   *
+   * finalProblems ( List<RefactoringProblem> )
+   *
+   *   The final status of the refactoring, i.e. problems identified in the
+   *   result of a full, potentially expensive validation and / or change
+   *   creation. The array will be empty if there are no known problems.
    *
    * feedback ( optional RefactoringFeedback )
    *
@@ -1331,7 +1344,7 @@
   }
 
   /**
-   * Reports information needed to allow applications to be launched.
+   * Reports information needed to allow a single file to be launched.
    *
    * This notification is not subscribed to by default. Clients can subscribe
    * by including the value "LAUNCH_DATA" in the list of services passed in an
@@ -1339,20 +1352,20 @@
    *
    * Parameters
    *
-   * executables ( List<ExecutableFile> )
+   * file ( FilePath )
    *
-   *   A list of the files that are executable. This list replaces any previous
-   *   list provided.
+   *   The file for which launch data is being provided. This will either be a
+   *   Dart library or an HTML file.
    *
-   * dartToHtml ( Map<FilePath, List<FilePath>> )
+   * kind ( optional ExecutableKind )
    *
-   *   A mapping from the paths of Dart files that are referenced by HTML files
-   *   to a list of the HTML files that reference the Dart files.
+   *   The kind of the executable file. This field is omitted if the file is
+   *   not a Dart file.
    *
-   * htmlToDart ( Map<FilePath, List<FilePath>> )
+   * referencedFiles ( optional List<FilePath> )
    *
-   *   A mapping from the paths of HTML files that reference Dart files to a
-   *   list of the Dart files they reference.
+   *   A list of the Dart files that are referenced by the file. This field is
+   *   omitted if the file is not an HTML file.
    */
   Stream onExecutionLaunchData;
 
diff --git a/pkg/analysis_server/test/integration/protocol_matchers.dart b/pkg/analysis_server/test/integration/protocol_matchers.dart
index 8956f99..c7969f4 100644
--- a/pkg/analysis_server/test/integration/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/protocol_matchers.dart
@@ -649,7 +649,9 @@
  * edit.getRefactoring result
  *
  * {
- *   "problems": List<RefactoringProblem>
+ *   "initialProblems": List<RefactoringProblem>
+ *   "optionsProblems": List<RefactoringProblem>
+ *   "finalProblems": List<RefactoringProblem>
  *   "feedback": optional RefactoringFeedback
  *   "change": optional SourceChange
  *   "potentialEdits": optional List<String>
@@ -657,7 +659,9 @@
  */
 final Matcher isEditGetRefactoringResult = new LazyMatcher(() => new MatchesJsonObject(
   "edit.getRefactoring result", {
-    "problems": isListOf(isRefactoringProblem)
+    "initialProblems": isListOf(isRefactoringProblem),
+    "optionsProblems": isListOf(isRefactoringProblem),
+    "finalProblems": isListOf(isRefactoringProblem)
   }, optionalFields: {
     "feedback": isRefactoringFeedback,
     "change": isSourceChange,
@@ -757,16 +761,17 @@
  * execution.launchData params
  *
  * {
- *   "executables": List<ExecutableFile>
- *   "dartToHtml": Map<FilePath, List<FilePath>>
- *   "htmlToDart": Map<FilePath, List<FilePath>>
+ *   "file": FilePath
+ *   "kind": optional ExecutableKind
+ *   "referencedFiles": optional List<FilePath>
  * }
  */
 final Matcher isExecutionLaunchDataParams = new LazyMatcher(() => new MatchesJsonObject(
   "execution.launchData params", {
-    "executables": isListOf(isExecutableFile),
-    "dartToHtml": isMapOf(isFilePath, isListOf(isFilePath)),
-    "htmlToDart": isMapOf(isFilePath, isListOf(isFilePath))
+    "file": isFilePath
+  }, optionalFields: {
+    "kind": isExecutableKind,
+    "referencedFiles": isListOf(isFilePath)
   }));
 
 /**
@@ -964,6 +969,7 @@
  *   "docSummary": optional String
  *   "docComplete": optional String
  *   "declaringType": optional String
+ *   "element": optional Element
  *   "returnType": optional String
  *   "parameterNames": optional List<String>
  *   "parameterTypes": optional List<String>
@@ -986,6 +992,7 @@
     "docSummary": isString,
     "docComplete": isString,
     "declaringType": isString,
+    "element": isElement,
     "returnType": isString,
     "parameterNames": isListOf(isString),
     "parameterTypes": isListOf(isString),
@@ -1086,6 +1093,7 @@
  *   LOCAL_VARIABLE
  *   METHOD
  *   PARAMETER
+ *   PREFIX
  *   SETTER
  *   TOP_LEVEL_VARIABLE
  *   TYPE_PARAMETER
@@ -1108,6 +1116,7 @@
   "LOCAL_VARIABLE",
   "METHOD",
   "PARAMETER",
+  "PREFIX",
   "SETTER",
   "TOP_LEVEL_VARIABLE",
   "TYPE_PARAMETER",
@@ -1136,12 +1145,14 @@
  * enum {
  *   CLIENT
  *   EITHER
+ *   NOT_EXECUTABLE
  *   SERVER
  * }
  */
 final Matcher isExecutableKind = new MatchesEnum("ExecutableKind", [
   "CLIENT",
   "EITHER",
+  "NOT_EXECUTABLE",
   "SERVER"
 ]);
 
@@ -1508,7 +1519,9 @@
  *   EXTRACT_METHOD
  *   INLINE_LOCAL_VARIABLE
  *   INLINE_METHOD
+ *   MOVE_FILE
  *   RENAME
+ *   SORT_MEMBERS
  * }
  */
 final Matcher isRefactoringKind = new MatchesEnum("RefactoringKind", [
@@ -1518,7 +1531,9 @@
   "EXTRACT_METHOD",
   "INLINE_LOCAL_VARIABLE",
   "INLINE_METHOD",
-  "RENAME"
+  "MOVE_FILE",
+  "RENAME",
+  "SORT_MEMBERS"
 ]);
 
 /**
@@ -1767,12 +1782,14 @@
  *
  * {
  *   "file": FilePath
+ *   "fileStamp": long
  *   "edits": List<SourceEdit>
  * }
  */
 final Matcher isSourceFileEdit = new LazyMatcher(() => new MatchesJsonObject(
   "SourceFileEdit", {
     "file": isFilePath,
+    "fileStamp": isInt,
     "edits": isListOf(isSourceEdit)
   }));
 
@@ -1948,6 +1965,23 @@
   }));
 
 /**
+ * moveFile feedback
+ */
+final Matcher isMoveFileFeedback = isNull;
+
+/**
+ * moveFile options
+ *
+ * {
+ *   "newFile": FilePath
+ * }
+ */
+final Matcher isMoveFileOptions = new LazyMatcher(() => new MatchesJsonObject(
+  "moveFile options", {
+    "newFile": isFilePath
+  }));
+
+/**
  * rename feedback
  *
  * {
@@ -1977,3 +2011,13 @@
     "newName": isString
   }));
 
+/**
+ * sortMembers feedback
+ */
+final Matcher isSortMembersFeedback = isNull;
+
+/**
+ * sortMembers options
+ */
+final Matcher isSortMembersOptions = isNull;
+
diff --git a/pkg/analysis_server/test/search/element_references_test.dart b/pkg/analysis_server/test/search/element_references_test.dart
index 3c78b7f..f5c3f15 100644
--- a/pkg/analysis_server/test/search/element_references_test.dart
+++ b/pkg/analysis_server/test/search/element_references_test.dart
@@ -244,145 +244,75 @@
     });
   }
 
-  test_hierarchy_whenExtends_field() {
+  test_hierarchy_field_explicit() {
     addTestFile('''
-class A {
-  int mmm;
-  use_mmm_a() {
-    mmm = 1;
+  class A {
+    int fff; // in A
   }
-}
-class B extends A {
-  int mmm;
-  use_mmm_b() {
-    mmm = 2;
+  class B extends A {
+    int fff; // in B
   }
-}
-class C extends B {
-  int mmm; // of C
-  use_mmm_c() {
-    mmm = 3;
+  class C extends B {
+    int fff; // in C
   }
-}
-class D extends A {
-  int mmm;
-  use_mmm_d() {
-    mmm = 4;
+  main(A a, B b, C c) {
+    a.fff = 10;
+    b.fff = 20;
+    c.fff = 30;
   }
-}
-class E extends C {
-  use_mmm_e() {
-    mmm = 5;
-  }
-}
-class F extends C {
-  int mmm;
-  use_mmm_f() {
-    mmm = 6;
-    mmm(6);
-  }
-}
-main(A a, B b, C c, D d, E e, F f) {
-  a.mmm = 10;
-  b.mmm = 20;
-  c.mmm = 30;
-  d.mmm = 40;
-  e.mmm = 50;
-  f.mmm = 60;
-}
-''');
-    return findElementReferences('mmm; // of C', false).then((_) {
+  ''');
+    return findElementReferences('fff; // in B', false).then((_) {
       expect(searchElement.kind, ElementKind.FIELD);
-      // unqualified
-      {
-        assertHasResult(SearchResultKind.WRITE, 'mmm = 1');
-        assertHasResult(SearchResultKind.WRITE, 'mmm = 2');
-        assertHasResult(SearchResultKind.WRITE, 'mmm = 3');
-        assertNoResult(SearchResultKind.WRITE, 'mmm = 4');
-        assertHasResult(SearchResultKind.WRITE, 'mmm = 5');
-        assertNoResult(SearchResultKind.WRITE, 'mmm = 6');
-      }
-      // qualified
-      {
-        assertHasResult(SearchResultKind.WRITE, 'mmm = 10');
-        assertHasResult(SearchResultKind.WRITE, 'mmm = 20');
-        assertHasResult(SearchResultKind.WRITE, 'mmm = 30');
-        assertNoResult(SearchResultKind.WRITE, 'mmm = 40');
-        assertHasResult(SearchResultKind.WRITE, 'mmm = 50');
-        assertNoResult(SearchResultKind.WRITE, 'mmm = 60');
-      }
+      assertHasResult(SearchResultKind.DECLARATION, 'fff; // in A');
+      assertHasResult(SearchResultKind.DECLARATION, 'fff; // in B');
+      assertHasResult(SearchResultKind.DECLARATION, 'fff; // in C');
+      assertHasResult(SearchResultKind.WRITE, 'fff = 10;');
+      assertHasResult(SearchResultKind.WRITE, 'fff = 20;');
+      assertHasResult(SearchResultKind.WRITE, 'fff = 30;');
     });
   }
 
-  test_hierarchy_whenExtends_method() {
-    // TODO(scheglov) ideally we need to remove D.mmm() declaration
-    // to actually test that we have fixed
-    // https://code.google.com/p/dart/issues/detail?id=19697
+  test_hierarchy_method() {
     addTestFile('''
 class A {
-  mmm(_) {}
-  use_mmm_a() {
-    mmm(1);
-  }
+  mmm() {} // in A
 }
 class B extends A {
-  mmm(_) {}
-  use_mmm_b() {
-    mmm(2);
-  }
+  mmm() {} // in B
 }
 class C extends B {
-  mmm(_) {} // of C
-  use_mmm_c() {
-    mmm(3);
-  }
+  mmm() {} // in C
 }
-class D extends A {
-  mmm(_) {}
-  use_mmm_d() {
-    mmm(4);
-  }
-}
-class E extends C {
-  use_mmm_e() {
-    mmm(5);
-  }
-}
-class F extends C {
-  mmm(_) {}
-  use_mmm_f() {
-    mmm(6);
-  }
-}
-main(A a, B b, C c, D d, E e, F f) {
+main(A a, B b, C c) {
   a.mmm(10);
   b.mmm(20);
   c.mmm(30);
-  d.mmm(40);
-  e.mmm(50);
-  f.mmm(60);
 }
 ''');
-    return findElementReferences('mmm(_) {} // of C', false).then((_) {
+    return findElementReferences('mmm() {} // in B', false).then((_) {
       expect(searchElement.kind, ElementKind.METHOD);
-      // unqualified
-      {
-        assertHasResult(SearchResultKind.INVOCATION, 'mmm(1)');
-        assertHasResult(SearchResultKind.INVOCATION, 'mmm(2)');
-        assertHasResult(SearchResultKind.INVOCATION, 'mmm(3)');
-        assertNoResult(SearchResultKind.INVOCATION, 'mmm(4)');
-        assertHasResult(SearchResultKind.INVOCATION, 'mmm(5)');
-        assertNoResult(SearchResultKind.INVOCATION, 'mmm(6)');
-      }
-      // qualified
-      {
-        assertHasResult(SearchResultKind.INVOCATION, 'mmm(10)');
-        assertHasResult(SearchResultKind.INVOCATION, 'mmm(20)');
-        assertHasResult(SearchResultKind.INVOCATION, 'mmm(30)');
-        assertNoResult(SearchResultKind.INVOCATION, 'mmm(40)');
-        assertHasResult(SearchResultKind.INVOCATION, 'mmm(50)');
-        assertNoResult(SearchResultKind.INVOCATION, 'mmm(60)');
-      }
+      assertHasResult(SearchResultKind.INVOCATION, 'mmm(10)');
+      assertHasResult(SearchResultKind.INVOCATION, 'mmm(20)');
+      assertHasResult(SearchResultKind.INVOCATION, 'mmm(30)');
+    });
+  }
+
+  test_prefix() {
+    addTestFile('''
+import 'dart:async' as ppp;
+main() {
+  ppp.Future a;
+  ppp.Stream b;
+}
+''');
+    return findElementReferences("ppp;", false).then((_) {
+      expect(searchElement.kind, ElementKind.PREFIX);
+      expect(searchElement.name, 'ppp');
+      expect(searchElement.location.startLine, 1);
+      expect(results, hasLength(3));
+      assertHasResult(SearchResultKind.DECLARATION, 'ppp;');
+      assertHasResult(SearchResultKind.REFERENCE, 'ppp.Future');
+      assertHasResult(SearchResultKind.REFERENCE, 'ppp.Stream');
     });
   }
 
diff --git a/pkg/analysis_server/test/services/completion/completion_test_util.dart b/pkg/analysis_server/test/services/completion/completion_test_util.dart
index f40ede7..9ea63a8 100644
--- a/pkg/analysis_server/test/services/completion/completion_test_util.dart
+++ b/pkg/analysis_server/test/services/completion/completion_test_util.dart
@@ -6,7 +6,8 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/protocol.dart' as protocol show Element, ElementKind;
+import 'package:analysis_server/src/protocol.dart' hide Element;
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_server/src/services/index/local_memory_index.dart';
@@ -84,83 +85,139 @@
     return cs;
   }
 
-  void assertSuggestClass(String className, [CompletionRelevance relevance =
+  CompletionSuggestion assertSuggestClass(String name,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.CLASS, name, relevance);
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(protocol.ElementKind.CLASS));
+    expect(element.name, equals(name));
+    expect(element.returnType, isNull);
+    return cs;
+  }
+
+  CompletionSuggestion assertSuggestFunction(String name, String returnType,
+      bool isDeprecated, [CompletionRelevance relevance =
       CompletionRelevance.DEFAULT]) {
-    assertSuggest(CompletionSuggestionKind.CLASS, className, relevance);
-  }
-
-  void assertSuggestField(String completion, String declaringType, String type,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
-    CompletionSuggestion cs =
-        assertSuggest(CompletionSuggestionKind.FIELD, completion, relevance);
-    expect(cs.declaringType, equals(declaringType));
-    expect(cs.returnType, equals(type));
-  }
-
-  void assertSuggestFunction(String completion, String returnType,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
-    CompletionSuggestion cs =
-        assertSuggest(CompletionSuggestionKind.FUNCTION, completion, relevance);
-    expect(cs.returnType, equals(returnType));
-  }
-
-  void assertSuggestGetter(String className, String returnType,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
-    CompletionSuggestion cs =
-        assertSuggest(CompletionSuggestionKind.GETTER, className, relevance);
-    expect(cs.returnType, equals(returnType));
-  }
-
-  void assertSuggestLibraryPrefix(String completion,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
-    assertSuggest(
-        CompletionSuggestionKind.LIBRARY_PREFIX,
-        completion,
-        relevance);
-  }
-
-  void assertSuggestLocalVariable(String completion, String returnType,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
-    CompletionSuggestion cs =
-        assertSuggest(CompletionSuggestionKind.LOCAL_VARIABLE, completion, relevance);
-    expect(cs.returnType, equals(returnType));
-  }
-
-  void assertSuggestMethod(String className, String declaringType,
-      String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
-    CompletionSuggestion cs =
-        assertSuggest(CompletionSuggestionKind.METHOD, className, relevance);
-    expect(cs.declaringType, equals(declaringType));
-    expect(cs.returnType, equals(returnType));
-  }
-
-  void assertSuggestMethodName(String completion, String declaringType,
-      String returnType, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
-    CompletionSuggestion cs =
-        assertSuggest(CompletionSuggestionKind.METHOD_NAME, completion, relevance);
-    expect(cs.declaringType, equals(declaringType));
-    expect(cs.returnType, equals(returnType));
-  }
-
-  void assertSuggestParameter(String completion, String returnType,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
-    assertSuggest(CompletionSuggestionKind.PARAMETER, completion, relevance);
-  }
-
-  void assertSuggestSetter(String className, [CompletionRelevance relevance =
-      CompletionRelevance.DEFAULT]) {
-    assertSuggest(CompletionSuggestionKind.SETTER, className, relevance);
-  }
-
-  void assertSuggestTopLevelVar(String completion, String returnType,
-      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
     CompletionSuggestion cs = assertSuggest(
-        CompletionSuggestionKind.TOP_LEVEL_VARIABLE,
-        completion,
-        relevance);
+        CompletionSuggestionKind.FUNCTION,
+        name,
+        relevance,
+        isDeprecated);
     expect(cs.returnType, equals(returnType));
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(protocol.ElementKind.FUNCTION));
+    expect(element.name, equals(name));
+    expect(element.isDeprecated, equals(isDeprecated));
+    expect(
+        element.returnType,
+        equals(returnType != null ? returnType : 'dynamic'));
+    return cs;
+  }
+
+  CompletionSuggestion assertSuggestGetter(String name, String returnType,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.GETTER, name, relevance);
+    expect(cs.returnType, equals(returnType));
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(protocol.ElementKind.GETTER));
+    expect(element.name, equals(name));
+    expect(
+        element.returnType,
+        equals(returnType != null ? returnType : 'dynamic'));
+    return cs;
+  }
+
+  CompletionSuggestion assertSuggestLibraryPrefix(String prefix,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.LIBRARY_PREFIX, prefix, relevance);
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(protocol.ElementKind.LIBRARY));
+    expect(element.name, equals(prefix));
+    expect(element.returnType, isNull);
+    return cs;
+  }
+
+  CompletionSuggestion assertSuggestLocalVariable(String name,
+      String returnType, [CompletionRelevance relevance =
+      CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.LOCAL_VARIABLE, name, relevance);
+    expect(cs.returnType, equals(returnType));
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(protocol.ElementKind.LOCAL_VARIABLE));
+    expect(element.name, equals(name));
+    expect(
+        element.returnType,
+        equals(returnType != null ? returnType : 'dynamic'));
+    return cs;
+  }
+
+  CompletionSuggestion assertSuggestMethod(String name, String declaringType,
+      String returnType, [CompletionRelevance relevance =
+      CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.METHOD, name, relevance);
+    expect(cs.declaringType, equals(declaringType));
+    expect(cs.returnType, equals(returnType));
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(protocol.ElementKind.METHOD));
+    expect(element.name, equals(name));
+    expect(
+        element.returnType,
+        equals(returnType != null ? returnType : 'dynamic'));
+    return cs;
+  }
+
+  CompletionSuggestion assertSuggestParameter(String name, String returnType,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.PARAMETER, name, relevance);
+    expect(cs.returnType, equals(returnType));
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(protocol.ElementKind.PARAMETER));
+    expect(element.name, equals(name));
+    expect(
+        element.returnType,
+        equals(returnType != null ? returnType : 'dynamic'));
+    return cs;
+  }
+
+  CompletionSuggestion assertSuggestSetter(String name,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.SETTER, name, relevance);
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(protocol.ElementKind.SETTER));
+    expect(element.name, equals(name));
+    expect(element.returnType, isNull);
+    return cs;
+  }
+
+  CompletionSuggestion assertSuggestTopLevelVar(String name, String returnType,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.TOP_LEVEL_VARIABLE, name, relevance);
+    expect(cs.returnType, equals(returnType));
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(protocol.ElementKind.TOP_LEVEL_VARIABLE));
+    expect(element.name, equals(name));
+    //TODO (danrubel) return type level variable 'type' but not as 'returnType'
+//    expect(
+//        element.returnType,
+//        equals(returnType != null ? returnType : 'dynamic'));
+    return cs;
   }
 
   bool computeFast() {
diff --git a/pkg/analysis_server/test/services/completion/imported_computer_test.dart b/pkg/analysis_server/test/services/completion/imported_computer_test.dart
index 2943da5..a1216a9 100644
--- a/pkg/analysis_server/test/services/completion/imported_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/imported_computer_test.dart
@@ -38,6 +38,19 @@
     });
   }
 
+  test_function() {
+    addSource('/testA.dart', '@deprecated A() {int x;} _B() {}');
+    addTestSource('import "/testA.dart"; class C {foo(){^}}');
+    return computeFull().then((_) {
+      assertSuggestFunction('A', null, true);
+      assertNotSuggested('x');
+      assertNotSuggested('_B');
+      // Should not suggest compilation unit elements
+      // which are returned by the LocalComputer
+      assertNotSuggested('C');
+    });
+  }
+
   test_class_importHide() {
     addSource('/testA.dart', 'class A { } class B { }');
     addTestSource('import "/testA.dart" hide ^; class C {}');
diff --git a/pkg/analysis_server/test/services/completion/invocation_computer_test.dart b/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
index 9c11f1a..6afda09 100644
--- a/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/invocation_computer_test.dart
@@ -28,8 +28,8 @@
   test_field() {
     addTestSource('class A {var b; X _c;} class X{} main() {A a; a.^}');
     return computeFull().then((_) {
-      assertSuggestField('b', 'A', null);
-      assertSuggestField('_c', 'A', 'X');
+      assertSuggestGetter('b', null);
+      assertSuggestGetter('_c', 'X');
     });
   }
 
@@ -37,7 +37,7 @@
     addSource('/testB.dart', 'lib B; class X {M y; var _z;} class M{}');
     addTestSource('import "/testB.dart"; main() {X x; x.^}');
     return computeFull().then((_) {
-      assertSuggestField('y', 'X', 'M');
+      assertSuggestGetter('y', 'M');
       assertNotSuggested('_z');
     });
   }
@@ -46,8 +46,8 @@
     addTestSource(
         'class A {X b; var _c;} class X{} class B extends A {} main() {B b; b.^}');
     return computeFull().then((_) {
-      assertSuggestField('b', 'A', 'X');
-      assertSuggestField('_c', 'A', null);
+      assertSuggestGetter('b', 'X');
+      assertSuggestGetter('_c', null);
     });
   }
 
diff --git a/pkg/analysis_server/test/services/completion/local_computer_test.dart b/pkg/analysis_server/test/services/completion/local_computer_test.dart
index 2134be7..6e20e79 100644
--- a/pkg/analysis_server/test/services/completion/local_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/local_computer_test.dart
@@ -42,14 +42,18 @@
     addTestSource('class A {a() {try{} catch (e, s) {^}}}');
     expect(computeFast(), isTrue);
     assertSuggestParameter('e', null);
-    assertSuggestParameter('s', null);
+    assertSuggestParameter('s', 'StackTrace');
   }
 
   test_compilationUnit_declarations() {
-    addTestSource('class A {^} class B {} A T;');
+    addTestSource('@deprecated class A {^} class _B {} A T;');
     expect(computeFast(), isTrue);
-    assertSuggestClass('A');
-    assertSuggestClass('B');
+    var a = assertSuggestClass('A');
+    expect(a.element.isDeprecated, isTrue);
+    expect(a.element.isPrivate, isFalse);
+    var b = assertSuggestClass('_B');
+    expect(b.element.isDeprecated, isFalse);
+    expect(b.element.isPrivate, isTrue);
     assertSuggestTopLevelVar('T', 'A');
   }
 
@@ -83,14 +87,35 @@
     assertSuggestLocalVariable('foo', null);
   }
 
+  test_forEach2() {
+    addTestSource('main(args) {for (int foo in bar) {^}}');
+    expect(computeFast(), isTrue);
+    assertSuggestLocalVariable('foo', 'int');
+  }
+
   test_function() {
     addTestSource('String foo(List args) {x.then((R b) {^});}');
     expect(computeFast(), isTrue);
-    assertSuggestFunction('foo', 'String');
+    var f = assertSuggestFunction('foo', 'String', false);
+    expect(f.element.isPrivate, isFalse);
     assertSuggestParameter('args', 'List');
     assertSuggestParameter('b', 'R');
   }
 
+  test_getters() {
+    addTestSource('class A {@deprecated X get f => 0; Z a() {^} get _g => 1;}');
+    expect(computeFast(), isTrue);
+    var a = assertSuggestMethod('a', 'A', 'Z');
+    expect(a.element.isDeprecated, isFalse);
+    expect(a.element.isPrivate, isFalse);
+    var f = assertSuggestGetter('f', 'X');
+    expect(f.element.isDeprecated, isTrue);
+    expect(f.element.isPrivate, isFalse);
+    var g = assertSuggestGetter('_g', null);
+    expect(g.element.isDeprecated, isFalse);
+    expect(g.element.isPrivate, isTrue);
+  }
+
   test_local_name() {
     addTestSource('class A {a() {var f; A ^}}');
     expect(computeFast(), isTrue);
@@ -100,7 +125,7 @@
   }
 
   test_local_name2() {
-    addTestSource('class A {a() {var f; var ^}}');
+    addTestSource('class _A {a() {var f; var ^}}');
     expect(computeFast(), isTrue);
     assertNotSuggested('A');
     assertNotSuggested('a');
@@ -108,25 +133,33 @@
   }
 
   test_members() {
-    addTestSource('class A {X f; Z a() {^} var g;}');
+    addTestSource('class A {@deprecated X f; Z _a() {^} var _g;}');
     expect(computeFast(), isTrue);
-    assertSuggestMethodName('a', 'A', 'Z');
-    assertSuggestField('f', 'A', 'X');
-    assertSuggestField('g', 'A', null);
+    var a = assertSuggestMethod('_a', 'A', 'Z');
+    expect(a.element.isDeprecated, isFalse);
+    expect(a.element.isPrivate, isTrue);
+    var f = assertSuggestGetter('f', 'X');
+    expect(f.element.isDeprecated, isTrue);
+    expect(f.element.isPrivate, isFalse);
+    var g = assertSuggestGetter('_g', null);
+    expect(g.element.isDeprecated, isFalse);
+    expect(g.element.isPrivate, isTrue);
   }
 
   test_methodParam_named() {
-    addTestSource('class A {Z a(X x, {y: boo}) {^}}');
+    addTestSource('class A {@deprecated Z a(X x, {y: boo}) {^}}');
     expect(computeFast(), isTrue);
-    assertSuggestMethodName('a', 'A', 'Z');
+    var a = assertSuggestMethod('a', 'A', 'Z');
+    expect(a.element.isDeprecated, isTrue);
+    expect(a.element.isPrivate, isFalse);
     assertSuggestParameter('x', 'X');
-    assertSuggestParameter('y', 'boo');
+    assertSuggestParameter('y', null);
   }
 
   test_methodParam_positional() {
     addTestSource('class A {Z a(X x, [int y=1]) {^}}');
     expect(computeFast(), isTrue);
-    assertSuggestMethodName('a', 'A', 'Z');
+    assertSuggestMethod('a', 'A', 'Z');
     assertSuggestParameter('x', 'X');
     assertSuggestParameter('y', 'int');
   }
diff --git a/pkg/analysis_server/test/services/correction/change_test.dart b/pkg/analysis_server/test/services/correction/change_test.dart
index bf5d2b8..a1461b0 100644
--- a/pkg/analysis_server/test/services/correction/change_test.dart
+++ b/pkg/analysis_server/test/services/correction/change_test.dart
@@ -29,9 +29,9 @@
     SourceEdit edit1 = new SourceEdit(1, 2, 'a');
     SourceEdit edit2 = new SourceEdit(1, 2, 'b');
     expect(change.edits, hasLength(0));
-    change.addEdit('/a.dart', edit1);
+    change.addEdit('/a.dart', 0, edit1);
     expect(change.edits, hasLength(1));
-    change.addEdit('/a.dart', edit2);
+    change.addEdit('/a.dart', 0, edit2);
     expect(change.edits, hasLength(1));
     {
       SourceFileEdit fileEdit = change.getFileEdit('/a.dart');
@@ -42,7 +42,7 @@
 
   void test_getFileEdit() {
     SourceChange change = new SourceChange('msg');
-    SourceFileEdit fileEdit = new SourceFileEdit('/a.dart');
+    SourceFileEdit fileEdit = new SourceFileEdit('/a.dart', 0);
     change.addFileEdit(fileEdit);
     expect(change.getFileEdit('/a.dart'), fileEdit);
   }
@@ -54,10 +54,10 @@
 
   void test_toJson() {
     SourceChange change = new SourceChange('msg');
-    change.addFileEdit(new SourceFileEdit('/a.dart')
+    change.addFileEdit(new SourceFileEdit('/a.dart', 1)
         ..add(new SourceEdit(1, 2, 'aaa'))
         ..add(new SourceEdit(10, 20, 'bbb')));
-    change.addFileEdit(new SourceFileEdit('/b.dart')
+    change.addFileEdit(new SourceFileEdit('/b.dart', 2)
         ..add(new SourceEdit(21, 22, 'xxx'))
         ..add(new SourceEdit(210, 220, 'yyy')));
     {
@@ -78,6 +78,7 @@
       'message': 'msg',
       'edits': [{
           'file': '/a.dart',
+          'fileStamp': 1,
           'edits': [{
               'offset': 10,
               'length': 20,
@@ -89,6 +90,7 @@
             }]
         }, {
           'file': '/b.dart',
+          'fileStamp': 2,
           'edits': [{
               'offset': 210,
               'length': 220,
@@ -194,7 +196,7 @@
     SourceEdit edit1b = new SourceEdit(1, 0, 'a2');
     SourceEdit edit10 = new SourceEdit(10, 1, 'b');
     SourceEdit edit100 = new SourceEdit(100, 2, 'c');
-    SourceFileEdit fileEdit = new SourceFileEdit('/test.dart');
+    SourceFileEdit fileEdit = new SourceFileEdit('/test.dart', 0);
     fileEdit.addAll([edit100, edit1a, edit10, edit1b]);
     expect(fileEdit.edits, [edit100, edit10, edit1b, edit1a]);
   }
@@ -204,7 +206,7 @@
     SourceEdit edit1b = new SourceEdit(1, 0, 'a2');
     SourceEdit edit10 = new SourceEdit(10, 1, 'b');
     SourceEdit edit100 = new SourceEdit(100, 2, 'c');
-    SourceFileEdit fileEdit = new SourceFileEdit('/test.dart');
+    SourceFileEdit fileEdit = new SourceFileEdit('/test.dart', 0);
     fileEdit.add(edit100);
     fileEdit.add(edit1a);
     fileEdit.add(edit1b);
@@ -213,22 +215,23 @@
   }
 
   void test_new() {
-    SourceFileEdit fileEdit = new SourceFileEdit('/test.dart');
+    SourceFileEdit fileEdit = new SourceFileEdit('/test.dart', 100);
     fileEdit.add(new SourceEdit(1, 2, 'aaa'));
     fileEdit.add(new SourceEdit(10, 20, 'bbb'));
     expect(
         fileEdit.toString(),
-        '{"file":"/test.dart","edits":['
+        '{"file":"/test.dart","fileStamp":100,"edits":['
             '{"offset":10,"length":20,"replacement":"bbb"},'
             '{"offset":1,"length":2,"replacement":"aaa"}]}');
   }
 
   void test_toJson() {
-    SourceFileEdit fileEdit = new SourceFileEdit('/test.dart');
+    SourceFileEdit fileEdit = new SourceFileEdit('/test.dart', 100);
     fileEdit.add(new SourceEdit(1, 2, 'aaa'));
     fileEdit.add(new SourceEdit(10, 20, 'bbb'));
     var expectedJson = {
       FILE: '/test.dart',
+      FILE_STAMP: 100,
       EDITS: [{
           OFFSET: 10,
           LENGTH: 20,
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 32d0509..c434434 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -395,6 +395,23 @@
 ''');
   }
 
+  void test_createFile_forImport() {
+    testFile = '/my/project/bin/test.dart';
+    _indexTestUnit('''
+import 'my_file.dart';
+''');
+    AnalysisError error = _findErrorToFix();
+    fix = _assertHasFix(FixKind.CREATE_FILE, error);
+    change = fix.change;
+    // validate change
+    List<SourceFileEdit> fileEdits = change.edits;
+    expect(fileEdits, hasLength(1));
+    SourceFileEdit fileEdit = change.edits[0];
+    expect(fileEdit.file, '/my/project/bin/my_file.dart');
+    expect(fileEdit.fileStamp, -1);
+    expect(fileEdit.edits[0].replacement, contains('library my.file;'));
+  }
+
   void test_createMissingOverrides_functionType() {
     _indexTestUnit('''
 abstract class A {
diff --git a/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart b/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
index 1804b1d..f0b2694 100644
--- a/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
+++ b/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
@@ -42,7 +42,7 @@
  */
 bool _equalsLocationProperties(Location actual, Element expectedElement,
     int expectedOffset, int expectedLength, bool isQualified, bool isResolved) {
-  return expectedElement == actual.element &&
+  return (expectedElement == null || expectedElement == actual.element) &&
       expectedOffset == actual.offset &&
       expectedLength == actual.length &&
       isQualified == actual.isQualified &&
@@ -54,7 +54,8 @@
     Element expectedElement, Relationship expectedRelationship,
     ExpectedLocation expectedLocation) {
   return expectedElement == recordedRelation.element &&
-      expectedRelationship == recordedRelation.relationship &&
+      (expectedRelationship == null ||
+          expectedRelationship == recordedRelation.relationship) &&
       (expectedLocation == null ||
           _equalsLocation(recordedRelation.location, expectedLocation));
 }
@@ -1337,6 +1338,30 @@
         _expectedLocation(mainElement, 'p: 1'));
   }
 
+  void test_isReferencedBy_PrefixElement() {
+    _indexTestUnit('''
+import 'dart:async' as ppp;
+main() {
+  ppp.Future a;
+  ppp.Stream b;
+}
+''');
+    // prepare elements
+    PrefixElement element = findNodeElementAtString('ppp;');
+    Element elementA = findElement('a');
+    Element elementB = findElement('b');
+    // verify
+    _assertRecordedRelation(
+        element,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(elementA, 'ppp.Future'));
+    _assertRecordedRelation(
+        element,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(elementB, 'ppp.Stream'));
+    _assertNoRecordedRelation(element, null, _expectedLocation(null, 'ppp;'));
+  }
+
   void test_isReferencedBy_TopLevelVariableElement() {
     addSource('/lib.dart', '''
 library lib;
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
index 7753e34..8f11a33 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
@@ -12,11 +12,13 @@
 import 'package:analysis_server/src/services/index/local_memory_index.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
-import '../../abstract_single_unit.dart';
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
 
+import '../../abstract_single_unit.dart';
+
 
 int findIdentifierLength(String search) {
   int length = 0;
@@ -45,6 +47,31 @@
   Refactoring get refactoring;
 
   /**
+   * Asserts that [refactoringChange] contains a [FileEdit] for the file
+   * with the given [path], and it results the [expectedCode].
+   */
+  void assertFileChangeResult(String path, String expectedCode) {
+    // prepare FileEdit
+    SourceFileEdit fileEdit = refactoringChange.getFileEdit(path);
+    expect(fileEdit, isNotNull, reason: 'No file edit for $path');
+    // validate resulting code
+    File file = provider.getResource(path);
+    Source source = file.createSource();
+    String ini = context.getContents(source).data;
+    String actualCode = SourceEdit.applySequence(ini, fileEdit.edits);
+    expect(actualCode, expectedCode);
+  }
+
+  /**
+   * Asserts that [refactoringChange] does not contain a [FileEdit] for the file
+   * with the given [path].
+   */
+  void assertNoFileChange(String path) {
+    SourceFileEdit fileEdit = refactoringChange.getFileEdit(path);
+    expect(fileEdit, isNull);
+  }
+
+  /**
    * Asserts that [refactoring] initial/final conditions status is OK.
    */
   Future assertRefactoringConditionsOK() {
@@ -99,19 +126,6 @@
   }
 
   /**
-   * Asserts that [refactoringChange] contains a [FileEdit] for [testFile], and
-   * it results the [expectedCode].
-   */
-  void assertTestChangeResult(String expectedCode) {
-    // prepare FileEdit
-    SourceFileEdit fileEdit = refactoringChange.getFileEdit(testFile);
-    expect(fileEdit, isNotNull);
-    // validate resulting code
-    String actualCode = SourceEdit.applySequence(testCode, fileEdit.edits);
-    expect(actualCode, expectedCode);
-  }
-
-  /**
    * Checks that all conditions of [refactoring] are OK and the result of
    * applying the [Change] to [testUnit] is [expectedCode].
    */
@@ -124,6 +138,19 @@
     });
   }
 
+  /**
+   * Asserts that [refactoringChange] contains a [FileEdit] for [testFile], and
+   * it results the [expectedCode].
+   */
+  void assertTestChangeResult(String expectedCode) {
+    // prepare FileEdit
+    SourceFileEdit fileEdit = refactoringChange.getFileEdit(testFile);
+    expect(fileEdit, isNotNull);
+    // validate resulting code
+    String actualCode = SourceEdit.applySequence(testCode, fileEdit.edits);
+    expect(actualCode, expectedCode);
+  }
+
   void indexTestUnit(String code) {
     resolveTestUnit(code);
     index.indexUnit(context, testUnit);
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
index 66454c0..75d922c 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
@@ -7,10 +7,8 @@
 import 'package:analysis_server/src/protocol.dart' hide Element;
 import 'package:analysis_server/src/services/correction/namespace.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
-import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
 
 import 'abstract_refactoring.dart';
@@ -23,31 +21,6 @@
   RenameRefactoring refactoring;
 
   /**
-   * Asserts that [refactoringChange] contains a [FileEdit] for the file
-   * with the given [path], and it results the [expectedCode].
-   */
-  void assertFileChangeResult(String path, String expectedCode) {
-    // prepare FileEdit
-    SourceFileEdit fileEdit = refactoringChange.getFileEdit(path);
-    expect(fileEdit, isNotNull);
-    // validate resulting code
-    File file = provider.getResource(path);
-    Source source = file.createSource();
-    String ini = context.getContents(source).data;
-    String actualCode = SourceEdit.applySequence(ini, fileEdit.edits);
-    expect(actualCode, expectedCode);
-  }
-
-  /**
-   * Asserts that [refactoringChange] does not contain a [FileEdit] for the file
-   * with the given [path].
-   */
-  void assertNoFileChange(String path) {
-    SourceFileEdit fileEdit = refactoringChange.getFileEdit(path);
-    expect(fileEdit, isNull);
-  }
-
-  /**
    * Asserts that [refactoring] has potential edits in [testFile] at offset
    * of the given [searches].
    */
diff --git a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
new file mode 100644
index 0000000..89ad088
--- /dev/null
+++ b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
@@ -0,0 +1,140 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.services.refactoring.convert_getter_to_method;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' hide ElementKind;
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import 'abstract_refactoring.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(ConvertGetterToMethodTest);
+}
+
+
+@ReflectiveTestCase()
+class ConvertGetterToMethodTest extends RefactoringTest {
+  ConvertGetterToMethodRefactoring refactoring;
+
+  test_change_function() {
+    indexTestUnit('''
+int get test => 42;
+main() {
+  var a = test;
+  var b = test;
+}
+''');
+    _createRefactoring('test');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+int test() => 42;
+main() {
+  var a = test();
+  var b = test();
+}
+''');
+  }
+
+  test_change_method() {
+    indexTestUnit('''
+class A {
+  int get test => 1;
+}
+class B extends A {
+  int get test => 2;
+}
+class C extends B {
+  int get test => 3;
+}
+class D extends A {
+  int get test => 4;
+}
+main(A a, B b, C c, D d) {
+  var va = a.test;
+  var vb = b.test;
+  var vc = c.test;
+  var vd = d.test;
+}
+''');
+    _createRefactoringForString('test => 2');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+class A {
+  int test() => 1;
+}
+class B extends A {
+  int test() => 2;
+}
+class C extends B {
+  int test() => 3;
+}
+class D extends A {
+  int test() => 4;
+}
+main(A a, B b, C c, D d) {
+  var va = a.test();
+  var vb = b.test();
+  var vc = c.test();
+  var vd = d.test();
+}
+''');
+  }
+
+  test_checkInitialConditions_syntheticGetter() {
+    indexTestUnit('''
+int test = 42;
+main() {
+}
+''');
+    _createRefactoring('test');
+    // check conditions
+    _assertInitialConditions_fatal(
+        'Only explicit getters can be converted to methods.');
+  }
+
+  Future _assertInitialConditions_fatal(String message) {
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage: message);
+    });
+  }
+
+  /**
+   * Checks that all conditions are OK and the result of applying [refactoring]
+   * change to [testUnit] is [expectedCode].
+   */
+  Future _assertSuccessfulRefactoring(String expectedCode) {
+    return assertRefactoringConditionsOK().then((_) {
+      return refactoring.createChange().then((SourceChange refactoringChange) {
+        this.refactoringChange = refactoringChange;
+        assertTestChangeResult(expectedCode);
+      });
+    });
+  }
+
+  void _createRefactoring(String elementName) {
+    PropertyAccessorElement element =
+        findElement(elementName, ElementKind.GETTER);
+    _createRefactoringForElement(element);
+  }
+
+  void _createRefactoringForElement(ExecutableElement element) {
+    refactoring = new ConvertGetterToMethodRefactoring(searchEngine, element);
+  }
+
+  void _createRefactoringForString(String search) {
+    ExecutableElement element = findNodeElementAtString(search);
+    _createRefactoringForElement(element);
+  }
+}
diff --git a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
new file mode 100644
index 0000000..543dcae1
--- /dev/null
+++ b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
@@ -0,0 +1,180 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.refactoring.convert_method_to_getter;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart' hide ElementKind;
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import 'abstract_refactoring.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(ConvertMethodToGetterTest);
+}
+
+
+@ReflectiveTestCase()
+class ConvertMethodToGetterTest extends RefactoringTest {
+  ConvertMethodToGetterRefactoring refactoring;
+
+  test_change_function() {
+    indexTestUnit('''
+int test() => 42;
+main() {
+  var a = test();
+  var b = test();
+}
+''');
+    _createRefactoring('test');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+int get test => 42;
+main() {
+  var a = test;
+  var b = test;
+}
+''');
+  }
+
+  test_change_method() {
+    indexTestUnit('''
+class A {
+  int test() => 1;
+}
+class B extends A {
+  int test() => 2;
+}
+class C extends B {
+  int test() => 3;
+}
+class D extends A {
+  int test() => 4;
+}
+main(A a, B b, C c, D d) {
+  var va = a.test();
+  var vb = b.test();
+  var vc = c.test();
+  var vd = d.test();
+}
+''');
+    _createRefactoringForString('test() => 2');
+    // apply refactoring
+    return _assertSuccessfulRefactoring('''
+class A {
+  int get test => 1;
+}
+class B extends A {
+  int get test => 2;
+}
+class C extends B {
+  int get test => 3;
+}
+class D extends A {
+  int get test => 4;
+}
+main(A a, B b, C c, D d) {
+  var va = a.test;
+  var vb = b.test;
+  var vc = c.test;
+  var vd = d.test;
+}
+''');
+  }
+
+  test_checkInitialConditions_alreadyGetter() {
+    indexTestUnit('''
+int get test => 42;
+main() {
+  var a = test;
+  var b = test;
+}
+''');
+    ExecutableElement element = findElement('test', ElementKind.GETTER);
+    _createRefactoringForElement(element);
+    // check conditions
+    _assertInitialConditions_fatal(
+        'Only class methods or top-level functions can be converted to getters.');
+  }
+
+  test_checkInitialConditions_hasParameters() {
+    indexTestUnit('''
+int test(x) => x * 2;
+main() {
+  var v = test(1);
+}
+''');
+    _createRefactoring('test');
+    // check conditions
+    _assertInitialConditions_fatal(
+        'Only methods without parameters can be converted to getters.');
+  }
+
+  test_checkInitialConditions_localFunction() {
+    indexTestUnit('''
+main() {
+  test() {}
+  var v = test();
+}
+''');
+    _createRefactoring('test');
+    // check conditions
+    _assertInitialConditions_fatal(
+        'Only top-level functions can be converted to getters.');
+  }
+
+  test_checkInitialConditions_notFunctionOrMethod() {
+    indexTestUnit('''
+class A {
+  A.test();
+}
+''');
+    _createRefactoring('test');
+    // check conditions
+    _assertInitialConditions_fatal(
+        'Only class methods or top-level functions can be converted to getters.');
+  }
+
+  Future _assertInitialConditions_fatal(String message) {
+    return refactoring.checkInitialConditions().then((status) {
+      assertRefactoringStatus(
+          status,
+          RefactoringProblemSeverity.FATAL,
+          expectedMessage: message);
+    });
+  }
+
+  /**
+   * Checks that all conditions are OK and the result of applying the [Change]
+   * to [testUnit] is [expectedCode].
+   */
+  Future _assertSuccessfulRefactoring(String expectedCode) {
+    return assertRefactoringConditionsOK().then((_) {
+      return refactoring.createChange().then((SourceChange refactoringChange) {
+        this.refactoringChange = refactoringChange;
+        assertTestChangeResult(expectedCode);
+      });
+    });
+  }
+
+  void _createRefactoring(String elementName) {
+    ExecutableElement element = findElement(elementName);
+    _createRefactoringForElement(element);
+  }
+
+  void _createRefactoringForElement(ExecutableElement element) {
+    refactoring = new ConvertMethodToGetterRefactoring(searchEngine, element);
+  }
+
+  void _createRefactoringForString(String search) {
+    ExecutableElement element = findNodeElementAtString(search);
+    _createRefactoringForElement(element);
+  }
+}
diff --git a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
index b4adb6c..8001fc0 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -343,7 +343,7 @@
     _createRefactoringForStartEndComments();
     refactoring.name = 'bad-name';
     // check conditions
-    return _assertConditionsError("Method name must not contain '-'.");
+    return _assertConditionsFatal("Method name must not contain '-'.");
   }
 
   test_bad_notSameParent() {
diff --git a/pkg/analysis_server/test/services/refactoring/move_file_test.dart b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
new file mode 100644
index 0000000..e07b85e
--- /dev/null
+++ b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
@@ -0,0 +1,228 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.services.refactoring.move_files;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../abstract_context.dart';
+import '../../reflective_tests.dart';
+import 'abstract_refactoring.dart';
+
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(MoveFileTest);
+}
+
+
+@ReflectiveTestCase()
+class MoveFileTest extends RefactoringTest {
+  MoveFileRefactoring refactoring;
+
+  test_definingUnit() {
+    String pathA = '/project/000/1111/a.dart';
+    String pathB = '/project/000/1111/b.dart';
+    String pathC = '/project/000/1111/22/c.dart';
+    String pathD = '/project/000/1111/333/d.dart';
+    testFile = '/project/000/1111/test.dart';
+    addSource('/absolute/uri.dart', '');
+    addSource(pathA, 'part of lib;');
+    addSource(pathB, "import 'test.dart';");
+    addSource(pathC, '');
+    addSource(pathD, '');
+    addTestSource('''
+library lib;
+import 'dart:math';
+import '22/c.dart';
+export '333/d.dart';
+part 'a.dart';
+part '/absolute/uri.dart';
+''');
+    _performAnalysis();
+    // perform refactoring
+    _createRefactoring('/project/000/1111/22/new_name.dart');
+    return _assertSuccessfulRefactoring().then((_) {
+      assertNoFileChange(pathA);
+      assertFileChangeResult(pathB, "import '22/new_name.dart';");
+      assertNoFileChange(pathC);
+      assertFileChangeResult(testFile, '''
+library lib;
+import 'dart:math';
+import 'c.dart';
+export '../333/d.dart';
+part '../a.dart';
+part '/absolute/uri.dart';
+''');
+    });
+  }
+
+  test_importedLibrary() {
+    String pathA = '/project/000/1111/a.dart';
+    testFile = '/project/000/1111/sub/folder/test.dart';
+    addSource(pathA, '''
+import 'sub/folder/test.dart';
+''');
+    addTestSource('');
+    _performAnalysis();
+    // perform refactoring
+    _createRefactoring('/project/000/new/folder/name/new_name.dart');
+    return _assertSuccessfulRefactoring().then((_) {
+      assertFileChangeResult(pathA, '''
+import '../new/folder/name/new_name.dart';
+''');
+      assertNoFileChange(testFile);
+    });
+  }
+
+  test_importedLibrary_down() {
+    String pathA = '/project/000/1111/a.dart';
+    testFile = '/project/000/1111/test.dart';
+    addSource(pathA, '''
+import 'test.dart';
+''');
+    addTestSource('');
+    _performAnalysis();
+    // perform refactoring
+    _createRefactoring('/project/000/1111/22/new_name.dart');
+    return _assertSuccessfulRefactoring().then((_) {
+      assertFileChangeResult(pathA, '''
+import '22/new_name.dart';
+''');
+      assertNoFileChange(testFile);
+    });
+  }
+
+  test_importedLibrary_package() {
+    // configure packages
+    testFile = '/packages/my_pkg/aaa/test.dart';
+    File testFileRes = provider.newFile(testFile, '');
+    Map<String, List<Folder>> packageMap = {
+      'my_pkg': [provider.getResource('/packages/my_pkg')]
+    };
+    context.sourceFactory = new SourceFactory(
+        [
+            AbstractContextTest.SDK_RESOLVER,
+            resourceResolver,
+            new PackageMapUriResolver(provider, packageMap)]);
+    // do testing
+    String pathA = '/project/bin/a.dart';
+    addSource(pathA, '''
+import 'package:my_pkg/aaa/test.dart';
+''');
+    addTestSource('');
+    _performAnalysis();
+    // perform refactoring
+    _createRefactoring('/packages/my_pkg/bbb/ccc/new_name.dart');
+    return _assertSuccessfulRefactoring().then((_) {
+      assertFileChangeResult(pathA, '''
+import 'package:my_pkg/bbb/ccc/new_name.dart';
+''');
+      assertNoFileChange(testFile);
+    });
+  }
+
+  test_importedLibrary_up() {
+    String pathA = '/project/000/1111/a.dart';
+    testFile = '/project/000/1111/22/test.dart';
+    addSource(pathA, '''
+import '22/test.dart';
+''');
+    addTestSource('');
+    _performAnalysis();
+    // perform refactoring
+    _createRefactoring('/project/000/1111/new_name.dart');
+    return _assertSuccessfulRefactoring().then((_) {
+      assertFileChangeResult(pathA, '''
+import 'new_name.dart';
+''');
+      assertNoFileChange(testFile);
+    });
+  }
+
+  test_sourcedUnit() {
+    String pathA = '/project/000/1111/a.dart';
+    testFile = '/project/000/1111/22/test.dart';
+    addSource(pathA, '''
+part '22/test.dart';
+''');
+    addTestSource('');
+    _performAnalysis();
+    // perform refactoring
+    _createRefactoring('/project/000/1111/22/new_name.dart');
+    return _assertSuccessfulRefactoring().then((_) {
+      assertFileChangeResult(pathA, '''
+part '22/new_name.dart';
+''');
+      assertNoFileChange(testFile);
+    });
+  }
+
+  test_sourcedUnit_multipleLibraries() {
+    String pathA = '/project/000/1111/a.dart';
+    String pathB = '/project/000/b.dart';
+    testFile = '/project/000/1111/22/test.dart';
+    addSource(pathA, '''
+part '22/test.dart';
+''');
+    addSource(pathB, '''
+part '1111/22/test.dart';
+''');
+    addTestSource('');
+    _performAnalysis();
+    // perform refactoring
+    _createRefactoring('/project/000/1111/22/new_name.dart');
+    return _assertSuccessfulRefactoring().then((_) {
+      assertFileChangeResult(pathA, '''
+part '22/new_name.dart';
+''');
+      assertFileChangeResult(pathB, '''
+part '1111/22/new_name.dart';
+''');
+      assertNoFileChange(testFile);
+    });
+  }
+
+  /**
+   * Checks that all conditions are OK.
+   */
+  Future _assertSuccessfulRefactoring() {
+    return assertRefactoringConditionsOK().then((_) {
+      return refactoring.createChange().then((SourceChange refactoringChange) {
+        this.refactoringChange = refactoringChange;
+      });
+    });
+  }
+
+  void _createRefactoring(String newName) {
+    refactoring = new MoveFileRefactoring(
+        provider.pathContext,
+        searchEngine,
+        context,
+        testSource);
+    refactoring.newFile = newName;
+  }
+
+  void _performAnalysis() {
+    while (true) {
+      AnalysisResult result = context.performAnalysisTask();
+      if (!result.hasMoreWork) {
+        break;
+      }
+      for (ChangeNotice notice in result.changeNotices) {
+        if (notice.source.fullName.startsWith('/project/')) {
+          index.indexUnit(context, notice.compilationUnit);
+        }
+      }
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
index 2cb4674..0971db2 100644
--- a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
@@ -58,21 +58,21 @@
   void test_validateClassName_leadingBlanks() {
     assertRefactoringStatus(
         validateClassName(" NewName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Class name must not start or end with a blank.");
   }
 
   void test_validateClassName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateClassName("New-Name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Class name must not contain '-'.");
   }
 
   void test_validateClassName_notIdentifierStart() {
     assertRefactoringStatus(
         validateClassName("-NewName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Class name must begin with an uppercase letter or underscore.");
   }
@@ -87,7 +87,7 @@
   void test_validateClassName_trailingBlanks() {
     assertRefactoringStatus(
         validateClassName("NewName "),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Class name must not start or end with a blank.");
   }
   void test_validateConstantName_OK() {
@@ -116,7 +116,7 @@
   void test_validateConstantName_leadingBlanks() {
     assertRefactoringStatus(
         validateConstantName(" NewName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Constant name must not start or end with a blank.");
   }
 
@@ -130,14 +130,14 @@
   void test_validateConstantName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateConstantName("NA-ME"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Constant name must not contain '-'.");
   }
 
   void test_validateConstantName_notIdentifierStart() {
     assertRefactoringStatus(
         validateConstantName("99_RED_BALLOONS"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Constant name must begin with an uppercase letter or underscore.");
   }
@@ -152,7 +152,7 @@
   void test_validateConstantName_trailingBlanks() {
     assertRefactoringStatus(
         validateConstantName("NewName "),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Constant name must not start or end with a blank.");
   }
 
@@ -178,21 +178,21 @@
   void test_validateConstructorName_leadingBlanks() {
     assertRefactoringStatus(
         validateConstructorName(" newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Constructor name must not start or end with a blank.");
   }
 
   void test_validateConstructorName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateConstructorName("na-me"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Constructor name must not contain '-'.");
   }
 
   void test_validateConstructorName_notIdentifierStart() {
     assertRefactoringStatus(
         validateConstructorName("2name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Constructor name must begin with a lowercase letter or underscore.");
   }
@@ -207,7 +207,7 @@
   void test_validateConstructorName_trailingBlanks() {
     assertRefactoringStatus(
         validateConstructorName("newName "),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Constructor name must not start or end with a blank.");
   }
 
@@ -240,21 +240,21 @@
   void test_validateFieldName_leadingBlanks() {
     assertRefactoringStatus(
         validateFieldName(" newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Field name must not start or end with a blank.");
   }
 
   void test_validateFieldName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateFieldName("new-Name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Field name must not contain '-'.");
   }
 
   void test_validateFieldName_notIdentifierStart() {
     assertRefactoringStatus(
         validateFieldName("2newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Field name must begin with a lowercase letter or underscore.");
   }
@@ -269,7 +269,7 @@
   void test_validateFieldName_trailingBlanks() {
     assertRefactoringStatus(
         validateFieldName("newName "),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Field name must not start or end with a blank.");
   }
 
@@ -302,21 +302,21 @@
   void test_validateFunctionName_leadingBlanks() {
     assertRefactoringStatus(
         validateFunctionName(" newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Function name must not start or end with a blank.");
   }
 
   void test_validateFunctionName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateFunctionName("new-Name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Function name must not contain '-'.");
   }
 
   void test_validateFunctionName_notIdentifierStart() {
     assertRefactoringStatus(
         validateFunctionName("2newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Function name must begin with a lowercase letter or underscore.");
   }
@@ -331,7 +331,7 @@
   void test_validateFunctionName_trailingBlanks() {
     assertRefactoringStatus(
         validateFunctionName("newName "),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Function name must not start or end with a blank.");
   }
 
@@ -369,7 +369,7 @@
   void test_validateFunctionTypeAliasName_leadingBlanks() {
     assertRefactoringStatus(
         validateFunctionTypeAliasName(" NewName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Function type alias name must not start or end with a blank.");
   }
@@ -377,14 +377,14 @@
   void test_validateFunctionTypeAliasName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateFunctionTypeAliasName("New-Name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Function type alias name must not contain '-'.");
   }
 
   void test_validateFunctionTypeAliasName_notIdentifierStart() {
     assertRefactoringStatus(
         validateFunctionTypeAliasName("-NewName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Function type alias name must begin with an uppercase letter or underscore.");
   }
@@ -399,7 +399,7 @@
   void test_validateFunctionTypeAliasName_trailingBlanks() {
     assertRefactoringStatus(
         validateFunctionTypeAliasName("NewName "),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Function type alias name must not start or end with a blank.");
   }
@@ -430,21 +430,21 @@
   void test_validateImportPrefixName_leadingBlanks() {
     assertRefactoringStatus(
         validateImportPrefixName(" newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Import prefix name must not start or end with a blank.");
   }
 
   void test_validateImportPrefixName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateImportPrefixName("new-Name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Import prefix name must not contain '-'.");
   }
 
   void test_validateImportPrefixName_notIdentifierStart() {
     assertRefactoringStatus(
         validateImportPrefixName("2newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Import prefix name must begin with a lowercase letter or underscore.");
   }
@@ -459,7 +459,7 @@
   void test_validateImportPrefixName_trailingBlanks() {
     assertRefactoringStatus(
         validateImportPrefixName("newName "),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Import prefix name must not start or end with a blank.");
   }
 
@@ -496,21 +496,21 @@
   void test_validateLabelName_leadingBlanks() {
     assertRefactoringStatus(
         validateLabelName(" newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Label name must not start or end with a blank.");
   }
 
   void test_validateLabelName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateLabelName("new-Name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Label name must not contain '-'.");
   }
 
   void test_validateLabelName_notIdentifierStart() {
     assertRefactoringStatus(
         validateLabelName("2newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Label name must begin with a lowercase letter or underscore.");
   }
@@ -525,7 +525,7 @@
   void test_validateLabelName_trailingBlanks() {
     assertRefactoringStatus(
         validateLabelName("newName "),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Label name must not start or end with a blank.");
   }
 
@@ -555,7 +555,7 @@
         expectedMessage: "Library name identifier must not be empty.");
     assertRefactoringStatus(
         validateLibraryName("my. .name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Library name identifier must not start or end with a blank.");
   }
 
@@ -570,21 +570,21 @@
   void test_validateLibraryName_leadingBlanks() {
     assertRefactoringStatus(
         validateLibraryName("my. name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Library name identifier must not start or end with a blank.");
   }
 
   void test_validateLibraryName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateLibraryName("my.ba-d.name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Library name identifier must not contain '-'.");
   }
 
   void test_validateLibraryName_notIdentifierStart() {
     assertRefactoringStatus(
         validateLibraryName("my.2bad.name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Library name identifier must begin with a lowercase letter or underscore.");
   }
@@ -599,7 +599,7 @@
   void test_validateLibraryName_trailingBlanks() {
     assertRefactoringStatus(
         validateLibraryName("my.bad .name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Library name identifier must not start or end with a blank.");
   }
 
@@ -632,21 +632,21 @@
   void test_validateMethodName_leadingBlanks() {
     assertRefactoringStatus(
         validateMethodName(" newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Method name must not start or end with a blank.");
   }
 
   void test_validateMethodName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateMethodName("new-Name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Method name must not contain '-'.");
   }
 
   void test_validateMethodName_notIdentifierStart() {
     assertRefactoringStatus(
         validateMethodName("2newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Method name must begin with a lowercase letter or underscore.");
   }
@@ -661,7 +661,7 @@
   void test_validateMethodName_trailingBlanks() {
     assertRefactoringStatus(
         validateMethodName("newName "),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Method name must not start or end with a blank.");
   }
 
@@ -694,21 +694,21 @@
   void test_validateParameterName_leadingBlanks() {
     assertRefactoringStatus(
         validateParameterName(" newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Parameter name must not start or end with a blank.");
   }
 
   void test_validateParameterName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateParameterName("new-Name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Parameter name must not contain '-'.");
   }
 
   void test_validateParameterName_notIdentifierStart() {
     assertRefactoringStatus(
         validateParameterName("2newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Parameter name must begin with a lowercase letter or underscore.");
   }
@@ -723,7 +723,7 @@
   void test_validateParameterName_trailingBlanks() {
     assertRefactoringStatus(
         validateParameterName("newName "),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Parameter name must not start or end with a blank.");
   }
 
@@ -760,21 +760,21 @@
   void test_validateVariableName_leadingBlanks() {
     assertRefactoringStatus(
         validateVariableName(" newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Variable name must not start or end with a blank.");
   }
 
   void test_validateVariableName_notIdentifierMiddle() {
     assertRefactoringStatus(
         validateVariableName("new-Name"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Variable name must not contain '-'.");
   }
 
   void test_validateVariableName_notIdentifierStart() {
     assertRefactoringStatus(
         validateVariableName("2newName"),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage:
             "Variable name must begin with a lowercase letter or underscore.");
   }
@@ -789,7 +789,7 @@
   void test_validateVariableName_trailingBlanks() {
     assertRefactoringStatus(
         validateVariableName("newName "),
-        RefactoringProblemSeverity.ERROR,
+        RefactoringProblemSeverity.FATAL,
         expectedMessage: "Variable name must not start or end with a blank.");
   }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index 059b81d..3c795b1 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -61,12 +61,14 @@
 main() {
   int test = 0;
   var newName = 1;
+  print(newName);
 }
 ''');
     createRenameRefactoringAtString('test = 0');
     // check status
     refactoring.newName = 'newName';
     return refactoring.checkFinalConditions().then((status) {
+      expect(status.problems, hasLength(1));
       assertRefactoringStatus(
           status,
           RefactoringProblemSeverity.ERROR,
diff --git a/pkg/analysis_server/test/services/refactoring/test_all.dart b/pkg/analysis_server/test/services/refactoring/test_all.dart
index 8ea3a50..e80b9a7 100644
--- a/pkg/analysis_server/test/services/refactoring/test_all.dart
+++ b/pkg/analysis_server/test/services/refactoring/test_all.dart
@@ -6,10 +6,13 @@
 
 import 'package:unittest/unittest.dart';
 
+import 'convert_getter_to_method_test.dart' as convert_getter_to_method_test;
+import 'convert_method_to_getter_test.dart' as convert_method_to_getter_test;
 import 'extract_local_test.dart' as extract_local_test;
 import 'extract_method_test.dart' as extract_method_test;
 import 'inline_local_test.dart' as inline_local_test;
 import 'inline_method_test.dart' as inline_method_test;
+import 'move_file_test.dart' as move_file_test;
 import 'naming_conventions_test.dart' as naming_conventions_test;
 import 'rename_class_member_test.dart' as rename_class_member_test;
 import 'rename_constructor_test.dart' as rename_constructor_test;
@@ -23,10 +26,13 @@
 main() {
   groupSep = ' | ';
   group('refactoring', () {
+    convert_getter_to_method_test.main();
+    convert_method_to_getter_test.main();
     extract_local_test.main();
     extract_method_test.main();
     inline_local_test.main();
     inline_method_test.main();
+    move_file_test.main();
     naming_conventions_test.main();
     rename_class_member_test.main();
     rename_constructor_test.main();
diff --git a/pkg/analysis_server/test/services/search/hierarchy_test.dart b/pkg/analysis_server/test/services/search/hierarchy_test.dart
index 879d035..65820bf 100644
--- a/pkg/analysis_server/test/services/search/hierarchy_test.dart
+++ b/pkg/analysis_server/test/services/search/hierarchy_test.dart
@@ -10,11 +10,10 @@
 import 'package:analysis_server/src/services/index/local_memory_index.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:unittest/unittest.dart';
-
 import '../../abstract_single_unit.dart';
 import '../../reflective_tests.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:unittest/unittest.dart';
 
 
 main() {
@@ -73,12 +72,10 @@
     ClassElement classB = findElement("B");
     ClassMemberElement memberA = classA.constructors[0];
     ClassMemberElement memberB = classB.constructors[0];
-    var futureA =
-        getHierarchyMembers(searchEngine, memberA, false).then((members) {
+    var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
       expect(members, unorderedEquals([memberA]));
     });
-    var futureB =
-        getHierarchyMembers(searchEngine, memberB, false).then((members) {
+    var futureB = getHierarchyMembers(searchEngine, memberB).then((members) {
       expect(members, unorderedEquals([memberB]));
     });
     return Future.wait([futureA, futureB]);
@@ -108,20 +105,16 @@
     ClassMemberElement memberB = classB.fields[0];
     ClassMemberElement memberC = classC.fields[0];
     ClassMemberElement memberD = classD.fields[0];
-    var futureA =
-        getHierarchyMembers(searchEngine, memberA, false).then((members) {
+    var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberC]));
     });
-    var futureB =
-        getHierarchyMembers(searchEngine, memberB, false).then((members) {
+    var futureB = getHierarchyMembers(searchEngine, memberB).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberC]));
     });
-    var futureC =
-        getHierarchyMembers(searchEngine, memberC, false).then((members) {
+    var futureC = getHierarchyMembers(searchEngine, memberC).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberC]));
     });
-    var futureD =
-        getHierarchyMembers(searchEngine, memberD, false).then((members) {
+    var futureD = getHierarchyMembers(searchEngine, memberD).then((members) {
       expect(members, unorderedEquals([memberD]));
     });
     return Future.wait([futureA, futureB, futureC, futureD]);
@@ -155,62 +148,24 @@
     ClassMemberElement memberC = classC.methods[0];
     ClassMemberElement memberD = classD.methods[0];
     ClassMemberElement memberE = classE.methods[0];
-    var futureA =
-        getHierarchyMembers(searchEngine, memberA, false).then((members) {
+    var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberC]));
     });
-    var futureB =
-        getHierarchyMembers(searchEngine, memberB, false).then((members) {
+    var futureB = getHierarchyMembers(searchEngine, memberB).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberC]));
     });
-    var futureC =
-        getHierarchyMembers(searchEngine, memberC, false).then((members) {
+    var futureC = getHierarchyMembers(searchEngine, memberC).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberC]));
     });
-    var futureD =
-        getHierarchyMembers(searchEngine, memberD, false).then((members) {
+    var futureD = getHierarchyMembers(searchEngine, memberD).then((members) {
       expect(members, unorderedEquals([memberD, memberE]));
     });
-    var futureE =
-        getHierarchyMembers(searchEngine, memberE, false).then((members) {
+    var futureE = getHierarchyMembers(searchEngine, memberE).then((members) {
       expect(members, unorderedEquals([memberD, memberE]));
     });
     return Future.wait([futureA, futureB, futureC, futureD, futureE]);
   }
 
-  Future test_getHierarchyMembers_methods_onlySuper() {
-    _indexTestUnit('''
-class A {
-  foo() {}
-}
-class B extends A {
-  foo() {}
-}
-class C extends B {
-  foo() {}
-}
-''');
-    ClassElement classA = findElement("A");
-    ClassElement classB = findElement("B");
-    ClassElement classC = findElement("C");
-    ClassMemberElement memberA = classA.methods[0];
-    ClassMemberElement memberB = classB.methods[0];
-    ClassMemberElement memberC = classC.methods[0];
-    var futureA =
-        getHierarchyMembers(searchEngine, memberA, true).then((members) {
-      expect(members, unorderedEquals([memberA]));
-    });
-    var futureB =
-        getHierarchyMembers(searchEngine, memberB, true).then((members) {
-      expect(members, unorderedEquals([memberA, memberB]));
-    });
-    var futureC =
-        getHierarchyMembers(searchEngine, memberC, true).then((members) {
-      expect(members, unorderedEquals([memberA, memberB, memberC]));
-    });
-    return Future.wait([futureA, futureB, futureC]);
-  }
-
   Future test_getHierarchyMembers_withInterfaces() {
     _indexTestUnit('''
 class A {
@@ -236,16 +191,13 @@
     ClassMemberElement memberA = classA.methods[0];
     ClassMemberElement memberB = classB.methods[0];
     ClassMemberElement memberD = classD.methods[0];
-    var futureA =
-        getHierarchyMembers(searchEngine, memberA, false).then((members) {
+    var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberD]));
     });
-    var futureB =
-        getHierarchyMembers(searchEngine, memberB, false).then((members) {
+    var futureB = getHierarchyMembers(searchEngine, memberB).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberD]));
     });
-    var futureD =
-        getHierarchyMembers(searchEngine, memberD, false).then((members) {
+    var futureD = getHierarchyMembers(searchEngine, memberD).then((members) {
       expect(members, unorderedEquals([memberA, memberB, memberD]));
     });
     return Future.wait([futureA, futureB, futureD]);
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index b559f24..293e0af 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -439,6 +439,23 @@
     return _verifyReferences(element, expected);
   }
 
+  Future test_searchReferences_PrefixElement() {
+    _indexTestUnit('''
+import 'dart:async' as ppp;
+main() {
+  ppp.Future a;
+  ppp.Stream b;
+}
+''');
+    PrefixElement element = findNodeElementAtString('ppp;');
+    Element elementA = findElement('a');
+    Element elementB = findElement('b');
+    var expected = [
+        _expectId(elementA, MatchKind.REFERENCE, 'ppp.Future'),
+        _expectId(elementB, MatchKind.REFERENCE, 'ppp.Stream')];
+    return _verifyReferences(element, expected);
+  }
+
   Future test_searchReferences_MethodElement() {
     _indexTestUnit('''
 class A {
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index e3a637a..1a768b8 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -5,12 +5,6 @@
 import 'package:unittest/unittest.dart';
 
 import 'analysis/test_all.dart' as analysis_all;
-import 'analysis_hover_test.dart' as analysis_hover_test;
-import 'analysis_notification_highlights_test.dart' as analysis_notification_highlights_test;
-import 'analysis_notification_navigation_test.dart' as analysis_notification_navigation_test;
-import 'analysis_notification_occurrences_test.dart' as analysis_notification_occurrences_test;
-import 'analysis_notification_outline_test.dart' as analysis_notification_outline_test;
-import 'analysis_notification_overrides_test.dart' as analysis_notification_overrides_test;
 import 'analysis_server_test.dart' as analysis_server_test;
 import 'channel/test_all.dart' as channel_test;
 import 'computer/test_all.dart' as computer_test_all;
@@ -33,12 +27,6 @@
   groupSep = ' | ';
   group('analysis_server', () {
     analysis_all.main();
-    analysis_hover_test.main();
-    analysis_notification_highlights_test.main();
-    analysis_notification_navigation_test.main();
-    analysis_notification_occurrences_test.main();
-    analysis_notification_outline_test.main();
-    analysis_notification_overrides_test.main();
     analysis_server_test.main();
     channel_test.main();
     computer_test_all.main();
diff --git a/pkg/analysis_server/tool/spec/codegen_analysis_server.dart b/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
index 4cd81a9..0e0dd20 100644
--- a/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
+++ b/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
@@ -72,12 +72,9 @@
         writeln(
             '''/**
  * Start the analysis server.
- * 
- * @param millisToRestart the number of milliseconds to wait for an unresponsive server before
- *          restarting it, or zero if the server should not be restarted.
  */'''
             );
-        writeln('public void start(long millisToRestart) throws Exception;');
+        writeln('public void start() throws Exception;');
       });
       super.visitApi();
     });
diff --git a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
index 43fc138..228a344 100644
--- a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
+++ b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
@@ -190,6 +190,7 @@
    * Type references in the spec that are named something else in Dart.
    */
   static const Map<String, String> _typeRenames = const {
+    'long': 'int',
     'object': 'Map',
   };
 
@@ -559,8 +560,19 @@
       case 'SourceChange':
         docComment(
             [new dom.Text('Adds [edit] to the [FileEdit] for the given [file].')]);
-        writeln('void addEdit(String file, SourceEdit edit) =>');
-        writeln('    _addEditToSourceChange(this, file, edit);');
+        writeln('void addEdit(String file, int fileStamp, SourceEdit edit) =>');
+        writeln('    _addEditToSourceChange(this, file, fileStamp, edit);');
+        writeln();
+        docComment(
+            [new dom.Text('Adds [edit] to the [FileEdit] for the given [source].')]);
+        writeln('void addSourceEdit(engine.AnalysisContext context,');
+        writeln('    engine.Source source, SourceEdit edit) =>');
+        writeln('    _addSourceEditToSourceChange(this, context, source, edit);');
+        writeln();
+        docComment(
+            [new dom.Text('Adds [edit] to the [FileEdit] for the given [element].')]);
+        writeln('void addElementEdit(engine.Element element, SourceEdit edit) =>');
+        writeln('    _addElementEditToSourceChange(this, element, edit);');
         writeln();
         docComment([new dom.Text('Adds the given [FileEdit].')]);
         writeln('void addFileEdit(SourceFileEdit edit) {');
@@ -1121,6 +1133,7 @@
           case 'bool':
             return new FromJsonFunction('jsonDecoder._decodeBool');
           case 'int':
+          case 'long':
             return new FromJsonFunction('jsonDecoder._decodeInt');
           case 'object':
             return new FromJsonIdentity();
diff --git a/pkg/analysis_server/tool/spec/codegen_java.dart b/pkg/analysis_server/tool/spec/codegen_java.dart
index 823207f..bec7dd6 100644
--- a/pkg/analysis_server/tool/spec/codegen_java.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java.dart
@@ -181,7 +181,7 @@
   bool isPrimitive(TypeDecl type) {
     if (type is TypeReference) {
       String typeStr = javaType(type);
-      return typeStr == 'int' || typeStr == 'boolean';
+      return typeStr == 'boolean' || typeStr == 'int' || typeStr == 'long';
     }
     return false;
   }
diff --git a/pkg/analysis_server/tool/spec/codegen_java_types.dart b/pkg/analysis_server/tool/spec/codegen_java_types.dart
index 99363e7..b28fab3 100644
--- a/pkg/analysis_server/tool/spec/codegen_java_types.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java_types.dart
@@ -597,6 +597,8 @@
       return 'getAsBoolean';
     } else if (name == 'int' || name == 'Integer') {
       return 'getAsInt';
+    } else if (name == 'long' || name == 'Long') {
+      return 'getAsLong';
     } else if (name.startsWith('List')) {
       return 'getAsJsonArray';
     } else {
@@ -630,7 +632,7 @@
       TypeDecl listItemType = (field.type as TypeList).itemType;
       String jsonArrayName = 'jsonArray${capitalize(name)}';
       writeln('JsonArray ${jsonArrayName} = new JsonArray();');
-      writeln('for(${javaType(listItemType)} elt : ${name}) {');
+      writeln('for (${javaType(listItemType)} elt : ${name}) {');
       indent(() {
         if (isDeclaredInSpec(listItemType)) {
           writeln('${jsonArrayName}.add(elt.toJson());');
diff --git a/pkg/analysis_server/tool/spec/codegen_matchers.dart b/pkg/analysis_server/tool/spec/codegen_matchers.dart
index 9795510..02261da 100644
--- a/pkg/analysis_server/tool/spec/codegen_matchers.dart
+++ b/pkg/analysis_server/tool/spec/codegen_matchers.dart
@@ -158,7 +158,11 @@
 
   @override
   void visitTypeReference(TypeReference typeReference) {
-    write(camelJoin(['is', typeReference.typeName]));
+    String typeName = typeReference.typeName;
+    if (typeName == 'long') {
+      typeName = 'int';
+    }
+    write(camelJoin(['is', typeName]));
   }
 
   @override
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 54c0a58..3cee950 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -1223,11 +1223,30 @@
           </field>
         </params>
         <result>
-          <field name="problems">
+          <field name="initialProblems">
             <list><ref>RefactoringProblem</ref></list>
             <p>
-              The status of the refactoring. The array will be empty
-              if there are no known problems.
+              The initial status of the refactoring, i.e. problems related to
+              the context in which the refactoring is requested.
+              The array will be empty if there are no known problems.
+            </p>
+          </field>
+          <field name="optionsProblems">
+            <list><ref>RefactoringProblem</ref></list>
+            <p>
+              The options validation status, i.e. problems in the given options,
+              such as light-weight validation of a new name, flags
+              compatibility, etc.
+              The array will be empty if there are no known problems.
+            </p>
+          </field>
+          <field name="finalProblems">
+            <list><ref>RefactoringProblem</ref></list>
+            <p>
+              The final status of the refactoring, i.e. problems identified in
+              the result of a full, potentially expensive validation and / or
+              change creation.
+              The array will be empty if there are no known problems.
             </p>
           </field>
           <field name="feedback" optional="true">
@@ -1380,7 +1399,7 @@
       </request>
       <notification event="launchData">
         <p>
-          Reports information needed to allow applications to be launched.
+          Reports information needed to allow a single file to be launched.
         </p>
         <p>
           This notification is not subscribed to by default. Clients can
@@ -1388,35 +1407,25 @@
           passed in an <tt>execution.setSubscriptions</tt> request.
         </p>
         <params>
-          <field name="executables">
-            <list><ref>ExecutableFile</ref></list>
+          <field name="file">
+            <ref>FilePath</ref>
             <p>
-              A list of the files that are executable. This list replaces any
-              previous list provided.
+              The file for which launch data is being provided. This will either
+              be a Dart library or an HTML file.
             </p>
           </field>
-          <field name="dartToHtml">
-            <map>
-              <key><ref>FilePath</ref></key>
-              <value>
-                <list><ref>FilePath</ref></list>
-              </value>
-            </map>
+          <field name="kind" optional="true">
+            <ref>ExecutableKind</ref>
             <p>
-              A mapping from the paths of Dart files that are referenced by HTML
-              files to a list of the HTML files that reference the Dart files.
+              The kind of the executable file. This field is omitted if the file
+              is not a Dart file.
             </p>
           </field>
-          <field name="htmlToDart">
-            <map>
-              <key><ref>FilePath</ref></key>
-              <value>
-                <list><ref>FilePath</ref></list>
-              </value>
-            </map>
+          <field name="referencedFiles" optional="true">
+            <list><ref>FilePath</ref></list>
             <p>
-              A mapping from the paths of HTML files that reference Dart files
-              to a list of the Dart files they reference.
+              A list of the Dart files that are referenced by the file. This
+              field is omitted if the file is not an HTML file.
             </p>
           </field>
         </params>
@@ -1742,6 +1751,12 @@
               of a class.
             </p>
           </field>
+          <field name="element" optional="true">
+            <ref>Element</ref>
+            <p>
+              Information about the element reference being suggested.
+            </p>
+          </field>
           <field name="returnType" optional="true">
             <ref>String</ref>
             <p>
@@ -1906,6 +1921,7 @@
           <value><code>LOCAL_VARIABLE</code></value>
           <value><code>METHOD</code></value>
           <value><code>PARAMETER</code></value>
+          <value><code>PREFIX</code></value>
           <value><code>SETTER</code></value>
           <value><code>TOP_LEVEL_VARIABLE</code></value>
           <value><code>TYPE_PARAMETER</code></value>
@@ -1940,6 +1956,7 @@
         <enum>
           <value><code>CLIENT</code></value>
           <value><code>EITHER</code></value>
+          <value><code>NOT_EXECUTABLE</code></value>
           <value><code>SERVER</code></value>
         </enum>
       </type>
@@ -2448,7 +2465,9 @@
           <value><code>EXTRACT_METHOD</code></value>
           <value><code>INLINE_LOCAL_VARIABLE</code></value>
           <value><code>INLINE_METHOD</code></value>
+          <value><code>MOVE_FILE</code></value>
           <value><code>RENAME</code></value>
+          <value><code>SORT_MEMBERS</code></value>
         </enum>
       </type>
       <type name="RefactoringMethodParameter">
@@ -2880,6 +2899,16 @@
               The file containing the code to be modified.
             </p>
           </field>
+          <field name="fileStamp">
+            <ref>long</ref>
+            <p>
+              The modification stamp of the file at the moment when the change
+              was created, in milliseconds since the "Unix epoch". Will be -1 if
+              the file did not exist and should be created. The client may use
+              this field to make sure that the file was not changed since then,
+              so it is safe to apply the change.
+            </p>
+          </field>
           <field name="edits">
             <list><ref>SourceEdit</ref></list>
             <p>
@@ -3232,6 +3261,30 @@
           </field>
         </options>
       </refactoring>
+      <refactoring kind="MOVE_FILE">
+        <p>
+          Move the given file and update all of the references to that file
+          and from it. The move operation is supported in general case - for
+          renaming a file in the same folder, moving it to a different folder
+          or both.
+        </p>
+        <p>
+          The refactoring must be activated before an actual file moving
+          operation is performed.
+        </p>
+        <p>
+          The "offset" and "length" fields from the request are ignored, but the
+          file specified in the request specifies the file to be moved.
+        </p>
+        <options>
+          <field name="newFile">
+            <ref>FilePath</ref>
+            <p>
+              The new file path to which the given file is being moved.
+            </p>
+          </field>
+        </options>
+      </refactoring>
       <refactoring kind="RENAME">
         <p>
           Rename a given element and all of the references to that
@@ -3282,6 +3335,16 @@
           </field>
         </options>
       </refactoring>
+      <refactoring kind=SORT_MEMBERS>
+        <p>
+          Sort all of the directives, unit and class members
+          of the given Dart file.
+        </p>
+        <p>
+          The "offset" and "length" fields from the request are ignored, but the
+          file specified in the request specifies the file to be sorted.
+        </p>
+      </refactoring>
     </refactorings>
     <h2>Errors</h2>
     <p>
diff --git a/pkg/analyzer/lib/source/package_map_provider.dart b/pkg/analyzer/lib/source/package_map_provider.dart
index 9d73815..85b493d 100644
--- a/pkg/analyzer/lib/source/package_map_provider.dart
+++ b/pkg/analyzer/lib/source/package_map_provider.dart
@@ -4,14 +4,7 @@
 
 library source.package_map_provider;
 
-import 'dart:collection';
-import 'dart:convert';
-import 'dart:io' as io;
-
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/sdk_io.dart';
-import 'package:path/path.dart';
 
 /**
  * Data structure output by PackageMapProvider.  This contains both the package
@@ -49,122 +42,3 @@
    */
   PackageMapInfo computePackageMap(Folder folder);
 }
-
-/**
- * Implementation of PackageMapProvider that operates by executing pub.
- */
-class PubPackageMapProvider implements PackageMapProvider {
-  static const String PUB_LIST_COMMAND = 'list-package-dirs';
-
-  /**
-   * The name of the 'pubspec.lock' file, which we assume is the dependency
-   * in the event that [PUB_LIST_COMMAND] fails.
-   */
-  static const String PUBSPEC_LOCK_NAME = 'pubspec.lock';
-
-  /**
-   * [ResourceProvider] that is used to create the [Folder]s that populate the
-   * package map.
-   */
-  final ResourceProvider resourceProvider;
-
-  /**
-   * Sdk that we use to find the pub executable.
-   */
-  final DirectoryBasedDartSdk sdk;
-
-  PubPackageMapProvider(this.resourceProvider, this.sdk);
-
-  @override
-  PackageMapInfo computePackageMap(Folder folder) {
-    // TODO(paulberry) make this asynchronous so that we can (a) do other
-    // analysis while it's in progress, and (b) time out if it takes too long
-    // to respond.
-    String executable = sdk.pubExecutable.getAbsolutePath();
-    io.ProcessResult result;
-    try {
-      result = io.Process.runSync(
-          executable, [PUB_LIST_COMMAND], workingDirectory: folder.path);
-    } on io.ProcessException catch (exception, stackTrace) {
-      AnalysisEngine.instance.logger.logInformation(
-          "Error running pub $PUB_LIST_COMMAND\n${exception}\n${stackTrace}");
-    }
-    if (result.exitCode != 0) {
-      AnalysisEngine.instance.logger.logInformation(
-          "pub $PUB_LIST_COMMAND failed: exit code ${result.exitCode}");
-      return _error(folder);
-    }
-    try {
-      return parsePackageMap(result.stdout, folder);
-    } catch (exception, stackTrace) {
-      AnalysisEngine.instance.logger.logError(
-          "Malformed output from pub $PUB_LIST_COMMAND\n${exception}\n${stackTrace}");
-    }
-
-    return _error(folder);
-  }
-
-  /**
-   * Decode the JSON output from pub into a package map.  Paths in the
-   * output are considered relative to [folder].
-   */
-  PackageMapInfo parsePackageMap(String jsonText, Folder folder) {
-    // The output of pub looks like this:
-    // {
-    //   "packages": {
-    //     "foo": "path/to/foo",
-    //     "bar": ["path/to/bar1", "path/to/bar2"],
-    //     "myapp": "path/to/myapp",  // self link is included
-    //   },
-    //   "input_files": [
-    //     "path/to/myapp/pubspec.lock"
-    //   ]
-    // }
-    Map<String, List<Folder>> packageMap = new HashMap<String, List<Folder>>();
-    Map obj = JSON.decode(jsonText);
-    Map packages = obj['packages'];
-    processPaths(String packageName, List paths) {
-      List<Folder> folders = <Folder>[];
-      for (var path in paths) {
-        if (path is String) {
-          Resource resource = folder.getChild(path);
-          if (resource is Folder) {
-            folders.add(resource);
-          }
-        }
-      }
-      if (folders.isNotEmpty) {
-        packageMap[packageName] = folders;
-      }
-    }
-    packages.forEach((key, value) {
-      if (value is String) {
-        processPaths(key, [value]);
-      } else if (value is List) {
-        processPaths(key, value);
-      }
-    });
-    Set<String> dependencies = new Set<String>();
-    List inputFiles = obj['input_files'];
-    if (inputFiles != null) {
-      for (var path in inputFiles) {
-        if (path is String) {
-          dependencies.add(folder.canonicalizePath(path));
-        }
-      }
-    }
-    return new PackageMapInfo(packageMap, dependencies);
-  }
-
-  /**
-   * Create a PackageMapInfo object representing an error condition.
-   */
-  PackageMapInfo _error(Folder folder) {
-    // Even if an error occurs, we still need to know the dependencies, so that
-    // we'll know when to try running "pub list-package-dirs" again.
-    // Unfortunately, "pub list-package-dirs" doesn't tell us dependencies when
-    // an error occurs, so just assume there is one dependency, "pubspec.lock".
-    List<String> dependencies = <String>[join(folder.path, PUBSPEC_LOCK_NAME)];
-    return new PackageMapInfo(null, dependencies.toSet());
-  }
-}
\ No newline at end of file
diff --git a/pkg/analyzer/lib/source/pub_package_map_provider.dart b/pkg/analyzer/lib/source/pub_package_map_provider.dart
new file mode 100644
index 0000000..cb949eaf
--- /dev/null
+++ b/pkg/analyzer/lib/source/pub_package_map_provider.dart
@@ -0,0 +1,134 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library source.pub_package_map_provider;
+
+import 'dart:collection';
+import 'dart:convert';
+import 'dart:io' as io;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/package_map_provider.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:path/path.dart';
+
+/**
+ * Implementation of PackageMapProvider that operates by executing pub.
+ */
+class PubPackageMapProvider implements PackageMapProvider {
+  static const String PUB_LIST_COMMAND = 'list-package-dirs';
+
+  /**
+   * The name of the 'pubspec.lock' file, which we assume is the dependency
+   * in the event that [PUB_LIST_COMMAND] fails.
+   */
+  static const String PUBSPEC_LOCK_NAME = 'pubspec.lock';
+
+  /**
+   * [ResourceProvider] that is used to create the [Folder]s that populate the
+   * package map.
+   */
+  final ResourceProvider resourceProvider;
+
+  /**
+   * Sdk that we use to find the pub executable.
+   */
+  final DirectoryBasedDartSdk sdk;
+
+  PubPackageMapProvider(this.resourceProvider, this.sdk);
+
+  @override
+  PackageMapInfo computePackageMap(Folder folder) {
+    // TODO(paulberry) make this asynchronous so that we can (a) do other
+    // analysis while it's in progress, and (b) time out if it takes too long
+    // to respond.
+    String executable = sdk.pubExecutable.getAbsolutePath();
+    io.ProcessResult result;
+    try {
+      result = io.Process.runSync(
+          executable, [PUB_LIST_COMMAND], workingDirectory: folder.path);
+    } on io.ProcessException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Error running pub $PUB_LIST_COMMAND\n${exception}\n${stackTrace}");
+    }
+    if (result.exitCode != 0) {
+      AnalysisEngine.instance.logger.logInformation(
+          "pub $PUB_LIST_COMMAND failed: exit code ${result.exitCode}");
+      return _error(folder);
+    }
+    try {
+      return parsePackageMap(result.stdout, folder);
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError(
+          "Malformed output from pub $PUB_LIST_COMMAND\n${exception}\n${stackTrace}");
+    }
+
+    return _error(folder);
+  }
+
+  /**
+   * Decode the JSON output from pub into a package map.  Paths in the
+   * output are considered relative to [folder].
+   */
+  PackageMapInfo parsePackageMap(String jsonText, Folder folder) {
+    // The output of pub looks like this:
+    // {
+    //   "packages": {
+    //     "foo": "path/to/foo",
+    //     "bar": ["path/to/bar1", "path/to/bar2"],
+    //     "myapp": "path/to/myapp",  // self link is included
+    //   },
+    //   "input_files": [
+    //     "path/to/myapp/pubspec.lock"
+    //   ]
+    // }
+    Map<String, List<Folder>> packageMap = new HashMap<String, List<Folder>>();
+    Map obj = JSON.decode(jsonText);
+    Map packages = obj['packages'];
+    processPaths(String packageName, List paths) {
+      List<Folder> folders = <Folder>[];
+      for (var path in paths) {
+        if (path is String) {
+          Resource resource = folder.getChild(path);
+          if (resource is Folder) {
+            folders.add(resource);
+          }
+        }
+      }
+      if (folders.isNotEmpty) {
+        packageMap[packageName] = folders;
+      }
+    }
+    packages.forEach((key, value) {
+      if (value is String) {
+        processPaths(key, [value]);
+      } else if (value is List) {
+        processPaths(key, value);
+      }
+    });
+    Set<String> dependencies = new Set<String>();
+    List inputFiles = obj['input_files'];
+    if (inputFiles != null) {
+      for (var path in inputFiles) {
+        if (path is String) {
+          dependencies.add(folder.canonicalizePath(path));
+        }
+      }
+    }
+    return new PackageMapInfo(packageMap, dependencies);
+  }
+
+  /**
+   * Create a PackageMapInfo object representing an error condition.
+   */
+  PackageMapInfo _error(Folder folder) {
+    // Even if an error occurs, we still need to know the dependencies, so that
+    // we'll know when to try running "pub list-package-dirs" again.
+    // Unfortunately, "pub list-package-dirs" doesn't tell us dependencies when
+    // an error occurs, so just assume there is one dependency, "pubspec.lock".
+    List<String> dependencies = <String>[join(folder.path, PUBSPEC_LOCK_NAME)];
+    return new PackageMapInfo(null, dependencies.toSet());
+  }
+}
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index e66c5e1..7c82653 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -23,6 +23,7 @@
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/source/package_map_provider.dart';
+import 'package:analyzer/source/pub_package_map_provider.dart';
 
 /**
  * The maximum number of sources for which AST structures should be kept in the cache.
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 11a096b..a645a13 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -15701,6 +15701,8 @@
       return identical(this, parent.name);
     } else if (parent is FunctionTypeAlias) {
       return identical(this, parent.name);
+    } else if (parent is ImportDirective) {
+      return identical(this, parent.prefix);
     } else if (parent is Label) {
       return identical(this, parent.label) && (parent.parent is LabeledStatement);
     } else if (parent is MethodDeclaration) {
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index f5025e8..34f381d 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -11207,46 +11207,26 @@
 
   @override
   bool internalIsMoreSpecificThan(DartType type, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
-    // TODO(collinsn): what version of subtyping do we want?
+    // What version of subtyping do we want? See discussion below in [internalIsSubtypeOf].
     //
     // The more unsound version: any.
-    /*
-    for (Type t : types) {
-      if (((TypeImpl) t).internalIsMoreSpecificThan(type, withDynamic, visitedTypePairs)) {
+    for (DartType t in _types) {
+      if ((t as TypeImpl).internalIsMoreSpecificThan(type, withDynamic, visitedTypePairs)) {
         return true;
       }
     }
     return false;
-    */
-    // The less unsound version: all.
-    for (DartType t in _types) {
-      if (!(t as TypeImpl).internalIsMoreSpecificThan(type, withDynamic, visitedTypePairs)) {
-        return false;
-      }
-    }
-    return true;
   }
 
   @override
   bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) {
-    // TODO(collinsn): what version of subtyping do we want?
-    //
     // The more unsound version: any.
-    /*
-    for (Type t : types) {
-      if (((TypeImpl) t).internalIsSubtypeOf(type, visitedTypePairs)) {
+    for (DartType t in _types) {
+      if ((t as TypeImpl).internalIsSubtypeOf(type, visitedTypePairs)) {
         return true;
       }
     }
     return false;
-    */
-    // The less unsound version: all.
-    for (DartType t in _types) {
-      if (!(t as TypeImpl).internalIsSubtypeOf(type, visitedTypePairs)) {
-        return false;
-      }
-    }
-    return true;
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 3b64b51..79694a2 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -19336,9 +19336,24 @@
       return;
     }
     DartType currentType = _getBestType(element);
-    // If we aren't allowing precision loss then the third condition checks that we
+    // If we aren't allowing precision loss then the third and fourth conditions check that we
     // aren't losing precision.
-    if (currentType == null || allowPrecisionLoss || !currentType.isMoreSpecificThan(potentialType)) {
+    //
+    // Let [C] be the current type and [P] be the potential type.  When we aren't allowing
+    // precision loss -- which is the case for is-checks -- we check that [! (C << P)] or  [P << C].
+    // The second check, that [P << C], is analogous to part of the Dart Language Spec rule
+    // for type promotion under is-checks (in the analogy [T] is [P] and [S] is [C]):
+    //
+    //   An is-expression of the form [v is T] shows that [v] has type [T] iff [T] is more
+    //   specific than the type [S] of the expression [v] and both [T != dynamic] and
+    //   [S != dynamic].
+    //
+    // It also covers an important case that is not applicable in the spec: for union types, we
+    // want an is-check to promote from an union type to (a subtype of) any of its members.
+    //
+    // The first check, that [! (C << P)], covers the case where [P] and [C] are unrelated types;
+    // This case is not addressed in the spec for static types.
+    if (currentType == null || allowPrecisionLoss || !currentType.isMoreSpecificThan(potentialType) || potentialType.isMoreSpecificThan(currentType)) {
       if (element is PropertyInducingElement) {
         PropertyInducingElement variable = element;
         if (!variable.isConst && !variable.isFinal) {
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 1bbc2c2..d6c5951 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.23.0-dev.4
+version: 0.23.0-dev.6
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index ce60089..534196a 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -1281,6 +1281,11 @@
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
   }
 
+  void test_inDeclarationContext_prefix() {
+    SimpleIdentifier identifier = AstFactory.importDirective3("uri", "pref", []).prefix;
+    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+  }
+
   void test_inDeclarationContext_simpleFormalParameter() {
     SimpleIdentifier identifier = AstFactory.simpleFormalParameter3("p").identifier;
     JUnitTestCase.assertTrue(identifier.inDeclarationContext());
@@ -1494,6 +1499,10 @@
         final __test = new SimpleIdentifierTest();
         runJUnitTest(__test, __test.test_inDeclarationContext_methodDeclaration);
       });
+      _ut.test('test_inDeclarationContext_prefix', () {
+        final __test = new SimpleIdentifierTest();
+        runJUnitTest(__test, __test.test_inDeclarationContext_prefix);
+      });
       _ut.test('test_inDeclarationContext_simpleFormalParameter', () {
         final __test = new SimpleIdentifierTest();
         runJUnitTest(__test, __test.test_inDeclarationContext_simpleFormalParameter);
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index 62abc48..6a07214 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -4447,9 +4447,9 @@
   }
 
   void test_isMoreSpecificThan_someElementOnLHSIsNotASubtypeOfAnyElementOnRHS() {
-    // Unions are not subtypes when some element is not a subtype
-    JUnitTestCase.assertFalse(_uAB.isMoreSpecificThan(_uB));
-    JUnitTestCase.assertFalse(_uAB.isMoreSpecificThan(_typeB));
+    // Unions are subtypes when some element is a subtype
+    JUnitTestCase.assertTrue(_uAB.isMoreSpecificThan(_uB));
+    JUnitTestCase.assertTrue(_uAB.isMoreSpecificThan(_typeB));
   }
 
   void test_isMoreSpecificThan_subtypeOfSomeElement() {
@@ -4481,9 +4481,9 @@
   }
 
   void test_isSubtypeOf_someElementOnLHSIsNotASubtypeOfAnyElementOnRHS() {
-    // Unions are not subtypes when some element is not a subtype
-    JUnitTestCase.assertFalse(_uAB.isSubtypeOf(_uB));
-    JUnitTestCase.assertFalse(_uAB.isSubtypeOf(_typeB));
+    // Unions are subtypes when some element is a subtype
+    JUnitTestCase.assertTrue(_uAB.isSubtypeOf(_uB));
+    JUnitTestCase.assertTrue(_uAB.isSubtypeOf(_typeB));
   }
 
   void test_isSubtypeOf_subtypeOfSomeElement() {
diff --git a/pkg/analyzer/test/source/package_map_provider_test.dart b/pkg/analyzer/test/source/package_map_provider_test.dart
index bf941a2..839db68 100644
--- a/pkg/analyzer/test/source/package_map_provider_test.dart
+++ b/pkg/analyzer/test/source/package_map_provider_test.dart
@@ -7,6 +7,7 @@
 import 'dart:convert';
 
 import 'package:analyzer/source/package_map_provider.dart';
+import 'package:analyzer/source/pub_package_map_provider.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/generated/sdk_io.dart';
diff --git a/pkg/analyzer2dart/lib/src/identifier_semantics.dart b/pkg/analyzer2dart/lib/src/identifier_semantics.dart
new file mode 100644
index 0000000..692838e
--- /dev/null
+++ b/pkg/analyzer2dart/lib/src/identifier_semantics.dart
@@ -0,0 +1,420 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Code for classifying the semantics of identifiers appearing in a Dart file.
+ */
+library analyzer2dart.identifierSemantics;
+
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+/**
+ * Enum representing the different kinds of destinations which a property
+ * access or method or function invocation might refer to.
+ */
+class AccessKind {
+  /**
+   * The destination of the access is an instance method, property, or field
+   * of a class, and thus must be determined dynamically.
+   */
+  static const AccessKind DYNAMIC = const AccessKind._('DYNAMIC');
+
+  /**
+   * The destination of the access is a function that is defined locally within
+   * an enclosing function or method.
+   */
+  static const AccessKind LOCAL_FUNCTION = const AccessKind._('LOCAL_FUNCTION');
+
+  /**
+   * The destination of the access is a variable that is defined locally within
+   * an enclosing function or method.
+   */
+  static const AccessKind LOCAL_VARIABLE = const AccessKind._('LOCAL_VARIABLE');
+
+  /**
+   * The destination of the access is a variable that is defined as a parameter
+   * to an enclosing function or method.
+   */
+  static const AccessKind PARAMETER = const AccessKind._('PARAMETER');
+
+  /**
+   * The destination of the access is a field that is defined statically within
+   * a class, or a top level variable within a library.
+   */
+  static const AccessKind STATIC_FIELD = const AccessKind._('STATIC_FIELD');
+
+  /**
+   * The destination of the access is a method that is defined statically
+   * within a class, or at top level within a library.
+   */
+  static const AccessKind STATIC_METHOD = const AccessKind._('STATIC_METHOD');
+
+  /**
+   * The destination of the access is a property getter/setter that is defined
+   * statically within a class, or at top level within a library.
+   */
+  static const AccessKind STATIC_PROPERTY =
+      const AccessKind._('STATIC_PROPERTY');
+
+  final String name;
+
+  String toString() => name;
+
+  const AccessKind._(this.name);
+}
+
+/**
+ * Data structure used to classify the semantics of a property access or method
+ * or function invocation.
+ */
+class AccessSemantics {
+  /**
+   * The kind of access.
+   */
+  final AccessKind kind;
+
+  /**
+   * The identifier being used to access the property, method, or function.
+   */
+  final SimpleIdentifier identifier;
+
+  /**
+   * The element being accessed, if statically known.  This will be null if
+   * [kind] is DYNAMIC or if the element is undefined (e.g. an attempt to
+   * access a non-existent static method in a class).
+   */
+  final Element element;
+
+  /**
+   * The class containing the element being accessed, if this is a static
+   * reference to an element in a class.  This will be null if [kind] is
+   * DYNAMIC, LOCAL_FUNCTION, LOCAL_VARIABLE, or PARAMETER, or if the element
+   * being accessed is defined at toplevel within a library.
+   *
+   * Note: it is possible for [classElement] to be non-null and for [element]
+   * to be null; for example this occurs if the element being accessed is a
+   * non-existent static method or field inside an existing class.
+   */
+  final ClassElement classElement;
+
+  // TODO(paulberry): would it also be useful to store the libraryElement?
+
+  /**
+   * When [kind] is DYNAMIC, the expression whose runtime type determines the
+   * class in which [identifier] should be looked up.  Null if the expression
+   * is implicit "this".
+   *
+   * When [kind] is not DYNAMIC, this field is always null.
+   */
+  final Expression target;
+
+  /**
+   * True if this is an invocation of a method, or a call on a property.
+   */
+  final bool isInvoke;
+
+  AccessSemantics.dynamic(this.identifier, this.target, {this.isInvoke: false})
+      : kind = AccessKind.DYNAMIC,
+        element = null,
+        classElement = null;
+
+  AccessSemantics.localFunction(this.identifier, this.element, {this.isInvoke:
+      false})
+      : kind = AccessKind.LOCAL_FUNCTION,
+        classElement = null,
+        target = null;
+
+  AccessSemantics.localVariable(this.identifier, this.element, {this.isInvoke:
+      false})
+      : kind = AccessKind.LOCAL_VARIABLE,
+        classElement = null,
+        target = null;
+
+  AccessSemantics.parameter(this.identifier, this.element, {this.isInvoke:
+      false})
+      : kind = AccessKind.PARAMETER,
+        classElement = null,
+        target = null;
+
+  AccessSemantics.staticField(this.identifier, this.element, this.classElement,
+      {this.isInvoke: false})
+      : kind = AccessKind.STATIC_FIELD,
+        target = null;
+
+  AccessSemantics.staticMethod(this.identifier, this.element, this.classElement,
+      {this.isInvoke: false})
+      : kind = AccessKind.STATIC_METHOD,
+        target = null;
+
+  AccessSemantics.staticProperty(this.identifier, this.element,
+      this.classElement, {this.isInvoke: false})
+      : kind = AccessKind.STATIC_PROPERTY,
+        target = null;
+
+  /**
+   * True if this is a read access to a property, or a method tear-off.  Note
+   * that both [isRead] and [isWrite] will be true in the case of a
+   * read-modify-write operation (e.g. "+=").
+   */
+  bool get isRead => !isInvoke && identifier.inGetterContext();
+
+  /**
+   * True if this is a write access to a property, or an (erroneous) attempt to
+   * write to a method.  Note that both [isRead] and [isWrite] will be true in
+   * the case of a read-modify-write operation (e.g. "+=").
+   */
+  bool get isWrite => identifier.inSetterContext();
+}
+
+/**
+ * Return the semantics for [node].
+ */
+AccessSemantics classifyMethodInvocation(MethodInvocation node) {
+  Expression target = node.realTarget;
+  Element staticElement = node.methodName.staticElement;
+  if (target == null) {
+    if (staticElement is FunctionElement) {
+      if (staticElement.enclosingElement is CompilationUnitElement) {
+        return new AccessSemantics.staticMethod(
+            node.methodName,
+            staticElement,
+            null,
+            isInvoke: true);
+      } else {
+        return new AccessSemantics.localFunction(
+            node.methodName,
+            staticElement,
+            isInvoke: true);
+      }
+    } else if (staticElement is MethodElement && staticElement.isStatic) {
+      return new AccessSemantics.staticMethod(
+          node.methodName,
+          staticElement,
+          staticElement.enclosingElement,
+          isInvoke: true);
+    } else if (staticElement is PropertyAccessorElement) {
+      if (staticElement.isSynthetic) {
+        if (staticElement.enclosingElement is CompilationUnitElement) {
+          return new AccessSemantics.staticField(
+              node.methodName,
+              staticElement.variable,
+              null,
+              isInvoke: true);
+        } else if (staticElement.isStatic) {
+          return new AccessSemantics.staticField(
+              node.methodName,
+              staticElement.variable,
+              staticElement.enclosingElement,
+              isInvoke: true);
+        }
+      } else {
+        if (staticElement.enclosingElement is CompilationUnitElement) {
+          return new AccessSemantics.staticProperty(
+              node.methodName,
+              staticElement,
+              null,
+              isInvoke: true);
+        } else if (staticElement.isStatic) {
+          return new AccessSemantics.staticProperty(
+              node.methodName,
+              staticElement,
+              staticElement.enclosingElement,
+              isInvoke: true);
+        }
+      }
+    } else if (staticElement is LocalVariableElement) {
+      return new AccessSemantics.localVariable(
+          node.methodName,
+          staticElement,
+          isInvoke: true);
+    } else if (staticElement is ParameterElement) {
+      return new AccessSemantics.parameter(
+          node.methodName,
+          staticElement,
+          isInvoke: true);
+    }
+  } else if (target is Identifier) {
+    Element targetStaticElement = target.staticElement;
+    if (targetStaticElement is PrefixElement) {
+      if (staticElement == null) {
+        return new AccessSemantics.dynamic(
+            node.methodName,
+            null,
+            isInvoke: true);
+      } else if (staticElement is PropertyAccessorElement) {
+        if (staticElement.isSynthetic) {
+          return new AccessSemantics.staticField(
+              node.methodName,
+              staticElement.variable,
+              null,
+              isInvoke: true);
+        } else {
+          return new AccessSemantics.staticProperty(
+              node.methodName,
+              staticElement,
+              null,
+              isInvoke: true);
+        }
+      } else {
+        return new AccessSemantics.staticMethod(
+            node.methodName,
+            staticElement,
+            null,
+            isInvoke: true);
+      }
+    } else if (targetStaticElement is ClassElement) {
+      if (staticElement is PropertyAccessorElement) {
+        if (staticElement.isSynthetic) {
+          return new AccessSemantics.staticField(
+              node.methodName,
+              staticElement.variable,
+              targetStaticElement,
+              isInvoke: true);
+        } else {
+          return new AccessSemantics.staticProperty(
+              node.methodName,
+              staticElement,
+              targetStaticElement,
+              isInvoke: true);
+        }
+      } else {
+        return new AccessSemantics.staticMethod(
+            node.methodName,
+            staticElement,
+            targetStaticElement,
+            isInvoke: true);
+      }
+    }
+  }
+  return new AccessSemantics.dynamic(node.methodName, target, isInvoke: true);
+}
+
+/**
+ * Return the access semantics for [node].
+ */
+AccessSemantics classifyPrefixedIdentifier(PrefixedIdentifier node) {
+  return _classifyPrefixed(node.prefix, node.identifier);
+}
+
+/**
+ * Helper function for classifying an expression of type
+ * Identifier.SimpleIdentifier.
+ */
+AccessSemantics _classifyPrefixed(Identifier lhs, SimpleIdentifier rhs) {
+  Element lhsElement = lhs.staticElement;
+  Element rhsElement = rhs.staticElement;
+  if (lhsElement is PrefixElement) {
+    if (rhsElement is PropertyAccessorElement) {
+      if (rhsElement.isSynthetic) {
+        return new AccessSemantics.staticField(rhs, rhsElement.variable, null);
+      } else {
+        return new AccessSemantics.staticProperty(rhs, rhsElement, null);
+      }
+    } else if (rhsElement is FunctionElement) {
+      return new AccessSemantics.staticMethod(rhs, rhsElement, null);
+    } else {
+      return new AccessSemantics.dynamic(rhs, null);
+    }
+  } else if (lhsElement is ClassElement) {
+    if (rhsElement is PropertyAccessorElement && rhsElement.isSynthetic) {
+      return new AccessSemantics.staticField(
+          rhs,
+          rhsElement.variable,
+          lhsElement);
+    } else if (rhsElement is MethodElement) {
+      return new AccessSemantics.staticMethod(rhs, rhsElement, lhsElement);
+    } else {
+      return new AccessSemantics.staticProperty(rhs, rhsElement, lhsElement);
+    }
+  } else {
+    return new AccessSemantics.dynamic(rhs, lhs);
+  }
+}
+
+/**
+ * Return the access semantics for [node].
+ */
+AccessSemantics classifyPropertyAccess(PropertyAccess node) {
+  if (node.target is Identifier) {
+    return _classifyPrefixed(node.target, node.propertyName);
+  } else {
+    return new AccessSemantics.dynamic(node.propertyName, node.realTarget);
+  }
+}
+
+/**
+ * Return the access semantics for [node].
+ *
+ * Note: if [node] is the right hand side of a [PropertyAccess] or
+ * [PrefixedIdentifier], or the method name of a [MethodInvocation], the return
+ * value is null, since the semantics are determined by the parent.  In
+ * practice these cases should never arise because the parent will visit the
+ * parent node before visiting this one.
+ */
+AccessSemantics classifySimpleIdentifier(SimpleIdentifier node) {
+  AstNode parent = node.parent;
+  if (node.inDeclarationContext()) {
+    // This identifier is a declaration, not a use.
+    return null;
+  }
+  if (parent is TypeName) {
+    // TODO(paulberry): handle this case.  Or, perhaps it would be better to
+    // require clients not to visit the children of a TypeName when visiting
+    // the AST structure.
+    //
+    // TODO(paulberry): be sure to consider type literals, e.g.:
+    //   class A {}
+    //   var a = A;
+    return null;
+  }
+  if ((parent is PropertyAccess && parent.propertyName == node) ||
+      (parent is PrefixedIdentifier && parent.identifier == node) ||
+      (parent is MethodInvocation && parent.methodName == node)) {
+    // The access semantics are determined by the parent.
+    return null;
+  }
+  // TODO(paulberry): handle PrefixElement.
+  Element staticElement = node.staticElement;
+  if (staticElement is PropertyAccessorElement) {
+    if (staticElement.isSynthetic) {
+      if (staticElement.enclosingElement is CompilationUnitElement) {
+        return new AccessSemantics.staticField(
+            node,
+            staticElement.variable,
+            null);
+      } else if (staticElement.isStatic) {
+        return new AccessSemantics.staticField(
+            node,
+            staticElement.variable,
+            staticElement.enclosingElement);
+      }
+    } else {
+      if (staticElement.enclosingElement is CompilationUnitElement) {
+        return new AccessSemantics.staticProperty(node, staticElement, null);
+      } else if (staticElement.isStatic) {
+        return new AccessSemantics.staticProperty(
+            node,
+            staticElement,
+            staticElement.enclosingElement);
+      }
+    }
+  } else if (staticElement is LocalVariableElement) {
+    return new AccessSemantics.localVariable(node, staticElement);
+  } else if (staticElement is ParameterElement) {
+    return new AccessSemantics.parameter(node, staticElement);
+  } else if (staticElement is FunctionElement) {
+    if (staticElement.enclosingElement is CompilationUnitElement) {
+      return new AccessSemantics.staticMethod(node, staticElement, null);
+    } else {
+      return new AccessSemantics.localFunction(node, staticElement);
+    }
+  } else if (staticElement is MethodElement && staticElement.isStatic) {
+    return new AccessSemantics.staticMethod(
+        node,
+        staticElement,
+        staticElement.enclosingElement);
+  }
+  return new AccessSemantics.dynamic(node, null);
+}
diff --git a/pkg/analyzer2dart/lib/src/tree_shaker.dart b/pkg/analyzer2dart/lib/src/tree_shaker.dart
index 9cd8423..0ea41da 100644
--- a/pkg/analyzer2dart/lib/src/tree_shaker.dart
+++ b/pkg/analyzer2dart/lib/src/tree_shaker.dart
@@ -11,6 +11,7 @@
 import 'package:compiler/implementation/universe/universe.dart';
 
 import 'closed_world.dart';
+import 'package:analyzer2dart/src/identifier_semantics.dart';
 
 /**
  * The result of performing local reachability analysis on a method.
@@ -24,7 +25,7 @@
   /**
    * The functions statically called by the method.
    */
-  final List<LocalElement> calls = <LocalElement>[];
+  final List<ExecutableElement> calls = <ExecutableElement>[];
 
   /**
    * The selectors used by the method to perform dynamic invocation.
@@ -209,19 +210,6 @@
 
   TreeShakingVisitor(this.analysis);
 
-  /**
-   * Handle a true method call (a MethodInvocation that represents a call to
-   * a non-static method).
-   */
-  void handleMethodCall(MethodInvocation node) {
-    analysis.invokes.add(createSelectorFromMethodInvocation(node));
-  }
-
-  @override
-  void visitFunctionDeclaration(FunctionDeclaration node) {
-    super.visitFunctionDeclaration(node);
-  }
-
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorElement staticElement = node.staticElement;
@@ -240,110 +228,86 @@
 
   @override
   void visitMethodInvocation(MethodInvocation node) {
-    super.visitMethodInvocation(node);
-    Element staticElement = node.methodName.staticElement;
-    if (staticElement == null) {
-      if (node.realTarget != null) {
-        // Calling a method that has no known element, e.g.:
-        //   dynamic x;
-        //   x.foo();
-        handleMethodCall(node);
-      } else {
-        // Calling a toplevel function which has no known element, e.g.
-        //   main() {
-        //     foo();
-        //   }
-        // TODO(paulberry): deal with this case.  May need to notify the back
-        // end in case this makes it want to drag in some helper code.
-        throw new UnimplementedError();
-      }
-    } else if (staticElement is MethodElement) {
-      // Invoking a method, e.g.:
-      //   class A {
-      //     f() {}
-      //   }
-      //   main() {
-      //     new A().f();
-      //   }
-      // or via implicit this, i.e.:
-      //   class A {
-      //     f() {}
-      //     foo() {
-      //       f();
-      //     }
-      //   }
-      // TODO(paulberry): if user-provided types are wrong, this may actually
-      // be the PropertyAccessorElement case.
-      // TODO(paulberry): do we need to do something different for static
-      // methods?
-      handleMethodCall(node);
-    } else if (staticElement is PropertyAccessorElement) {
-      // Invoking a callable getter, e.g.:
-      //   typedef FunctionType();
-      //   class A {
-      //     FunctionType get f { ... }
-      //   }
-      //   main() {
-      //     new A().f();
-      //   }
-      // or via implicit this, i.e.:
-      //   typedef FunctionType();
-      //   class A {
-      //     FunctionType get f { ... }
-      //     foo() {
-      //       f();
-      //     }
-      //   }
-      // This also covers the case where the getter is synthetic, because we
-      // are getting a field (TODO(paulberry): verify that this is the case).
-      // TODO(paulberry): deal with this case.
-      // TODO(paulberry): if user-provided types are wrong, this may actually
-      // be the MethodElement case.
-      throw new UnimplementedError();
-    } else if (staticElement is MultiplyInheritedExecutableElement) {
-      // TODO(paulberry): deal with this case.
-      throw new UnimplementedError();
-    } else if (staticElement is LocalElement) {
-      // Invoking a callable local, e.g.:
-      //   typedef FunctionType();
-      //   main() {
-      //     FunctionType f = ...;
-      //     f();
-      //   }
-      // or:
-      //   main() {
-      //     f() { ... }
-      //     f();
-      //   }
-      // or:
-      //   f() {}
-      //   main() {
-      //     f();
-      //   }
-      // TODO(paulberry): for the moment we are assuming it's a toplevel
-      // function.
-      analysis.calls.add(staticElement);
-    } else if (staticElement is MultiplyDefinedElement) {
-      // TODO(paulberry): do we have to deal with this case?
-      throw new UnimplementedError();
+    if (node.target != null) {
+      node.target.accept(this);
     }
-    // TODO(paulberry): I believe all the other possibilities are errors, but
-    // we should double check.
+    node.argumentList.accept(this);
+    AccessSemantics semantics = classifyMethodInvocation(node);
+    switch (semantics.kind) {
+      case AccessKind.DYNAMIC:
+        analysis.invokes.add(createSelectorFromMethodInvocation(node));
+        break;
+      case AccessKind.LOCAL_FUNCTION:
+      case AccessKind.LOCAL_VARIABLE:
+      case AccessKind.PARAMETER:
+        // Locals don't need to be tree shaken.
+        break;
+      case AccessKind.STATIC_FIELD:
+        // Invocation of a field.  TODO(paulberry): handle this.
+        throw new UnimplementedError();
+      case AccessKind.STATIC_METHOD:
+        analysis.calls.add(semantics.element);
+        break;
+      case AccessKind.STATIC_PROPERTY:
+        // Invocation of a property.  TODO(paulberry): handle this.
+        throw new UnimplementedError();
+      default:
+        // Unexpected access kind.
+        throw new UnimplementedError();
+    }
   }
 
   @override
   void visitPropertyAccess(PropertyAccess node) {
-    // Accessing a getter or setter, e.g.:
-    //   class A {
-    //     get g() => ...;
-    //   }
-    //   main() {
-    //     new A().g;
-    //   }
-    // TODO(paulberry): do setters go through this path as well?
-    // TODO(paulberry): handle cases where the property access is represented
-    // as a PrefixedIdentifier.
-    super.visitPropertyAccess(node);
-    analysis.invokes.add(new Selector.getter(node.propertyName.name, null));
+    if (node.target != null) {
+      node.target.accept(this);
+    }
+    _handlePropertyAccess(classifyPropertyAccess(node));
+  }
+
+  @override
+  visitPrefixedIdentifier(PrefixedIdentifier node) {
+    node.prefix.accept(this);
+    _handlePropertyAccess(classifyPrefixedIdentifier(node));
+  }
+
+  @override
+  visitSimpleIdentifier(SimpleIdentifier node) {
+    AccessSemantics semantics = classifySimpleIdentifier(node);
+    if (semantics != null) {
+      _handlePropertyAccess(semantics);
+    }
+  }
+
+  void _handlePropertyAccess(AccessSemantics semantics) {
+    switch (semantics.kind) {
+      case AccessKind.DYNAMIC:
+        if (semantics.isRead) {
+          analysis.invokes.add(
+              new Selector.getter(semantics.identifier.name, null));
+        }
+        if (semantics.isWrite) {
+          // TODO(paulberry): implement.
+          throw new UnimplementedError();
+        }
+        break;
+      case AccessKind.LOCAL_FUNCTION:
+      case AccessKind.LOCAL_VARIABLE:
+      case AccessKind.PARAMETER:
+        // Locals don't need to be tree shaken.
+        break;
+      case AccessKind.STATIC_FIELD:
+        // TODO(paulberry): implement.
+        throw new UnimplementedError();
+      case AccessKind.STATIC_METHOD:
+        // Method tear-off.  TODO(paulberry): implement.
+        break;
+      case AccessKind.STATIC_PROPERTY:
+        // TODO(paulberry): implement.
+        throw new UnimplementedError();
+      default:
+        // Unexpected access kind.
+        throw new UnimplementedError();
+    }
   }
 }
diff --git a/pkg/analyzer2dart/test/identifier_semantics_test.dart b/pkg/analyzer2dart/test/identifier_semantics_test.dart
new file mode 100644
index 0000000..9d929c7
--- /dev/null
+++ b/pkg/analyzer2dart/test/identifier_semantics_test.dart
@@ -0,0 +1,2142 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:unittest/unittest.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'mock_sdk.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer2dart/src/identifier_semantics.dart';
+
+main() {
+  test('Call function defined at top level', () {
+    Helper helper = new Helper('''
+g() {}
+
+f() {
+  g();
+}
+''');
+    helper.checkStaticMethod('g()', null, 'g', true, isInvoke: true);
+  });
+
+  test('Call function defined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.g();
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+g() {}
+''');
+    helper.checkStaticMethod('l.g()', null, 'g', true, isInvoke: true);
+  });
+
+  test('Call method defined statically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  static g() {}
+
+  f() {
+    g();
+  }
+}
+''');
+    helper.checkStaticMethod('g()', 'A', 'g', true, isInvoke: true);
+  });
+
+  test('Call method defined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {
+  static g() {}
+}
+f() {
+  A.g();
+}
+''');
+    helper.checkStaticMethod('A.g()', 'A', 'g', true, isInvoke: true);
+  });
+
+  test(
+      'Call method defined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.A.g();
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {
+  static g() {}
+}
+''');
+    helper.checkStaticMethod('l.A.g()', 'A', 'g', true, isInvoke: true);
+  });
+
+  test('Call method defined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  g() {}
+
+  f() {
+    g();
+  }
+}
+''');
+    helper.checkDynamic('g()', null, 'g', isInvoke: true);
+  });
+
+  test(
+      'Call method defined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {
+  g() {}
+}
+f(A a) {
+  a.g();
+}
+''');
+    helper.checkDynamic('a.g()', 'a', 'g', isInvoke: true);
+  });
+
+  test(
+      'Call method defined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {
+  g() {}
+}
+A h() => null;
+f() {
+  h().g();
+}
+''');
+    helper.checkDynamic('h().g()', 'h()', 'g', isInvoke: true);
+  });
+
+  test(
+      'Call method defined dynamically in class from outside class via dynamic var',
+      () {
+    Helper helper = new Helper('''
+f(a) {
+  a.g();
+}
+''');
+    helper.checkDynamic('a.g()', 'a', 'g', isInvoke: true);
+  });
+
+  test(
+      'Call method defined dynamically in class from outside class via dynamic expression',
+      () {
+    Helper helper = new Helper('''
+h() => null;
+f() {
+  h().g();
+}
+''');
+    helper.checkDynamic('h().g()', 'h()', 'g', isInvoke: true);
+  });
+
+  test('Call method defined locally', () {
+    Helper helper = new Helper('''
+f() {
+  g() {}
+  g();
+}
+''');
+    helper.checkLocalFunction('g()', 'g', isInvoke: true);
+  });
+
+  test('Call method undefined at top level', () {
+    Helper helper = new Helper('''
+f() {
+  g();
+}
+''');
+    // Undefined top level invocations are treated as dynamic.
+    // TODO(paulberry): not sure if this is a good idea.  In general, when such
+    // a call appears inside an instance method, it is dynamic, because "this"
+    // might be an instance of a derived class that implements g().  However,
+    // in this case, we are not inside an instance method, so we know that the
+    // target is undefined.
+    helper.checkDynamic('g()', null, 'g', isInvoke: true);
+  });
+
+  test('Call method undefined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.g();
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+''');
+    // Undefined top level invocations are treated as dynamic.
+    // TODO(paulberry): not sure if this is a good idea, for similar reasons to
+    // the case above.
+    helper.checkDynamic('l.g()', null, 'g', isInvoke: true);
+  });
+
+  test('Call method undefined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {}
+
+f() {
+  A.g();
+}
+''');
+    helper.checkStaticMethod('A.g()', 'A', 'g', false, isInvoke: true);
+  });
+
+  test(
+      'Call method undefined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.A.g();
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {}
+''');
+    helper.checkStaticMethod('l.A.g()', 'A', 'g', false, isInvoke: true);
+  });
+
+  test('Call method undefined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  f() {
+    g();
+  }
+}
+''');
+    helper.checkDynamic('g()', null, 'g', isInvoke: true);
+  });
+
+  test(
+      'Call method undefined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {}
+
+f(A a) {
+  a.g();
+}
+''');
+    helper.checkDynamic('a.g()', 'a', 'g', isInvoke: true);
+  });
+
+  test(
+      'Call method undefined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {}
+
+A h() => null;
+
+f() {
+  h().g();
+}
+''');
+    helper.checkDynamic('h().g()', 'h()', 'g', isInvoke: true);
+  });
+
+  test('Call variable defined at top level', () {
+    Helper helper = new Helper('''
+var x;
+
+f() {
+  x();
+}
+''');
+    helper.checkStaticField('x()', null, 'x', isInvoke: true);
+  });
+
+  test('Call variable defined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  return l.x();
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+var x;
+''');
+    helper.checkStaticField('l.x()', null, 'x', isInvoke: true);
+  });
+
+  test('Call field defined statically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  static var x;
+
+  f() {
+    return x();
+  }
+}
+''');
+    helper.checkStaticField('x()', 'A', 'x', isInvoke: true);
+  });
+
+  test('Call field defined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {
+  static var x;
+}
+
+f() {
+  return A.x();
+}
+''');
+    helper.checkStaticField('A.x()', 'A', 'x', isInvoke: true);
+  });
+
+  test(
+      'Call field defined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  return l.A.x();
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {
+  static var x;
+}
+''');
+    helper.checkStaticField('l.A.x()', 'A', 'x', isInvoke: true);
+  });
+
+  test('Call field defined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+
+  f() {
+    return x();
+  }
+}
+''');
+    helper.checkDynamic('x()', null, 'x', isInvoke: true);
+  });
+
+  test(
+      'Call field defined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+}
+
+f(A a) {
+  return a.x();
+}
+''');
+    helper.checkDynamic('a.x()', 'a', 'x', isInvoke: true);
+  });
+
+  test(
+      'Call field defined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+}
+
+A h() => null;
+
+f() {
+  return h().x();
+}
+''');
+    helper.checkDynamic('h().x()', 'h()', 'x', isInvoke: true);
+  });
+
+  test(
+      'Call field defined dynamically in class from outside class via dynamic var',
+      () {
+    Helper helper = new Helper('''
+f(a) {
+  return a.x();
+}
+''');
+    helper.checkDynamic('a.x()', 'a', 'x', isInvoke: true);
+  });
+
+  test(
+      'Call field defined dynamically in class from outside class via dynamic expression',
+      () {
+    Helper helper = new Helper('''
+h() => null;
+
+f() {
+  return h().x();
+}
+''');
+    helper.checkDynamic('h().x()', 'h()', 'x', isInvoke: true);
+  });
+
+  test('Call variable defined locally', () {
+    Helper helper = new Helper('''
+f() {
+  var x;
+  return x();
+}
+''');
+    helper.checkLocalVariable('x()', 'x', isInvoke: true);
+  });
+
+  test('Call variable defined in parameter', () {
+    Helper helper = new Helper('''
+f(x) {
+  return x();
+}
+''');
+    helper.checkParameter('x()', 'x', isInvoke: true);
+  });
+
+  test('Call accessor defined at top level', () {
+    Helper helper = new Helper('''
+get x => null;
+
+f() {
+  return x();
+}
+''');
+    helper.checkStaticProperty('x()', null, 'x', true, isInvoke: true);
+  });
+
+  test('Call accessor defined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  return l.x();
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+get x => null;
+''');
+    helper.checkStaticProperty('l.x()', null, 'x', true, isInvoke: true);
+  });
+
+  test('Call accessor defined statically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  static get x => null;
+
+  f() {
+    return x();
+  }
+}
+''');
+    helper.checkStaticProperty('x()', 'A', 'x', true, isInvoke: true);
+  });
+
+  test('Call accessor defined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {
+  static get x => null;
+}
+
+f() {
+  return A.x();
+}
+''');
+    helper.checkStaticProperty('A.x()', 'A', 'x', true, isInvoke: true);
+  });
+
+  test(
+      'Call accessor defined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  return l.A.x();
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {
+  static get x => null;
+}
+''');
+    helper.checkStaticProperty('l.A.x()', 'A', 'x', true, isInvoke: true);
+  });
+
+  test('Call accessor defined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  get x => null;
+
+  f() {
+    return x();
+  }
+}
+''');
+    helper.checkDynamic('x()', null, 'x', isInvoke: true);
+  });
+
+  test(
+      'Call accessor defined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {
+  get x => null;
+}
+
+f(A a) {
+  return a.x();
+}
+''');
+    helper.checkDynamic('a.x()', 'a', 'x', isInvoke: true);
+  });
+
+  test(
+      'Call accessor defined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {
+  get x => null;
+}
+
+A h() => null;
+
+f() {
+  return h().x();
+}
+''');
+    helper.checkDynamic('h().x()', 'h()', 'x', isInvoke: true);
+  });
+
+  test(
+      'Call accessor defined dynamically in class from outside class via dynamic var',
+      () {
+    Helper helper = new Helper('''
+f(a) {
+  return a.x();
+}
+''');
+    helper.checkDynamic('a.x()', 'a', 'x', isInvoke: true);
+  });
+
+  test(
+      'Call accessor defined dynamically in class from outside class via dynamic expression',
+      () {
+    Helper helper = new Helper('''
+h() => null;
+
+f() {
+  return h().x();
+}
+''');
+    helper.checkDynamic('h().x()', 'h()', 'x', isInvoke: true);
+  });
+
+  test('Get function defined at top level', () {
+    Helper helper = new Helper('''
+g() {}
+
+f() {
+  return g;
+}
+''');
+    helper.checkStaticMethod('g', null, 'g', true, isRead: true);
+  });
+
+  test('Get function defined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  return l.g;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+g() {}
+''');
+    helper.checkStaticMethod('l.g', null, 'g', true, isRead: true);
+  });
+
+  test('Get method defined statically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  static g() {}
+
+  f() {
+    return g;
+  }
+}
+''');
+    helper.checkStaticMethod('g', 'A', 'g', true, isRead: true);
+  });
+
+  test('Get method defined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {
+  static g() {}
+}
+f() {
+  return A.g;
+}
+''');
+    helper.checkStaticMethod('A.g', 'A', 'g', true, isRead: true);
+  });
+
+  test(
+      'Get method defined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  return l.A.g;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {
+  static g() {}
+}
+''');
+    helper.checkStaticMethod('l.A.g', 'A', 'g', true, isRead: true);
+  });
+
+  test('Get method defined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  g() {}
+
+  f() {
+    return g;
+  }
+}
+''');
+    helper.checkDynamic('g', null, 'g', isRead: true);
+  });
+
+  test(
+      'Get method defined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {
+  g() {}
+}
+f(A a) {
+  return a.g;
+}
+''');
+    helper.checkDynamic('a.g', 'a', 'g', isRead: true);
+  });
+
+  test(
+      'Get method defined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {
+  g() {}
+}
+A h() => null;
+f() {
+  return h().g;
+}
+''');
+    helper.checkDynamic('h().g', 'h()', 'g', isRead: true);
+  });
+
+  test('Get method defined locally', () {
+    Helper helper = new Helper('''
+f() {
+  g() {}
+  return g;
+}
+''');
+    helper.checkLocalFunction('g', 'g', isRead: true);
+  });
+
+  test('Get variable defined at top level', () {
+    Helper helper = new Helper('''
+var x;
+
+f() {
+  return x;
+}
+''');
+    helper.checkStaticField('x', null, 'x', isRead: true);
+  });
+
+  test('Get variable defined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  return l.x;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+var x;
+''');
+    helper.checkStaticField('l.x', null, 'x', isRead: true);
+  });
+
+  test('Get field defined statically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  static var x;
+
+  f() {
+    return x;
+  }
+}
+''');
+    helper.checkStaticField('x', 'A', 'x', isRead: true);
+  });
+
+  test('Get field defined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {
+  static var x;
+}
+
+f() {
+  return A.x;
+}
+''');
+    helper.checkStaticField('A.x', 'A', 'x', isRead: true);
+  });
+
+  test(
+      'Get field defined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  return l.A.x;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {
+  static var x;
+}
+''');
+    helper.checkStaticField('l.A.x', 'A', 'x', isRead: true);
+  });
+
+  test('Get field defined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+
+  f() {
+    return x;
+  }
+}
+''');
+    helper.checkDynamic('x', null, 'x', isRead: true);
+  });
+
+  test(
+      'Get field defined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+}
+
+f(A a) {
+  return a.x;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isRead: true);
+  });
+
+  test(
+      'Get field defined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+}
+
+A h() => null;
+
+f() {
+  return h().x;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isRead: true);
+  });
+
+  test(
+      'Get field defined dynamically in class from outside class via dynamic var',
+      () {
+    Helper helper = new Helper('''
+f(a) {
+  return a.x;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isRead: true);
+  });
+
+  test(
+      'Get field defined dynamically in class from outside class via dynamic expression',
+      () {
+    Helper helper = new Helper('''
+h() => null;
+
+f() {
+  return h().x;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isRead: true);
+  });
+
+  test('Get variable defined locally', () {
+    Helper helper = new Helper('''
+f() {
+  var x;
+  return x;
+}
+''');
+    helper.checkLocalVariable('x', 'x', isRead: true);
+  });
+
+  test('Get variable defined in parameter', () {
+    Helper helper = new Helper('''
+f(x) {
+  return x;
+}
+''');
+    helper.checkParameter('x', 'x', isRead: true);
+  });
+
+  test('Get accessor defined at top level', () {
+    Helper helper = new Helper('''
+get x => null;
+
+f() {
+  return x;
+}
+''');
+    helper.checkStaticProperty('x', null, 'x', true, isRead: true);
+  });
+
+  test('Get accessor defined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  return l.x;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+get x => null;
+''');
+    helper.checkStaticProperty('l.x', null, 'x', true, isRead: true);
+  });
+
+  test('Get accessor defined statically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  static get x => null;
+
+  f() {
+    return x;
+  }
+}
+''');
+    helper.checkStaticProperty('x', 'A', 'x', true, isRead: true);
+  });
+
+  test('Get accessor defined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {
+  static get x => null;
+}
+
+f() {
+  return A.x;
+}
+''');
+    helper.checkStaticProperty('A.x', 'A', 'x', true, isRead: true);
+  });
+
+  test(
+      'Get accessor defined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  return l.A.x;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {
+  static get x => null;
+}
+''');
+    helper.checkStaticProperty('l.A.x', 'A', 'x', true, isRead: true);
+  });
+
+  test('Get accessor defined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  get x => null;
+
+  f() {
+    return x;
+  }
+}
+''');
+    helper.checkDynamic('x', null, 'x', isRead: true);
+  });
+
+  test(
+      'Get accessor defined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {
+  get x => null;
+}
+
+f(A a) {
+  return a.x;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isRead: true);
+  });
+
+  test(
+      'Get accessor defined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {
+  get x => null;
+}
+
+A h() => null;
+
+f() {
+  return h().x;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isRead: true);
+  });
+
+  test(
+      'Get accessor defined dynamically in class from outside class via dynamic var',
+      () {
+    Helper helper = new Helper('''
+f(a) {
+  return a.x;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isRead: true);
+  });
+
+  test(
+      'Get accessor defined dynamically in class from outside class via dynamic expression',
+      () {
+    Helper helper = new Helper('''
+h() => null;
+
+f() {
+  return h().x;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isRead: true);
+  });
+
+  test('Get accessor undefined at top level', () {
+    Helper helper = new Helper('''
+f() {
+  return x;
+}
+''');
+    // Undefined top level property accesses are treated as dynamic.
+    // TODO(paulberry): not sure if this is a good idea.  In general, when such
+    // an access appears inside an instance method, it is dynamic, because
+    // "this" might be an instance of a derived class that implements x.
+    // However, in this case, we are not inside an instance method, so we know
+    // that the target is undefined.
+    helper.checkDynamic('x', null, 'x', isRead: true);
+  });
+
+  test('Get accessor undefined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  return l.x;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+''');
+    // Undefined top level property accesses are treated as dynamic.
+    // TODO(paulberry): not sure if this is a good idea, for similar reasons to
+    // the case above.
+    helper.checkDynamic('l.x', null, 'x', isRead: true);
+  });
+
+  test('Get accessor undefined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {}
+
+f() {
+  return A.x;
+}
+''');
+    helper.checkStaticProperty('A.x', 'A', 'x', false, isRead: true);
+  });
+
+  test(
+      'Get accessor undefined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  return l.A.x;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {}
+''');
+    helper.checkStaticProperty('l.A.x', 'A', 'x', false, isRead: true);
+  });
+
+  test('Get accessor undefined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  f() {
+    return x;
+  }
+}
+''');
+    helper.checkDynamic('x', null, 'x', isRead: true);
+  });
+
+  test(
+      'Get accessor undefined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {}
+
+f(A a) {
+  return a.x;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isRead: true);
+  });
+
+  test(
+      'Get accessor undefined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {}
+
+A h() => null;
+
+f() {
+  return h().x;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isRead: true);
+  });
+
+  test('Set variable defined at top level', () {
+    Helper helper = new Helper('''
+var x;
+
+f() {
+  x = 1;
+}
+''');
+    helper.checkStaticField('x', null, 'x', isWrite: true);
+  });
+
+  test('Set variable defined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.x = 1;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+var x;
+''');
+    helper.checkStaticField('l.x', null, 'x', isWrite: true);
+  });
+
+  test('Set field defined statically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  static var x;
+
+  f() {
+    x = 1;
+  }
+}
+''');
+    helper.checkStaticField('x', 'A', 'x', isWrite: true);
+  });
+
+  test('Set field defined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {
+  static var x;
+}
+
+f() {
+  A.x = 1;
+}
+''');
+    helper.checkStaticField('A.x', 'A', 'x', isWrite: true);
+  });
+
+  test(
+      'Set field defined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.A.x = 1;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {
+  static var x;
+}
+''');
+    helper.checkStaticField('l.A.x', 'A', 'x', isWrite: true);
+  });
+
+  test('Set field defined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+
+  f() {
+    x = 1;
+  }
+}
+''');
+    helper.checkDynamic('x', null, 'x', isWrite: true);
+  });
+
+  test(
+      'Set field defined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+}
+
+f(A a) {
+  a.x = 1;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isWrite: true);
+  });
+
+  test(
+      'Set field defined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+}
+
+A h() => null;
+
+f() {
+  h().x = 1;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isWrite: true);
+  });
+
+  test('Set variable defined locally', () {
+    Helper helper = new Helper('''
+f() {
+  var x;
+  x = 1;
+}
+''');
+    helper.checkLocalVariable('x', 'x', isWrite: true);
+  });
+
+  test('Set variable defined in parameter', () {
+    Helper helper = new Helper('''
+f(x) {
+  x = 1;
+}
+''');
+    helper.checkParameter('x', 'x', isWrite: true);
+  });
+
+  test('Set accessor defined at top level', () {
+    Helper helper = new Helper('''
+set x(value) {};
+
+f() {
+  x = 1;
+}
+''');
+    helper.checkStaticProperty('x', null, 'x', true, isWrite: true);
+  });
+
+  test('Set accessor defined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.x = 1;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+set x(value) {};
+''');
+    helper.checkStaticProperty('l.x', null, 'x', true, isWrite: true);
+  });
+
+  test('Set accessor defined statically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  static set x(value) {}
+
+  f() {
+    x = 1;
+  }
+}
+''');
+    helper.checkStaticProperty('x', 'A', 'x', true, isWrite: true);
+  });
+
+  test('Set accessor defined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {
+  static set x(value) {}
+}
+
+f() {
+  A.x = 1;
+}
+''');
+    helper.checkStaticProperty('A.x', 'A', 'x', true, isWrite: true);
+  });
+
+  test(
+      'Set accessor defined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.A.x = 1;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {
+  static set x(value) {}
+}
+''');
+    helper.checkStaticProperty('l.A.x', 'A', 'x', true, isWrite: true);
+  });
+
+  test('Set accessor defined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  set x(value) {}
+
+  f() {
+    x = 1;
+  }
+}
+''');
+    helper.checkDynamic('x', null, 'x', isWrite: true);
+  });
+
+  test(
+      'Set accessor defined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {
+  set x(value) {}
+}
+
+f(A a) {
+  a.x = 1;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isWrite: true);
+  });
+
+  test(
+      'Set accessor defined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {
+  set x(value) {}
+}
+
+A h() => null;
+
+f() {
+  h().x = 1;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isWrite: true);
+  });
+
+  test(
+      'Set accessor defined dynamically in class from outside class via dynamic var',
+      () {
+    Helper helper = new Helper('''
+f(a) {
+  a.x = 1;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isWrite: true);
+  });
+
+  test(
+      'Set accessor defined dynamically in class from outside class via dynamic expression',
+      () {
+    Helper helper = new Helper('''
+h() => null;
+
+f() {
+  h().x = 1;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isWrite: true);
+  });
+
+  test('Set accessor undefined at top level', () {
+    Helper helper = new Helper('''
+f() {
+  x = 1;
+}
+''');
+    helper.checkDynamic('x', null, 'x', isWrite: true);
+  });
+
+  test('Set accessor undefined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.x = 1;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+''');
+    helper.checkDynamic('l.x', null, 'x', isWrite: true);
+  });
+
+  test('Set accessor undefined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {}
+
+f() {
+  A.x = 1;
+}
+''');
+    helper.checkStaticProperty('A.x', 'A', 'x', false, isWrite: true);
+  });
+
+  test(
+      'Set accessor undefined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.A.x = 1;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {}
+''');
+    helper.checkStaticProperty('l.A.x', 'A', 'x', false, isWrite: true);
+  });
+
+  test('Set accessor undefined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  f() {
+    x = 1;
+  }
+}
+''');
+    helper.checkDynamic('x', null, 'x', isWrite: true);
+  });
+
+  test(
+      'Set accessor undefined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {}
+
+f(A a) {
+  a.x = 1;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isWrite: true);
+  });
+
+  test(
+      'Set accessor undefined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {}
+
+A h() => null;
+
+f() {
+  h().x = 1;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isWrite: true);
+  });
+
+  test('RMW variable defined at top level', () {
+    Helper helper = new Helper('''
+var x;
+
+f() {
+  x += 1;
+}
+''');
+    helper.checkStaticField('x', null, 'x', isRead: true, isWrite: true);
+  });
+
+  test('RMW variable defined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.x += 1;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+var x;
+''');
+    helper.checkStaticField('l.x', null, 'x', isRead: true, isWrite: true);
+  });
+
+  test('RMW field defined statically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  static var x;
+
+  f() {
+    x += 1;
+  }
+}
+''');
+    helper.checkStaticField('x', 'A', 'x', isRead: true, isWrite: true);
+  });
+
+  test('RMW field defined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {
+  static var x;
+}
+
+f() {
+  A.x += 1;
+}
+''');
+    helper.checkStaticField('A.x', 'A', 'x', isRead: true, isWrite: true);
+  });
+
+  test(
+      'RMW field defined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.A.x += 1;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {
+  static var x;
+}
+''');
+    helper.checkStaticField('l.A.x', 'A', 'x', isRead: true, isWrite: true);
+  });
+
+  test('RMW field defined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+
+  f() {
+    x += 1;
+  }
+}
+''');
+    helper.checkDynamic('x', null, 'x', isRead: true, isWrite: true);
+  });
+
+  test(
+      'RMW field defined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+}
+
+f(A a) {
+  a.x += 1;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isRead: true, isWrite: true);
+  });
+
+  test(
+      'RMW field defined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {
+  var x;
+}
+
+A h() => null;
+
+f() {
+  h().x += 1;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isRead: true, isWrite: true);
+  });
+
+  test('RMW variable defined locally', () {
+    Helper helper = new Helper('''
+f() {
+  var x;
+  x += 1;
+}
+''');
+    helper.checkLocalVariable('x', 'x', isRead: true, isWrite: true);
+  });
+
+  test('RMW variable defined in parameter', () {
+    Helper helper = new Helper('''
+f(x) {
+  x += 1;
+}
+''');
+    helper.checkParameter('x', 'x', isRead: true, isWrite: true);
+  });
+
+  test('RMW accessor defined at top level', () {
+    Helper helper = new Helper('''
+set x(value) {};
+
+f() {
+  x += 1;
+}
+''');
+    helper.checkStaticProperty(
+        'x',
+        null,
+        'x',
+        true,
+        isRead: true,
+        isWrite: true);
+  });
+
+  test('RMW accessor defined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.x += 1;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+set x(value) {};
+''');
+    helper.checkStaticProperty(
+        'l.x',
+        null,
+        'x',
+        true,
+        isRead: true,
+        isWrite: true);
+  });
+
+  test('RMW accessor defined statically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  static set x(value) {}
+
+  f() {
+    x += 1;
+  }
+}
+''');
+    helper.checkStaticProperty(
+        'x',
+        'A',
+        'x',
+        true,
+        isRead: true,
+        isWrite: true);
+  });
+
+  test('RMW accessor defined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {
+  static set x(value) {}
+}
+
+f() {
+  A.x += 1;
+}
+''');
+    helper.checkStaticProperty(
+        'A.x',
+        'A',
+        'x',
+        true,
+        isRead: true,
+        isWrite: true);
+  });
+
+  test(
+      'RMW accessor defined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.A.x += 1;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {
+  static set x(value) {}
+}
+''');
+    helper.checkStaticProperty(
+        'l.A.x',
+        'A',
+        'x',
+        true,
+        isRead: true,
+        isWrite: true);
+  });
+
+  test('RMW accessor defined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  set x(value) {}
+
+  f() {
+    x += 1;
+  }
+}
+''');
+    helper.checkDynamic('x', null, 'x', isRead: true, isWrite: true);
+  });
+
+  test(
+      'RMW accessor defined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {
+  set x(value) {}
+}
+
+f(A a) {
+  a.x += 1;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isRead: true, isWrite: true);
+  });
+
+  test(
+      'RMW accessor defined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {
+  set x(value) {}
+}
+
+A h() => null;
+
+f() {
+  h().x += 1;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isRead: true, isWrite: true);
+  });
+
+  test(
+      'RMW accessor defined dynamically in class from outside class via dynamic var',
+      () {
+    Helper helper = new Helper('''
+f(a) {
+  a.x += 1;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isRead: true, isWrite: true);
+  });
+
+  test(
+      'RMW accessor defined dynamically in class from outside class via dynamic expression',
+      () {
+    Helper helper = new Helper('''
+h() => null;
+
+f() {
+  h().x += 1;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isRead: true, isWrite: true);
+  });
+
+  test('RMW accessor undefined at top level', () {
+    Helper helper = new Helper('''
+f() {
+  x += 1;
+}
+''');
+    helper.checkDynamic('x', null, 'x', isRead: true, isWrite: true);
+  });
+
+  test('RMW accessor undefined at top level via prefix', () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.x += 1;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+''');
+    helper.checkDynamic('l.x', null, 'x', isRead: true, isWrite: true);
+  });
+
+  test('RMW accessor undefined statically in class from outside class', () {
+    Helper helper = new Helper('''
+class A {}
+
+f() {
+  A.x += 1;
+}
+''');
+    helper.checkStaticProperty(
+        'A.x',
+        'A',
+        'x',
+        false,
+        isRead: true,
+        isWrite: true);
+  });
+
+  test(
+      'RMW accessor undefined statically in class from outside class via prefix',
+      () {
+    Helper helper = new Helper('''
+import 'lib.dart' as l;
+
+f() {
+  l.A.x += 1;
+}
+''');
+    helper.addFile('/lib.dart', '''
+library lib;
+
+class A {}
+''');
+    helper.checkStaticProperty(
+        'l.A.x',
+        'A',
+        'x',
+        false,
+        isRead: true,
+        isWrite: true);
+  });
+
+  test('RMW accessor undefined dynamically in class from inside class', () {
+    Helper helper = new Helper('''
+class A {
+  f() {
+    x += 1;
+  }
+}
+''');
+    helper.checkDynamic('x', null, 'x', isRead: true, isWrite: true);
+  });
+
+  test(
+      'RMW accessor undefined dynamically in class from outside class via typed var',
+      () {
+    Helper helper = new Helper('''
+class A {}
+
+f(A a) {
+  a.x += 1;
+}
+''');
+    helper.checkDynamic('a.x', 'a', 'x', isRead: true, isWrite: true);
+  });
+
+  test(
+      'RMW accessor undefined dynamically in class from outside class via typed expression',
+      () {
+    Helper helper = new Helper('''
+class A {}
+
+A h() => null;
+
+f() {
+  h().x += 1;
+}
+''');
+    helper.checkDynamic('h().x', 'h()', 'x', isRead: true, isWrite: true);
+  });
+}
+
+class Helper {
+  final MemoryResourceProvider provider = new MemoryResourceProvider();
+  Source rootSource;
+  AnalysisContext context;
+
+  Helper(String rootContents) {
+    DartSdk sdk = new MockSdk();
+    String rootFile = '/root.dart';
+    File file = provider.newFile(rootFile, rootContents);
+    rootSource = file.createSource();
+    context = AnalysisEngine.instance.createAnalysisContext();
+    // Set up the source factory.
+    List<UriResolver> uriResolvers = [
+        new ResourceUriResolver(provider),
+        new DartUriResolver(sdk)];
+    context.sourceFactory = new SourceFactory(uriResolvers);
+    // add the Source
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(rootSource);
+    context.applyChanges(changeSet);
+  }
+
+  void addFile(String path, String contents) {
+    provider.newFile(path, contents);
+  }
+
+  LibraryElement get libraryElement {
+    return context.computeLibraryElement(rootSource);
+  }
+
+  /**
+   * Verify that the node represented by [expectedSource] is classified as
+   * a static field element reference.
+   */
+  void checkStaticField(String expectedSource, String expectedClass,
+      String expectedName, {bool isRead: false, bool isWrite: false, bool isInvoke:
+      false}) {
+    TestVisitor visitor = new TestVisitor();
+    int count = 0;
+    visitor.onAccess = (Expression node, AccessSemantics semantics) {
+      count++;
+      expect(node.toSource(), equals(expectedSource));
+      expect(semantics.kind, equals(AccessKind.STATIC_FIELD));
+      expect(semantics.identifier.name, equals(expectedName));
+      expect(semantics.element.displayName, equals(expectedName));
+      if (expectedClass == null) {
+        expect(semantics.classElement, isNull);
+      } else {
+        expect(semantics.classElement, isNotNull);
+        expect(semantics.classElement.displayName, equals(expectedClass));
+      }
+      expect(semantics.target, isNull);
+      expect(semantics.isRead, equals(isRead));
+      expect(semantics.isWrite, equals(isWrite));
+      expect(semantics.isInvoke, equals(isInvoke));
+    };
+    libraryElement.unit.accept(visitor);
+    expect(count, equals(1));
+  }
+
+  /**
+   * Verify that the node represented by [expectedSource] is classified as
+   * a static property access.
+   */
+  void checkStaticProperty(String expectedSource, String expectedClass,
+      String expectedName, bool defined, {bool isRead: false, bool isWrite: false,
+      bool isInvoke: false}) {
+    TestVisitor visitor = new TestVisitor();
+    int count = 0;
+    visitor.onAccess = (Expression node, AccessSemantics semantics) {
+      count++;
+      expect(node.toSource(), equals(expectedSource));
+      expect(semantics.kind, equals(AccessKind.STATIC_PROPERTY));
+      expect(semantics.identifier.name, equals(expectedName));
+      if (expectedClass == null) {
+        expect(semantics.classElement, isNull);
+      } else {
+        expect(semantics.classElement, isNotNull);
+        expect(semantics.classElement.displayName, equals(expectedClass));
+      }
+      if (defined) {
+        expect(semantics.element.displayName, equals(expectedName));
+      } else {
+        expect(semantics.element, isNull);
+      }
+      expect(semantics.target, isNull);
+      expect(semantics.isRead, equals(isRead));
+      expect(semantics.isWrite, equals(isWrite));
+      expect(semantics.isInvoke, equals(isInvoke));
+    };
+    libraryElement.unit.accept(visitor);
+    expect(count, equals(1));
+  }
+
+  /**
+   * Verify that the node represented by [expectedSource] is classified as
+   * a static method.
+   */
+  void checkStaticMethod(String expectedSource, String expectedClass,
+      String expectedName, bool defined, {bool isRead: false, bool isWrite: false,
+      bool isInvoke: false}) {
+    TestVisitor visitor = new TestVisitor();
+    int count = 0;
+    visitor.onAccess = (AstNode node, AccessSemantics semantics) {
+      count++;
+      expect(node.toSource(), equals(expectedSource));
+      expect(semantics.kind, equals(AccessKind.STATIC_METHOD));
+      expect(semantics.identifier.name, equals(expectedName));
+      if (expectedClass == null) {
+        expect(semantics.classElement, isNull);
+        if (defined) {
+          expect(semantics.element, new isInstanceOf<FunctionElement>());
+        }
+      } else {
+        expect(semantics.classElement, isNotNull);
+        expect(semantics.classElement.displayName, equals(expectedClass));
+        if (defined) {
+          expect(semantics.element, new isInstanceOf<MethodElement>());
+        }
+      }
+      if (defined) {
+        expect(semantics.element.displayName, equals(expectedName));
+      } else {
+        expect(semantics.element, isNull);
+      }
+      expect(semantics.target, isNull);
+      expect(semantics.isRead, equals(isRead));
+      expect(semantics.isWrite, equals(isWrite));
+      expect(semantics.isInvoke, equals(isInvoke));
+    };
+    libraryElement.unit.accept(visitor);
+    expect(count, equals(1));
+  }
+
+  /**
+   * Verify that the node represented by [expectedSource] is classified as
+   * a dynamic method invocation.
+   */
+  void checkDynamic(String expectedSource, String expectedTarget,
+      String expectedName, {bool isRead: false, bool isWrite: false, bool isInvoke:
+      false}) {
+    TestVisitor visitor = new TestVisitor();
+    int count = 0;
+    visitor.onAccess = (AstNode node, AccessSemantics semantics) {
+      count++;
+      expect(node.toSource(), equals(expectedSource));
+      expect(semantics.kind, equals(AccessKind.DYNAMIC));
+      if (expectedTarget == null) {
+        expect(semantics.target, isNull);
+      } else {
+        expect(semantics.target.toSource(), equals(expectedTarget));
+      }
+      expect(semantics.identifier.name, equals(expectedName));
+      expect(semantics.element, isNull);
+      expect(semantics.classElement, isNull);
+      expect(semantics.isRead, equals(isRead));
+      expect(semantics.isWrite, equals(isWrite));
+      expect(semantics.isInvoke, equals(isInvoke));
+    };
+    libraryElement.unit.accept(visitor);
+    expect(count, equals(1));
+  }
+
+  /**
+   * Verify that the node represented by [expectedSource] is classified as
+   * a local function invocation.
+   */
+  void checkLocalFunction(String expectedSource, String expectedName,
+      {bool isRead: false, bool isWrite: false, bool isInvoke: false}) {
+    TestVisitor visitor = new TestVisitor();
+    int count = 0;
+    visitor.onAccess = (AstNode node, AccessSemantics semantics) {
+      count++;
+      expect(node.toSource(), equals(expectedSource));
+      expect(semantics.kind, equals(AccessKind.LOCAL_FUNCTION));
+      expect(semantics.identifier.name, equals(expectedName));
+      expect(semantics.element.displayName, equals(expectedName));
+      expect(semantics.classElement, isNull);
+      expect(semantics.target, isNull);
+      expect(semantics.isRead, equals(isRead));
+      expect(semantics.isWrite, equals(isWrite));
+      expect(semantics.isInvoke, equals(isInvoke));
+    };
+    libraryElement.unit.accept(visitor);
+    expect(count, equals(1));
+  }
+
+  /**
+   * Verify that the node represented by [expectedSource] is classified as
+   * a local variable access.
+   */
+  void checkLocalVariable(String expectedSource, String expectedName,
+      {bool isRead: false, bool isWrite: false, bool isInvoke: false}) {
+    TestVisitor visitor = new TestVisitor();
+    int count = 0;
+    visitor.onAccess = (AstNode node, AccessSemantics semantics) {
+      count++;
+      expect(node.toSource(), equals(expectedSource));
+      expect(semantics.kind, equals(AccessKind.LOCAL_VARIABLE));
+      expect(semantics.element.name, equals(expectedName));
+      expect(semantics.classElement, isNull);
+      expect(semantics.target, isNull);
+      expect(semantics.isRead, equals(isRead));
+      expect(semantics.isWrite, equals(isWrite));
+      expect(semantics.isInvoke, equals(isInvoke));
+    };
+    libraryElement.unit.accept(visitor);
+    expect(count, equals(1));
+  }
+
+  /**
+   * Verify that the node represented by [expectedSource] is classified as a
+   * parameter access.
+   */
+  void checkParameter(String expectedSource, String expectedName, {bool isRead:
+      false, bool isWrite: false, bool isInvoke: false}) {
+    TestVisitor visitor = new TestVisitor();
+    int count = 0;
+    visitor.onAccess = (AstNode node, AccessSemantics semantics) {
+      count++;
+      expect(node.toSource(), equals(expectedSource));
+      expect(semantics.kind, equals(AccessKind.PARAMETER));
+      expect(semantics.element.name, equals(expectedName));
+      expect(semantics.classElement, isNull);
+      expect(semantics.target, isNull);
+      expect(semantics.isRead, equals(isRead));
+      expect(semantics.isWrite, equals(isWrite));
+      expect(semantics.isInvoke, equals(isInvoke));
+    };
+    libraryElement.unit.accept(visitor);
+    expect(count, equals(1));
+  }
+}
+
+typedef void AccessHandler(Expression node, AccessSemantics semantics);
+
+/**
+ * Visitor class used to run the tests.
+ */
+class TestVisitor extends RecursiveAstVisitor {
+  AccessHandler onAccess;
+
+  @override
+  visitMethodInvocation(MethodInvocation node) {
+    onAccess(node, classifyMethodInvocation(node));
+  }
+
+  @override
+  visitPrefixedIdentifier(PrefixedIdentifier node) {
+    onAccess(node, classifyPrefixedIdentifier(node));
+  }
+
+  @override
+  visitPropertyAccess(PropertyAccess node) {
+    onAccess(node, classifyPropertyAccess(node));
+  }
+
+  @override
+  visitSimpleIdentifier(SimpleIdentifier node) {
+    AccessSemantics semantics = classifySimpleIdentifier(node);
+    if (semantics != null) {
+      onAccess(node, semantics);
+    }
+  }
+}
diff --git a/pkg/barback/CHANGELOG.md b/pkg/barback/CHANGELOG.md
index 101c319..7133208 100644
--- a/pkg/barback/CHANGELOG.md
+++ b/pkg/barback/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.15.2+2
+
+* Fix a bug in listing all assets from a static package.
+
 ## 0.15.2+1
 
 * Properly handle logs from a transformer that's been canceled.
diff --git a/pkg/barback/lib/src/graph/static_asset_cascade.dart b/pkg/barback/lib/src/graph/static_asset_cascade.dart
index f909c0f..5aab920 100644
--- a/pkg/barback/lib/src/graph/static_asset_cascade.dart
+++ b/pkg/barback/lib/src/graph/static_asset_cascade.dart
@@ -42,7 +42,7 @@
 
   Future<AssetSet> get availableOutputs {
     var provider = graph.provider as StaticPackageProvider;
-    return provider.getAllAssetIds(package).map(provider.getAsset).toList()
+    return provider.getAllAssetIds(package).asyncMap(provider.getAsset).toList()
         .then((assets) => new AssetSet.from(assets));
   }
 
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index 58ce3c0..83ac85f 100644
--- a/pkg/barback/pubspec.yaml
+++ b/pkg/barback/pubspec.yaml
@@ -7,7 +7,7 @@
 #
 # When the minor or patch version of this is upgraded, you *must* update that
 # version constraint in pub to stay in sync with this.
-version: 0.15.2+1
+version: 0.15.2+2
 
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
diff --git a/pkg/barback/test/static_provider_test.dart b/pkg/barback/test/static_provider_test.dart
index 08aad6f..4bd44f9 100644
--- a/pkg/barback/test/static_provider_test.dart
+++ b/pkg/barback/test/static_provider_test.dart
@@ -31,4 +31,10 @@
     updateSources(["app|a.txt"]);
     expectAsset("app|a.out", "b");
   });
+
+  test("can list all static assets", () {
+    initStaticGraph(["app|foo.txt", "app|bar.txt", "app|baz.txt"],
+        staticPackages: ["app"]);
+    expectAllAssets(["app|foo.txt", "app|bar.txt", "app|baz.txt"]);
+  });
 }
diff --git a/pkg/code_transformers/lib/src/messages.dart b/pkg/code_transformers/lib/src/messages.dart
index ab1b502..a1a8e58 100644
--- a/pkg/code_transformers/lib/src/messages.dart
+++ b/pkg/code_transformers/lib/src/messages.dart
@@ -25,134 +25,13 @@
     'Invalid URL to reach another package',
     '''
 To reach an asset that belongs to another package, use `package:` URLs in
-Dart code, but in any other language (like HTML or CSS) use relative URLs.
+Dart code, but in any other language (like HTML or CSS) use relative URLs that
+first go all the way to the `packages/` directory.
 
-These are the rules you must follow to write URLs that refer to files in other
-packages:
-
-  * If the file containing the relative URL is an entrypoint under `web`, use
-    `packages/package_name/path_to_file`
-
-  * If the file containing the URL is under `web`, but in a different directory
-    than your entrypoint, walk out to the same level as the entrypoint first,
-    then enter the `packages` directory.
-
-    **Note**: If two entrypoints include the file under `web` containing the
-    URL, either both entrypoints have to live in the same directory, or you need
-    to move the file to the `lib` directory.
-
-  * If the file containing the URL lives under `lib`, walk up as many levels as
-    directories you have + 1. This is because code in `lib/a/b` is loaded from
-    `packages/package_name/a/b`.
-
-The rules are easier to follow if you know how the code is laid out for
-Dartium before you build, and how it is laid out after you build it with `pub
-build`. Consider the following example:
-
-   package a
-      lib/
-        |- a1.html
-
-      web/
-        |- a2.html
-
-   package b
-      lib/
-        |- b1.html
-        |- b2/
-            |- b3.html
-
-   package c
-      lib/
-        |- c3.html
-
-      web/
-        |- index.html
-        |- index.dart
-        |- c1/
-            |- c2.html
-
-If your app is package `c`, then `pub get` generates a packages directory under
-the web directory, like this:
-
-      web/
-        |- index.html
-        |- index.dart
-        |- c1/
-        |   |- c2.html
-        |- packages/
-            |- a/
-            |   |- a1.html
-            |- b/
-            |   |- b1.html
-            |   |- b2/
-            |       |- b3.html
-            |- c/
-                |- c3.html
-
-Note that no `lib` directory is under the `packages` directory.
-When you launch `web/index.html` in Dartium, Dartium loads `package:` imports from
-`web/packages/`.
-
-If you need to refer to any file in other packages from `index.html`, you can
-simply do `packages/package_name/path_to_file`. For example
-`packages/b/b2/b3.html`. From `index.html` you can also refer to files under the
-web directory of the same package using a simple relative URL, like
-`c1/c2.html`.
-
-However, if you want to load `a1.html` from `c2.html`, you need to reach out to
-the packages directory that lives next to your entrypoint and then load the file
-from there, for example `../packages/a/a1.html`. Because pub generates symlinks
-to the packages directory also under c1, you may be tempted to write
-`packages/a/a1.html`, but that is incorrect - it would yield a canonicalization
-error (see more below).
-
-If you want to load a file from the lib directory of your own package, you
-should also use a package URL. For example, `packages/c/c3.html` and not
-`../lib/c3.html`. This will allow you to write code in `lib` in a way that it
-can be used within and outside your package without making any changes to it.
-
-Because any time you reach inside a `lib/` directory you do so using a
-`packages/` URL, the rules for reaching into other files in other packages are
-always consistent: go up to exit the `packages` directory and go back inside to
-the file you are looking for.  For example, to reach `a1.html` from `b3.html`
-you need to write `../../../packages/a/a1.html`.
-
-The motivation behind all these rules is that URLs need to work under many
-scenarios at once:
-
-  * They need to work in Dartium without any code transformation: resolving the
-    path in the context of a simple HTTP server, or using `file:///` URLs,
-    should yield a valid path to assets. The `packages` directory is safe to use
-    because pub already creates it next to entrypoints of your application.
-
-  * They need to be canonical. To take advantage of caching, multiple URLs
-    reaching the same asset should resolve to the same absolute URL.
-    
-    Also, in projects that use HTML imports (like polymer) tools support that
-    you reach a library with either Dart imports or HTML imports, and correctly
-    resolve them to be the same library. The rules are designed to allow tools
-    to support this.
-
-    For example, consider you have an import might like:
-
-        <link rel=import href=packages/a/a.html>
-
-    where a.html has `<script type="application/dart" src="a.dart">`. If your
-    Dart entrypoint also loads `"package:a/a.dart"`,  then a tool need to make
-    sure that both versions of `a.dart` are loaded from the same URL. Otherwise,
-    you may see errors at runtime like: `A is not a subtype of A`, which can be
-    extremely confusing.
-
-    When you follow the rules above, our tools can detect the pattern in the
-    HTML-import URL containing `packages/` and canonicalize the import
-    by converting `packages/a/a.dart` into `package:a/a.dart` under the hood.
-
-  * They need to continue to be valid after applications are built.
-    Technically this could be done automatically with pub transformers, but to
-    make sure that code works also in Dartium with a simple HTTP Server,
-    existing transformers do not fix URLs, they just detect inconsistencies and
-    produce an error message like this one, instead.
+The rules for correctly writing these imports are subtle and have a lot of
+special cases. Please review
+<https://www.dartlang.org/polymer/app-directories.html> to learn
+more.
 ''');
 
 const INVALID_PREFIX_PATH = const MessageTemplate(
@@ -168,5 +47,7 @@
 For example, if `packages/a/a.html` needs to import `packages/b/b.html`,
 you might expect a.html to import `../b/b.html`. Instead, it must import
 `../../packages/b/b.html`.
-See [issue 15797](http://dartbug.com/15797).
+
+See [issue 15797](http://dartbug.com/15797) and
+<https://www.dartlang.org/polymer/app-directories.html> to learn more.
 ''');
diff --git a/pkg/code_transformers/pubspec.yaml b/pkg/code_transformers/pubspec.yaml
index 9256127..9ee39cc 100644
--- a/pkg/code_transformers/pubspec.yaml
+++ b/pkg/code_transformers/pubspec.yaml
@@ -1,5 +1,5 @@
 name: code_transformers
-version: 0.2.3
+version: 0.2.3+1
 author: "Dart Team <misc@dartlang.org>"
 description: Collection of utilities related to creating barback transformers.
 homepage: http://www.dartlang.org
diff --git a/pkg/dart2js_incremental/lib/caching_compiler.dart b/pkg/dart2js_incremental/lib/caching_compiler.dart
index afdf92f..15a0a39 100644
--- a/pkg/dart2js_incremental/lib/caching_compiler.dart
+++ b/pkg/dart2js_incremental/lib/caching_compiler.dart
@@ -6,7 +6,7 @@
 
 /// Do not call this method directly. It will be made private.
 // TODO(ahe): Make this method private.
-Compiler reuseCompiler(
+Future<Compiler> reuseCompiler(
     {DiagnosticHandler diagnosticHandler,
      CompilerInputProvider inputProvider,
      CompilerOutputProvider outputProvider,
@@ -16,7 +16,7 @@
      Uri packageRoot,
      bool packagesAreImmutable: false,
      Map<String, dynamic> environment,
-     bool reuseLibrary(LibraryElement library)}) {
+     Future<bool> reuseLibrary(LibraryElement library)}) {
   UserTag oldTag = new UserTag('_reuseCompiler').makeCurrent();
   if (libraryRoot == null) {
     throw 'Missing libraryRoot';
@@ -55,14 +55,16 @@
         print('Unable to reuse compiler.');
       }
     }
-    compiler = new Compiler(
-        inputProvider,
-        outputProvider,
-        diagnosticHandler,
-        libraryRoot,
-        packageRoot,
-        options,
-        environment);
+    oldTag.makeCurrent();
+    return new Future.value(
+        new Compiler(
+            inputProvider,
+            outputProvider,
+            diagnosticHandler,
+            libraryRoot,
+            packageRoot,
+            options,
+            environment));
   } else {
     for (final task in compiler.tasks) {
       if (task.watch != null) {
@@ -83,15 +85,16 @@
         ..compilationFailed = false;
     JavaScriptBackend backend = compiler.backend;
 
-    backend.emitter.cachedElements.addAll(backend.generatedCode.keys);
+    backend.emitter.oldEmitter.cachedElements.addAll(
+        backend.generatedCode.keys);
 
     compiler.enqueuer.codegen.newlyEnqueuedElements.clear();
 
-    backend.emitter.containerBuilder
+    backend.emitter.oldEmitter.containerBuilder
         ..staticGetters.clear()
         ..methodClosures.clear();
 
-    backend.emitter.nsmEmitter
+    backend.emitter.oldEmitter.nsmEmitter
         ..trivialNsmHandlers.clear();
 
     backend.emitter.typeTestEmitter
@@ -105,7 +108,7 @@
     backend.emitter.interceptorEmitter
         ..interceptorInvocationNames.clear();
 
-    backend.emitter.metadataEmitter
+    backend.emitter.oldEmitter.metadataEmitter
         ..globalMetadata.clear()
         ..globalMetadataMap.clear();
 
@@ -115,6 +118,10 @@
         ..nativeMethods.clear();
 
     backend.emitter
+        ..readTypeVariables.clear()
+        ..instantiatedClasses = null;
+
+    backend.emitter.oldEmitter
         ..outputBuffers.clear()
         ..deferredConstants.clear()
         ..isolateProperties = null
@@ -126,10 +133,7 @@
         ..mangledGlobalFieldNames.clear()
         ..recordedMangledNames.clear()
         ..additionalProperties.clear()
-        ..readTypeVariables.clear()
-        ..instantiatedClasses = null
-        ..precompiledFunction.clear()
-        ..precompiledConstructorNames.clear()
+        ..clearCspPrecompiledNodes()
         ..hasMakeConstantList = false
         ..elementDescriptors.clear();
 
@@ -138,13 +142,14 @@
 
     if (reuseLibrary == null) {
       reuseLibrary = (LibraryElement library) {
-        return
+        return new Future.value(
             library.isPlatformLibrary ||
-            (packagesAreImmutable && library.isPackageLibrary);
+            (packagesAreImmutable && library.isPackageLibrary));
       };
     }
-    compiler.libraryLoader.reset(reuseLibrary: reuseLibrary);
+    return compiler.libraryLoader.resetAsync(reuseLibrary).then((_) {
+      oldTag.makeCurrent();
+      return compiler;
+    });
   }
-  oldTag.makeCurrent();
-  return compiler;
 }
diff --git a/pkg/dart2js_incremental/lib/dart2js_incremental.dart b/pkg/dart2js_incremental/lib/dart2js_incremental.dart
index 6e49c02..d66bffe 100644
--- a/pkg/dart2js_incremental/lib/dart2js_incremental.dart
+++ b/pkg/dart2js_incremental/lib/dart2js_incremental.dart
@@ -69,7 +69,7 @@
   Future<bool> compile(Uri script) {
     List<String> options = new List<String>.from(this.options);
     options.addAll(INCREMENTAL_OPTIONS);
-    _compiler = reuseCompiler(
+    Future<Compiler> future = reuseCompiler(
         cachedCompiler: _compiler,
         libraryRoot: libraryRoot,
         packageRoot: packageRoot,
@@ -78,6 +78,9 @@
         options: options,
         outputProvider: outputProvider,
         environment: environment);
-    return _compiler.run(script);
+    return future.then((Compiler compiler) {
+      _compiler = compiler;
+      return compiler.run(script);
+    });
   }
 }
diff --git a/site/try/poi/diff.dart b/pkg/dart2js_incremental/lib/diff.dart
similarity index 63%
rename from site/try/poi/diff.dart
rename to pkg/dart2js_incremental/lib/diff.dart
index a2e17eb..e3fad3a 100644
--- a/site/try/poi/diff.dart
+++ b/pkg/dart2js_incremental/lib/diff.dart
@@ -4,27 +4,6 @@
 
 library trydart.poi.diff;
 
-import 'dart:async' show
-    Completer,
-    Future,
-    Stream;
-
-import 'dart:convert' show
-    LineSplitter,
-    UTF8;
-
-import 'package:compiler/compiler.dart' as api;
-
-import 'package:compiler/implementation/dart2jslib.dart' show
-    Compiler,
-    Enqueuer,
-    QueueFilter,
-    Script,
-    WorkItem;
-
-import 'package:compiler/implementation/elements/visitor.dart' show
-    ElementVisitor;
-
 import 'package:compiler/implementation/elements/elements.dart' show
     AbstractFieldElement,
     ClassElement,
@@ -37,8 +16,8 @@
 
 import 'package:compiler/implementation/elements/modelx.dart' as modelx;
 
-import 'package:compiler/implementation/dart_types.dart' show
-    DartType;
+import 'package:compiler/implementation/elements/modelx.dart' show
+    DeclarationSite;
 
 import 'package:compiler/implementation/scanner/scannerlib.dart' show
     EOF_TOKEN,
@@ -49,12 +28,9 @@
     PartialElement,
     Token;
 
-import 'package:compiler/implementation/source_file.dart' show
-    StringSourceFile;
-
 class Difference {
-  final Element before;
-  final Element after;
+  final DeclarationSite before;
+  final DeclarationSite after;
   Token token;
 
   Difference(this.before, this.after);
@@ -69,23 +45,26 @@
 List<Difference> computeDifference(
     ScopeContainerElement before,
     ScopeContainerElement after) {
-  Map<String, Element> beforeMap = <String, Element>{};
-  before.forEachLocalMember((Element element) {
-    beforeMap[element.name] = element;
+  Map<String, DeclarationSite> beforeMap = <String, DeclarationSite>{};
+  before.forEachLocalMember((modelx.ElementX element) {
+    DeclarationSite site = element.declarationSite;
+    assert(site != null);
+    beforeMap[element.name] = site;
   });
   List<Difference> modifications = <Difference>[];
   List<Difference> potentiallyChanged = <Difference>[];
-  after.forEachLocalMember((Element element) {
-    Element existing = beforeMap.remove(element.name);
+  after.forEachLocalMember((modelx.ElementX element) {
+    DeclarationSite existing = beforeMap.remove(element.name);
     if (existing == null) {
-      modifications.add(new Difference(null, element));
+      modifications.add(new Difference(null, element.declarationSite));
     } else {
-      potentiallyChanged.add(new Difference(existing, element));
+      potentiallyChanged.add(new Difference(existing, element.declarationSite));
     }
   });
 
   modifications.addAll(
-      beforeMap.values.map((Element element) => new Difference(element, null)));
+      beforeMap.values.map(
+          (DeclarationSite site) => new Difference(site, null)));
 
   modifications.addAll(
       potentiallyChanged.where(areDifferentElements));
@@ -94,12 +73,8 @@
 }
 
 bool areDifferentElements(Difference diff) {
-  Element beforeElement = diff.before;
-  Element afterElement = diff.after;
-  var before = (beforeElement is modelx.VariableElementX)
-      ? beforeElement.variables : beforeElement;
-  var after = (afterElement is modelx.VariableElementX)
-      ? afterElement.variables : afterElement;
+  DeclarationSite before = diff.before;
+  DeclarationSite after = diff.after;
   if (before is PartialElement && after is PartialElement) {
     Token beforeToken = before.beginToken;
     Token afterToken = after.beginToken;
diff --git a/pkg/glob/CHANGELOG.md b/pkg/glob/CHANGELOG.md
new file mode 100644
index 0000000..5747978
--- /dev/null
+++ b/pkg/glob/CHANGELOG.md
@@ -0,0 +1,5 @@
+## 1.0.0+1
+
+* Fix several analyzer warnings.
+
+* Fix the tests on Windows.
diff --git a/pkg/glob/lib/glob.dart b/pkg/glob/lib/glob.dart
index 1c7efda..f80faa1 100644
--- a/pkg/glob/lib/glob.dart
+++ b/pkg/glob/lib/glob.dart
@@ -4,16 +4,19 @@
 
 library glob;
 
+import 'dart:async';
+import 'dart:io';
+
 import 'package:path/path.dart' as p;
 
 import 'src/ast.dart';
+import 'src/list_tree.dart';
 import 'src/parser.dart';
 import 'src/utils.dart';
 
 /// Regular expression used to quote globs.
 final _quoteRegExp = new RegExp(r'[*{[?\\}\],\-()]');
 
-// TODO(nweiz): Add [list] and [listSync] methods.
 /// A glob for matching and listing files and directories.
 ///
 /// A glob matches an entire string as a path. Although the glob pattern uses
@@ -45,6 +48,8 @@
   /// The parsed AST of the glob.
   final AstNode _ast;
 
+  ListTree _listTree;
+
   /// Whether [context]'s current directory is absolute.
   bool get _contextIsAbsolute {
     if (_contextIsAbsoluteCache == null) {
@@ -98,6 +103,47 @@
         _ast = new Parser(pattern + (recursive ? "{,/**}" : ""), context)
             .parse();
 
+  /// Lists all [FileSystemEntity]s beneath [root] that match the glob.
+  ///
+  /// This works much like [Directory.list], but it only lists directories that
+  /// could contain entities that match the glob. It provides no guarantees
+  /// about the order of the returned entities, although it does guarantee that
+  /// only one entity with a given path will be returned.
+  ///
+  /// [root] defaults to the current working directory.
+  ///
+  /// [followLinks] works the same as for [Directory.list].
+  Stream<FileSystemEntity> list({String root, bool followLinks: true}) {
+    if (context.style != p.style) {
+      throw new StateError("Can't list glob \"$this\"; it matches "
+          "${context.style} paths, but this platform uses ${p.style} paths.");
+    }
+
+    if (_listTree == null) _listTree = new ListTree(_ast);
+    return _listTree.list(root: root, followLinks: followLinks);
+  }
+
+  /// Synchronously lists all [FileSystemEntity]s beneath [root] that match the
+  /// glob.
+  ///
+  /// This works much like [Directory.listSync], but it only lists directories
+  /// that could contain entities that match the glob. It provides no guarantees
+  /// about the order of the returned entities, although it does guarantee that
+  /// only one entity with a given path will be returned.
+  ///
+  /// [root] defaults to the current working directory.
+  ///
+  /// [followLinks] works the same as for [Directory.list].
+  List<FileSystemEntity> listSync({String root, bool followLinks: true}) {
+    if (context.style != p.style) {
+      throw new StateError("Can't list glob \"$this\"; it matches "
+          "${context.style} paths, but this platform uses ${p.style} paths.");
+    }
+
+    if (_listTree == null) _listTree = new ListTree(_ast);
+    return _listTree.listSync(root: root, followLinks: followLinks);
+  }
+
   /// Returns whether this glob matches [path].
   bool matches(String path) => matchAsPrefix(path) != null;
 
diff --git a/pkg/glob/lib/src/ast.dart b/pkg/glob/lib/src/ast.dart
index 5e1da1a..dbb76e6 100644
--- a/pkg/glob/lib/src/ast.dart
+++ b/pkg/glob/lib/src/ast.dart
@@ -5,6 +5,7 @@
 library glob.ast;
 
 import 'package:path/path.dart' as p;
+import 'package:collection/collection.dart';
 
 import 'utils.dart';
 
@@ -25,6 +26,17 @@
   /// Either this or [canMatchRelative] or both will be true.
   final bool canMatchRelative = true;
 
+  /// Returns a new glob with all the options bubbled to the top level.
+  ///
+  /// In particular, this returns a glob AST with two guarantees:
+  ///
+  /// 1. There are no [OptionsNode]s other than the one at the top level.
+  /// 2. It matches the same set of paths as [this].
+  ///
+  /// For example, given the glob `{foo,bar}/{click/clack}`, this would return
+  /// `{foo/click,foo/clack,bar/click,bar/clack}`.
+  OptionsNode flattenOptions() => new OptionsNode([new SequenceNode([this])]);
+
   /// Returns whether this glob matches [string].
   bool matches(String string) {
     if (_regExp == null) _regExp = new RegExp('^${_toRegExp()}\$');
@@ -46,8 +58,118 @@
   SequenceNode(Iterable<AstNode> nodes)
       : nodes = nodes.toList();
 
+  OptionsNode flattenOptions() {
+    if (nodes.isEmpty) return new OptionsNode([this]);
+
+    var sequences = nodes.first.flattenOptions().options
+        .map((sequence) => sequence.nodes);
+    for (var node in nodes.skip(1)) {
+      // Concatenate all sequences in the next options node ([nextSequences])
+      // onto all previous sequences ([sequences]).
+      var nextSequences = node.flattenOptions().options;
+      sequences = sequences.expand((sequence) {
+        return nextSequences.map((nextSequence) {
+          return sequence.toList()..addAll(nextSequence.nodes);
+        });
+      });
+    }
+
+    return new OptionsNode(sequences.map((sequence) {
+      // Combine any adjacent LiteralNodes in [sequence].
+      return new SequenceNode(sequence.fold([], (combined, node) {
+        if (combined.isEmpty || combined.last is! LiteralNode ||
+            node is! LiteralNode) {
+          return combined..add(node);
+        }
+
+        combined[combined.length - 1] =
+            new LiteralNode(combined.last.text + node.text);
+        return combined;
+      }));
+    }));
+  }
+
+  /// Splits this glob into components along its path separators.
+  ///
+  /// For example, given the glob `foo/*/*.dart`, this would return three globs:
+  /// `foo`, `*`, and `*.dart`.
+  ///
+  /// Path separators within options nodes are not split. For example,
+  /// `foo/{bar,baz/bang}/qux` will return three globs: `foo`, `{bar,baz/bang}`,
+  /// and `qux`.
+  ///
+  /// [context] is used to determine what absolute roots look like for this
+  /// glob.
+  List<SequenceNode> split(p.Context context) {
+    var componentsToReturn = [];
+    var currentComponent;
+
+    addNode(node) {
+      if (currentComponent == null) currentComponent = [];
+      currentComponent.add(node);
+    }
+
+    finishComponent() {
+      if (currentComponent == null) return;
+      componentsToReturn.add(new SequenceNode(currentComponent));
+      currentComponent = null;
+    }
+
+    for (var node in nodes) {
+      if (node is! LiteralNode || !node.text.contains('/')) {
+        addNode(node);
+        continue;
+      }
+
+      var text = node.text;
+      if (context.style == p.Style.windows) text = text.replaceAll("/", "\\");
+      var components = context.split(text);
+
+      // If the first component is absolute, that means it's a separator (on
+      // Windows some non-separator things are also absolute, but it's invalid
+      // to have "C:" show up in the middle of a path anyway).
+      if (context.isAbsolute(components.first)) {
+        // If this is the first component, it's the root.
+        if (componentsToReturn.isEmpty && currentComponent == null) {
+          var root = components.first;
+          if (context.style == p.Style.windows) {
+            // Above, we switched to backslashes to make [context.split] handle
+            // roots properly. That means that if there is a root, it'll still
+            // have backslashes, where forward slashes are required for globs.
+            // So we switch it back here.
+            root = root.replaceAll("\\", "/");
+          }
+          addNode(new LiteralNode(root));
+        }
+        finishComponent();
+        components = components.skip(1);
+        if (components.isEmpty) continue;
+      }
+
+      // For each component except the last one, add a separate sequence to
+      // [sequences] containing only that component.
+      for (var component in components.take(components.length - 1)) {
+        addNode(new LiteralNode(component));
+        finishComponent();
+      }
+
+      // For the final component, only end its sequence (by adding a new empty
+      // sequence) if it ends with a separator.
+      addNode(new LiteralNode(components.last));
+      if (node.text.endsWith('/')) finishComponent();
+    }
+
+    finishComponent();
+    return componentsToReturn;
+  }
+
   String _toRegExp() => nodes.map((node) => node._toRegExp()).join();
 
+  bool operator==(Object other) => other is SequenceNode &&
+      const IterableEquality().equals(nodes, other.nodes);
+
+  int get hashCode => const IterableEquality().hash(nodes);
+
   String toString() => nodes.join();
 }
 
@@ -57,6 +179,10 @@
 
   String _toRegExp() => '[^/]*';
 
+  bool operator==(Object other) => other is StarNode;
+
+  int get hashCode => 0;
+
   String toString() => '*';
 }
 
@@ -94,6 +220,10 @@
     return buffer.toString();
   }
 
+  bool operator==(Object other) => other is DoubleStarNode;
+
+  int get hashCode => 1;
+
   String toString() => '**';
 }
 
@@ -103,6 +233,10 @@
 
   String _toRegExp() => '[^/]';
 
+  bool operator==(Object other) => other is AnyCharNode;
+
+  int get hashCode => 2;
+
   String toString() => '?';
 }
 
@@ -119,6 +253,20 @@
   RangeNode(Iterable<Range> ranges, {this.negated})
       : ranges = ranges.toSet();
 
+  OptionsNode flattenOptions() {
+    if (negated || ranges.any((range) => !range.isSingleton)) {
+      return super.flattenOptions();
+    }
+
+    // If a range explicitly lists a set of characters, return each character as
+    // a separate expansion.
+    return new OptionsNode(ranges.map((range) {
+      return new SequenceNode([
+        new LiteralNode(new String.fromCharCodes([range.min]))
+      ]);
+    }));
+  }
+
   String _toRegExp() {
     var buffer = new StringBuffer();
 
@@ -148,6 +296,14 @@
     return buffer.toString();
   }
 
+  bool operator==(Object other) {
+    if (other is! RangeNode) return false;
+    if ((other as RangeNode).negated != negated) return false;
+    return const SetEquality().equals(ranges, (other as RangeNode).ranges);
+  }
+
+  int get hashCode => (negated ? 1 : 3) * const SetEquality().hash(ranges);
+
   String toString() {
     var buffer = new StringBuffer()..write('[');
     for (var range in ranges) {
@@ -172,9 +328,17 @@
   OptionsNode(Iterable<SequenceNode> options)
       : options = options.toList();
 
+  OptionsNode flattenOptions() => new OptionsNode(
+      options.expand((option) => option.flattenOptions().options));
+
   String _toRegExp() =>
       '(?:${options.map((option) => option._toRegExp()).join("|")})';
 
+  bool operator==(Object other) => other is OptionsNode && 
+      const UnorderedIterableEquality().equals(options, other.options);
+
+  int get hashCode => const UnorderedIterableEquality().hash(options);
+
   String toString() => '{${options.join(',')}}';
 }
 
@@ -196,9 +360,13 @@
 
   bool get canMatchRelative => !canMatchAbsolute;
 
-  LiteralNode(this.text, this._context);
+  LiteralNode(this.text, [this._context]);
 
   String _toRegExp() => regExpQuote(text);
 
+  bool operator==(Object other) => other is LiteralNode && other.text == text;
+
+  int get hashCode => text.hashCode;
+
   String toString() => text;
 }
diff --git a/pkg/glob/lib/src/list_tree.dart b/pkg/glob/lib/src/list_tree.dart
new file mode 100644
index 0000000..fea2b98
--- /dev/null
+++ b/pkg/glob/lib/src/list_tree.dart
@@ -0,0 +1,390 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library glob.list_tree;
+
+import 'dart:io';
+import 'dart:async';
+
+import 'package:path/path.dart' as p;
+
+import 'ast.dart';
+import 'stream_pool.dart';
+
+/// A structure built from a glob that efficiently lists filesystem entities
+/// that match that glob.
+///
+/// This structure is designed to list the minimal number of physical
+/// directories necessary to find everything that matches the glob. For example,
+/// for the glob `foo/{bar,baz}/*`, there's no need to list the working
+/// directory or even `foo/`; only `foo/bar` and `foo/baz` should be listed.
+///
+/// This works by creating a tree of [_ListTreeNode]s, each of which corresponds
+/// to a single of directory nesting in the source glob. Each node has child
+/// nodes associated with globs ([_ListTreeNode.children]), as well as its own
+/// glob ([_ListTreeNode._validator]) that indicates which entities within that
+/// node's directory should be returned.
+///
+/// For example, the glob `foo/{*.dart,b*/*.txt}` creates the following tree:
+///
+///     .
+///     '-- "foo" (validator: "*.dart")
+///         '-- "b*" (validator: "*.txt"
+///
+/// If a node doesn't have a validator, we know we don't have to list it
+/// explicitly.
+///
+/// Nodes can also be marked as "recursive", which means they need to be listed
+/// recursively (usually to support `**`). In this case, they will have no
+/// children; instead, their validator will just encompass the globs that would
+/// otherwise be in their children. For example, the glob
+/// `foo/{**.dart,bar/*.txt}` creates a recursive node for `foo` with the
+/// validator `**.dart,bar/*.txt`.
+///
+/// If the glob contains multiple filesystem roots (e.g. `{C:/,D:/}*.dart`),
+/// each root will have its own tree of nodes. Relative globs use `.` as their
+/// root instead.
+class ListTree {
+  /// A map from filesystem roots to the list tree for those roots.
+  ///
+  /// A relative glob will use `.` as its root.
+  final _trees = new Map<String, _ListTreeNode>();
+
+  /// Whether paths listed might overlap.
+  ///
+  /// If they do, we need to filter out overlapping paths.
+  bool _canOverlap;
+
+  ListTree(AstNode glob) {
+    // The first step in constructing a tree from the glob is to simplify the
+    // problem by eliminating options. [glob.flattenOptions] bubbles all options
+    // (and certain ranges) up to the top level of the glob so we can deal with
+    // them one at a time.
+    var options = glob.flattenOptions();
+
+    for (var option in options.options) {
+      // Since each option doesn't include its own options, we can safely split
+      // it into path components.
+      var components = option.split(p.context);
+      var firstNode = components.first.nodes.first;
+      var root = '.';
+
+      // Determine the root for this option, if it's absolute. If it's not, the
+      // root's just ".".
+      if (firstNode is LiteralNode) {
+        var text = firstNode.text;
+        if (Platform.isWindows) text.replaceAll("/", "\\");
+        if (p.isAbsolute(text)) {
+          // If the path is absolute, the root should be the only thing in the
+          // first component.
+          assert(components.first.nodes.length == 1);
+          root = firstNode.text;
+          components.removeAt(0);
+        }
+      }
+
+      _addGlob(root, components);
+    }
+
+    _canOverlap = _computeCanOverlap();
+  }
+
+  /// Add the glob represented by [components] to the tree under [root].
+  void _addGlob(String root, List<AstNode> components) {
+    // The first [parent] represents the root directory itself. It may be null
+    // here if this is the first option with this particular [root]. If so,
+    // we'll create it below.
+    //
+    // As we iterate through [components], [parent] will be set to
+    // progressively more nested nodes.
+    var parent = _trees[root];
+    for (var i = 0; i < components.length; i++) {
+      var component = components[i];
+      var recursive = component.nodes.any((node) => node is DoubleStarNode);
+      var complete = i == components.length - 1;
+
+      // If the parent node for this level of nesting already exists, the new
+      // option will be added to it as additional validator options and/or
+      // additional children.
+      //
+      // If the parent doesn't exist, we'll create it in one of the else
+      // clauses below.
+      if (parent != null) {
+        if (parent.isRecursive || recursive) {
+          // If [component] is recursive, mark [parent] as recursive. This
+          // will cause all of its children to be folded into its validator.
+          // If [parent] was already recursive, this is a no-op.
+          parent.makeRecursive();
+
+          // Add [component] and everything nested beneath it as an option to
+          // [parent]. Since [parent] is recursive, it will recursively list
+          // everything beneath it and filter them with one big glob.
+          parent.addOption(_join(components.sublist(i)));
+          return;
+        } else if (complete) {
+          // If [component] is the last component, add it to [parent]'s
+          // validator but not to its children.
+          parent.addOption(component);
+        } else {
+          // On the other hand if there are more components, add [component]
+          // to [parent]'s children and not its validator. Since we process
+          // each option's components separately, the same component is never
+          // both a validator and a child.
+          if (!parent.children.containsKey(component)) {
+            parent.children[component] = new _ListTreeNode();
+          }
+          parent = parent.children[component];
+        }
+      } else if (recursive) {
+        _trees[root] = new _ListTreeNode.recursive(
+            _join(components.sublist(i)));
+        return;
+      } else if (complete) {
+        _trees[root] = new _ListTreeNode()..addOption(component);
+      } else {
+        _trees[root] = new _ListTreeNode();
+        _trees[root].children[component] = new _ListTreeNode();
+        parent = _trees[root].children[component];
+      }
+    }
+  }
+
+  /// Computes the value for [_canOverlap].
+  bool _computeCanOverlap() {
+    // If this can list a relative path and an absolute path, the former may be
+    // contained within the latter.
+    if (_trees.length > 1 && _trees.containsKey('.')) return true;
+
+    // Otherwise, this can only overlap if the tree beneath any given root could
+    // overlap internally.
+    return _trees.values.any((node) => node.canOverlap);
+  }
+
+  /// List all entities that match this glob beneath [root].
+  Stream<FileSystemEntity> list({String root, bool followLinks: true}) {
+    if (root == null) root = '.';
+    var pool = new StreamPool();
+    for (var rootDir in _trees.keys) {
+      var dir = rootDir == '.' ? root : rootDir;
+      pool.add(_trees[rootDir].list(dir, followLinks: followLinks));
+    }
+    pool.closeWhenEmpty();
+
+    if (!_canOverlap) return pool.stream;
+
+    // TODO(nweiz): Rather than filtering here, avoid double-listing directories
+    // in the first place.
+    var seen = new Set();
+    return pool.stream.where((entity) {
+      if (seen.contains(entity.path)) return false;
+      seen.add(entity.path);
+      return true;
+    });
+  }
+
+  /// Synchronosuly list all entities that match this glob beneath [root].
+  List<FileSystemEntity> listSync({String root, bool followLinks: true}) {
+    if (root == null) root = '.';
+
+    var result = _trees.keys.expand((rootDir) {
+      var dir = rootDir == '.' ? root : rootDir;
+      return _trees[rootDir].listSync(dir, followLinks: followLinks);
+    });
+
+    if (!_canOverlap) return result.toList();
+
+    // TODO(nweiz): Rather than filtering here, avoid double-listing directories
+    // in the first place.
+    var seen = new Set();
+    return result.where((entity) {
+      if (seen.contains(entity.path)) return false;
+      seen.add(entity.path);
+      return true;
+    }).toList();
+  }
+}
+
+/// A single node in a [ListTree].
+class _ListTreeNode {
+  /// This node's child nodes, by their corresponding globs.
+  ///
+  /// Each child node will only be listed on directories that match its glob.
+  ///
+  /// This may be `null`, indicating that this node should be listed
+  /// recursively.
+  Map<SequenceNode, _ListTreeNode> children;
+
+  /// This node's validator.
+  ///
+  /// This determines which entities will ultimately be emitted when [list] is
+  /// called.
+  OptionsNode _validator;
+
+  /// Whether this node is recursive.
+  ///
+  /// A recursive node has no children and is listed recursively.
+  bool get isRecursive => children == null;
+
+  /// Whether this node doesn't itself need to be listed.
+  ///
+  /// If a node has no validator and all of its children are literal filenames,
+  /// there's no need to list its contents. We can just directly traverse into
+  /// its children.
+  bool get _isIntermediate {
+    if (_validator != null) return false;
+    return children.keys.every((sequence) =>
+        sequence.nodes.length == 1 && sequence.nodes.first is LiteralNode);
+  }
+
+  /// Returns whether listing this node might return overlapping results.
+  bool get canOverlap {
+    // A recusive node can never overlap with itself, because it will only ever
+    // involve a single call to [Directory.list] that's then filtered with
+    // [_validator].
+    if (isRecursive) return false;
+
+    // If there's more than one child node and at least one of the children is
+    // dynamic (that is, matches more than just a literal string), there may be
+    // overlap.
+    if (children.length > 1 && children.keys.any((sequence) =>
+          sequence.nodes.length > 1 || sequence.nodes.single is! LiteralNode)) {
+      return true;
+    }
+
+    return children.values.any((node) => node.canOverlap);
+  }
+
+  /// Creates a node with no children and no validator.
+  _ListTreeNode()
+      : children = new Map<SequenceNode, _ListTreeNode>(),
+        _validator = null;
+
+  /// Creates a recursive node the given [validator].
+  _ListTreeNode.recursive(SequenceNode validator)
+      : children = null,
+        _validator = new OptionsNode([validator]);
+
+  /// Transforms this into recursive node, folding all its children into its
+  /// validator.
+  void makeRecursive() {
+    if (isRecursive) return;
+    _validator = new OptionsNode(children.keys.map((sequence) {
+      var child = children[sequence];
+      child.makeRecursive();
+      return _join([sequence, child._validator]);
+    }));
+    children = null;
+  }
+
+  /// Adds [validator] to this node's existing validator.
+  void addOption(SequenceNode validator) {
+    if (_validator == null) {
+      _validator = new OptionsNode([validator]);
+    } else {
+      _validator.options.add(validator);
+    }
+  }
+
+  /// Lists all entities within [dir] matching this node or its children.
+  ///
+  /// This may return duplicate entities. These will be filtered out in
+  /// [ListTree.list].
+  Stream<FileSystemEntity> list(String dir, {bool followLinks: true}) {
+    if (isRecursive) {
+      return new Directory(dir).list(recursive: true, followLinks: followLinks)
+          .where((entity) => _matches(entity.path.substring(dir.length + 1)));
+    }
+
+    var resultPool = new StreamPool();
+
+    // Don't spawn extra [Directory.list] calls when we already know exactly
+    // which subdirectories we're interested in.
+    if (_isIntermediate) {
+      children.forEach((sequence, child) {
+        resultPool.add(child.list(p.join(dir, sequence.nodes.single.text),
+            followLinks: followLinks));
+      });
+      resultPool.closeWhenEmpty();
+      return resultPool.stream;
+    }
+
+    var resultController = new StreamController(sync: true);
+    resultPool.add(resultController.stream);
+    new Directory(dir).list(followLinks: followLinks).listen((entity) {
+      var basename = entity.path.substring(dir.length + 1);
+      if (_matches(basename)) resultController.add(entity);
+
+      children.forEach((sequence, child) {
+        if (entity is! Directory) return;
+        if (!sequence.matches(basename)) return;
+        resultPool.add(child.list(p.join(dir, basename),
+            followLinks: followLinks));
+      });
+    },
+        onError: resultController.addError,
+        onDone: resultController.close);
+
+    resultPool.closeWhenEmpty();
+    return resultPool.stream;
+  }
+
+  /// Synchronously lists all entities within [dir] matching this node or its
+  /// children.
+  ///
+  /// This may return duplicate entities. These will be filtered out in
+  /// [ListTree.listSync].
+  Iterable<FileSystemEntity> listSync(String dir, {bool followLinks: true}) {
+    if (isRecursive) {
+      return new Directory(dir)
+          .listSync(recursive: true, followLinks: followLinks)
+          .where((entity) => _matches(entity.path.substring(dir.length + 1)));
+    }
+
+    // Don't spawn extra [Directory.listSync] calls when we already know exactly
+    // which subdirectories we're interested in.
+    if (_isIntermediate) {
+      return children.keys.expand((sequence) {
+        return children[sequence].listSync(
+            p.join(dir, sequence.nodes.single.text), followLinks: followLinks);
+      });
+    }
+
+    return new Directory(dir).listSync(followLinks: followLinks)
+        .expand((entity) {
+      var entities = [];
+      var basename = entity.path.substring(dir.length + 1);
+      if (_matches(basename)) entities.add(entity);
+      if (entity is! Directory) return entities;
+
+      entities.addAll(children.keys
+          .where((sequence) => sequence.matches(basename))
+          .expand((sequence) {
+        return children[sequence].listSync(
+            p.join(dir, basename), followLinks: followLinks);
+      }));
+
+      return entities;
+    });
+  }
+
+  /// Returns whether the native [path] matches [_validator].
+  bool _matches(String path) {
+    if (_validator == null) return false;
+    return _validator.matches(path);
+  }
+
+  String toString() => "($_validator) $children";
+}
+
+/// Joins each [components] into a new glob where each component is separated by
+/// a path separator.
+SequenceNode _join(Iterable<AstNode> components) {
+  var componentsList = components.toList();
+  var nodes = [componentsList.removeAt(0)];
+  for (var component in componentsList) {
+    nodes.add(new LiteralNode('/'));
+    nodes.add(component);
+  }
+  return new SequenceNode(nodes);
+}
diff --git a/pkg/glob/lib/src/stream_pool.dart b/pkg/glob/lib/src/stream_pool.dart
new file mode 100644
index 0000000..6417513
--- /dev/null
+++ b/pkg/glob/lib/src/stream_pool.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library glob.stream_pool;
+
+import 'dart:async';
+
+/// A pool of streams whose events are unified and emitted through a central
+/// stream.
+class StreamPool<T> {
+  /// The stream through which all events from streams in the pool are emitted.
+  Stream<T> get stream => _controller.stream;
+  final StreamController<T> _controller;
+
+  /// Subscriptions to the streams that make up the pool.
+  final _subscriptions = new Map<Stream<T>, StreamSubscription<T>>();
+
+  /// Whether this pool should be closed when it becomes empty.
+  bool _closeWhenEmpty = false;
+
+  /// Creates a new stream pool that only supports a single subscriber.
+  ///
+  /// Any events from broadcast streams in the pool will be buffered until a
+  /// listener is subscribed.
+  StreamPool()
+      // Create the controller as sync so that any sync input streams will be
+      // forwarded synchronously. Async input streams will have their asynchrony
+      // preserved, since _controller.add will be called asynchronously.
+      : _controller = new StreamController<T>(sync: true);
+
+  /// Creates a new stream pool where [stream] can be listened to more than
+  /// once.
+  ///
+  /// Any events from buffered streams in the pool will be emitted immediately,
+  /// regardless of whether [stream] has any subscribers.
+  StreamPool.broadcast()
+      // Create the controller as sync so that any sync input streams will be
+      // forwarded synchronously. Async input streams will have their asynchrony
+      // preserved, since _controller.add will be called asynchronously.
+      : _controller = new StreamController<T>.broadcast(sync: true);
+
+  /// Adds [stream] as a member of this pool.
+  ///
+  /// Any events from [stream] will be emitted through [this.stream]. If
+  /// [stream] is sync, they'll be emitted synchronously; if [stream] is async,
+  /// they'll be emitted asynchronously.
+  void add(Stream<T> stream) {
+    if (_subscriptions.containsKey(stream)) return;
+    _subscriptions[stream] = stream.listen(_controller.add,
+        onError: _controller.addError,
+        onDone: () => remove(stream));
+  }
+
+  /// Removes [stream] as a member of this pool.
+  void remove(Stream<T> stream) {
+    var subscription = _subscriptions.remove(stream);
+    if (subscription != null) subscription.cancel();
+    if (_closeWhenEmpty && _subscriptions.isEmpty) close();
+  }
+
+  /// Removes all streams from this pool and closes [stream].
+  void close() {
+    for (var subscription in _subscriptions.values) {
+      subscription.cancel();
+    }
+    _subscriptions.clear();
+    _controller.close();
+  }
+
+  /// The next time this pool becomes empty, close it.
+  void closeWhenEmpty() {
+    if (_subscriptions.isEmpty) close();
+    _closeWhenEmpty = true;
+  }
+}
diff --git a/pkg/glob/lib/src/utils.dart b/pkg/glob/lib/src/utils.dart
index 12952e8..35526c0 100644
--- a/pkg/glob/lib/src/utils.dart
+++ b/pkg/glob/lib/src/utils.dart
@@ -4,6 +4,8 @@
 
 library glob.utils;
 
+import 'package:path/path.dart' as p;
+
 /// A range from [min] to [max], inclusive.
 class Range {
   /// The minimum value included by the range.
@@ -23,6 +25,11 @@
 
   /// Whether [this] contains [value].
   bool contains(int value) => value >= min && value <= max;
+
+  bool operator==(Object other) => other is Range &&
+      other.min == min && other.max == max;
+
+  int get hashCode => 3 * min + 7 * max;
 }
 
 /// An implementation of [Match] constructed by [Glob]s.
@@ -53,3 +60,11 @@
 /// expressions backslash-escaped.
 String regExpQuote(String contents) =>
     contents.replaceAllMapped(_quote, (char) => "\\${char[0]}");
+
+/// Returns [path] with all its separators replaced with forward slashes.
+///
+/// This is useful when converting from Windows paths to globs.
+String separatorToForwardSlash(String path) {
+  if (p.style != p.Style.windows) return path;
+  return path.replaceAll('\\', '/');
+}
diff --git a/pkg/glob/pubspec.yaml b/pkg/glob/pubspec.yaml
index 2a5e9a8..1365f27 100644
--- a/pkg/glob/pubspec.yaml
+++ b/pkg/glob/pubspec.yaml
@@ -1,8 +1,11 @@
 name: glob
-version: 1.0.0-dev
+version: 1.0.1
+author: "Dart Team <misc@dartlang.org>"
+homepage: http://www.dartlang.org
 description: Bash-style filename globbing.
 dependencies:
   path: ">=1.0.0 <2.0.0"
   string_scanner: ">=0.1.0 <0.2.0"
 dev_dependencies:
   unittest: ">=0.11.0 <0.12.0"
+  scheduled_test: ">=0.11.2 <0.12.0"
diff --git a/pkg/glob/test/list_test.dart b/pkg/glob/test/list_test.dart
new file mode 100644
index 0000000..59c5841
--- /dev/null
+++ b/pkg/glob/test/list_test.dart
@@ -0,0 +1,305 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:glob/glob.dart';
+import 'package:glob/src/utils.dart';
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+
+String sandbox;
+
+void main() {
+  setUp(() {
+    scheduleSandbox();
+
+    d.dir("foo", [
+      d.file("bar"),
+      d.dir("baz", [
+        d.file("bang"),
+        d.file("qux")
+      ])
+    ]).create();
+  });
+
+  group("list()", () {
+    test("fails if the context doesn't match the system context", () {
+      expect(new Glob("*", context: p.url).list, throwsStateError);
+    });
+
+    test("reports exceptions for non-existent directories", () {
+      schedule(() {
+        expect(new Glob("non/existent/**").list().toList(),
+            throwsA(new isInstanceOf<FileSystemException>()));
+      });
+    });
+  });
+
+  group("listSync()", () {
+    test("fails if the context doesn't match the system context", () {
+      expect(new Glob("*", context: p.url).listSync, throwsStateError);
+    });
+
+    test("reports exceptions for non-existent directories", () {
+      schedule(() {
+        expect(new Glob("non/existent/**").listSync,
+            throwsA(new isInstanceOf<FileSystemException>()));
+      });
+    });
+  });
+
+  syncAndAsync((list) {
+    group("literals", () {
+      test("lists a single literal", () {
+        expect(list("foo/baz/qux"),
+            completion(equals([p.join("foo", "baz", "qux")])));
+      });
+
+      test("lists a non-matching literal", () {
+        expect(list("foo/baz/nothing"), completion(isEmpty));
+      });
+    });
+
+    group("star", () {
+      test("lists within filenames but not across directories", () {
+        expect(list("foo/b*"), completion(unorderedEquals([
+          p.join("foo", "bar"),
+          p.join("foo", "baz")
+        ])));
+      });
+
+      test("lists the empy string", () {
+        expect(list("foo/bar*"), completion(equals([p.join("foo", "bar")])));
+      });
+    });
+
+    group("double star", () {
+      test("lists within filenames", () {
+        expect(list("foo/baz/**"), completion(unorderedEquals([
+          p.join("foo", "baz", "qux"),
+          p.join("foo", "baz", "bang")
+        ])));
+      });
+
+      test("lists the empty string", () {
+        expect(list("foo/bar**"), completion(equals([p.join("foo", "bar")])));
+      });
+
+      test("lists recursively", () {
+        expect(list("foo/**"), completion(unorderedEquals([
+          p.join("foo", "bar"),
+          p.join("foo", "baz"),
+          p.join("foo", "baz", "qux"),
+          p.join("foo", "baz", "bang")
+        ])));
+      });
+
+      test("combines with literals", () {
+        expect(list("foo/ba**"), completion(unorderedEquals([
+          p.join("foo", "bar"),
+          p.join("foo", "baz"),
+          p.join("foo", "baz", "qux"),
+          p.join("foo", "baz", "bang")
+        ])));
+      });
+
+      test("lists recursively in the middle of a glob", () {
+        d.dir("deep", [
+          d.dir("a", [
+            d.dir("b", [
+              d.dir("c", [
+                d.file("d"),
+                d.file("long-file")
+              ]),
+              d.dir("long-dir", [d.file("x")])
+            ])
+          ])
+        ]).create();
+
+        expect(list("deep/**/?/?"), completion(unorderedEquals([
+          p.join("deep", "a", "b", "c"),
+          p.join("deep", "a", "b", "c", "d")
+        ])));
+      });
+    });
+
+    group("any char", () {
+      test("matches a character", () {
+        expect(list("foo/ba?"), completion(unorderedEquals([
+          p.join("foo", "bar"),
+          p.join("foo", "baz")
+        ])));
+      });
+
+      test("doesn't match a separator", () {
+        expect(list("foo?bar"), completion(isEmpty));
+      });
+    });
+
+    group("range", () {
+      test("matches a range of characters", () {
+        expect(list("foo/ba[a-z]"), completion(unorderedEquals([
+          p.join("foo", "bar"),
+          p.join("foo", "baz")
+        ])));
+      });
+
+      test("matches a specific list of characters", () {
+        expect(list("foo/ba[rz]"), completion(unorderedEquals([
+          p.join("foo", "bar"),
+          p.join("foo", "baz")
+        ])));
+      });
+
+      test("doesn't match outside its range", () {
+        expect(list("foo/ba[a-x]"),
+            completion(unorderedEquals([p.join("foo", "bar")])));
+      });
+
+      test("doesn't match outside its specific list", () {
+        expect(list("foo/ba[rx]"),
+            completion(unorderedEquals([p.join("foo", "bar")])));
+      });
+    });
+
+    test("the same file shouldn't be non-recursively listed multiple times",
+        () {
+      d.dir("multi", [
+        d.dir("start-end", [d.file("file")])
+      ]).create();
+
+      expect(list("multi/{start-*/f*,*-end/*e}"),
+          completion(equals([p.join("multi", "start-end", "file")])));
+    });
+
+    test("the same file shouldn't be recursively listed multiple times", () {
+      d.dir("multi", [
+        d.dir("a", [
+          d.dir("b", [
+            d.file("file"),
+            d.dir("c", [
+              d.file("file")
+            ])
+          ]),
+          d.dir("x", [
+            d.dir("y", [
+              d.file("file")
+            ])
+          ])
+        ])
+      ]).create();
+
+      expect(list("multi/{*/*/*/file,a/**/file}"), completion(unorderedEquals([
+        p.join("multi", "a", "b", "file"),
+        p.join("multi", "a", "b", "c", "file"),
+        p.join("multi", "a", "x", "y", "file")
+      ])));
+    });
+
+    group("with symlinks", () {
+      setUp(() {
+        schedule(() {
+          return new Link(p.join(sandbox, "dir", "link"))
+              .create(p.join(sandbox, "foo", "baz"), recursive: true);
+        }, "symlink foo/baz to dir/link");
+      });
+
+      test("follows symlinks by default", () {
+        expect(list("dir/**"), completion(unorderedEquals([
+          p.join("dir", "link"),
+          p.join("dir", "link", "bang"),
+          p.join("dir", "link", "qux")
+        ])));
+      });
+
+      test("doesn't follow symlinks with followLinks: false", () {
+        expect(list("dir/**", followLinks: false),
+            completion(equals([p.join("dir", "link")])));
+      });
+
+      test("shouldn't crash on broken symlinks", () {
+        schedule(() {
+          return new Directory(p.join(sandbox, "foo")).delete(recursive: true);
+        });
+
+        expect(list("dir/**"), completion(equals([p.join("dir", "link")])));
+      });
+    });
+
+    test("always lists recursively with recursive: true", () {
+      expect(list("foo", recursive: true), completion(unorderedEquals([
+        "foo",
+        p.join("foo", "bar"),
+        p.join("foo", "baz"),
+        p.join("foo", "baz", "qux"),
+        p.join("foo", "baz", "bang")
+      ])));
+    });
+
+    test("lists an absolute glob", () {
+      expect(schedule(() {
+        var pattern = separatorToForwardSlash(
+            p.absolute(p.join(sandbox, 'foo/baz/**')));
+
+        return list(pattern);
+      }), completion(unorderedEquals([
+        p.join("foo", "baz", "bang"),
+        p.join("foo", "baz", "qux")
+      ])));
+    });
+  });
+}
+
+typedef Future<List<String>> ListFn(String glob,
+    {bool recursive, bool followLinks});
+
+/// Runs [callback] in two groups with two values of [listFn]: one that uses
+/// [Glob.list], one that uses [Glob.listSync].
+void syncAndAsync(callback(ListFn listFn)) {
+  group("async", () {
+    callback((glob, {recursive: false, followLinks: true}) {
+      return schedule(() {
+        return new Glob(glob, recursive: recursive)
+            .list(root: sandbox, followLinks: followLinks)
+            .map((entity) {
+          return separatorToForwardSlash(
+              p.relative(entity.path, from: sandbox));
+        }).toList();
+      }, 'listing $glob');
+    });
+  });
+
+  group("sync", () {
+    callback((glob, {recursive: false, followLinks: true}) {
+      return schedule(() {
+        return new Glob(glob, recursive: recursive)
+            .listSync(root: sandbox, followLinks: followLinks)
+            .map((entity) {
+          return separatorToForwardSlash(
+              p.relative(entity.path, from: sandbox));
+        }).toList();
+      }, 'listing $glob');
+    });
+  });
+}
+
+void scheduleSandbox() {
+  schedule(() {
+    return Directory.systemTemp.createTemp('glob_').then((dir) {
+      sandbox = dir.path;
+      d.defaultRoot = sandbox;
+    });
+  }, 'creating sandbox');
+
+  currentSchedule.onComplete.schedule(() {
+    d.defaultRoot = null;
+    if (sandbox == null) return null;
+    var oldSandbox = sandbox;
+    sandbox = null;
+    return new Directory(oldSandbox).delete(recursive: true);
+  });
+}
diff --git a/pkg/glob/test/match_test.dart b/pkg/glob/test/match_test.dart
index ad9dcf3..448d60c 100644
--- a/pkg/glob/test/match_test.dart
+++ b/pkg/glob/test/match_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:glob/glob.dart';
+import 'package:glob/src/utils.dart';
 import 'package:path/path.dart' as p;
 import 'package:unittest/unittest.dart';
 
@@ -234,8 +235,7 @@
   });
 
   test("a relative path can be matched by an absolute glob", () {
-    var pattern = p.absolute('foo/bar');
-    if (p.style == p.Style.windows) pattern = pattern.replaceAll('\\', '/');
+    var pattern = separatorToForwardSlash(p.absolute('foo/bar'));
     expect('foo/bar', contains(new Glob(pattern)));
   });
 
diff --git a/pkg/http_multi_server/CHANGELOG.md b/pkg/http_multi_server/CHANGELOG.md
index 05f2f2c..f3d79a3 100644
--- a/pkg/http_multi_server/CHANGELOG.md
+++ b/pkg/http_multi_server/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.3.0
+
+* Add support for `HttpServer.autoCompress`.
+
 ## 1.2.0
 
 * Add support for `HttpServer.defaultResponseHeaders.clear`.
diff --git a/pkg/http_multi_server/lib/http_multi_server.dart b/pkg/http_multi_server/lib/http_multi_server.dart
index 7075ab4..01e3ca8 100644
--- a/pkg/http_multi_server/lib/http_multi_server.dart
+++ b/pkg/http_multi_server/lib/http_multi_server.dart
@@ -46,6 +46,13 @@
     }
   }
 
+  bool get autoCompress => _servers.first.autoCompress;
+  set autoCompress(bool value) {
+    for (var server in _servers) {
+      server.autoCompress = value;
+    }
+  }
+
   /// Returns the port that one of the wrapped servers is listening on.
   ///
   /// If the wrapped servers are listening on different ports, it's not defined
diff --git a/pkg/http_multi_server/pubspec.yaml b/pkg/http_multi_server/pubspec.yaml
index b1b2830..edc4c41 100644
--- a/pkg/http_multi_server/pubspec.yaml
+++ b/pkg/http_multi_server/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http_multi_server
-version: 1.2.0
+version: 1.3.0+1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description:
@@ -8,4 +8,4 @@
   unittest: ">=0.11.0 <0.12.0"
   http: ">=0.11.0 <0.12.0"
 environment:
-  sdk: ">=1.6.0-dev.6.0 <2.0.0"
+  sdk: ">=1.7.0-edge.40587 <2.0.0"
diff --git a/pkg/http_multi_server/test/http_multi_server_test.dart b/pkg/http_multi_server/test/http_multi_server_test.dart
index 0371c89..2729fa0 100644
--- a/pkg/http_multi_server/test/http_multi_server_test.dart
+++ b/pkg/http_multi_server/test/http_multi_server_test.dart
@@ -60,6 +60,27 @@
       }), completes);
     });
 
+    test("autoCompress= sets the value for all servers", () {
+      multiServer.autoCompress = true;
+
+      multiServer.listen((request) {
+        request.response.write("got request");
+        request.response.close();
+      });
+
+      expect(_get(subServer1).then((response) {
+        expect(response.headers['content-encoding'], equals("gzip"));
+      }), completes);
+
+      expect(_get(subServer2).then((response) {
+        expect(response.headers['content-encoding'], equals("gzip"));
+      }), completes);
+
+      expect(_get(subServer3).then((response) {
+        expect(response.headers['content-encoding'], equals("gzip"));
+      }), completes);
+    });
+
     test("headers.set sets the value for all servers", () {
       multiServer.defaultResponseHeaders.set(
           "server", "http_multi_server test");
diff --git a/pkg/intl/CHANGELOG.md b/pkg/intl/CHANGELOG.md
index aebfa3b..3e3e69c 100644
--- a/pkg/intl/CHANGELOG.md
+++ b/pkg/intl/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.11.8
+
+  * Support NumberFormats with two different grouping sizes, e.g.
+    1,23,45,67,890
+
 ## 0.11.7
   * Moved petitparser into a regular dependency so pub run works.
 
@@ -22,7 +27,7 @@
 
 ## 0.11.3
 
- * Add a --[no]-use-deferred-loading flag to generate_from_arb.dart and 
+ * Add a --[no]-use-deferred-loading flag to generate_from_arb.dart and
    generally make the deferred loading of message libraries optional.
 
 ## 0.11.2
@@ -37,11 +42,11 @@
 
 ## 0.11.0
 
- * Switch the message format from a custom JSON format to 
+ * Switch the message format from a custom JSON format to
    the ARB format ( https://code.google.com/p/arb/ )
 
 ## 0.10.0
- 
+
  * Make message catalogs use deferred loading.
 
  * Update CLDR Data to version 25 for dates and numbers.
@@ -59,7 +64,7 @@
   you can format for a particular locale without it dictating the currency, and
   also supply the currency symbols which we don't have yet.
 
-* Canonicalize locales more consistently, avoiding a number of problems if you 
+* Canonicalize locales more consistently, avoiding a number of problems if you
   use a non-canonical form.
 
 * For locales whose length is longer than 6 change "-" to "_" in position 3 when
@@ -73,6 +78,3 @@
 * Handle two different messages with the same text.
 
 * Allow complex string literals in arguments (e.g. multi-line)
-
-
-
diff --git a/pkg/intl/lib/number_symbols_data.dart b/pkg/intl/lib/number_symbols_data.dart
index 7eb76f6..e30719a 100644
--- a/pkg/intl/lib/number_symbols_data.dart
+++ b/pkg/intl/lib/number_symbols_data.dart
@@ -4,7 +4,6 @@
 // code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-
 /**
  * Date/time formatting symbols for all locales.
  *
@@ -17,7 +16,6 @@
  * removed after those changes land to CLDR.
  */
 
-
 library number_symbol_data;
 import "number_symbols.dart";
 
@@ -737,6 +735,27 @@
       DEF_CURRENCY_CODE: 'CAD'
 ),
   /**
+   * Number formatting symbols for locale ga.
+   */
+  "ga" : const NumberSymbols(
+      NAME: "ga",
+      DECIMAL_SEP: '.',
+      GROUP_SEP: ',',
+      PERCENT: '%',
+      ZERO_DIGIT: '0',
+      PLUS_SIGN: '+',
+      MINUS_SIGN: '-',
+      EXP_SYMBOL: 'E',
+      PERMILL: '\u2030',
+      INFINITY: '\u221E',
+      NAN: 'NaN',
+      DECIMAL_PATTERN: '#,##0.###',
+      SCIENTIFIC_PATTERN: '#E0',
+      PERCENT_PATTERN: '#,##0%',
+      CURRENCY_PATTERN: '\u00A4#,##0.00',
+      DEF_CURRENCY_CODE: 'EUR'
+),
+  /**
    * Number formatting symbols for locale gl.
    */
   "gl" : const NumberSymbols(
diff --git a/pkg/intl/lib/src/intl/number_format.dart b/pkg/intl/lib/src/intl/number_format.dart
index 272d70b..c00d5db 100644
--- a/pkg/intl/lib/src/intl/number_format.dart
+++ b/pkg/intl/lib/src/intl/number_format.dart
@@ -52,6 +52,15 @@
    * between commas.
    */
   int _groupingSize = 3;
+  /**
+   * In some formats the last grouping size may be different than previous
+   * ones, e.g. Hindi.
+   */
+  int _finalGroupingSize = 3;
+  /**
+   * Set to true if the format has explicitly set the grouping size.
+   */
+  bool _groupingSizeSetExplicitly = false;
   bool _decimalSeparatorAlwaysShown = false;
   bool _useSignForPositiveExponent = false;
   bool _useExponentialNotation = false;
@@ -346,13 +355,17 @@
    * We are printing the digits of the number from left to right. We may need
    * to print a thousands separator or other grouping character as appropriate
    * to the locale. So we find how many places we are from the end of the number
-   * by subtracting our current [position] from the [totalLength] and print
-   * the separator character every [_groupingSize] digits.
+   * by subtracting our current [position] from the [totalLength] and printing
+   * the separator character every [_groupingSize] digits, with the final 
+   * grouping possibly being of a different size, [_finalGroupingSize].
    */
   void _group(int totalLength, int position) {
     var distanceFromEnd = totalLength - position;
     if (distanceFromEnd <= 1 || _groupingSize <= 0) return;
-    if (distanceFromEnd % _groupingSize == 1) {
+    if (distanceFromEnd == _finalGroupingSize + 1) {
+      _add(symbols.GROUP_SEP);
+    } else if ((distanceFromEnd > _finalGroupingSize) && 
+        (distanceFromEnd - _finalGroupingSize) % _groupingSize == 1) {
       _add(symbols.GROUP_SEP);
     }
   }
@@ -847,7 +860,10 @@
       }
     }
 
-    format._groupingSize = max(0, groupingCount);
+    format._finalGroupingSize = max(0, groupingCount);
+    if (!format._groupingSizeSetExplicitly) {
+      format._groupingSize = format._finalGroupingSize;
+    }
     format._decimalSeparatorAlwaysShown = decimalPos == 0 ||
         decimalPos == totalDigits;
 
@@ -883,6 +899,10 @@
         }
         break;
       case _PATTERN_GROUPING_SEPARATOR:
+        if (groupingCount > 0) {
+          format._groupingSizeSetExplicitly = true;
+          format._groupingSize = groupingCount;
+        }
         groupingCount = 0;
         break;
       case _PATTERN_DECIMAL_SEPARATOR:
diff --git a/pkg/intl/pubspec.yaml b/pkg/intl/pubspec.yaml
index 9fc0d73..dad9a65 100644
--- a/pkg/intl/pubspec.yaml
+++ b/pkg/intl/pubspec.yaml
@@ -1,5 +1,5 @@
 name: intl
-version: 0.11.7
+version: 0.11.8
 author: Dart Team <misc@dartlang.org>
 description: Contains code to deal with internationalized/localized messages, date and number formatting and parsing, bi-directional text, and other internationalization issues.
 homepage: https://www.dartlang.org
diff --git a/pkg/intl/test/number_format_test.dart b/pkg/intl/test/number_format_test.dart
index d94f126..52520fa 100644
--- a/pkg/intl/test/number_format_test.dart
+++ b/pkg/intl/test/number_format_test.dart
@@ -83,14 +83,16 @@
   sortedLocales.sort((a, b) => a.compareTo(b));
   for (var locale in sortedLocales) {
     var testFormats = standardFormats(locale);
-    var list = mainList.take((testFormats.length * 2) + 1).iterator;
-    mainList = mainList.skip((testFormats.length * 2) + 1);
+    var testLength = (testFormats.length * 3) + 1;
+    var list = mainList.take(testLength).iterator;
+    mainList = mainList.skip(testLength);
     var nextLocaleFromList = (list..moveNext()).current;
     test("Test against ICU data for $locale", () {
       expect(locale, nextLocaleFromList);
       for (var format in testFormats) {
         var formatted = format.format(123);
         var negative = format.format(-12.3);
+        var large = format.format(1234567890);
         var expected = (list..moveNext()).current;
         expect(formatted, expected);
         var expectedNegative = (list..moveNext()).current;
@@ -102,10 +104,14 @@
             .replaceAll("\u200f", "")
             .replaceAll("\u2212", "-");
         expect(negative, expectedNegative);
+        var expectedLarge = (list..moveNext()).current;
+        expect(large, expectedLarge);
         var readBack = format.parse(formatted);
         expect(readBack, 123);
         var readBackNegative = format.parse(negative);
         expect(readBackNegative, -12.3);
+        var readBackLarge = format.parse(large);
+        expect(readBackLarge, 1234567890);
       }
     });
   }
diff --git a/pkg/intl/test/number_test_data.dart b/pkg/intl/test/number_test_data.dart
index 1f2dcd1..ff7e674 100644
--- a/pkg/intl/test/number_test_data.dart
+++ b/pkg/intl/test/number_test_data.dart
@@ -15,501 +15,708 @@
     "af",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "am",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "ar",
     r"١٢٣",
     r"‏-١٢٫٣",
+    r"١٬٢٣٤٬٥٦٧٬٨٩٠",
     r"١٢٬٣٠٠٪",
     r"‏-١٬٢٣٠٪",
+    r"١٢٣٬٤٥٦٬٧٨٩٬٠٠٠٪",
     "az",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "bg",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "bn",
     r"১২৩",
     r"-১২.৩",
+    r"১,২৩,৪৫,৬৭,৮৯০",
     r"১২,৩০০%",
     r"-১,২৩০%",
+    r"১,২৩,৪৫,৬৭,৮৯,০০০%",
     "br",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "ca",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "chr",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "cs",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300 %",
     r"-1 230 %",
+    r"123 456 789 000 %",
     "cy",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "da",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300 %",
     r"-1.230 %",
+    r"123.456.789.000 %",
     "de",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300 %",
     r"-1.230 %",
+    r"123.456.789.000 %",
     "de_AT",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300 %",
     r"-1.230 %",
+    r"123.456.789.000 %",
     "de_CH",
     r"123",
     r"-12.3",
+    r"1'234'567'890",
     r"12'300 %",
     r"-1'230 %",
+    r"123'456'789'000 %",
     "el",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "en",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "en_AU",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "en_GB",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "en_IE",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "en_IN",
     r"123",
     r"-12.3",
+    r"1,23,45,67,890",
     r"12,300%",
     r"-1,230%",
+    r"1,23,45,67,89,000%",
     "en_SG",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "en_US",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "en_ZA",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "es",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "es_419",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "es_ES",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "et",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "eu",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"% 12.300",
     r"-% 1.230",
+    r"% 123.456.789.000",
     "fa",
     r"۱۲۳",
     r"‎−۱۲٫۳",
+    r"۱٬۲۳۴٬۵۶۷٬۸۹۰",
     r"۱۲٬۳۰۰٪",
     r"‎−۱٬۲۳۰٪",
+    r"۱۲۳٬۴۵۶٬۷۸۹٬۰۰۰٪",
     "fi",
     r"123",
     r"−12,3",
+    r"1 234 567 890",
     r"12 300 %",
     r"−1 230 %",
+    r"123 456 789 000 %",
     "fil",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "fr",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300 %",
     r"-1 230 %",
+    r"123 456 789 000 %",
     "fr_CA",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300 %",
     r"-1 230 %",
+    r"123 456 789 000 %",
+    "ga",
+    r"123",
+    r"-12.3",
+    r"1,234,567,890",
+    r"12,300%",
+    r"-1,230%",
+    r"123,456,789,000%",
     "gl",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "gsw",
     r"123",
     r"−12.3",
+    r"1’234’567’890",
     r"12’300 %",
     r"−1’230 %",
+    r"123’456’789’000 %",
     "gu",
     r"123",
     r"-12.3",
+    r"1,23,45,67,890",
     r"12,300%",
     r"-1,230%",
+    r"1,23,45,67,89,000%",
     "haw",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "he",
     r"123",
     r"‎-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"‎-1,230%",
+    r"123,456,789,000%",
     "hi",
     r"123",
     r"-12.3",
+    r"1,23,45,67,890",
     r"12,300%",
     r"-1,230%",
+    r"1,23,45,67,89,000%",
     "hr",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "hu",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "hy",
     r"123",
     r"-12,3",
+    r"1234567890",
     r"12300%",
     r"-1230%",
+    r"123456789000%",
     "id",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "in",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "is",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "it",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "iw",
     r"123",
     r"‎-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"‎-1,230%",
+    r"123,456,789,000%",
     "ja",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "ka",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300 %",
     r"-1 230 %",
+    r"123 456 789 000 %",
     "kk",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "km",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "kn",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "ko",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "ky",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "ln",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "lo",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "lt",
     r"123",
     r"−12,3",
+    r"1 234 567 890",
     r"12 300 %",
     r"−1 230 %",
+    r"123 456 789 000 %",
     "lv",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "mk",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "ml",
     r"123",
     r"-12.3",
+    r"1,23,45,67,890",
     r"12,300%",
     r"-1,230%",
+    r"1,23,45,67,89,000%",
     "mn",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "mr",
     r"१२३",
     r"-१२.३",
+    r"१,२३४,५६७,८९०",
     r"१२,३००%",
     r"-१,२३०%",
+    r"१२३,४५६,७८९,०००%",
     "ms",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "mt",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "my",
     r"၁၂၃",
     r"-၁၂.၃",
+    r"၁,၂၃၄,၅၆၇,၈၉၀",
     r"၁၂,၃၀၀%",
     r"-၁,၂၃၀%",
+    r"၁၂၃,၄၅၆,၇၈၉,၀၀၀%",
     "nb",
     r"123",
     r"−12,3",
+    r"1 234 567 890",
     r"12 300 %",
     r"−1 230 %",
+    r"123 456 789 000 %",
     "ne",
     r"१२३",
     r"-१२.३",
+    r"१,२३४,५६७,८९०",
     r"१२,३००%",
     r"-१,२३०%",
+    r"१२३,४५६,७८९,०००%",
     "nl",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "no",
     r"123",
     r"−12,3",
+    r"1 234 567 890",
     r"12 300 %",
     r"−1 230 %",
+    r"123 456 789 000 %",
     "no_NO",
     r"123",
     r"−12,3",
+    r"1 234 567 890",
     r"12 300 %",
     r"−1 230 %",
+    r"123 456 789 000 %",
     "or",
     r"123",
     r"-12.3",
+    r"1,23,45,67,890",
     r"12,300%",
     r"-1,230%",
+    r"1,23,45,67,89,000%",
     "pa",
     r"123",
     r"-12.3",
+    r"1,23,45,67,890",
     r"12,300%",
     r"-1,230%",
+    r"1,23,45,67,89,000%",
     "pl",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "pt",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "pt_BR",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "pt_PT",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "ro",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300 %",
     r"-1.230 %",
+    r"123.456.789.000 %",
     "ru",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300 %",
     r"-1 230 %",
+    r"123 456 789 000 %",
     "si",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "sk",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300 %",
     r"-1 230 %",
+    r"123 456 789 000 %",
     "sl",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "sq",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "sr",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "sv",
     r"123",
     r"−12,3",
+    r"1 234 567 890",
     r"12 300 %",
     r"−1 230 %",
+    r"123 456 789 000 %",
     "sw",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "ta",
     r"123",
     r"-12.3",
+    r"1,23,45,67,890",
     r"12,300%",
     r"-1,230%",
+    r"1,23,45,67,89,000%",
     "te",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "th",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "tl",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "tr",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"%12.300",
     r"-%1.230",
+    r"%123.456.789.000",
     "uk",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "ur",
     r"123",
     r"‎-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"‎-1,230%",
+    r"123,456,789,000%",
     "uz",
     r"123",
     r"-12,3",
+    r"1 234 567 890",
     r"12 300%",
     r"-1 230%",
+    r"123 456 789 000%",
     "vi",
     r"123",
     r"-12,3",
+    r"1.234.567.890",
     r"12.300%",
     r"-1.230%",
+    r"123.456.789.000%",
     "zh",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "zh_CN",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "zh_HK",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "zh_TW",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "zu",
     r"123",
     r"-12.3",
+    r"1,234,567,890",
     r"12,300%",
     r"-1,230%",
+    r"123,456,789,000%",
     "END"];
\ No newline at end of file
diff --git a/pkg/metatest/CHANGELOG.md b/pkg/metatest/CHANGELOG.md
new file mode 100644
index 0000000..f9b4e1c
--- /dev/null
+++ b/pkg/metatest/CHANGELOG.md
@@ -0,0 +1,3 @@
+# 0.1.0
+
+* First release.
diff --git a/pkg/serialization/LICENSE b/pkg/metatest/LICENSE
similarity index 95%
rename from pkg/serialization/LICENSE
rename to pkg/metatest/LICENSE
index ee99930..5c60afe 100644
--- a/pkg/serialization/LICENSE
+++ b/pkg/metatest/LICENSE
@@ -1,4 +1,4 @@
-Copyright 2013, the Dart project authors. All rights reserved.
+Copyright 2014, the Dart project authors. All rights reserved.
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
diff --git a/pkg/scheduled_test/test/metatest.dart b/pkg/metatest/lib/metatest.dart
similarity index 65%
rename from pkg/scheduled_test/test/metatest.dart
rename to pkg/metatest/lib/metatest.dart
index 3c0cd9a..c8b5660 100644
--- a/pkg/scheduled_test/test/metatest.dart
+++ b/pkg/metatest/lib/metatest.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -10,14 +10,88 @@
 library metatest;
 
 import 'dart:async';
-import 'dart:io';
 import 'dart:isolate';
 
-import 'package:path/path.dart' as path;
 import 'package:unittest/unittest.dart';
-import 'package:scheduled_test/scheduled_test.dart' as scheduled_test;
 
-import 'utils.dart';
+import 'src/utils.dart';
+
+/// Whether or not we're running in a child isolate that's supposed to run a
+/// test.
+bool _inChildIsolate;
+
+/// The port with which the child isolate should communicate with the parent
+/// isolate.
+///
+/// `null` in the parent isolate.
+SendPort _replyTo;
+
+/// The only value of the configuration used in metatest.
+final _metaConfiguration = new _MetaConfiguration();
+
+/// The function holding the tests to be run.
+Function _testBody;
+
+/// The description of the test to run in the child isolate.
+///
+/// `null` in the parent isolate.
+String _testToRun;
+
+/// Stores the optional timeout used to override the default unittest timeout.
+Duration _timeoutOverride;
+
+/// Runs [setUpFn] before every metatest.
+///
+/// Note that [setUpFn] will be overwritten if the test itself calls [setUp].
+void metaSetUp(void setUpFn()) {
+  if (_inChildIsolate) setUp(setUpFn);
+}
+
+/// Runs a set of tests defined in `body` and checks the result by comparing
+/// with values in `expectedResults`.
+///
+/// [expectedResults] is a list which should have a [Map] value for each test
+/// that is run. Each [Map] key corresponds to values from a completed test
+/// case: "description", "message", "result", and "stackTrace".
+///
+/// The value of "result" can be one of: 'pass', 'fail', or 'error'.
+///
+/// The value for "stackTrace" is the [String] 'null' if the property is `null`
+/// on the source test case. Otherwise, it is the output of `toString`. The
+/// format is not guaranteed.
+///
+/// Here's an example of a `expectedResults` value for two tests, where the
+/// where the first fails and the second passes.
+///
+/// ```dart
+/// [{
+///   'description': 'test',
+///   'message': 'Caught error!',
+///   'result': 'fail',
+/// }, {
+///   'description': 'follow up',
+///   'result': 'pass',
+/// }]
+/// ```
+void expectTestResults(String description, void body(),
+    List<Map> expectedResults) {
+  _setUpTest(description, body, (resultsMap) {
+    var list = resultsMap['results'];
+    expect(list, hasLength(expectedResults.length),
+        reason: 'The number of tests run does not match the number of expected'
+          ' results.');
+
+    for (var i = 0; i < list.length; i++) {
+      var expectedMap = expectedResults[i];
+      var map = list[i];
+
+      expectedMap.forEach((key, value) {
+        expect(map, containsPair(key, value), reason: 'A test did not match the'
+          ' expected value for "$key" at index $i.');
+      });
+    }
+  });
+}
 
 /// Declares a test with the given [description] and [body]. [body] corresponds
 /// to the `main` method of a test file, and will be run in an isolate. By
@@ -26,12 +100,12 @@
 void expectTestsPass(String description, void body(), {List<String> passing}) {
   _setUpTest(description, body, (results) {
     if (_hasError(results)) {
-      throw 'Expected all tests to pass, but got error(s):\n'
-          '${_summarizeTests(results)}';
+      fail('Expected all tests to pass, but got error(s):\n'
+          '${_summarizeTests(results)}');
     } else if (passing == null) {
       if (results['failed'] != 0) {
-        throw 'Expected all tests to pass, but some failed:\n'
-            '${_summarizeTests(results)}';
+        fail('Expected all tests to pass, but some failed:\n'
+            '${_summarizeTests(results)}');
       }
     } else {
       var shouldPass = new Set.from(passing);
@@ -42,7 +116,7 @@
       if (!shouldPass.containsAll(didPass) ||
           !didPass.containsAll(shouldPass)) {
         String stringify(Set<String> tests) =>
-          '{${tests.map((t) => '"$t"').join(', ')}}';
+            '{${tests.map((t) => '"$t"').join(', ')}}';
 
         fail('Expected exactly ${stringify(shouldPass)} to pass, but '
             '${stringify(didPass)} passed.\n'
@@ -52,38 +126,6 @@
   });
 }
 
-/// Declares a test with the given [description] and [body].
-///
-/// [body] corresponds
-/// to the `main` method of a test file, and will be run in an isolate.
-///
-/// All tests must have an expected result in [expectedResults].
-void expectTests(String description, void body(),
-                 Map<String, String> expectedResults) {
-  _setUpTest(description, body, (results) {
-    expectedResults = new Map.from(expectedResults);
-
-    for (var testResult in results['results']) {
-      var description = testResult['description'];
-
-      expect(expectedResults, contains(description),
-          reason: '"$description" did not have an expected result set.\n'
-            '${_summarizeTests(results)}');
-
-      var result = testResult['result'];
-
-      expect(expectedResults, containsPair(description, result),
-          reason: 'The test "$description" not not have the expected result.\n'
-            '${_summarizeTests(results)}');
-
-      expectedResults.remove(description);
-    }
-    expect(expectedResults, isEmpty,
-        reason: 'Unexpected additional test results\n'
-            '${_summarizeTests(results)}');
-  });
-}
-
 /// Declares a test with the given [description] and [body]. [body] corresponds
 /// to the `main` method of a test file, and will be run in an isolate. Expects
 /// all tests defined by [body] to fail.
@@ -99,45 +141,27 @@
   });
 }
 
-/// Runs [setUpFn] before every metatest. Note that [setUpFn] will be
-/// overwritten if the test itself calls [setUp].
-void metaSetUp(void setUpFn()) {
-  if (_inChildIsolate) scheduled_test.setUp(setUpFn);
-}
-
 /// Sets up a test with the given [description] and [body]. After the test runs,
 /// calls [validate] with the result map.
-void _setUpTest(String description, void body(), void validate(Map)) {
+void _setUpTest(String description, void body(), void validate(Map map)) {
   if (_inChildIsolate) {
     _ensureInitialized();
     if (_testToRun == description) body();
   } else {
     test(description, () {
-      expect(_runInIsolate(description).then(validate), completes);
+      return _runInIsolate(description).then(validate);
     });
   }
 }
 
-/// The description of the test to run in the child isolate.
-///
-/// `null` in the parent isolate.
-String _testToRun;
-
-/// The port with which the child isolate should communicate with the parent
-/// isolate.
-///
-/// `null` in the parent isolate.
-SendPort _replyTo;
-
-/// Whether or not we're running in a child isolate that's supposed to run a
-/// test.
-bool _inChildIsolate;
-
 /// Initialize metatest.
 ///
 /// [message] should be the second argument to [main]. It's used to determine
 /// whether this test is in the parent isolate or a child isolate.
-void initMetatest(message) {
+///
+/// [timeout], when specified, overrides the default timeout for unittest.
+void initMetatest(message, {Duration timeout}) {
+  _timeoutOverride = timeout;
   if (message == null) {
     _inChildIsolate = false;
   } else {
@@ -147,22 +171,27 @@
   }
 }
 
-/// Runs the test described by [description] in its own isolate. Returns a map
-/// describing the results of that test run.
+// TODO(kevmoo) We need to capture the main method to allow running in an
+// isolate. There is no mechanism to capture the current executing URI between
+// browser and vm. Issue 1145 and/or Issue 8440
+void initTests(void testBody(message)) {
+  _testBody = testBody;
+  _testBody(null);
+}
+
+/// Runs the test described by [description] in its own isolate.
+///
+/// Returns a map describing the results of that test run.
 Future<Map> _runInIsolate(String description) {
+  if (_testBody == null) {
+    throw new StateError('initTests was not called.');
+  }
+
   var replyPort = new ReceivePort();
-  // TODO(nweiz): Don't use path here once issue 8440 is fixed.
-  var uri = path.toUri(path.absolute(path.fromUri(Platform.script)));
-  return Isolate.spawnUri(uri, [], {
+  return Isolate.spawn(_testBody, {
     'testToRun': description,
     'replyTo': replyPort.sendPort
-  }).then((_) {
-    // TODO(nweiz): Remove this timeout once issue 8875 is fixed and we can
-    // capture top-level exceptions.
-    return timeout(replyPort.first, 30 * 1000, () {
-      throw 'Timed out waiting for test to complete.';
-    });
-  });
+  }).then((_) => replyPort.first);
 }
 
 /// Returns whether [results] (a test result map) describes a test run in which
@@ -211,11 +240,12 @@
 
 /// Ensure that the metatest configuration is loaded.
 void _ensureInitialized() {
-  unittestConfiguration = _singleton;
+  unittestConfiguration = _metaConfiguration;
+  if (_timeoutOverride != null) {
+    unittestConfiguration.timeout = _timeoutOverride;
+  }
 }
 
-final _singleton = new _MetaConfiguration();
-
 /// Special test configuration for use within the child isolates. This hides all
 /// output and reports data back to the parent isolate.
 class _MetaConfiguration extends Configuration {
diff --git a/pkg/metatest/lib/src/utils.dart b/pkg/metatest/lib/src/utils.dart
new file mode 100644
index 0000000..542f289
--- /dev/null
+++ b/pkg/metatest/lib/src/utils.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library metatest.utils;
+
+/// Prepends each line in [text] with [prefix]. If [firstPrefix] is passed, the
+/// first line is prefixed with that instead.
+String prefixLines(String text, {String prefix: '| ', String firstPrefix}) {
+  var lines = text.split('\n');
+  if (firstPrefix == null) {
+    return lines.map((line) => '$prefix$line').join('\n');
+  }
+
+  var firstLine = "$firstPrefix${lines.first}";
+  lines = lines.skip(1).map((line) => '$prefix$line').toList();
+  lines.insert(0, firstLine);
+  return lines.join('\n');
+}
diff --git a/pkg/metatest/pubspec.yaml b/pkg/metatest/pubspec.yaml
new file mode 100644
index 0000000..e875ba8
--- /dev/null
+++ b/pkg/metatest/pubspec.yaml
@@ -0,0 +1,9 @@
+name: metatest
+version: 0.1.0
+author: Dart Team <misc@dartlang.org>
+description: A package for testing Dart test frameworks.
+homepage: https://www.dartlang.org/
+environment:
+  sdk: '>=1.0.0 <2.0.0'
+dependencies:
+  unittest: '>=0.11.0 <0.12.0'
diff --git a/pkg/observe/test/path_observer_test.dart b/pkg/observe/test/path_observer_test.dart
index aae8887..e1225ef 100644
--- a/pkg/observe/test/path_observer_test.dart
+++ b/pkg/observe/test/path_observer_test.dart
@@ -72,6 +72,7 @@
       expectPath('foo["b\\"az"]', 'foo["b\\"az"]', 2, [#foo, 'b"az']);
       expectPath("foo['b\\'az']", 'foo["b\'az"]', 2, [#foo, "b'az"]);
       expectPath([#a, #b], 'a.b', 2, [#a, #b]);
+      expectPath([], '', 0, []);
 
       expectPath('.', '<invalid path>', 0);
       expectPath(' . ', '<invalid path>', 0);
diff --git a/pkg/pkg.gyp b/pkg/pkg.gyp
index 5326455..7751c19 100644
--- a/pkg/pkg.gyp
+++ b/pkg/pkg.gyp
@@ -40,12 +40,12 @@
     {
       'target_name': 'pub_packages',
       'type': 'none',
+      'dependencies': [
+        'pkg_files.gyp:http_files_stamp',
+      ],
       'actions': [
         {
           'action_name': 'remove_html_imports',
-          'dependencies': [
-            'pkg_files.gyp:http_files_stamp',
-          ],
           'inputs': [
             '../tools/remove_html_imports.py',
             '<(SHARED_INTERMEDIATE_DIR)/http_files.stamp',
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 9b8dad1..6cb7c51 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -35,10 +35,13 @@
 polymer/test/custom_event_test: Pass, RuntimeError # Issue 18931
 polymer/test/entered_view_test: Pass, RuntimeError # Issue 18931
 polymer/test/event_binding_release_handler_test: Pass, RuntimeError # Issue 18931
+polymer/test/event_controller_test: Pass, RuntimeError # Issue 21012
 polymer/test/event_handlers_test: Pass, RuntimeError # Issue 18931
 polymer/test/event_path_test: Pass, RuntimeError # Issue 18931
 polymer/test/event_path_declarative_test: Pass, RuntimeError, Timeout # Issue 18931
 polymer/test/events_test: Pass, RuntimeError # Issue 18931
+polymer/test/force_ready_test: Pass, RuntimeError # Issue 18931
+polymer/test/inject_bound_html_test: Pass, RuntimeError # Issue 18931
 polymer/test/instance_attrs_test: Pass, RuntimeError # Issue 18931
 polymer/test/js_custom_event_test: Pass, RuntimeError # Issue 18931
 polymer/test/js_interop_test: Pass, RuntimeError # Issue 18931
@@ -113,19 +116,6 @@
 polymer/test/build/unique_message_test: Skip # Intended only as a vm test.
 code_transformers/test/unique_message_test: Skip # Intended only as a vm test.
 
-[ $compiler == dart2js && $runtime == ff && $system == windows ]
-http/test/html/client_test: Fail # Issue 19750
-scheduled_test/test/scheduled_stream/scheduled_stream_test: Fail # Issue 19750
-json_rpc_2/test/server/server_test: Fail # Issue 19750
-shelf/test/log_middleware_test: Fail # Issue 19750
-
-[ $runtime == ff ]
-stack_trace/test/trace_test: Fail # Issue 19750
-http/test/html/client_test: Fail # Issue 19750
-scheduled_test/test/scheduled_stream/scheduled_stream_test: Fail # Issue 19750
-json_rpc_2/test/server/server_test: Fail # Issue 19750
-shelf/test/log_middleware_test: Fail # Issue 19750
-
 [ $compiler == dart2js && $checked ]
 crypto/test/base64_test: Slow, Pass
 
@@ -154,16 +144,32 @@
 analysis_server/test/domain_analysis_test: Pass, Slow # Issue 16473, 19756
 analysis_server/test/analysis_notification_highlights_test: Pass, Slow # 16473, 19756
 analysis_server/test/search/top_level_declarations_test: Pass, Slow # 16473, 19756
+analysis_server/test/socket_server_test: Pass, Slow # Issue 16473, 19756
 analyzer/test/generated/element_test: Pass, Slow # Issue 16473
 
 [ $runtime == d8 || $runtime == jsshell ]
 stack_trace/test/chain_test: Fail # Issues 15171 and 15105
 stack_trace/test/vm_test: RuntimeError, OK # VM-specific traces
-unittest/test/missing_tick_test: Fail # Timer interface not supported: dartbug.com/7728.
 
 [ $runtime == jsshell ]
 async/test/stream_zip_test: RuntimeError, OK # Timers are not supported.
-scheduled_test/test/unittest_compatibility_test: Fail # Issue 7728
+scheduled_test/test/scheduled_future_matchers_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_stream/stream_matcher_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/abort_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/current_schedule_current_task_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/current_schedule_errors_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/current_schedule_state_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/nested_task_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/on_complete_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/on_exception_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/set_up_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/simple_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/task_return_value_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/tear_down_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/unhandled_error_test: RuntimeError #Issue 21005
+scheduled_test/test/scheduled_test/wrap_future_test: RuntimeError #Issue 21005
+scheduled_test/test/unittest_compatibility_test: RuntimeError #Issue 21005
+unittest/test/missing_tick_test: Fail # Timer interface not supported: dartbug.com/7728
 unittest/test/nested_groups_setup_teardown_test: RuntimeError # http://dartbug.com/10109
 
 [ $compiler == dart2js && $runtime == drt ]
@@ -183,10 +189,13 @@
 polymer/test/custom_event_test: Skip # uses dart:html
 polymer/test/entered_view_test: Skip # uses dart:html
 polymer/test/event_binding_release_handler_test: Skip #uses dart:html
+polymer/test/event_controller_test: Skip #uses dart:html
 polymer/test/event_handlers_test: Skip #uses dart:html
 polymer/test/event_path_declarative_test: Skip #uses dart:html
 polymer/test/event_path_test: Skip #uses dart:html
 polymer/test/events_test: Skip #uses dart:html
+polymer/test/force_ready_test: Skip # uses dart:html
+polymer/test/inject_bound_html_test: Skip # uses dart:html
 polymer/test/instance_attrs_test: Skip #uses dart:html
 polymer/test/js_custom_event_test: Skip #uses dart:html
 polymer/test/js_interop_test: Skip #uses dart:html
@@ -222,9 +231,6 @@
 intl/test/find_default_locale_browser_test: Fail
 intl/test/date_time_format_http_request_test: Skip # Timeout.
 
-[ $runtime == safarimobilesim ]
-polymer/test/bind_mdv_test: RuntimeError # Issue 20929
-
 [ $ie ]
 polymer/test/noscript_test: RuntimeError, Pass # Issue 13260
 intl/test/date_time_format_http_request_test: Fail # Issue 8983
@@ -233,13 +239,23 @@
 polymer/test/template_attr_template_test: RuntimeError # Issue 20897
 
 [ $runtime == ie10 ]
-typed_data/test/typed_buffers_test/none: Fail # Issue   17607 (I put this here explicitly, since this is not the same as on ie9)
-polymer/e2e_test/*: Pass, RuntimeError # Issue 19265
-polymer_expressions/*: Pass, RuntimeError # Issue 19265
-template_binding/test/template_binding_test: Pass, RuntimeError # Issue 19265
-template_binding/test/custom_element_bindings_test: Pass, RuntimeError # Issue 20714
-polymer/test/event_handlers_test: Pass, Timeout # Issue 19327
 analyzer/test/generated/java_core_test: Pass, Timeout # Issue 19747
+polymer/e2e_test/*: Pass, RuntimeError # Issue 19265
+polymer/test/event_handlers_test: Pass, Timeout # Issue 19327
+polymer_expressions/*: Pass, RuntimeError # Issue 19265
+template_binding/test/custom_element_bindings_test: Pass, RuntimeError # Issue 20714
+template_binding/test/template_binding_test: Pass, RuntimeError # Issue 19265
+typed_data/test/typed_buffers_test/none: Fail # Issue   17607 (I put this here explicitly, since this is not the same as on ie9)
+
+[ $runtime == ie10 || $runtime == ie11 ]
+scheduled_test/test/scheduled_test/current_schedule_errors_test: Timeout # Issue 21007
+scheduled_test/test/scheduled_test/nested_task_test: Timeout # Issue 21007
+scheduled_test/test/scheduled_test/out_of_band_task_test: Timeout # Issue 21007
+scheduled_test/test/scheduled_test/signal_error_test: Timeout # Issue 21007
+scheduled_test/test/scheduled_test/task_return_value_test: Timeout # Issue 21007
+scheduled_test/test/scheduled_test/timeout_test: Timeout # Issue 21007
+scheduled_test/test/scheduled_test/wrap_async_test: Timeout # Issue 21007
+scheduled_test/test/scheduled_test/wrap_future_test: Timeout # Issue 21007
 
 [ $runtime == safari || $runtime == safarimobilesim ]
 # Unexplained errors only occuring on Safari.
@@ -319,6 +335,7 @@
 code_transformers/test/resolver_test: Skip # Uses dart:io
 code_transformers/test/unique_message_test: Skip # Uses dart:io
 code_transformers/test/remove_sourcemap_comment_test: Skip # Uses dart:io.
+glob/test/*: Fail, OK # Uses dart:io.
 http/test/io/*: Fail, OK # Uses dart:io.
 http_parser/test/web_socket_test: Fail, OK # Uses dart:io
 http_multi_server/test/http_multi_server_test: Skip # Uses dart:io
@@ -340,6 +357,7 @@
 polymer/test/build/build_log_combiner_test: Fail, OK # Uses dart:io.
 polymer/test/build/script_compactor_test: Fail, OK # Uses dart:io.
 polymer/test/build/utils_test: Fail, OK # Uses dart:io.
+polymer/test/build/index_page_builder_test: Fail, OK # Uses dart:io.
 polymer/test/build/import_inliner_test: Fail, OK # Uses dart:io.
 polymer/test/build/linter_test: Fail, OK # Uses dart:io.
 polymer/test/build/remove_sourcemap_comment_test: Fail, OK # Uses dart:io.
@@ -353,13 +371,6 @@
 third_party/angular_tests/vm_test: Skip # Uses dart:io
 watcher/test/*: Fail, OK # Uses dart:io.
 
-scheduled_test/test/descriptor/*: Fail # http://dartbug.com/8440
-scheduled_test/test/scheduled_future_matchers_test: Fail # http://dartbug.com/8440
-scheduled_test/test/scheduled_process_test: Fail # http://dartbug.com/8440
-scheduled_test/test/scheduled_test/*: Fail # http://dartbug.com/8440
-scheduled_test/test/scheduled_stream/stream_matcher_test: Fail # http://dartbug.com/8440
-
-
 */test/analyzer_test: Skip  # No need to run analysis tests on browser bots
 
 # Skip tests on the browser if the test depends on dart:io
@@ -383,11 +394,20 @@
 # simulator.
 *: Skip
 
+[ $compiler == none && ( $runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
 # Skip serialization test that explicitly has no library declaration in the
 # test on Dartium, which requires all tests to have a library.
-[ $compiler == none && ( $runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
-serialization/test/no_library_test: Skip # Expected Failure
-serialization/test/serialization_test: Fail # 13921
+polymer/e2e_test/canonicalization/test/deploy1_test: Fail, OK # tests deploy only behavior
+polymer/e2e_test/canonicalization/test/deploy2_test: Fail, OK # tests deploy only behavior
+polymer/e2e_test/canonicalization/test/deploy3_test: Fail, OK # tests deploy only behavior
+polymer/e2e_test/canonicalization/test/dir/dev2_test: RuntimeError # Issue 17596
+polymer/e2e_test/canonicalization/test/dir/deploy1_test: Fail, OK # tests deploy only behavior
+polymer/e2e_test/canonicalization/test/dir/deploy2_test: Fail, OK # tests deploy only behavior
+scheduled_test/test/descriptor/*: RuntimeError # 13921
+scheduled_test/test/scheduled_future_matchers_test: RuntimeError # 13921
+scheduled_test/test/scheduled_process_test: RuntimeError # 13921
+scheduled_test/test/scheduled_stream/stream_matcher_test: RuntimeError # 13921
+scheduled_test/test/scheduled_test/*: RuntimeError # 13921
 unittest/test/async_exception_test: RuntimeError # 13921
 unittest/test/async_exception_with_future_test: RuntimeError # 13921
 unittest/test/async_setup_teardown_test: RuntimeError # 13921
@@ -413,12 +433,7 @@
 unittest/test/skipped_soloed_nested_test: RuntimeError # 13921
 unittest/test/teardown_test: RuntimeError # 13921
 unittest/test/testcases_immutable_test: RuntimeError # 13921
-polymer/e2e_test/canonicalization/test/deploy1_test: Fail, OK # tests deploy only behavior
-polymer/e2e_test/canonicalization/test/deploy2_test: Fail, OK # tests deploy only behavior
-polymer/e2e_test/canonicalization/test/deploy3_test: Fail, OK # tests deploy only behavior
-polymer/e2e_test/canonicalization/test/dir/dev2_test: RuntimeError # Issue 17596
-polymer/e2e_test/canonicalization/test/dir/deploy1_test: Fail, OK # tests deploy only behavior
-polymer/e2e_test/canonicalization/test/dir/deploy2_test: Fail, OK # tests deploy only behavior
+
 
 [ $runtime == vm ]
 # Skip tests on the VM if the package depends on dart:html
@@ -433,10 +448,12 @@
 
 [ $browser ]
 docgen/test/*: Skip  # Uses dart:io
+scheduled_test/test/scheduled_process_test: Skip # Uses dart:io
 scheduled_test/test/scheduled_server_test: Skip # Uses dart:io
+scheduled_test/test/descriptor/*: Skip # Uses dart:io
 
-[ $browser || $runtime == vm ]
-unittest/test/missing_tick_test: Fail, OK # Expected to fail, due to timeout.
+[ $compiler == none && $browser ]
+unittest/test/missing_tick_test: RuntimeError # Expected to fail, due to timeout.
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 third_party/angular_tests/vm_test: StaticWarning # Uses removed APIs. See issue 18733.
@@ -469,3 +486,4 @@
 
 [ $system == windows ]
 analysis_server/test/integration/search/get_type_hierarchy_test: Pass, Fail # Issue 20436
+glob/test/list_test: RuntimeError # Issue 21071
diff --git a/pkg/polymer/CHANGELOG.md b/pkg/polymer/CHANGELOG.md
index cf8f3c5..a21d7ca 100644
--- a/pkg/polymer/CHANGELOG.md
+++ b/pkg/polymer/CHANGELOG.md
@@ -1,3 +1,46 @@
+#### 0.15.0-dev
+  * Added Polymer.forceReady method. This forces a ready state regardless of
+    whether or not there are still polymer-element declarations waiting for
+    their class definitions to be loaded.
+  * Added Polymer.waitingFor method. This returns a list of all polymer-element
+    declarations that are still waiting for their class definitions to be
+    loaded.
+  * Add runtime checking of the waitingFor queue and print to the console if a
+    deadlock situation is suspected to help diagnose the white screen of death.
+  * Added injectBoundHTML instance method. This can be used to dynamically
+    inject html that is bound to your current element into a target element.
+
+#### 0.14.3
+  * Warn if the same css file is inlined more than once,
+    [19996](http://dartbug.com/19996).
+  * Don't start moving elements from head to body until we find the first
+    import, [20826](http://dartbug.com/20826).
+  * Add option to not inject platform.js in the build output
+    [20865](http://dartbug.com/20865). To use, set `inject_platform_js` to
+    false in the polymer transformer config section of your pubspec.yaml:
+
+        transformers:
+        - polymer:
+            inject_platform_js: false
+            ...
+
+#### 0.14.2+1
+  * Fix findController function for js or dart wrapped elements. This fixes
+    event bindings when using paper-dialog and probably some other cases,
+    [20931](http://dartbug.com/20931).
+
+#### 0.14.2
+  * Polymer will now create helpful index pages in all folders containing entry
+    points and in their parent folders, in debug mode only
+    [20963](http://dartbug.com/20963).
+
+#### 0.14.1
+  * The build.dart file no longer requires a list of entry points, and you can
+    replace the entire file with `export 'package:polymer/default_build.dart';`
+    [20396](http://dartbug.com/20396).
+  * Inlined imports from the head of the document now get inserted inside a
+    hidden div, similar to the js vulcanizer [20943](http://dartbug.com/20943).
+
 #### 0.14.0+1
   * Small style improvements on error/warnings page.
 
@@ -9,6 +52,8 @@
     like the option to not inject platform.js at all in the built output (if you
     are deploying to chrome exclusively), please star this bug
     http://dartbug.com/20865.
+  * Fixed invalid linter warning when using event handlers inside an
+    `auto-binding-dart` template, [20913](http://dartbug.com/20913).
 
 #### 0.13.1
   * Upgraded error messages to have a unique and stable identifier. This
diff --git a/pkg/polymer/bin/new_element.dart b/pkg/polymer/bin/new_element.dart
index 2440cdd..4437438 100644
--- a/pkg/polymer/bin/new_element.dart
+++ b/pkg/polymer/bin/new_element.dart
@@ -9,6 +9,7 @@
 import 'dart:io';
 import 'package:args/args.dart';
 import 'package:path/path.dart' as path show absolute, dirname, join, split;
+import 'package:polymer/html_element_names.dart';
 
 void printUsage(ArgParser parser) {
   print('pub run polymer:new_element [-o output_dir] [-e super-element] '
@@ -126,7 +127,7 @@
   return dir;
 }
 
-bool _isDOMElement(String element) => (_htmlElementNames[element] != null);
+bool _isDOMElement(String element) => (HTML_ELEMENT_NAMES[element] != null);
 
 bool _isPolymerElement(String element) {
   return element.contains('-') && (element.toLowerCase() == element);
@@ -167,7 +168,7 @@
     // The element being extended is a DOM Class.
     importDartHtml = "import 'dart:html';\n";
     classDeclaration = 
-        'class $capitalizedName extends ${_htmlElementNames[superClass]} '
+        'class $capitalizedName extends ${HTML_ELEMENT_NAMES[superClass]} '
         'with Polymer, Observable {';
     polymerCreatedString = '\n    polymerCreated();';
     extendsElementString = ' extends="$superClass"';
@@ -242,128 +243,3 @@
   print('  ' + path.absolute(path.join(directory, underscoreName + '.dart')));
   print('  ' + path.absolute(path.join(directory, underscoreName + '.html')));
 }
-
-/**
- * HTML element to DOM type mapping. Source:
- * <http://dev.w3.org/html5/spec/section-index.html#element-interfaces>
- *
- * The 'HTML' prefix has been removed to match `dart:html`, as per:
- * <http://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/lib/html/scripts/htmlrenamer.py>
- * It does not appear any element types are being renamed other than the prefix.
- * However there does not appear to be the last subtypes for the following tags:
- * command, data, dialog, td, th, and time.
- */
-const _htmlElementNames = const {
-  'a': 'AnchorElement',
-  'abbr': 'Element',
-  'address': 'Element',
-  'area': 'AreaElement',
-  'article': 'Element',
-  'aside': 'Element',
-  'audio': 'AudioElement',
-  'b': 'Element',
-  'base': 'BaseElement',
-  'bdi': 'Element',
-  'bdo': 'Element',
-  'blockquote': 'QuoteElement',
-  'body': 'BodyElement',
-  'br': 'BRElement',
-  'button': 'ButtonElement',
-  'canvas': 'CanvasElement',
-  'caption': 'TableCaptionElement',
-  'cite': 'Element',
-  'code': 'Element',
-  'col': 'TableColElement',
-  'colgroup': 'TableColElement',
-  'command': 'Element', // see doc comment, was: 'CommandElement'
-  'data': 'Element', // see doc comment, was: 'DataElement'
-  'datalist': 'DataListElement',
-  'dd': 'Element',
-  'del': 'ModElement',
-  'details': 'DetailsElement',
-  'dfn': 'Element',
-  'dialog': 'Element', // see doc comment, was: 'DialogElement'
-  'div': 'DivElement',
-  'dl': 'DListElement',
-  'dt': 'Element',
-  'em': 'Element',
-  'embed': 'EmbedElement',
-  'fieldset': 'FieldSetElement',
-  'figcaption': 'Element',
-  'figure': 'Element',
-  'footer': 'Element',
-  'form': 'FormElement',
-  'h1': 'HeadingElement',
-  'h2': 'HeadingElement',
-  'h3': 'HeadingElement',
-  'h4': 'HeadingElement',
-  'h5': 'HeadingElement',
-  'h6': 'HeadingElement',
-  'head': 'HeadElement',
-  'header': 'Element',
-  'hgroup': 'Element',
-  'hr': 'HRElement',
-  'html': 'HtmlElement',
-  'i': 'Element',
-  'iframe': 'IFrameElement',
-  'img': 'ImageElement',
-  'input': 'InputElement',
-  'ins': 'ModElement',
-  'kbd': 'Element',
-  'keygen': 'KeygenElement',
-  'label': 'LabelElement',
-  'legend': 'LegendElement',
-  'li': 'LIElement',
-  'link': 'LinkElement',
-  'map': 'MapElement',
-  'mark': 'Element',
-  'menu': 'MenuElement',
-  'meta': 'MetaElement',
-  'meter': 'MeterElement',
-  'nav': 'Element',
-  'noscript': 'Element',
-  'object': 'ObjectElement',
-  'ol': 'OListElement',
-  'optgroup': 'OptGroupElement',
-  'option': 'OptionElement',
-  'output': 'OutputElement',
-  'p': 'ParagraphElement',
-  'param': 'ParamElement',
-  'pre': 'PreElement',
-  'progress': 'ProgressElement',
-  'q': 'QuoteElement',
-  'rp': 'Element',
-  'rt': 'Element',
-  'ruby': 'Element',
-  's': 'Element',
-  'samp': 'Element',
-  'script': 'ScriptElement',
-  'section': 'Element',
-  'select': 'SelectElement',
-  'small': 'Element',
-  'source': 'SourceElement',
-  'span': 'SpanElement',
-  'strong': 'Element',
-  'style': 'StyleElement',
-  'sub': 'Element',
-  'summary': 'Element',
-  'sup': 'Element',
-  'table': 'TableElement',
-  'tbody': 'TableSectionElement',
-  'td': 'TableCellElement', // see doc comment, was: 'TableDataCellElement'
-  'template': 'Element', // should be 'TemplateElement', but it is not yet
-                         // in dart:html
-  'textarea': 'TextAreaElement',
-  'tfoot': 'TableSectionElement',
-  'th': 'TableCellElement', // see doc comment, was: 'TableHeaderCellElement'
-  'thead': 'TableSectionElement',
-  'time': 'Element', // see doc comment, was: 'TimeElement'
-  'title': 'TitleElement',
-  'tr': 'TableRowElement',
-  'track': 'TrackElement',
-  'u': 'Element',
-  'ul': 'UListElement',
-  'var': 'Element',
-  'video': 'VideoElement',
-  'wbr': 'Element',
-};
diff --git a/pkg/polymer/bin/new_entry.dart b/pkg/polymer/bin/new_entry.dart
index 5bbcd13..e8bab17 100644
--- a/pkg/polymer/bin/new_entry.dart
+++ b/pkg/polymer/bin/new_entry.dart
@@ -94,7 +94,6 @@
 <!doctype html>
 <html>
   <head>
-    <script src="packages/web_components/platform.js"></script>
     <script src="packages/web_components/dart_support.js"></script>
 
     <!-- link rel="import" href="path_to_html_import.html" -->
diff --git a/pkg/polymer/lib/html_element_names.dart b/pkg/polymer/lib/html_element_names.dart
new file mode 100644
index 0000000..89fd517
--- /dev/null
+++ b/pkg/polymer/lib/html_element_names.dart
@@ -0,0 +1,128 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library polymer.html_element_names;
+
+/**
+ * HTML element to DOM type mapping. Source:
+ * <http://dev.w3.org/html5/spec/section-index.html#element-interfaces>
+ *
+ * The 'HTML' prefix has been removed to match `dart:html`, as per:
+ * <http://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/lib/html/scripts/htmlrenamer.py>
+ * It does not appear any element types are being renamed other than the prefix.
+ * However there does not appear to be the last subtypes for the following tags:
+ * command, data, td, th, and time.
+ */
+const HTML_ELEMENT_NAMES = const {
+    'a': 'AnchorElement',
+    'abbr': 'Element',
+    'address': 'Element',
+    'area': 'AreaElement',
+    'article': 'Element',
+    'aside': 'Element',
+    'audio': 'AudioElement',
+    'b': 'Element',
+    'base': 'BaseElement',
+    'bdi': 'Element',
+    'bdo': 'Element',
+    'blockquote': 'QuoteElement',
+    'body': 'BodyElement',
+    'br': 'BRElement',
+    'button': 'ButtonElement',
+    'canvas': 'CanvasElement',
+    'caption': 'TableCaptionElement',
+    'cite': 'Element',
+    'code': 'Element',
+    'col': 'TableColElement',
+    'colgroup': 'TableColElement',
+    'command': 'Element', // see doc comment, was: 'CommandElement'
+    'data': 'Element', // see doc comment, was: 'DataElement'
+    'datalist': 'DataListElement',
+    'dd': 'Element',
+    'del': 'ModElement',
+    'details': 'DetailsElement',
+    'dfn': 'Element',
+    'dialog': 'DialogElement',
+    'div': 'DivElement',
+    'dl': 'DListElement',
+    'dt': 'Element',
+    'em': 'Element',
+    'embed': 'EmbedElement',
+    'fieldset': 'FieldSetElement',
+    'figcaption': 'Element',
+    'figure': 'Element',
+    'footer': 'Element',
+    'form': 'FormElement',
+    'h1': 'HeadingElement',
+    'h2': 'HeadingElement',
+    'h3': 'HeadingElement',
+    'h4': 'HeadingElement',
+    'h5': 'HeadingElement',
+    'h6': 'HeadingElement',
+    'head': 'HeadElement',
+    'header': 'Element',
+    'hgroup': 'Element',
+    'hr': 'HRElement',
+    'html': 'HtmlElement',
+    'i': 'Element',
+    'iframe': 'IFrameElement',
+    'img': 'ImageElement',
+    'input': 'InputElement',
+    'ins': 'ModElement',
+    'kbd': 'Element',
+    'keygen': 'KeygenElement',
+    'label': 'LabelElement',
+    'legend': 'LegendElement',
+    'li': 'LIElement',
+    'link': 'LinkElement',
+    'map': 'MapElement',
+    'mark': 'Element',
+    'menu': 'MenuElement',
+    'meta': 'MetaElement',
+    'meter': 'MeterElement',
+    'nav': 'Element',
+    'noscript': 'Element',
+    'object': 'ObjectElement',
+    'ol': 'OListElement',
+    'optgroup': 'OptGroupElement',
+    'option': 'OptionElement',
+    'output': 'OutputElement',
+    'p': 'ParagraphElement',
+    'param': 'ParamElement',
+    'pre': 'PreElement',
+    'progress': 'ProgressElement',
+    'q': 'QuoteElement',
+    'rp': 'Element',
+    'rt': 'Element',
+    'ruby': 'Element',
+    's': 'Element',
+    'samp': 'Element',
+    'script': 'ScriptElement',
+    'section': 'Element',
+    'select': 'SelectElement',
+    'small': 'Element',
+    'source': 'SourceElement',
+    'span': 'SpanElement',
+    'strong': 'Element',
+    'style': 'StyleElement',
+    'sub': 'Element',
+    'summary': 'Element',
+    'sup': 'Element',
+    'table': 'TableElement',
+    'tbody': 'TableSectionElement',
+    'td': 'TableCellElement', // see doc comment, was: 'TableDataCellElement'
+    'template': 'TemplateElement',
+    'textarea': 'TextAreaElement',
+    'tfoot': 'TableSectionElement',
+    'th': 'TableCellElement', // see doc comment, was: 'TableHeaderCellElement'
+    'thead': 'TableSectionElement',
+    'time': 'Element', // see doc comment, was: 'TimeElement'
+    'title': 'TitleElement',
+    'tr': 'TableRowElement',
+    'track': 'TrackElement',
+    'u': 'Element',
+    'ul': 'UListElement',
+    'var': 'Element',
+    'video': 'VideoElement',
+    'wbr': 'Element',
+};
diff --git a/pkg/polymer/lib/src/build/common.dart b/pkg/polymer/lib/src/build/common.dart
index d75c585..4d809f5 100644
--- a/pkg/polymer/lib/src/build/common.dart
+++ b/pkg/polymer/lib/src/build/common.dart
@@ -93,10 +93,14 @@
   // reachable (entry point+imported) html if deploying. See dartbug.com/17199.
   final bool lint;
 
+  /// This will automatically inject `platform.js` from the `web_components`
+  /// package in all entry points, if it is not already included.
+  final bool injectPlatformJs;
+
   TransformOptions({entryPoints, this.inlineStylesheets,
       this.contentSecurityPolicy: false, this.directlyIncludeJS: true,
       this.releaseMode: true, this.lint: true,
-      this.injectBuildLogsInOutput: false})
+      this.injectBuildLogsInOutput: false, this.injectPlatformJs: true})
       : entryPoints = entryPoints == null ? null
           : entryPoints.map(systemToAssetPath).toList();
 
@@ -127,6 +131,13 @@
     var globalDefault = inlineStylesheets['default'];
     return (globalDefault != null) ? globalDefault : true;
   }
+
+  // Whether a stylesheet with [id] has an overriden inlining setting.
+  bool stylesheetInliningIsOverridden(AssetId id) {
+    return inlineStylesheets != null &&
+        (inlineStylesheets.containsKey(id.toString())
+          || inlineStylesheets.containsKey(id.path));
+  }
 }
 
 /// Mixin for polymer transformers.
diff --git a/pkg/polymer/lib/src/build/generated/messages.html b/pkg/polymer/lib/src/build/generated/messages.html
index 4d5624c..7f32493 100644
--- a/pkg/polymer/lib/src/build/generated/messages.html
+++ b/pkg/polymer/lib/src/build/generated/messages.html
@@ -123,114 +123,12 @@
 
 <div id="code_transformers_2"><h3>Invalid URL to reach another package <a href="#code_transformers_2">#2</a></h3>
 <p>To reach an asset that belongs to another package, use <code>package:</code> URLs in
-Dart code, but in any other language (like HTML or CSS) use relative URLs.</p>
-<p>These are the rules you must follow to write URLs that refer to files in other
-packages:</p><ul><li>
-<p>If the file containing the relative URL is an entrypoint under <code>web</code>, use
-<code>packages/package_name/path_to_file</code></p></li><li>
-<p>If the file containing the URL is under <code>web</code>, but in a different directory
-than your entrypoint, walk out to the same level as the entrypoint first,
-then enter the <code>packages</code> directory.</p>
-<p><strong>Note</strong>: If two entrypoints include the file under <code>web</code> containing the
-URL, either both entrypoints have to live in the same directory, or you need
-to move the file to the <code>lib</code> directory.</p></li><li>
-<p>If the file containing the URL lives under <code>lib</code>, walk up as many levels as
-directories you have + 1. This is because code in <code>lib/a/b</code> is loaded from
-<code>packages/package_name/a/b</code>.</p></li></ul>
-<p>The rules are easier to follow if you know how the code is laid out for
-Dartium before you build, and how it is laid out after you build it with <code>pub
-build</code>. Consider the following example:</p>
-<p>   package a</p>
-<pre><code>  lib/
-    |- a1.html
-
-  web/
-    |- a2.html
-</code></pre>
-<p>   package b</p>
-<pre><code>  lib/
-    |- b1.html
-    |- b2/
-        |- b3.html
-</code></pre>
-<p>   package c</p>
-<pre><code>  lib/
-    |- c3.html
-
-  web/
-    |- index.html
-    |- index.dart
-    |- c1/
-        |- c2.html
-</code></pre>
-<p>If your app is package <code>c</code>, then <code>pub get</code> generates a packages directory under
-the web directory, like this:</p>
-<pre><code>  web/
-    |- index.html
-    |- index.dart
-    |- c1/
-    |   |- c2.html
-    |- packages/
-        |- a/
-        |   |- a1.html
-        |- b/
-        |   |- b1.html
-        |   |- b2/
-        |       |- b3.html
-        |- c/
-            |- c3.html
-</code></pre>
-<p>Note that no <code>lib</code> directory is under the <code>packages</code> directory.
-When you launch <code>web/index.html</code> in Dartium, Dartium loads <code>package:</code> imports from
-<code>web/packages/</code>.</p>
-<p>If you need to refer to any file in other packages from <code>index.html</code>, you can
-simply do <code>packages/package_name/path_to_file</code>. For example
-<code>packages/b/b2/b3.html</code>. From <code>index.html</code> you can also refer to files under the
-web directory of the same package using a simple relative URL, like
-<code>c1/c2.html</code>.</p>
-<p>However, if you want to load <code>a1.html</code> from <code>c2.html</code>, you need to reach out to
-the packages directory that lives next to your entrypoint and then load the file
-from there, for example <code>../packages/a/a1.html</code>. Because pub generates symlinks
-to the packages directory also under c1, you may be tempted to write
-<code>packages/a/a1.html</code>, but that is incorrect - it would yield a canonicalization
-error (see more below).</p>
-<p>If you want to load a file from the lib directory of your own package, you
-should also use a package URL. For example, <code>packages/c/c3.html</code> and not
-<code>../lib/c3.html</code>. This will allow you to write code in <code>lib</code> in a way that it
-can be used within and outside your package without making any changes to it.</p>
-<p>Because any time you reach inside a <code>lib/</code> directory you do so using a
-<code>packages/</code> URL, the rules for reaching into other files in other packages are
-always consistent: go up to exit the <code>packages</code> directory and go back inside to
-the file you are looking for.  For example, to reach <code>a1.html</code> from <code>b3.html</code>
-you need to write <code>../../../packages/a/a1.html</code>.</p>
-<p>The motivation behind all these rules is that URLs need to work under many
-scenarios at once:</p><ul><li>
-<p>They need to work in Dartium without any code transformation: resolving the
-path in the context of a simple HTTP server, or using <code>file:///</code> URLs,
-should yield a valid path to assets. The <code>packages</code> directory is safe to use
-because pub already creates it next to entrypoints of your application.</p></li><li>
-<p>They need to be canonical. To take advantage of caching, multiple URLs
-reaching the same asset should resolve to the same absolute URL.</p>
-<p>Also, in projects that use HTML imports (like polymer) tools support that
-you reach a library with either Dart imports or HTML imports, and correctly
-resolve them to be the same library. The rules are designed to allow tools
-to support this.</p>
-<p>For example, consider you have an import might like:</p>
-<pre><code>&lt;link rel=import href=packages/a/a.html&gt;
-</code></pre>
-<p>where a.html has <code>&lt;script type="application/dart" src="a.dart"&gt;</code>. If your
-Dart entrypoint also loads <code>"package:a/a.dart"</code>,  then a tool need to make
-sure that both versions of <code>a.dart</code> are loaded from the same URL. Otherwise,
-you may see errors at runtime like: <code>A is not a subtype of A</code>, which can be
-extremely confusing.</p>
-<p>When you follow the rules above, our tools can detect the pattern in the
-HTML-import URL containing <code>packages/</code> and canonicalize the import
-by converting <code>packages/a/a.dart</code> into <code>package:a/a.dart</code> under the hood.</p></li><li>
-<p>They need to continue to be valid after applications are built.
-Technically this could be done automatically with pub transformers, but to
-make sure that code works also in Dartium with a simple HTTP Server,
-existing transformers do not fix URLs, they just detect inconsistencies and
-produce an error message like this one, instead.</p></li></ul>
+Dart code, but in any other language (like HTML or CSS) use relative URLs that
+first go all the way to the <code>packages/</code> directory.</p>
+<p>The rules for correctly writing these imports are subtle and have a lot of
+special cases. Please review
+<a href="https://www.dartlang.org/polymer/app-directories.html">https://www.dartlang.org/polymer/app-directories.html</a> to learn
+more.</p>
 </div><hr />
 
 <div id="code_transformers_3"><h3>Incomplete URL to asset in another package <a href="#code_transformers_3">#3</a></h3>
@@ -239,8 +137,9 @@
 now you must use a canonical URL form for it.</p>
 <p>For example, if <code>packages/a/a.html</code> needs to import <code>packages/b/b.html</code>,
 you might expect a.html to import <code>../b/b.html</code>. Instead, it must import
-<code>../../packages/b/b.html</code>.
-See <a href="http://dartbug.com/15797">issue 15797</a>.</p>
+<code>../../packages/b/b.html</code>.</p>
+<p>See <a href="http://dartbug.com/15797">issue 15797</a> and
+<a href="https://www.dartlang.org/polymer/app-directories.html">https://www.dartlang.org/polymer/app-directories.html</a> to learn more.</p>
 </div><hr /><h2>Messages from package <code>observe</code></h2>
 <hr />
 
@@ -584,5 +483,18 @@
 <p>Custom element found in document body without an "unresolved" attribute on it or
 one of its parents. This means your app probably has a flash of unstyled content
 before it finishes loading. See <a href="http://goo.gl/iN03Pj">http://goo.gl/iN03Pj</a> for more info.</p>
+</div><hr />
+
+<div id="polymer_42"><h3>A css file was inlined multiple times. <a href="#polymer_42">#42</a></h3>
+<p>Css files are inlined by default, but if you import the same one in multiple
+places you probably want to override this behavior to prevent duplicate code.
+To do this, use the following pattern to update your pubspec.yaml:</p>
+<pre><code>transformers:
+- polymer:
+  inline_stylesheets:
+    web/my_file.css: false
+</code></pre>
+<p>If you would like to hide this warning and keep it inlined, do the same thing
+but assign the value to true.</p>
 </div><hr /></body>
 </html>
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index c603fff..cf3b7d9 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -31,8 +31,10 @@
   final AssetId docId;
   final seen = new Set<AssetId>();
   final scriptIds = <AssetId>[];
+  final inlinedStylesheetIds = new Set<AssetId>();
   final extractedFiles = new Set<AssetId>();
   bool experimentalBootstrap = false;
+  final Element importsWrapper = new Element.html('<div hidden></div>');
 
   /// The number of extracted inline Dart scripts. Used as a counter to give
   /// unique-ish filenames.
@@ -54,20 +56,35 @@
 
     return readPrimaryAsHtml(transform, logger).then((doc) {
       document = doc;
+
+      // Insert our importsWrapper. This may be removed later if not needed, but
+      // it makes the logic simpler to have it in the document.
+      document.body.insertBefore(importsWrapper, document.body.firstChild);
+
       changed = new _UrlNormalizer(transform, docId, logger).visit(document)
         || changed;
-      
+
       experimentalBootstrap = document.querySelectorAll('link').any((link) =>
           link.attributes['rel'] == 'import' &&
           link.attributes['href'] == POLYMER_EXPERIMENTAL_HTML);
       changed = _extractScripts(document) || changed;
+
+      // We only need to move the head into the body for the entry point.
+      _moveHeadToBody(document);
+
       return _visitImports(document);
     }).then((importsFound) {
       changed = changed || importsFound;
+
       return _removeScripts(document);
     }).then((scriptsRemoved) {
       changed = changed || scriptsRemoved;
 
+      // Remove the importsWrapper if it contains nothing. Wait until now to do
+      // this since it might have a script that got removed, and thus no longer
+      // have any children.
+      if (importsWrapper.children.isEmpty) importsWrapper.remove();
+
       var output = transform.primaryInput;
       if (changed) output = new Asset.fromString(docId, document.outerHtml);
       transform.addOutput(output);
@@ -96,8 +113,6 @@
   Future<bool> _visitImports(Document document) {
     bool changed = false;
 
-    _moveHeadToBody(document);
-
     // Note: we need to preserve the import order in the generated output.
     return Future.forEach(document.querySelectorAll('link'), (Element tag) {
       var rel = tag.attributes['rel'];
@@ -121,6 +136,13 @@
         if (!options.shouldInlineStylesheet(id)) return null;
 
         changed = true;
+        if (inlinedStylesheetIds.contains(id)
+            && !options.stylesheetInliningIsOverridden(id)) {
+          logger.warning(
+              CSS_FILE_INLINED_MULTIPLE_TIMES.create({'url': id.path}),
+              span: tag.sourceSpan);
+        }
+        inlinedStylesheetIds.add(id);
         return _inlineStylesheet(id, tag);
       }
     }).then((_) => changed);
@@ -128,7 +150,9 @@
 
   /// To preserve the order of scripts with respect to inlined
   /// link rel=import, we move both of those into the body before we do any
-  /// inlining.
+  /// inlining. We do not start doing this until the first import is found
+  /// however, as some scripts do need to be ran in the head to work
+  /// properly (platform.js for instance).
   ///
   /// Note: we do this for stylesheets as well to preserve ordering with
   /// respect to eachother, because stylesheets can be pulled in transitively
@@ -138,17 +162,21 @@
   // Should we do the same? Alternatively could we inline head into head and
   // body into body and avoid this whole thing?
   void _moveHeadToBody(Document doc) {
-    var insertionPoint = doc.body.firstChild;
+    var foundImport = false;
     for (var node in doc.head.nodes.toList(growable: false)) {
       if (node is! Element) continue;
       var tag = node.localName;
       var type = node.attributes['type'];
       var rel = node.attributes['rel'];
+      if (tag == 'link' && rel == 'import') foundImport = true;
+      if (!foundImport) continue;
       if (tag == 'style' || tag == 'script' &&
             (type == null || type == TYPE_JS || type == TYPE_DART) ||
           tag == 'link' && (rel == 'stylesheet' || rel == 'import')) {
-        // Move the node into the body, where its contents will be placed.
-        doc.body.insertBefore(node, insertionPoint);
+        // Move the node into the importsWrapper, where its contents will be
+        // placed. This wrapper is a hidden div to prevent inlined html from
+        // causing a FOUC.
+        importsWrapper.append(node);
       }
     }
   }
diff --git a/pkg/polymer/lib/src/build/index_page_builder.dart b/pkg/polymer/lib/src/build/index_page_builder.dart
new file mode 100644
index 0000000..2543a1e
--- /dev/null
+++ b/pkg/polymer/lib/src/build/index_page_builder.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Builds an index.html file in each folder containing entry points, if none
+/// already exists. This file simply lists all the entry point files.
+library polymer.src.build.index_page_builder;
+
+import 'dart:async';
+import 'dart:math';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+
+import 'common.dart';
+
+/// Builds an index.html file in each folder containing entry points, if none
+/// already exists. This file simply lists all the entry point files.
+class IndexPageBuilder extends AggregateTransformer {
+  final TransformOptions options;
+
+  IndexPageBuilder(this.options);
+
+  classifyPrimary(AssetId id) {
+    if (!options.isHtmlEntryPoint(id)) return null;
+    // Group all entry points together.
+    return 'all_entry_points';
+  }
+
+  Future apply(AggregateTransform transform) {
+    Map<String, List<String>> dirFilesMap = {};
+
+    return transform.primaryInputs.toList().then((assets) {
+      // Add the asset to its directory, and make sure its directory is included
+      // in all its parents.
+      for (var asset in assets) {
+        var dir = path.url.dirname(asset.id.path);
+        while (dir != '.') {
+          dirFilesMap.putIfAbsent(dir, () => []);
+
+          var relativePath = path.url.relative(asset.id.path, from: dir);
+          var relativeDir = path.url.dirname(relativePath);
+          dirFilesMap[dir].add(relativePath);
+          dir = path.url.dirname(dir);
+        }
+      }
+
+      // Create an output index.html file for each directory, if one doesn't
+      // exist already
+      var futures = [];
+      dirFilesMap.forEach((directory, files) {
+        futures.add(_createOutput(directory, files, transform));
+      });
+      return Future.wait(futures);
+    });
+  }
+
+  Future _createOutput(
+      String directory, List<String> files, AggregateTransform transform) {
+    var indexAsset = new AssetId(
+        transform.package, path.join(directory, 'index.html'));
+
+    return transform.hasInput(indexAsset).then((exists) {
+      // Don't overwrite existing outputs!
+      if (exists) return;
+
+      // Sort alphabetically by recursive path parts.
+      files.sort((String a, String b) {
+        var aParts = path.split(a);
+        var bParts = path.split(b);
+        int diff = 0;
+        int minLength = min(aParts.length, bParts.length);
+        for (int i = 0; i < minLength; i++) {
+          // Directories are sorted below files.
+          var aIsDir = i < aParts.length - 1;
+          var bIsDir = i < bParts.length - 1;
+          if (aIsDir && !bIsDir) return 1;
+          if (!aIsDir && bIsDir) return -1;
+
+          // Raw string comparison, if not identical we return.
+          diff = aParts[i].compareTo(bParts[i]);
+          if (diff != 0) return diff;
+        }
+        // Identical files, shouldn't happen in practice.
+        return 0;
+      });
+
+      // Create the document with a list.
+      var doc = new StringBuffer(
+          '<!DOCTYPE html><html><body><h1>Entry points</h1><ul>');
+
+      // Add all the assets to the list.
+      for (var file in files) {
+        doc.write('<li><a href="$file">$file</a></li>');
+      };
+
+      doc.write('</ul></body></html>');
+
+      // Output the index.html file
+      transform.addOutput(new Asset.fromString(indexAsset , doc.toString()));
+    });
+  }
+
+}
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index 7a29953..15100e6 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -388,7 +388,7 @@
     }
 
     // FOUC check, if content is supplied
-    if (!node.innerHtml.isEmpty) {
+    if (_isEntryPoint && !node.innerHtml.isEmpty) {
       var parent = node;
       var hasFoucFix = false;
       while (parent != null && !hasFoucFix) {
diff --git a/pkg/polymer/lib/src/build/messages.dart b/pkg/polymer/lib/src/build/messages.dart
index 51795db..955ebeb 100644
--- a/pkg/polymer/lib/src/build/messages.dart
+++ b/pkg/polymer/lib/src/build/messages.dart
@@ -539,3 +539,22 @@
 one of its parents. This means your app probably has a flash of unstyled content
 before it finishes loading. See <http://goo.gl/iN03Pj> for more info.
 ''');
+
+const CSS_FILE_INLINED_MULTIPLE_TIMES = const MessageTemplate(
+    const MessageId('polymer', 42),
+    'The css file %-url-% was inlined multiple times.',
+    'A css file was inlined multiple times.',
+    '''
+Css files are inlined by default, but if you import the same one in multiple
+places you probably want to override this behavior to prevent duplicate code.
+To do this, use the following pattern to update your pubspec.yaml:
+
+    transformers:
+    - polymer:
+      inline_stylesheets:
+        web/my_file.css: false
+
+If you would like to hide this warning and keep it inlined, do the same thing
+but assign the value to true.
+'''
+);
diff --git a/pkg/polymer/lib/src/build/polyfill_injector.dart b/pkg/polymer/lib/src/build/polyfill_injector.dart
index e416352..2001fac 100644
--- a/pkg/polymer/lib/src/build/polyfill_injector.dart
+++ b/pkg/polymer/lib/src/build/polyfill_injector.dart
@@ -100,7 +100,9 @@
       var suffix = options.releaseMode ? '.js' : '.concat.js';
       if (!dartSupportFound) _addScriptFirst('web_components/dart_support.js');
       // platform.js should come before all other scripts.
-      if (!platformJsFound) _addScriptFirst('web_components/platform$suffix');
+      if (!platformJsFound && options.injectPlatformJs) {
+        _addScriptFirst('web_components/platform$suffix');
+      }
 
       transform.addOutput(
           new Asset.fromString(transform.primaryInput.id, document.outerHtml));
diff --git a/pkg/polymer/lib/src/declaration.dart b/pkg/polymer/lib/src/declaration.dart
index fb5c8c9..1dedada 100644
--- a/pkg/polymer/lib/src/declaration.dart
+++ b/pkg/polymer/lib/src/declaration.dart
@@ -462,6 +462,10 @@
     // createPolymerAccessors is done lazily on the first access of properties.
     // Here we just extract the information from annotations and store it as
     // properties on the declaration.
+
+    // Dart Note: The js side makes computed properties read only, and does
+    // special logic right here for them. For us they are automatically read
+    // only unless you define a setter for them, so we left that out.
     var options = const smoke.QueryOptions(includeInherited: true,
         includeUpTo: HtmlElement, withAnnotations: const [ComputedProperty]);
     var existing = {};
@@ -483,6 +487,8 @@
 
 Type _getRegisteredType(String name) => _typesByName[name];
 
+/// Dart Note: instanceOfType not implemented for dart, its not needed.
+
 /// track document.register'ed tag names and their declarations
 final Map _declarations = new Map<String, PolymerDeclaration>();
 
diff --git a/pkg/polymer/lib/src/events.dart b/pkg/polymer/lib/src/events.dart
index 881728a..3fc71ad 100644
--- a/pkg/polymer/lib/src/events.dart
+++ b/pkg/polymer/lib/src/events.dart
@@ -52,6 +52,12 @@
     while (node.parentNode != null) {
       if (node is Polymer && node.eventController != null) {
         return node.eventController;
+      } else if (node is Element) {
+        // If it is a normal element, js polymer element, or dart wrapper to a
+        // js polymer element, then we try js interop.
+        var eventController =
+            new JsObject.fromBrowserObject(node)['eventController'];
+        if (eventController != null) return eventController;
       }
       node = node.parentNode;
     }
diff --git a/pkg/polymer/lib/src/instance.dart b/pkg/polymer/lib/src/instance.dart
index 37a43ea..9965a1e 100644
--- a/pkg/polymer/lib/src/instance.dart
+++ b/pkg/polymer/lib/src/instance.dart
@@ -221,6 +221,17 @@
   /// for use.
   static Future get onReady => _onReady.future;
 
+  /// Returns a list of elements that have had polymer-elements created but
+  /// are not yet ready to register. The list is an array of element
+  /// definitions.
+  static List<Element> get waitingFor =>
+      _Polymer.callMethod('waitingFor', [null]);
+
+  /// Forces polymer to register any pending elements. Can be used to abort
+  /// waiting for elements that are partially defined.
+  static forceReady([int timeout]) =>
+      _Polymer.callMethod('forceReady', [null, timeout]);
+
   /// The most derived `<polymer-element>` declaration for this element.
   PolymerDeclaration get element => _element;
   PolymerDeclaration _element;
@@ -1268,6 +1279,18 @@
     // Dart note: made start smarter, so we don't need to call stop.
     return job..start(callback, wait);
   }
+
+  /// Inject HTML which contains markup bound to this element into
+  /// a target element (replacing target element content).
+  DocumentFragment injectBoundHTML(String html, [Element element]) {
+    var template = new TemplateElement()..innerHtml = html;
+    var fragment = this.instanceTemplate(template);
+    if (element != null) {
+      element.text = '';
+      element.append(fragment);
+    }
+    return fragment;
+  }
 }
 
 // Dart note: this is related to _bindOldStylePublishedProperty. Polymer
diff --git a/pkg/polymer/lib/src/js/polymer/build.log b/pkg/polymer/lib/src/js/polymer/build.log
index 01302a8..dd25319 100644
--- a/pkg/polymer/lib/src/js/polymer/build.log
+++ b/pkg/polymer/lib/src/js/polymer/build.log
@@ -1,35 +1,35 @@
 BUILD LOG
 ---------
-Build Time: 2014-09-10T09:11:24
+Build Time: 2014-09-22T10:46:42
 
 NODEJS INFORMATION
 ==================
 nodejs: v0.10.29
-grunt: 0.4.5
 chai: 1.9.1
-grunt-concat-sourcemap: 0.4.3
+grunt: 0.4.5
 grunt-audit: 0.0.3
-grunt-contrib-concat: 0.4.0
+grunt-concat-sourcemap: 0.4.3
 grunt-contrib-uglify: 0.5.1
+grunt-contrib-concat: 0.4.0
 grunt-karma: 0.8.3
 grunt-string-replace: 0.2.7
-karma: 0.12.23
-karma-crbot-reporter: 0.0.4
 karma-firefox-launcher: 0.1.3
 karma-ie-launcher: 0.1.5
-karma-mocha: 0.1.9
 karma-safari-launcher: 0.1.1
 karma-script-launcher: 0.1.0
 mocha: 1.21.4
+karma-crbot-reporter: 0.0.4
+karma-mocha: 0.1.9
+karma: 0.12.23
 
 REPO REVISIONS
 ==============
-polymer-expressions: 30afaf9fffe647bbe53e67f4ac12596acaca77ca
-polymer-gestures: 3534e23ccc0f50ee24e47fd915579a5ebc770a76
-polymer-dev: d66a86eac545ff8115f781ec6b1466024f49c0c0
-HTMLImports: d0c8d08f23ed407288bcac385e19747a3fbeba96
-TemplateBinding: 41e95ea0e4b45543a29ea5240cd4f0defc7208c1
+polymer-expressions: 64d6aea8ec8d9ce65767bfd7cdc2d2bc9b60af26
+polymer-gestures: ee0798a8698b6731fe16be4a51c70333374a1c57
+polymer-dev: d61654b747438384fb934e97cfbba910b0c0bb04
+HTMLImports: 77efd89e04ae63a3ee7c88cb7e1d2784cf60dcb1
+TemplateBinding: a6df3b77d75bf8225a4cc30362cf80ed76480c3e
 
 BUILD HASHES
 ============
-build/polymer.js: 5eb34c0f8e6abe9984a5a2811c022fca4d1098b6
\ No newline at end of file
+build/polymer.js: 709f82c7212d81e8e19927b53d5ce27c0f90ea9e
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
index 0d97f53..b9ea6b0 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
@@ -107,7 +107,7 @@
       return s;
     },
     findTarget: function(inEvent) {
-      if (HAS_FULL_PATH && inEvent.path) {
+      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {
         return inEvent.path[0];
       }
       var x = inEvent.clientX, y = inEvent.clientY;
@@ -121,7 +121,7 @@
     },
     findTouchAction: function(inEvent) {
       var n;
-      if (HAS_FULL_PATH && inEvent.path) {
+      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {
         var path = inEvent.path;
         for (var i = 0; i < path.length; i++) {
           n = path[i];
@@ -132,7 +132,7 @@
       } else {
         n = inEvent.target;
         while(n) {
-          if (n.hasAttribute('touch-action')) {
+          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {
             return n.getAttribute('touch-action');
           }
           n = n.parentNode || n.host;
@@ -197,6 +197,20 @@
     insideNode: function(node, x, y) {
       var rect = node.getBoundingClientRect();
       return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);
+    },
+    path: function(event) {
+      var p;
+      if (HAS_FULL_PATH && event.path && event.path.length) {
+        p = event.path;
+      } else {
+        p = [];
+        var n = this.findTarget(event);
+        while (n) {
+          p.push(n);
+          n = n.parentNode || n.host;
+        }
+      }
+      return p;
     }
   };
   scope.targetFinding = target;
@@ -607,6 +621,7 @@
    *   - pointercancel: a pointer will no longer generate events
    */
   var dispatcher = {
+    IS_IOS: false,
     pointermap: new scope.PointerMap(),
     requiredGestures: new scope.PointerMap(),
     eventMap: Object.create(null),
@@ -686,6 +701,23 @@
       this.fireEvent('up', inEvent);
       this.requiredGestures.delete(inEvent.pointerId);
     },
+    addGestureDependency: function(node, currentGestures) {
+      var gesturesWanted = node._pgEvents;
+      if (gesturesWanted) {
+        var gk = Object.keys(gesturesWanted);
+        for (var i = 0, r, ri, g; i < gk.length; i++) {
+          // gesture
+          g = gk[i];
+          if (gesturesWanted[g] > 0) {
+            // lookup gesture recognizer
+            r = this.dependencyMap[g];
+            // recognizer index
+            ri = r ? r.index : -1;
+            currentGestures[ri] = true;
+          }
+        }
+      }
+    },
     // LISTENER LOGIC
     eventHandler: function(inEvent) {
       // This is used to prevent multiple dispatch of events from
@@ -699,21 +731,15 @@
         if (!inEvent._handledByPG) {
           currentGestures = {};
         }
-        // map gesture names to ordered set of recognizers
-        var gesturesWanted = inEvent.currentTarget._pgEvents;
-        if (gesturesWanted) {
-          var gk = Object.keys(gesturesWanted);
-          for (var i = 0, r, ri, g; i < gk.length; i++) {
-            // gesture
-            g = gk[i];
-            if (gesturesWanted[g] > 0) {
-              // lookup gesture recognizer
-              r = this.dependencyMap[g];
-              // recognizer index
-              ri = r ? r.index : -1;
-              currentGestures[ri] = true;
-            }
+        // in IOS mode, there is only a listener on the document, so this is not re-entrant
+        if (this.IS_IOS) {
+          var nodes = scope.targetFinding.path(inEvent);
+          for (var i = 0, n; i < nodes.length; i++) {
+            n = nodes[i];
+            this.addGestureDependency(n, currentGestures);
           }
+        } else {
+          this.addGestureDependency(inEvent.currentTarget, currentGestures);
         }
       }
 
@@ -988,6 +1014,9 @@
       dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
+      if (target === document) {
+        return;
+      }
       dispatcher.unlisten(target, this.events);
     },
     lastTouches: [],
@@ -1086,6 +1115,7 @@
 
   // handler block for native touch events
   var touchEvents = {
+    IS_IOS: false,
     events: [
       'touchstart',
       'touchmove',
@@ -1098,13 +1128,14 @@
       'move'
     ],
     register: function(target, initial) {
-      if (initial) {
-        return;
+      if (this.IS_IOS ? initial : !initial) {
+        dispatcher.listen(target, this.events);
       }
-      dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
-      dispatcher.unlisten(target, this.events);
+      if (!this.IS_IOS) {
+        dispatcher.unlisten(target, this.events);
+      }
     },
     scrollTypes: {
       EMITTER: 'none',
@@ -1398,6 +1429,9 @@
       dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
+      if (target === document) {
+        return;
+      }
       dispatcher.unlisten(target, this.events);
     },
     POINTER_TYPES: [
@@ -1480,6 +1514,9 @@
       dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
+      if (target === document) {
+        return;
+      }
       dispatcher.unlisten(target, this.events);
     },
     cleanup: function(id) {
@@ -1533,6 +1570,7 @@
  * Included are touch events (v1), mouse events, and MSPointerEvents.
  */
 (function(scope) {
+
   var dispatcher = scope.dispatcher;
   var nav = window.navigator;
 
@@ -1544,18 +1582,16 @@
     dispatcher.registerSource('mouse', scope.mouseEvents);
     if (window.ontouchstart !== undefined) {
       dispatcher.registerSource('touch', scope.touchEvents);
-      /*
-       * NOTE: an empty touch listener on body will reactivate nodes imported from templates with touch listeners
-       * Removing it will re-break the nodes
-       *
-       * Work around for https://bugs.webkit.org/show_bug.cgi?id=135628
-       */
-      var isSafari = nav.userAgent.match('Safari') && !nav.userAgent.match('Chrome');
-      if (isSafari) {
-        document.body.addEventListener('touchstart', function(){});
-      }
     }
   }
+
+  // Work around iOS bugs https://bugs.webkit.org/show_bug.cgi?id=135628 and https://bugs.webkit.org/show_bug.cgi?id=136506
+  var ua = navigator.userAgent;
+  var IS_IOS = ua.match(/iPad|iPhone|iPod/) && 'ontouchstart' in window;
+
+  dispatcher.IS_IOS = IS_IOS;
+  scope.touchEvents.IS_IOS = IS_IOS;
+
   dispatcher.register(document, true);
 })(window.PolymerGestures);
 
@@ -3698,7 +3734,7 @@
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 Polymer = {
-  version: '0.4.0-d66a86e'
+  version: '0.4.1-d61654b'
 };
 
 /*
@@ -3881,8 +3917,14 @@
 

 // NOTE: test for native imports loading is based on explicitly watching

 // all imports (see below).

+// We cannot rely on this entirely without watching the entire document

+// for import links. For perf reasons, currently only head is watched.

+// Instead, we fallback to checking if the import property is available 

+// and the document is not itself loading. 

 function isImportLoaded(link) {

-  return useNative ? link.__loaded : link.__importParsed;

+  return useNative ? link.__loaded || 

+      (link.import && link.import.readyState !== 'loading') :

+      link.__importParsed;

 }

 

 // TODO(sorvell): Workaround for 

@@ -4053,19 +4095,14 @@
 
 })(Platform);
 
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+/*
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
 
 (function(global) {
   'use strict';
@@ -4125,7 +4162,7 @@
     // Firefox OS Apps do not allow eval. This feature detection is very hacky
     // but even if some other platform adds support for this function this code
     // will continue to work.
-    if (navigator.getDeviceStorage) {
+    if (typeof navigator != 'undefined' && navigator.getDeviceStorage) {
       return false;
     }
 
@@ -4140,7 +4177,7 @@
   var hasEval = detectEval();
 
   function isIndex(s) {
-    return +s === s >>> 0;
+    return +s === s >>> 0 && s !== '';
   }
 
   function toNumber(s) {
@@ -4854,26 +4891,12 @@
 
   var runningMicrotaskCheckpoint = false;
 
-  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {
-    try {
-      eval('%RunMicrotasks()');
-      return true;
-    } catch (ex) {
-      return false;
-    }
-  })();
-
   global.Platform = global.Platform || {};
 
   global.Platform.performMicrotaskCheckpoint = function() {
     if (runningMicrotaskCheckpoint)
       return;
 
-    if (hasDebugForceFullDelivery) {
-      eval('%RunMicrotasks()');
-      return;
-    }
-
     if (!collectObservers)
       return;
 
@@ -8481,8 +8504,12 @@
   scope.api.instance.events = events;
 
   // alias PolymerGestures event listener logic
-  scope.addEventListener = PolymerGestures.addEventListener;
-  scope.removeEventListener = PolymerGestures.removeEventListener;
+  scope.addEventListener = function(node, eventType, handlerFn, capture) {
+    PolymerGestures.addEventListener(wrap(node), eventType, handlerFn, capture);
+  };
+  scope.removeEventListener = function(node, eventType, handlerFn, capture) {
+    PolymerGestures.removeEventListener(wrap(node), eventType, handlerFn, capture);
+  };
 
 })(Polymer);
 
@@ -8734,15 +8761,27 @@
     bindToAccessor: function(name, observable, resolveFn) {
       var privateName = name + '_';
       var privateObservable  = name + 'Observable_';
+      // Present for properties which are computed and published and have a
+      // bound value.
+      var privateComputedBoundValue = name + 'ComputedBoundObservable_';
 
       this[privateObservable] = observable;
+
       var oldValue = this[privateName];
 
       var self = this;
-      var value = observable.open(function(value, oldValue) {
+      function updateValue(value, oldValue) {
         self[privateName] = value;
+
+        var setObserveable = self[privateComputedBoundValue];
+        if (setObserveable && typeof setObserveable.setValue == 'function') {
+          setObserveable.setValue(value);
+        }
+ 
         self.emitPropertyChangeRecord(name, value, oldValue);
-      });
+      }
+ 
+      var value = observable.open(updateValue);
 
       if (resolveFn && !areSameValue(oldValue, value)) {
         var resolvedValue = resolveFn(oldValue, value);
@@ -8753,13 +8792,13 @@
         }
       }
 
-      this[privateName] = value;
-      this.emitPropertyChangeRecord(name, value, oldValue);
+      updateValue(value, oldValue);
 
       var observer = {
         close: function() {
           observable.close();
           self[privateObservable] = undefined;
+          self[privateComputedBoundValue] = undefined;
         }
       };
       this.registerObserver(observer);
@@ -8787,6 +8826,17 @@
         this[property] = observable;
         return;
       }
+      var computed = this.element.prototype.computed;
+
+      // Binding an "out-only" value to a computed property. Note that
+      // since this observer isn't opened, it doesn't need to be closed on
+      // cleanup.
+      if (computed && computed[property]) {
+        var privateComputedBoundValue = property + 'ComputedBoundObservable_';
+        this[privateComputedBoundValue] = observable;
+        return;
+      }
+
       return this.bindToAccessor(property, observable, resolveBindingValue);
     },
     invokeMethod: function(method, args) {
@@ -9398,10 +9448,26 @@
     return prototypesByName[name];
   }
 
+  function instanceOfType(element, type) {
+    if (typeof type !== 'string') {
+      return false;
+    }
+    var proto = HTMLElement.getPrototypeForTag(type);
+    var ctor = proto && proto.constructor;
+    if (!ctor) {
+      return false;
+    }
+    if (CustomElements.instanceof) {
+      return CustomElements.instanceof(element, ctor);
+    }
+    return element instanceof ctor;
+  }
+
   // exports
 
   scope.getRegisteredPrototype = getRegisteredPrototype;
   scope.waitingForPrototype = waitingForPrototype;
+  scope.instanceOfType = instanceOfType;
 
   // namespace shenanigans so we can expose our scope on the registration 
   // function
@@ -9957,7 +10023,7 @@
       }
       return map;
     },
-    createPropertyAccessor: function(name) {
+    createPropertyAccessor: function(name, ignoreWrites) {
       var proto = this.prototype;
 
       var privateName = name + '_';
@@ -9973,6 +10039,10 @@
           return this[privateName];
         },
         set: function(value) {
+          if (ignoreWrites) {
+            return this[privateName];
+          }
+
           var observable = this[privateObservable];
           if (observable) {
             observable.setValue(value);
@@ -9989,16 +10059,20 @@
       });
     },
     createPropertyAccessors: function(prototype) {
-      var n$ = prototype._publishNames;
-      if (n$ && n$.length) {
-        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {
-          this.createPropertyAccessor(n);
-        }
-      }
       var n$ = prototype._computedNames;
       if (n$ && n$.length) {
         for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {
-          this.createPropertyAccessor(n);
+          this.createPropertyAccessor(n, true);
+        }
+      }
+      var n$ = prototype._publishNames;
+      if (n$ && n$.length) {
+        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {
+          // If the property is computed and published, the accessor is created
+          // above.
+          if (!prototype.computed || !prototype.computed[n]) {
+            this.createPropertyAccessor(n);
+          }
         }
       }
     }
@@ -10565,6 +10639,21 @@
         }
       }
     },
+  
+    /**
+    Returns a list of elements that have had polymer-elements created but 
+    are not yet ready to register. The list is an array of element definitions.
+    */
+    waitingFor: function() {
+      var e$ = [];
+      for (var i=0, l=elements.length, e; (i<l) && 
+          (e=elements[i]); i++) {
+        if (e.__queue && !e.__queue.flushable) {
+          e$.push(e);
+        }
+      }
+      return e$;
+    },
 
     waitToReady: true
 
@@ -10586,15 +10675,37 @@
 
   function whenReady(callback) {
     queue.waitToReady = true;
-    HTMLImports.whenImportsReady(function() {
-      queue.addReadyCallback(callback);
-      queue.waitToReady = false;
-      queue.check();
+    Platform.endOfMicrotask(function() {
+      HTMLImports.whenImportsReady(function() {
+        queue.addReadyCallback(callback);
+        queue.waitToReady = false;
+        queue.check();
+    });
+    });
+  }
+
+  /**
+    Forces polymer to register any pending elements. Can be used to abort
+    waiting for elements that are partially defined.
+    @param timeout {Integer} Optional timeout in milliseconds
+  */
+  function forceReady(timeout) {
+    if (timeout === undefined) {
+      queue.ready();
+      return;
+    }
+    var handle = setTimeout(function() {
+      queue.ready();
+    }, timeout);
+    Polymer.whenReady(function() {
+      clearTimeout(handle);
     });
   }
 
   // exports
   scope.elements = elements;
+  scope.waitingFor = queue.waitingFor.bind(queue);
+  scope.forceReady = forceReady;
   scope.queue = queue;
   scope.whenReady = scope.whenPolymerReady = whenReady;
 })(Polymer);
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
index 8cda857..d93438b 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
@@ -59,31 +59,31 @@
     "src/lib/auto-binding.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACncA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjhCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uB;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9rDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrwCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/cA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjhCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uB;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3qDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrwCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
   "sourcesContent": [
     "/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {};\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findTouchAction: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n        }\n      } else {\n        n = inEvent.target;\n        while(n) {\n          if (n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n      // auto is default\n      return \"auto\";\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findTouchAction: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n        }\n      } else {\n        n = inEvent.target;\n        while(n) {\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n      // auto is default\n      return \"auto\";\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    },\n    path: function(event) {\n      var p;\n      if (HAS_FULL_PATH && event.path && event.path.length) {\n        p = event.path;\n      } else {\n        p = [];\n        var n = this.findTarget(event);\n        while (n) {\n          p.push(n);\n          n = n.parentNode || n.host;\n        }\n      }\n      return p;\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n",
     "/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'html /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  // set of recognizers to run for the currently handled event\n  var currentGestures;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    requiredGestures: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    // map gesture event -> {listeners: int, index: gestures[int]}\n    dependencyMap: {\n      // make sure down and up are in the map to trigger \"register\"\n      down: {listeners: 0, index: -1},\n      up: {listeners: 0, index: -1}\n    },\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      var obj = Object.create(null);\n      obj.listeners = 0;\n      obj.index = this.gestures.length;\n      for (var i = 0, g; i < source.exposes.length; i++) {\n        g = source.exposes[i].toLowerCase();\n        this.dependencyMap[g] = obj;\n      }\n      this.gestures.push(source);\n    },\n    register: function(element, initial) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element, initial);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.requiredGestures.set(inEvent.pointerId, currentGestures);\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n\n      var type = inEvent.type;\n\n      // only generate the list of desired events on \"down\"\n      if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') {\n        if (!inEvent._handledByPG) {\n          currentGestures = {};\n        }\n        // map gesture names to ordered set of recognizers\n        var gesturesWanted = inEvent.currentTarget._pgEvents;\n        if (gesturesWanted) {\n          var gk = Object.keys(gesturesWanted);\n          for (var i = 0, r, ri, g; i < gk.length; i++) {\n            // gesture\n            g = gk[i];\n            if (gesturesWanted[g] > 0) {\n              // lookup gesture recognizer\n              r = this.dependencyMap[g];\n              // recognizer index\n              ri = r ? r.index : -1;\n              currentGestures[ri] = true;\n            }\n          }\n        }\n      }\n\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = function() {\n        inEvent.preventDefault();\n      };\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e, rg; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        rg = e._requiredGestures;\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          // only run recognizer if an element in the source event's path is listening for those gestures\n          if (rg[j]) {\n            g = this.gestures[j];\n            fn = g[e.type];\n            if (fn) {\n              fn.call(g, e);\n            }\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      ev._requiredGestures = this.requiredGestures.get(ev.pointerId);\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n\n  /**\n   * Listen for `gesture` on `node` with the `handler` function\n   *\n   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.activateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      var recognizer = dispatcher.gestures[dep.index];\n      if (!node._pgListeners) {\n        dispatcher.register(node);\n        node._pgListeners = 0;\n      }\n      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes\n      if (recognizer) {\n        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];\n        var actionNode;\n        switch(node.nodeType) {\n          case Node.ELEMENT_NODE:\n            actionNode = node;\n          break;\n          case Node.DOCUMENT_FRAGMENT_NODE:\n            actionNode = node.host;\n          break;\n          default:\n            actionNode = null;\n          break;\n        }\n        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {\n          actionNode.setAttribute('touch-action', touchAction);\n        }\n      }\n      if (!node._pgEvents) {\n        node._pgEvents = {};\n      }\n      node._pgEvents[g] = (node._pgEvents[g] || 0) + 1;\n      node._pgListeners++;\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   *\n   * Listen for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.addEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.activateGesture(node, gesture);\n      node.addEventListener(gesture, handler, capture);\n    }\n  };\n\n  /**\n   * Tears down the gesture configuration for `node`\n   *\n   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.deactivateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      if (node._pgListeners > 0) {\n        node._pgListeners--;\n      }\n      if (node._pgListeners === 0) {\n        dispatcher.unregister(node);\n      }\n      if (node._pgEvents) {\n        if (node._pgEvents[g] > 0) {\n          node._pgEvents[g]--;\n        } else {\n          node._pgEvents[g] = 0;\n        }\n      }\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   * Stop listening for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.removeEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.deactivateGesture(node, gesture);\n      node.removeEventListener(gesture, handler, capture);\n    }\n  };\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.findTarget(inEvent);\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var target = pointermap.get(this.POINTER_ID);\n        if (target) {\n          var e = this.prepareEvent(inEvent);\n          e.target = target;\n          // handle case where we missed a mouseup\n          if (e.buttons === 0) {\n            dispatcher.cancel(e);\n            this.cleanupMouse();\n          } else {\n            dispatcher.move(e);\n          }\n        }\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.findTarget(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved\n  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;\n  var HAS_TOUCH_ACTION = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target, initial) {\n      if (initial) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === st.EMITTER) {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: this.currentTouchEvent.target\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = this.findTarget(inTouch, id);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var touchAction = scope.targetFinding.findTouchAction(inEvent);\n        var scrollAxis = this.touchActionToScrollType(touchAction);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36\n        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ\n        if (inEvent.cancelable) {\n          this.processTouches(inEvent, this.move);\n        }\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var nav = window.navigator;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (nav.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n      /*\n       * NOTE: an empty touch listener on body will reactivate nodes imported from templates with touch listeners\n       * Removing it will re-break the nodes\n       *\n       * Work around for https://bugs.webkit.org/show_bug.cgi?id=135628\n       */\n      var isSafari = nav.userAgent.match('Safari') && !nav.userAgent.match('Chrome');\n      if (isSafari) {\n        document.body.addEventListener('touchstart', function(){});\n      }\n    }\n  }\n  dispatcher.register(document, true);\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  // set of recognizers to run for the currently handled event\n  var currentGestures;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    IS_IOS: false,\n    pointermap: new scope.PointerMap(),\n    requiredGestures: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    // map gesture event -> {listeners: int, index: gestures[int]}\n    dependencyMap: {\n      // make sure down and up are in the map to trigger \"register\"\n      down: {listeners: 0, index: -1},\n      up: {listeners: 0, index: -1}\n    },\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      var obj = Object.create(null);\n      obj.listeners = 0;\n      obj.index = this.gestures.length;\n      for (var i = 0, g; i < source.exposes.length; i++) {\n        g = source.exposes[i].toLowerCase();\n        this.dependencyMap[g] = obj;\n      }\n      this.gestures.push(source);\n    },\n    register: function(element, initial) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element, initial);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.requiredGestures.set(inEvent.pointerId, currentGestures);\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    addGestureDependency: function(node, currentGestures) {\n      var gesturesWanted = node._pgEvents;\n      if (gesturesWanted) {\n        var gk = Object.keys(gesturesWanted);\n        for (var i = 0, r, ri, g; i < gk.length; i++) {\n          // gesture\n          g = gk[i];\n          if (gesturesWanted[g] > 0) {\n            // lookup gesture recognizer\n            r = this.dependencyMap[g];\n            // recognizer index\n            ri = r ? r.index : -1;\n            currentGestures[ri] = true;\n          }\n        }\n      }\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n\n      var type = inEvent.type;\n\n      // only generate the list of desired events on \"down\"\n      if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') {\n        if (!inEvent._handledByPG) {\n          currentGestures = {};\n        }\n        // in IOS mode, there is only a listener on the document, so this is not re-entrant\n        if (this.IS_IOS) {\n          var nodes = scope.targetFinding.path(inEvent);\n          for (var i = 0, n; i < nodes.length; i++) {\n            n = nodes[i];\n            this.addGestureDependency(n, currentGestures);\n          }\n        } else {\n          this.addGestureDependency(inEvent.currentTarget, currentGestures);\n        }\n      }\n\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = function() {\n        inEvent.preventDefault();\n      };\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e, rg; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        rg = e._requiredGestures;\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          // only run recognizer if an element in the source event's path is listening for those gestures\n          if (rg[j]) {\n            g = this.gestures[j];\n            fn = g[e.type];\n            if (fn) {\n              fn.call(g, e);\n            }\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      ev._requiredGestures = this.requiredGestures.get(ev.pointerId);\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n\n  /**\n   * Listen for `gesture` on `node` with the `handler` function\n   *\n   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.activateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      var recognizer = dispatcher.gestures[dep.index];\n      if (!node._pgListeners) {\n        dispatcher.register(node);\n        node._pgListeners = 0;\n      }\n      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes\n      if (recognizer) {\n        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];\n        var actionNode;\n        switch(node.nodeType) {\n          case Node.ELEMENT_NODE:\n            actionNode = node;\n          break;\n          case Node.DOCUMENT_FRAGMENT_NODE:\n            actionNode = node.host;\n          break;\n          default:\n            actionNode = null;\n          break;\n        }\n        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {\n          actionNode.setAttribute('touch-action', touchAction);\n        }\n      }\n      if (!node._pgEvents) {\n        node._pgEvents = {};\n      }\n      node._pgEvents[g] = (node._pgEvents[g] || 0) + 1;\n      node._pgListeners++;\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   *\n   * Listen for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.addEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.activateGesture(node, gesture);\n      node.addEventListener(gesture, handler, capture);\n    }\n  };\n\n  /**\n   * Tears down the gesture configuration for `node`\n   *\n   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.deactivateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      if (node._pgListeners > 0) {\n        node._pgListeners--;\n      }\n      if (node._pgListeners === 0) {\n        dispatcher.unregister(node);\n      }\n      if (node._pgEvents) {\n        if (node._pgEvents[g] > 0) {\n          node._pgEvents[g]--;\n        } else {\n          node._pgEvents[g] = 0;\n        }\n      }\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   * Stop listening for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.removeEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.deactivateGesture(node, gesture);\n      node.removeEventListener(gesture, handler, capture);\n    }\n  };\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      if (target === document) {\n        return;\n      }\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.findTarget(inEvent);\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var target = pointermap.get(this.POINTER_ID);\n        if (target) {\n          var e = this.prepareEvent(inEvent);\n          e.target = target;\n          // handle case where we missed a mouseup\n          if (e.buttons === 0) {\n            dispatcher.cancel(e);\n            this.cleanupMouse();\n          } else {\n            dispatcher.move(e);\n          }\n        }\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.findTarget(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved\n  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;\n  var HAS_TOUCH_ACTION = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    IS_IOS: false,\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target, initial) {\n      if (this.IS_IOS ? initial : !initial) {\n        dispatcher.listen(target, this.events);\n      }\n    },\n    unregister: function(target) {\n      if (!this.IS_IOS) {\n        dispatcher.unlisten(target, this.events);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === st.EMITTER) {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: this.currentTouchEvent.target\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = this.findTarget(inTouch, id);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var touchAction = scope.targetFinding.findTouchAction(inEvent);\n        var scrollAxis = this.touchActionToScrollType(touchAction);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36\n        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ\n        if (inEvent.cancelable) {\n          this.processTouches(inEvent, this.move);\n        }\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      if (target === document) {\n        return;\n      }\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      if (target === document) {\n        return;\n      }\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n\n  var dispatcher = scope.dispatcher;\n  var nav = window.navigator;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (nav.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  // Work around iOS bugs https://bugs.webkit.org/show_bug.cgi?id=135628 and https://bugs.webkit.org/show_bug.cgi?id=136506\n  var ua = navigator.userAgent;\n  var IS_IOS = ua.match(/iPad|iPhone|iPod/) && 'ontouchstart' in window;\n\n  dispatcher.IS_IOS = IS_IOS;\n  scope.touchEvents.IS_IOS = IS_IOS;\n\n  dispatcher.register(document, true);\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     exposes: [\n      'trackstart',\n      'track',\n      'trackx',\n      'tracky',\n      'trackend'\n     ],\n     defaultActions: {\n       'track': 'none',\n       'trackx': 'pan-y',\n       'tracky': 'pan-x'\n     },\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       } else if (inType === 'trackx') {\n         return;\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       } else if (inType === 'tracky') {\n         return;\n       }\n       var gestureProto = {\n         bubbles: true,\n         cancelable: true,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       };\n       if (inType !== 'tracky') {\n         gestureProto.x = inEvent.x;\n         gestureProto.dx = d.x;\n         gestureProto.ddx = dd.x;\n         gestureProto.clientX = inEvent.clientX;\n         gestureProto.pageX = inEvent.pageX;\n         gestureProto.screenX = inEvent.screenX;\n         gestureProto.xDirection = t.xDirection;\n       }\n       if (inType !== 'trackx') {\n         gestureProto.dy = d.y;\n         gestureProto.ddy = dd.y;\n         gestureProto.y = inEvent.y;\n         gestureProto.clientY = inEvent.clientY;\n         gestureProto.pageY = inEvent.pageY;\n         gestureProto.screenY = inEvent.screenY;\n         gestureProto.yDirection = t.yDirection;\n       }\n       var e = eventFactory.makeGestureEvent(inType, gestureProto);\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             p.lastMoveEvent = p.downEvent;\n             this.fireTrack('trackstart', inEvent, p);\n           }\n         }\n         if (p.tracking) {\n           this.fireTrack('track', inEvent, p);\n           this.fireTrack('trackx', inEvent, p);\n           this.fireTrack('tracky', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    exposes: [\n      'hold',\n      'holdpulse',\n      'release'\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    exposes: [\n      'tap'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n",
     "/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n",
     "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      switch (op) {\n        case '||':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) ||\n                right(model, observer, filterRegistry);\n          };\n        case '&&':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) &&\n                right(model, observer, filterRegistry);\n          };\n      }\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      this.dynamicDeps = true;\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.4.0-d66a86e'\n};\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.4.1-d61654b'\n};\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n /*\n\tOn supported platforms, platform.js is not needed. To retain compatibility\n\twith the polyfills, we stub out minimal functionality.\n */\nif (!window.Platform) {\n  logFlags = window.logFlags || {};\n\n\n  Platform = {\n  \tflush: function() {}\n  };\n\n  CustomElements = {\n  \tuseNative: true,\n    ready: true,\n    takeRecords: function() {},\n    instanceof: function(obj, base) {\n      return obj instanceof base;\n    }\n  };\n  \n  HTMLImports = {\n  \tuseNative: true\n  };\n\n  \n  addEventListener('HTMLImportsLoaded', function() {\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n\n\n  // ShadowDOM\n  ShadowDOMPolyfill = null;\n  wrap = unwrap = function(n){\n    return n;\n  };\n\n}\n",
-    "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\nvar hasNative = ('import' in document.createElement('link'));\r\nvar useNative = hasNative;\r\n\r\nisIE = /Trident/.test(navigator.userAgent);\r\n\r\n// TODO(sorvell): SD polyfill intrusion\r\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\r\nvar wrap = function(node) {\r\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\r\n};\r\nvar mainDoc = wrap(document);\r\n    \r\n// NOTE: We cannot polyfill document.currentScript because it's not possible\r\n// both to override and maintain the ability to capture the native value;\r\n// therefore we choose to expose _currentScript both when native imports\r\n// and the polyfill are in use.\r\nvar currentScriptDescriptor = {\r\n  get: function() {\r\n    var script = HTMLImports.currentScript || document.currentScript ||\r\n        // NOTE: only works when called in synchronously executing code.\r\n        // readyState should check if `loading` but IE10 is \r\n        // interactive when scripts run so we cheat.\r\n        (document.readyState !== 'complete' ? \r\n        document.scripts[document.scripts.length - 1] : null);\r\n    return wrap(script);\r\n  },\r\n  configurable: true\r\n};\r\n\r\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\r\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\r\n\r\n// call a callback when all HTMLImports in the document at call (or at least\r\n//  document ready) time have loaded.\r\n// 1. ensure the document is in a ready state (has dom), then \r\n// 2. watch for loading of imports and call callback when done\r\nfunction whenImportsReady(callback, doc) {\r\n  doc = doc || mainDoc;\r\n  // if document is loading, wait and try again\r\n  whenDocumentReady(function() {\r\n    watchImportsLoad(callback, doc);\r\n  }, doc);\r\n}\r\n\r\n// call the callback when the document is in a ready state (has dom)\r\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\r\nvar READY_EVENT = 'readystatechange';\r\nfunction isDocumentReady(doc) {\r\n  return (doc.readyState === 'complete' ||\r\n      doc.readyState === requiredReadyState);\r\n}\r\n\r\n// call <callback> when we ensure the document is in a ready state\r\nfunction whenDocumentReady(callback, doc) {\r\n  if (!isDocumentReady(doc)) {\r\n    var checkReady = function() {\r\n      if (doc.readyState === 'complete' || \r\n          doc.readyState === requiredReadyState) {\r\n        doc.removeEventListener(READY_EVENT, checkReady);\r\n        whenDocumentReady(callback, doc);\r\n      }\r\n    };\r\n    doc.addEventListener(READY_EVENT, checkReady);\r\n  } else if (callback) {\r\n    callback();\r\n  }\r\n}\r\n\r\nfunction markTargetLoaded(event) {\r\n  event.target.__loaded = true;\r\n}\r\n\r\n// call <callback> when we ensure all imports have loaded\r\nfunction watchImportsLoad(callback, doc) {\r\n  var imports = doc.querySelectorAll('link[rel=import]');\r\n  var loaded = 0, l = imports.length;\r\n  function checkDone(d) { \r\n    if (loaded == l) {\r\n      callback && callback();\r\n    }\r\n  }\r\n  function loadedImport(e) {\r\n    markTargetLoaded(e);\r\n    loaded++;\r\n    checkDone();\r\n  }\r\n  if (l) {\r\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\r\n      if (isImportLoaded(imp)) {\r\n        loadedImport.call(imp, {target: imp});\r\n      } else {\r\n        imp.addEventListener('load', loadedImport);\r\n        imp.addEventListener('error', loadedImport);\r\n      }\r\n    }\r\n  } else {\r\n    checkDone();\r\n  }\r\n}\r\n\r\n// NOTE: test for native imports loading is based on explicitly watching\r\n// all imports (see below).\r\nfunction isImportLoaded(link) {\r\n  return useNative ? link.__loaded : link.__importParsed;\r\n}\r\n\r\n// TODO(sorvell): Workaround for \r\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\r\n// this bug is addressed.\r\n// (1) Install a mutation observer to see when HTMLImports have loaded\r\n// (2) if this script is run during document load it will watch any existing\r\n// imports for loading.\r\n//\r\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\r\n// with imports that are added to document.head since the mutation observer \r\n// watches only head for perf reasons, (2) it requires this script\r\n// to run before any imports have completed loading.\r\nif (useNative) {\r\n  new MutationObserver(function(mxns) {\r\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\r\n      if (m.addedNodes) {\r\n        handleImports(m.addedNodes);\r\n      }\r\n    }\r\n  }).observe(document.head, {childList: true});\r\n\r\n  function handleImports(nodes) {\r\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\r\n      if (isImport(n)) {\r\n        handleImport(n);  \r\n      }\r\n    }\r\n  }\r\n\r\n  function isImport(element) {\r\n    return element.localName === 'link' && element.rel === 'import';\r\n  }\r\n\r\n  function handleImport(element) {\r\n    var loaded = element.import;\r\n    if (loaded) {\r\n      markTargetLoaded({target: element});\r\n    } else {\r\n      element.addEventListener('load', markTargetLoaded);\r\n      element.addEventListener('error', markTargetLoaded);\r\n    }\r\n  }\r\n\r\n  // make sure to catch any imports that are in the process of loading\r\n  // when this script is run.\r\n  (function() {\r\n    if (document.readyState === 'loading') {\r\n      var imports = document.querySelectorAll('link[rel=import]');\r\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\r\n        handleImport(imp);\r\n      }\r\n    }\r\n  })();\r\n\r\n}\r\n\r\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \r\n// have loaded. This event is required to simulate the script blocking \r\n// behavior of native imports. A main document script that needs to be sure\r\n// imports have loaded should wait for this event.\r\nwhenImportsReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  mainDoc.dispatchEvent(\r\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\r\n  );\r\n});\r\n\r\n// exports\r\nscope.useNative = useNative;\r\nscope.isImportLoaded = isImportLoaded;\r\nscope.whenReady = whenImportsReady;\r\nscope.isIE = isIE;\r\n\r\n// deprecated\r\nscope.whenImportsReady = whenImportsReady;\r\n\r\n})(window.HTMLImports);",
+    "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\nvar hasNative = ('import' in document.createElement('link'));\r\nvar useNative = hasNative;\r\n\r\nisIE = /Trident/.test(navigator.userAgent);\r\n\r\n// TODO(sorvell): SD polyfill intrusion\r\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\r\nvar wrap = function(node) {\r\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\r\n};\r\nvar mainDoc = wrap(document);\r\n    \r\n// NOTE: We cannot polyfill document.currentScript because it's not possible\r\n// both to override and maintain the ability to capture the native value;\r\n// therefore we choose to expose _currentScript both when native imports\r\n// and the polyfill are in use.\r\nvar currentScriptDescriptor = {\r\n  get: function() {\r\n    var script = HTMLImports.currentScript || document.currentScript ||\r\n        // NOTE: only works when called in synchronously executing code.\r\n        // readyState should check if `loading` but IE10 is \r\n        // interactive when scripts run so we cheat.\r\n        (document.readyState !== 'complete' ? \r\n        document.scripts[document.scripts.length - 1] : null);\r\n    return wrap(script);\r\n  },\r\n  configurable: true\r\n};\r\n\r\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\r\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\r\n\r\n// call a callback when all HTMLImports in the document at call (or at least\r\n//  document ready) time have loaded.\r\n// 1. ensure the document is in a ready state (has dom), then \r\n// 2. watch for loading of imports and call callback when done\r\nfunction whenImportsReady(callback, doc) {\r\n  doc = doc || mainDoc;\r\n  // if document is loading, wait and try again\r\n  whenDocumentReady(function() {\r\n    watchImportsLoad(callback, doc);\r\n  }, doc);\r\n}\r\n\r\n// call the callback when the document is in a ready state (has dom)\r\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\r\nvar READY_EVENT = 'readystatechange';\r\nfunction isDocumentReady(doc) {\r\n  return (doc.readyState === 'complete' ||\r\n      doc.readyState === requiredReadyState);\r\n}\r\n\r\n// call <callback> when we ensure the document is in a ready state\r\nfunction whenDocumentReady(callback, doc) {\r\n  if (!isDocumentReady(doc)) {\r\n    var checkReady = function() {\r\n      if (doc.readyState === 'complete' || \r\n          doc.readyState === requiredReadyState) {\r\n        doc.removeEventListener(READY_EVENT, checkReady);\r\n        whenDocumentReady(callback, doc);\r\n      }\r\n    };\r\n    doc.addEventListener(READY_EVENT, checkReady);\r\n  } else if (callback) {\r\n    callback();\r\n  }\r\n}\r\n\r\nfunction markTargetLoaded(event) {\r\n  event.target.__loaded = true;\r\n}\r\n\r\n// call <callback> when we ensure all imports have loaded\r\nfunction watchImportsLoad(callback, doc) {\r\n  var imports = doc.querySelectorAll('link[rel=import]');\r\n  var loaded = 0, l = imports.length;\r\n  function checkDone(d) { \r\n    if (loaded == l) {\r\n      callback && callback();\r\n    }\r\n  }\r\n  function loadedImport(e) {\r\n    markTargetLoaded(e);\r\n    loaded++;\r\n    checkDone();\r\n  }\r\n  if (l) {\r\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\r\n      if (isImportLoaded(imp)) {\r\n        loadedImport.call(imp, {target: imp});\r\n      } else {\r\n        imp.addEventListener('load', loadedImport);\r\n        imp.addEventListener('error', loadedImport);\r\n      }\r\n    }\r\n  } else {\r\n    checkDone();\r\n  }\r\n}\r\n\r\n// NOTE: test for native imports loading is based on explicitly watching\r\n// all imports (see below).\r\n// We cannot rely on this entirely without watching the entire document\r\n// for import links. For perf reasons, currently only head is watched.\r\n// Instead, we fallback to checking if the import property is available \r\n// and the document is not itself loading. \r\nfunction isImportLoaded(link) {\r\n  return useNative ? link.__loaded || \r\n      (link.import && link.import.readyState !== 'loading') :\r\n      link.__importParsed;\r\n}\r\n\r\n// TODO(sorvell): Workaround for \r\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\r\n// this bug is addressed.\r\n// (1) Install a mutation observer to see when HTMLImports have loaded\r\n// (2) if this script is run during document load it will watch any existing\r\n// imports for loading.\r\n//\r\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\r\n// with imports that are added to document.head since the mutation observer \r\n// watches only head for perf reasons, (2) it requires this script\r\n// to run before any imports have completed loading.\r\nif (useNative) {\r\n  new MutationObserver(function(mxns) {\r\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\r\n      if (m.addedNodes) {\r\n        handleImports(m.addedNodes);\r\n      }\r\n    }\r\n  }).observe(document.head, {childList: true});\r\n\r\n  function handleImports(nodes) {\r\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\r\n      if (isImport(n)) {\r\n        handleImport(n);  \r\n      }\r\n    }\r\n  }\r\n\r\n  function isImport(element) {\r\n    return element.localName === 'link' && element.rel === 'import';\r\n  }\r\n\r\n  function handleImport(element) {\r\n    var loaded = element.import;\r\n    if (loaded) {\r\n      markTargetLoaded({target: element});\r\n    } else {\r\n      element.addEventListener('load', markTargetLoaded);\r\n      element.addEventListener('error', markTargetLoaded);\r\n    }\r\n  }\r\n\r\n  // make sure to catch any imports that are in the process of loading\r\n  // when this script is run.\r\n  (function() {\r\n    if (document.readyState === 'loading') {\r\n      var imports = document.querySelectorAll('link[rel=import]');\r\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\r\n        handleImport(imp);\r\n      }\r\n    }\r\n  })();\r\n\r\n}\r\n\r\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \r\n// have loaded. This event is required to simulate the script blocking \r\n// behavior of native imports. A main document script that needs to be sure\r\n// imports have loaded should wait for this event.\r\nwhenImportsReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  mainDoc.dispatchEvent(\r\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\r\n  );\r\n});\r\n\r\n// exports\r\nscope.useNative = useNative;\r\nscope.isImportLoaded = isImportLoaded;\r\nscope.whenReady = whenImportsReady;\r\nscope.isIE = isIE;\r\n\r\n// deprecated\r\nscope.whenImportsReady = whenImportsReady;\r\n\r\n})(window.HTMLImports);",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n",
-    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (typeof navigator != 'undefined' && navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0 && s !== '';\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
     "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n",
     "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      var ifValue = true;\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        ifValue = deps.ifValue;\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !ifValue) {\n          this.valueChanged();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          ifValue = ifValue.open(this.updateIfValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      var value = deps.value;\n      if (!deps.oneTime)\n        value = value.open(this.updateIteratedValue, this);\n\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(value);\n    },\n\n    /**\n     * Gets the updated value of the bind/repeat. This can potentially call\n     * user code (if a bindingDelegate is set up) so we try to avoid it if we\n     * already have the value in hand (from Observer.open).\n     */\n    getUpdatedValue: function() {\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      return value;\n    },\n\n    updateIfValue: function(ifValue) {\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(this.getUpdatedValue());\n    },\n\n    updateIteratedValue: function(value) {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      this.updateValue(value);\n    },\n\n    updateValue: function(value) {\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n",
@@ -98,21 +98,21 @@
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function noopHandler(value) {\n    return value;\n  }\n\n  var typeHandlers = {\n    string: noopHandler,\n    'undefined': noopHandler,\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      * @param {Boolean} bubbles Set false to prevent bubbling, defaults to true\n      * @param {Boolean} cancelable Set false to prevent cancellation, defaults to true\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail === null || detail === undefined ? {} : detail;\n      var event = new CustomEvent(type, {\n        bubbles: bubbles !== undefined ? bubbles : true,\n        cancelable: cancelable !== undefined ? cancelable : true,\n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n  // alias PolymerGestures event listener logic\n  scope.addEventListener = PolymerGestures.addEventListener;\n  scope.removeEventListener = PolymerGestures.removeEventListener;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n  // alias PolymerGestures event listener logic\n  scope.addEventListener = function(node, eventType, handlerFn, capture) {\n    PolymerGestures.addEventListener(wrap(node), eventType, handlerFn, capture);\n  };\n  scope.removeEventListener = function(node, eventType, handlerFn, capture) {\n    PolymerGestures.removeEventListener(wrap(node), eventType, handlerFn, capture);\n  };\n\n})(Polymer);\n",
     "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(splices) {\n            this.invokeMethod(callbackName, [splices]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(splices) {\n            this.invokeMethod(callbackName, [splices]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      // Present for properties which are computed and published and have a\n      // bound value.\n      var privateComputedBoundValue = name + 'ComputedBoundObservable_';\n\n      this[privateObservable] = observable;\n\n      var oldValue = this[privateName];\n\n      var self = this;\n      function updateValue(value, oldValue) {\n        self[privateName] = value;\n\n        var setObserveable = self[privateComputedBoundValue];\n        if (setObserveable && typeof setObserveable.setValue == 'function') {\n          setObserveable.setValue(value);\n        }\n \n        self.emitPropertyChangeRecord(name, value, oldValue);\n      }\n \n      var value = observable.open(updateValue);\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      updateValue(value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n          self[privateComputedBoundValue] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      var computed = this.element.prototype.computed;\n\n      // Binding an \"out-only\" value to a computed property. Note that\n      // since this observer isn't opened, it doesn't need to be closed on\n      // cleanup.\n      if (computed && computed[property]) {\n        var privateComputedBoundValue = property + 'ComputedBoundObservable_';\n        this[privateComputedBoundValue] = observable;\n        return;\n      }\n\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure template is decorated (lets' things like <tr template ...> work)\n      HTMLTemplateElement.decorate(template);\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      if (!this.ownerDocument.isStagingDocument) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (hasShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      this.styleCacheForScope(scope)[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      var cache = this.styleCacheForScope(scope);\n      return cache[name];\n    },\n    styleCacheForScope: function(scope) {\n      if (hasShadowDOMPolyfill) {\n        var scopeName = scope.host ? scope.host.localName : scope.localName;\n        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});\n      } else {\n        return scope._scopeStyles = (scope._scopeStyles || {});\n      }\n    }\n  };\n\n  var polyfillScopeStyleCache = {};\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (typeof name !== 'string') {\n      var script = prototype || document._currentScript;\n      prototype = name;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  if (Platform.consumeDeclarations) {\n    Platform.consumeDeclarations(function(declarations) {;\n      if (declarations) {\n        for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n          element.apply(null, d);\n        }\n      }\n    });\n  }\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (typeof name !== 'string') {\n      var script = prototype || document._currentScript;\n      prototype = name;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  function instanceOfType(element, type) {\n    if (typeof type !== 'string') {\n      return false;\n    }\n    var proto = HTMLElement.getPrototypeForTag(type);\n    var ctor = proto && proto.constructor;\n    if (!ctor) {\n      return false;\n    }\n    if (CustomElements.instanceof) {\n      return CustomElements.instanceof(element, ctor);\n    }\n    return element instanceof ctor;\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n  scope.instanceOfType = instanceOfType;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  if (Platform.consumeDeclarations) {\n    Platform.consumeDeclarations(function(declarations) {;\n      if (declarations) {\n        for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n          element.apply(null, d);\n        }\n      }\n    });\n  }\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Polymer.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Polymer.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (hasShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        PolymerGestures.addEventListener(node, eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            PolymerGestures.removeEventListener(node, eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    //\n    // `name: value` entries in the `publish` object may need to generate \n    // matching properties on the prototype.\n    //\n    // Values that are objects may have a `reflect` property, which\n    // signals that the value describes property control metadata.\n    // In metadata objects, the prototype default value (if any)\n    // is encoded in the `value` property.\n    //\n    // publish: {\n    //   foo: 5, \n    //   bar: {value: true, reflect: true},\n    //   zot: {}\n    // }\n    //\n    // `reflect` metadata property controls whether changes to the property\n    // are reflected back to the attribute (default false). \n    //\n    // A value is stored on the prototype unless it's === `undefined`,\n    // in which case the base chain is checked for a value.\n    // If the basal value is also undefined, `null` is stored on the prototype.\n    //\n    // The reflection data is stored on another prototype object, `reflect`\n    // which also can be specified directly.\n    //\n    // reflect: {\n    //   foo: true\n    // }\n    //\n    requireProperties: function(propertyInfos, prototype, base) {\n      // per-prototype storage for reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyInfos) {\n        var value = propertyInfos[n];\n        // value has metadata if it has a `reflect` property\n        if (value && value.reflect !== undefined) {\n          prototype.reflect[n] = Boolean(value.reflect);\n          value = value.value;\n        }\n        // only set a value if one is specified\n        if (value !== undefined) {\n          prototype[n] = value;\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    //\n    // `name: value` entries in the `publish` object may need to generate \n    // matching properties on the prototype.\n    //\n    // Values that are objects may have a `reflect` property, which\n    // signals that the value describes property control metadata.\n    // In metadata objects, the prototype default value (if any)\n    // is encoded in the `value` property.\n    //\n    // publish: {\n    //   foo: 5, \n    //   bar: {value: true, reflect: true},\n    //   zot: {}\n    // }\n    //\n    // `reflect` metadata property controls whether changes to the property\n    // are reflected back to the attribute (default false). \n    //\n    // A value is stored on the prototype unless it's === `undefined`,\n    // in which case the base chain is checked for a value.\n    // If the basal value is also undefined, `null` is stored on the prototype.\n    //\n    // The reflection data is stored on another prototype object, `reflect`\n    // which also can be specified directly.\n    //\n    // reflect: {\n    //   foo: true\n    // }\n    //\n    requireProperties: function(propertyInfos, prototype, base) {\n      // per-prototype storage for reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyInfos) {\n        var value = propertyInfos[n];\n        // value has metadata if it has a `reflect` property\n        if (value && value.reflect !== undefined) {\n          prototype.reflect[n] = Boolean(value.reflect);\n          value = value.value;\n        }\n        // only set a value if one is specified\n        if (value !== undefined) {\n          prototype[n] = value;\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name, ignoreWrites) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          if (ignoreWrites) {\n            return this[privateName];\n          }\n\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n, true);\n        }\n      }\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          // If the property is computed and published, the accessor is created\n          // above.\n          if (!prototype.computed || !prototype.computed[n]) {\n            this.createPropertyAccessor(n);\n          }\n        }\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute into the 'publish' object\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // create a `publish` object if needed.\n        // the `publish` object is only relevant to this prototype, the \n        // publishing logic in `declaration/properties.js` is responsible for\n        // managing property values on the prototype chain.\n        // TODO(sjmiles): the `publish` object is later chained to it's \n        //                ancestor object, presumably this is only for \n        //                reflection or other non-library uses. \n        var publish = prototype.publish || (prototype.publish = {}); \n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // looks weird, but causes n to exist on `publish` if it does not;\n          // a more careful test would need expensive `in` operator\n          if (n && publish[n] === undefined) {\n            publish[n] = undefined;\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && template.content;\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (hasShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      var polyfillWasReady = CustomElements.ready;\n      CustomElements.ready = false;\n      this.flush();\n      if (!CustomElements.useNative) {\n        CustomElements.upgradeDocumentTree(document);\n      }\n      CustomElements.ready = polyfillWasReady;\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  function whenReady(callback) {\n    queue.waitToReady = true;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenReady;\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      var polyfillWasReady = CustomElements.ready;\n      CustomElements.ready = false;\n      this.flush();\n      if (!CustomElements.useNative) {\n        CustomElements.upgradeDocumentTree(document);\n      }\n      CustomElements.ready = polyfillWasReady;\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n  \n    /**\n    Returns a list of elements that have had polymer-elements created but \n    are not yet ready to register. The list is an array of element definitions.\n    */\n    waitingFor: function() {\n      var e$ = [];\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          e$.push(e);\n        }\n      }\n      return e$;\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  function whenReady(callback) {\n    queue.waitToReady = true;\n    Platform.endOfMicrotask(function() {\n      HTMLImports.whenImportsReady(function() {\n        queue.addReadyCallback(callback);\n        queue.waitToReady = false;\n        queue.check();\n    });\n    });\n  }\n\n  /**\n    Forces polymer to register any pending elements. Can be used to abort\n    waiting for elements that are partially defined.\n    @param timeout {Integer} Optional timeout in milliseconds\n  */\n  function forceReady(timeout) {\n    if (timeout === undefined) {\n      queue.ready();\n      return;\n    }\n    var handle = setTimeout(function() {\n      queue.ready();\n    }, timeout);\n    Polymer.whenReady(function() {\n      clearTimeout(handle);\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.waitingFor = queue.waitingFor.bind(queue);\n  scope.forceReady = forceReady;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenReady;\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenReady = scope.whenReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      queue.wait(this);\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    // TODO(sorvell): we currently queue in the order the prototypes are \n    // registered, but we should queue in the order that polymer-elements\n    // are registered. We are currently blocked from doing this based on \n    // crbug.com/395686.\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n    _register: function() {\n      //console.log('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // imperative element registration\n        Polymer(name);\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.enqueue(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n"
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js b/pkg/polymer/lib/src/js/polymer/polymer.js
index c0a13e1..1aec479 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js
@@ -7,9 +7,9 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version: 0.4.0-d66a86e
-window.PolymerGestures={},function(a){var b=!1,c=document.createElement("meta");if(c.createShadowRoot){var d=c.createShadowRoot(),e=document.createElement("span");d.appendChild(e),c.addEventListener("testpath",function(a){a.path&&(b=a.path[0]===e),a.stopPropagation()});var f=new CustomEvent("testpath",{bubbles:!0});document.head.appendChild(c),e.dispatchEvent(f),c.parentNode.removeChild(c),d=e=null}c=null;var g={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){var d,e;return a?(d=a.elementFromPoint(b,c),d?e=this.targetingShadow(d):a!==document&&(e=this.olderShadow(a)),this.searchRoot(e,b,c)||d):void 0},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){if(b&&a.path)return a.path[0];var c=a.clientX,d=a.clientY,e=this.owner(a.target);return e.elementFromPoint(c,d)||(e=document),this.searchRoot(e,c,d)},findTouchAction:function(a){var c;if(b&&a.path){for(var d=a.path,e=0;e<d.length;e++)if(c=d[e],c.nodeType===Node.ELEMENT_NODE&&c.hasAttribute("touch-action"))return c.getAttribute("touch-action")}else for(c=a.target;c;){if(c.hasAttribute("touch-action"))return c.getAttribute("touch-action");c=c.parentNode||c.host}return"auto"},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>=0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=a.parentNode||a.host,b=b.parentNode||b.host;return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=g,a.findTarget=g.findTarget.bind(g),a.deepContains=g.deepContains.bind(g),a.insideNode=g.insideNode}(window.PolymerGestures),function(){function a(a){return"html /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]},"manipulation"],e="",f="string"==typeof document.head.style.touchAction,g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],d[c]=b[c];return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=0;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f._source=d._source||"",f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b,c=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp","preventTap","tapPrevented","_source"],d=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0,function(){},!1],e="undefined"!=typeof SVGElementInstance,f=a.eventFactory,g={pointermap:new a.PointerMap,requiredGestures:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],dependencyMap:{down:{listeners:0,index:-1},up:{listeners:0,index:-1}},gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){var c=Object.create(null);c.listeners=0,c.index=this.gestures.length;for(var d,e=0;e<b.exposes.length;e++)d=b.exposes[e].toLowerCase(),this.dependencyMap[d]=c;this.gestures.push(b)},register:function(a,b){for(var c,d=this.eventSourceList.length,e=0;d>e&&(c=this.eventSourceList[e]);e++)c.register.call(c,a,b)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.requiredGestures.set(a.pointerId,b),this.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a),this.requiredGestures.delete(a.pointerId)},cancel:function(a){a.tapPrevented=!0,this.fireEvent("up",a),this.requiredGestures.delete(a.pointerId)},eventHandler:function(a){var c=a.type;if("touchstart"===c||"mousedown"===c||"pointerdown"===c||"MSPointerDown"===c){a._handledByPG||(b={});var d=a.currentTarget._pgEvents;if(d)for(var e,f,g,h=Object.keys(d),i=0;i<h.length;i++)g=h[i],d[g]>0&&(e=this.dependencyMap[g],f=e?e.index:-1,b[f]=!0)}if(!a._handledByPG){var j=this.eventMap&&this.eventMap[c];j&&j(a),a._handledByPG=!0}},listen:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.addEvent(a,c)},unlisten:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.removeEvent(a,c)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){var c=f.makePointerEvent(a,b);return c.preventDefault=b.preventDefault,c.tapPrevented=b.tapPrevented,c._target=c._target||b.target,c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,f=Object.create(null),g=0;g<c.length;g++)b=c[g],f[b]=a[b]||d[g],("target"===b||"relatedTarget"===b)&&e&&f[b]instanceof SVGElementInstance&&(f[b]=f[b].correspondingUseElement);return f.preventDefault=function(){a.preventDefault()},f},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=b,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b,c=0;c<this.gestureQueue.length;c++){a=this.gestureQueue[c],b=a._requiredGestures;for(var d,e,f=0;f<this.gestures.length;f++)b[f]&&(d=this.gestures[f],e=d[a.type],e&&e.call(d,a))}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),a._requiredGestures=this.requiredGestures.get(a.pointerId),this.gestureQueue.push(a)}};g.boundHandler=g.eventHandler.bind(g),g.boundGestureTrigger=g.gestureTrigger.bind(g),a.dispatcher=g,a.activateGesture=function(a,b){var c=b.toLowerCase(),d=g.dependencyMap[c];if(d){var e=g.gestures[d.index];if(a._pgListeners||(g.register(a),a._pgListeners=0),e){var f,h=e.defaultActions&&e.defaultActions[c];switch(a.nodeType){case Node.ELEMENT_NODE:f=a;break;case Node.DOCUMENT_FRAGMENT_NODE:f=a.host;break;default:f=null}h&&f&&!f.hasAttribute("touch-action")&&f.setAttribute("touch-action",h)}a._pgEvents||(a._pgEvents={}),a._pgEvents[c]=(a._pgEvents[c]||0)+1,a._pgListeners++}return Boolean(d)},a.addEventListener=function(b,c,d,e){d&&(a.activateGesture(b,c),b.addEventListener(c,d,e))},a.deactivateGesture=function(a,b){var c=b.toLowerCase(),d=g.dependencyMap[c];return d&&(a._pgListeners>0&&a._pgListeners--,0===a._pgListeners&&g.unregister(a),a._pgEvents&&(a._pgEvents[c]>0?a._pgEvents[c]--:a._pgEvents[c]=0)),Boolean(d)},a.removeEventListener=function(b,c,d,e){d&&(a.deactivateGesture(b,c),b.removeEventListener(c,d,e))}}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=!1;try{f=1===new MouseEvent("test",{buttons:1}).buttons}catch(g){}var h={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],exposes:["down","up","move"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",f||(c.buttons=e[c.which]||0),c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=c.has(this.POINTER_ID);e&&this.mouseup(d);var f=this.prepareEvent(d);f.target=a.findTarget(d),c.set(this.POINTER_ID,f.target),b.down(f)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.get(this.POINTER_ID);if(d){var e=this.prepareEvent(a);e.target=d,0===e.buttons?(b.cancel(e),this.cleanupMouse()):b.move(e)}}},mouseup:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(this.POINTER_ID),b.up(e),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=(a.targetFinding.allShadows.bind(a.targetFinding),b.pointermap),d=(Array.prototype.map.call.bind(Array.prototype.map),2500),e=200,f=20,g=!1,h={events:["touchstart","touchmove","touchend","touchcancel"],exposes:["down","up","move"],register:function(a,c){c||b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y"},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return b===c.EMITTER?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":"XY"},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===c.pointers()||1===c.pointers()&&c.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=null,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,e)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,d){if("touchstart"===this.currentTouchEvent.type){if(this.isPrimaryTouch(b)){var e={clientX:b.clientX,clientY:b.clientY,path:this.currentTouchEvent.path,target:this.currentTouchEvent.target};return a.findTarget(e)}return a.findTarget(b)}return c.get(d)},touchToPointer:function(a){var c=this.currentTouchEvent,d=b.cloneEvent(a),e=d.pointerId=a.identifier+2;d.target=this.findTarget(a,e),d.bubbles=!0,d.cancelable=!0,d.detail=this.clickCount,d.buttons=this.typeToButtons(c.type),d.width=a.webkitRadiusX||a.radiusX||0,d.height=a.webkitRadiusY||a.radiusY||0,d.pressure=a.webkitForce||a.force||.5,d.isPrimary=this.isPrimaryTouch(a),d.pointerType=this.POINTER_TYPE,d._source="touch";var f=this;return d.preventDefault=function(){f.scrolling=!1,f.firstXY=null,c.preventDefault()},d},processTouches:function(a,b){var d=a.changedTouches;this.currentTouchEvent=a;for(var e,f,g=0;g<d.length;g++)e=d[g],f=this.touchToPointer(e),"touchstart"===a.type&&c.set(f.pointerId,f.target),c.has(f.pointerId)&&b.call(this,f),("touchend"===a.type||a._cancel)&&this.cleanUpPointer(f)},shouldScroll:function(b){if(this.firstXY){var c,d=a.targetFinding.findTouchAction(b),e=this.touchActionToScrollType(d);if("none"===e)c=!1;else if("XY"===e)c=!0;else{var f=b.changedTouches[0],g=e,h="Y"===e?"X":"Y",i=Math.abs(f["client"+g]-this.firstXY[g]),j=Math.abs(f["client"+h]-this.firstXY[h]);c=i>=j}return c}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(c.pointers()>=b.length){var d=[];c.forEach(function(a,c){if(1!==c&&!this.findTouch(b,c-2)){var e=a;d.push(e)}},this),d.forEach(function(a){this.cancel(a),c.delete(a.pointerId)})}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){b.down(a)},touchmove:function(a){if(g)a.cancelable&&this.processTouches(a,this.move);else if(this.scrolling){if(this.firstXY){var b=a.changedTouches[0],c=b.clientX-this.firstXY.X,d=b.clientY-this.firstXY.Y,e=Math.sqrt(c*c+d*d);e>=f&&(this.touchcancel(a),this.scrolling=!0,this.firstXY=null)}}else null===this.scrolling&&this.shouldScroll(a)?this.scrolling=!0:(this.scrolling=!1,a.preventDefault(),this.processTouches(a,this.move))},move:function(a){b.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(c){c.relatedTarget=a.findTarget(c),b.up(c)},cancel:function(a){b.cancel(a)},touchcancel:function(a){a._cancel=!0,this.processTouches(a,this.cancel)},cleanUpPointer:function(a){c["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,e=b.changedTouches[0];if(this.isPrimaryTouch(e)){var f={x:e.clientX,y:e.clientY};c.push(f);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,f);setTimeout(g,d)}}};a.touchEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return c=b.cloneEvent(a),d&&(c.pointerType=this.POINTER_TYPES[a.pointerType]),c._source="ms",c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(d){var e=this.prepareEvent(d);e.target=a.findTarget(d),c.set(d.pointerId,e.target),b.down(e)},MSPointerMove:function(a){var d=c.get(a.pointerId);if(d){var e=this.prepareEvent(a);e.target=d,b.move(e)}},MSPointerUp:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},MSPointerCancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){var c=b.cloneEvent(a);return c._source="pointer",c},register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(d){var e=this.prepareEvent(d);e.target=a.findTarget(d),c.set(e.pointerId,e.target),b.down(e)},pointermove:function(a){var d=c.get(a.pointerId);if(d){var e=this.prepareEvent(a);e.target=d,b.move(e)}},pointerup:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},pointercancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher,c=window.navigator;if(window.PointerEvent)b.registerSource("pointer",a.pointerEvents);else if(c.msPointerEnabled)b.registerSource("ms",a.msEvents);else if(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart){b.registerSource("touch",a.touchEvents);var d=c.userAgent.match("Safari")&&!c.userAgent.match("Chrome");d&&document.body.addEventListener("touchstart",function(){})}b.register(document,!0)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],exposes:["trackstart","track","trackx","tracky","trackend"],defaultActions:{track:"none",trackx:"pan-y",tracky:"pan-x"},WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);if(g.x)e.xDirection=this.clampDir(g.x);else if("trackx"===a)return;if(g.y)e.yDirection=this.clampDir(g.y);else if("tracky"===a)return;var h={bubbles:!0,cancelable:!0,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId,_source:"track"};"tracky"!==a&&(h.x=b.x,h.dx=f.x,h.ddx=g.x,h.clientX=b.clientX,h.pageX=b.pageX,h.screenX=b.screenX,h.xDirection=e.xDirection),"trackx"!==a&&(h.dy=f.y,h.ddy=g.y,h.y=b.y,h.clientY=b.clientY,h.pageY=b.pageY,h.screenY=b.screenY,h.yDirection=e.yDirection);var i=c.makeGestureEvent(a,h);e.downTarget.dispatchEvent(i)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(!b.tracking){var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,b.lastMoveEvent=b.downEvent,this.fireTrack("trackstart",a,b))}b.tracking&&(this.fireTrack("track",a,b),this.fireTrack("trackx",a,b),this.fireTrack("tracky",a,b)),b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d.delete(a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["down","move","up"],exposes:["hold","holdpulse","release"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},down:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},up:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},move:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,b){var d={bubbles:!0,cancelable:!0,pointerType:this.heldPointer.pointerType,pointerId:this.heldPointer.pointerId,x:this.heldPointer.clientX,y:this.heldPointer.clientY,_source:"hold"};b&&(d.holdTime=b);var e=c.makeGestureEvent(a,d);this.target.dispatchEvent(e)}};b.registerGesture("hold",d)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],exposes:["tap"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){return"mouse"===a.pointerType?1===b.buttons:!a.tapPrevented},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey,_source:"tap"});f.dispatchEvent(g)}}d.delete(b.pointerId)}};c.preventTap=function(a){return function(){a.tapPrevented=!0,d.delete(a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b,c;for(a=C();;)if(v("["))c=G(),a=Z.createMemberExpression("[",a,c);else if(v("."))c=F(),a=Z.createMemberExpression(".",a,c);else{if(!v("("))break;b=D(),a=Z.createCallExpression(a,b)}return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=q[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),q[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){this.computed="["==c,this.dynamicDeps="function"==typeof a||a.dynamicDeps||this.computed&&!(b instanceof d),this.simplePath=!this.dynamicDeps&&(b instanceof e||b instanceof d)&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property=!this.computed||this.simplePath?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a,b){for(;a[t]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[t];return a}function o(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function p(){}var q=Object.create(null);d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=n(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof f?this.object.fullPath.slice():[this.object.name];a.push(this.property instanceof e?this.property.name:this.property.value),this.fullPath_=Path.get(a)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.computed){var c=this.property;this.valueFn_=function(b,d,e){var f=a(b,d,e),g=c(b,d,e);
-return d&&d.addPath(f,[g]),f?f[g]:void 0}}else{var b=Path.get(this.property.name);this.valueFn_=function(c,d,e){var f=a(c,d,e);return d&&d.addPath(f,b),b.getValueFrom(f)}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=a;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find function or filter: "+this.name);if(d?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("Cannot find function or filter: "+this.name);for(var h=e||[],j=0;j<this.args.length;j++)h.push(i(this.args[j])(a,b,c));return f.apply(g,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d,e){return r[a](b(c,d,e))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);switch(b=i(b),c=i(c),a){case"||":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)||c(a,d,e)};case"&&":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)&&c(a,d,e)}}return function(d,e,f){return s[a](b(d,e,f),c(d,e,f))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),this.dynamicDeps=!0,function(d,e,f){return a(d,e,f)?b(d,e,f):c(d,e,f)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createCallExpression:function(a,b){if(!(a instanceof e))throw Error("Only identifier function invocations are allowed");var c=new g(a.name,b);return function(a,b,d){return c.transform(a,b,d,!1)}},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c,d){for(var e=[],f=0;f<a.length;f++)e.push(a[f](b,c,d));return e}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c,d){for(var e={},f=0;f<a.length;f++)e[a[f].key]=a[f].value(b,c,d);return e}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b,c),e=0;e<this.filters.length;e++)d=this.filters[e].transform(a,b,c,!1,[d]);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(a,void 0,c,!0,[b]);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){return u(c,a,b,d)}}}};var u="__proto__"in{}?function(a,b,c,d){var e={};return e[c]=b,e[d]=void 0,e[t]=a,e.__proto__=a,e}:function(a,b,c,d){var e=Object.create(a);return Object.defineProperty(e,c,{value:b,configurable:!0,writable:!0}),Object.defineProperty(e,d,{value:void 0,configurable:!0,writable:!0}),Object.defineProperty(e,t,{value:a,configurable:!0,writable:!0}),e};a.PolymerExpressions=p,p.getExpression=c}(this),Polymer={version:"0.4.0-d66a86e"},"function"==typeof window.Polymer&&(Polymer={}),window.Platform||(logFlags=window.logFlags||{},Platform={flush:function(){}},CustomElements={useNative:!0,ready:!0,takeRecords:function(){},"instanceof":function(a,b){return a instanceof b}},HTMLImports={useNative:!0},addEventListener("HTMLImportsLoaded",function(){document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))}),ShadowDOMPolyfill=null,wrap=unwrap=function(a){return a}),function(a){function b(a,b){b=b||o,d(function(){f(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===q}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===q)&&(b.removeEventListener(r,e),d(a,b))};b.addEventListener(r,e)}}function e(a){a.target.__loaded=!0}function f(a,b){function c(){h==i&&a&&a()}function d(a){e(a),h++,c()}var f=b.querySelectorAll("link[rel=import]"),h=0,i=f.length;if(i)for(var j,k=0;i>k&&(j=f[k]);k++)g(j)?d.call(j,{target:j}):(j.addEventListener("load",d),j.addEventListener("error",d));else c()}function g(a){return l?a.__loaded:a.__importParsed}function h(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)i(b)&&j(b)}function i(a){return"link"===a.localName&&"import"===a.rel}function j(a){var b=a.import;b?e({target:a}):(a.addEventListener("load",e),a.addEventListener("error",e))}var k="import"in document.createElement("link"),l=k;isIE=/Trident/.test(navigator.userAgent);var m=Boolean(window.ShadowDOMPolyfill),n=function(a){return m?ShadowDOMPolyfill.wrapIfNeeded(a):a},o=n(document),p={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return n(a)},configurable:!0};Object.defineProperty(document,"_currentScript",p),Object.defineProperty(o,"_currentScript",p);var q=isIE?"complete":"interactive",r="readystatechange";l&&(new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&h(b.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var a,b=document.querySelectorAll("link[rel=import]"),c=0,d=b.length;d>c&&(a=b[c]);c++)j(a)}()),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),o.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=l,a.isImportLoaded=g,a.whenReady=b,a.isIE=isIE,a.whenImportsReady=b}(window.HTMLImports),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var testingExposeCycleCount=global.testingExposeCycleCount,hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&hasEval&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);
-var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue()))},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_,e=!0;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),e=c.ifValue,c.ifOneTime&&!e)return void this.valueChanged();c.ifOneTime||(e=e.open(this.updateIfValue,this))}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b));var f=c.value;return c.oneTime||(f=f.open(this.updateIteratedValue,this)),e?void this.updateValue(f):void this.valueChanged()},getUpdatedValue:function(){var a=this.deps.value;return this.deps.oneTime||(a=a.discardChanges()),a},updateIfValue:function(a){return a?void this.updateValue(this.getUpdatedValue()):void this.valueChanged()},updateIteratedValue:function(a){if(this.deps.hasIf){var b=this.deps.ifValue;if(this.deps.ifOneTime||(b=b.discardChanges()),!b)return void this.valueChanged()}this.updateValue(a)},updateValue:function(a){this.deps.repeat||(a=[a]);var b=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(a);this.valueChanged(a,b)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform),function(a){function b(a,b,d,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=c(b,h,d),e+"'"+h+"'"+g})}function c(a,b,c){if(b&&"/"===b[0])return b;var e=new URL(b,a);return c?e.href:d(e.href)}function d(a){var b=new URL(document.baseURI),c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b,c):a}function e(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");return f.join("/")+b.search+b.hash}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c,d){return a=b(a,c,d,g),b(a,c,d,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,!1,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style","url"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Polymer),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=Platform.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(Polymer),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(Polymer),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}function c(a){for(var b=a||{},c=1;c<arguments.length;c++){var e=arguments[c];try{for(var f in e)d(f,e,b)}catch(g){}}return b}function d(a,b,c){var d=e(b,a);Object.defineProperty(c,a,d)}function e(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||e(Object.getPrototypeOf(a),b)}}a.extend=b,a.mixin=c,Platform.mixin=c}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(a){function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c={};HTMLElement.register=function(a,b){c[a]=b},HTMLElement.getPrototypeForTag=function(a){var b=a?c[a]:HTMLElement.prototype;return b||Object.getPrototypeOf(document.createElement(a))};var d=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,d.apply(this,arguments)};var e=DOMTokenList.prototype.add,f=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)e.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)f.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var g=function(){return Array.prototype.slice.call(this)},h=window.NamedNodeMap||window.MozNamedAttrMap||{};NodeList.prototype.array=g,h.prototype.array=g,HTMLCollection.prototype.array=g,a.createDOM=b}(Polymer),function(a){function b(a){var e=b.caller,g=e.nom,h=e._super;h||(g||(g=e.nom=c.call(this,e)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(e,g,f(this)));var i=h[g];return i?(i._super||d(i,g,h),i.apply(this,a||[])):void 0}function c(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function d(a,b,c){var d=e(c,b,a);return d[b]&&(d[b].nom=b),a._super=d}function e(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}return Object}function f(a){return a.__proto__}a.super=b}(Polymer),function(a){function b(a){return a}function c(a,b){var c=typeof b;return b instanceof Date&&(c="date"),d[c](a,b)}var d={string:b,undefined:b,date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=c}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=null===b||void 0===b?{}:b,g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)},injectBoundHTML:function(a,b){var c=document.createElement("template");c.innerHTML=a;var d=this.instanceTemplate(c);return b&&(b.textContent="",b.appendChild(d)),d}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];PolymerGestures.addEventListener(this,c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d,a.addEventListener=PolymerGestures.addEventListener,a.removeEventListener=PolymerGestures.removeEventListener}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b){return a===b?0!==a||1/a===1/b:f(a)&&f(b)?!0:a!==a&&b!==b}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={object:void 0,type:"update",name:void 0,oldValue:void 0},f=Number.isNaN||function(a){return"number"==typeof a&&isNaN(a)},g={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObserver(b);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a){this.invokeMethod(e,[a])},this),this.registerNamedObserver(a+"__array",f)}},emitPropertyChangeRecord:function(a,c,d){if(!b(c,d)&&(this.propertyChanged_(a,c,d),Observer.hasObjectObserve)){var f=this.notifier_;f||(f=this.notifier_=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},bindToAccessor:function(a,c,d){var e=a+"_",f=a+"Observable_";this[f]=c;var g=this[e],h=this,i=c.open(function(b,c){h[e]=b,h.emitPropertyChangeRecord(a,b,c)});if(d&&!b(g,i)){var j=d(g,i);b(i,j)||(i=j,c.setValue&&c.setValue(i))}this[e]=i,this.emitPropertyChangeRecord(a,i,g);var k={close:function(){c.close(),h[f]=void 0}};return this.registerObserver(k),k},createComputedProperties:function(){if(this._computedNames)for(var a=0;a<this._computedNames.length;a++){var b=this._computedNames[a],c=this.computed[b];try{var d=PolymerExpressions.getExpression(c),e=d.getBinding(this,this.element.syntax);this.bindToAccessor(b,e)}catch(f){console.error("Failed to create computed property",f)}}},bindProperty:function(a,b,d){return d?void(this[a]=b):this.bindToAccessor(a,b,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObserver:function(a){return this._observers?void this._observers.push(a):void(this._observers=[a])},closeObservers:function(){if(this._observers){for(var a=this._observers,b=0;b<a.length;b++){var c=a[b];c&&"function"==typeof c.close&&c.close()}this._observers=[]}},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a in this._namedObservers)this.closeNamedObserver(a);this._namedObservers={}}}};a.api.instance.properties=g}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){HTMLTemplateElement.decorate(a);for(var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b),d=c.bindings_,e=0;e<d.length;e++)this.registerObserver(d[e]);return c},bind:function(a,b,c){var d=this.propertyForAttribute(a);if(d){var e=this.bindProperty(d,b,c);return Platform.enableBindingsReflection&&e&&(e.path=b.path_,this._recordBinding(d,e)),this.reflect[d]&&this.reflectPropertyToAttribute(d),e}return this.mixinSuper(arguments)},bindFinished:function(){this.makeElementReady()},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},asyncUnbindAll:function(){this._unbound||(b.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){this._unbound||(this.closeObservers(),this.closeNamedObservers(),this._unbound=!0)},cancelUnbindAll:function(){return this._unbound?void(b.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(b.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},d=/\{\{([^{}]*)}}/;a.bindPattern=d,a.api.instance.mdv=c}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d={PolymerBase:!0,job:function(a,b,c){if("string"!=typeof a)return Polymer.job.call(this,a,b,c);var d="___"+a;this[d]=Polymer.job.call(this,this[d],b,c)},"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.templateInstance&&this.templateInstance.model&&console.warn("Attributes on "+this.localName+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."),this.created(),this.prepareElement(),this.ownerDocument.isStagingDocument||this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.createComputedProperties(),this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()
-},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},window.ShadowDOMPolyfill),e="element",f="controller",g={STYLE_SCOPE_ATTRIBUTE:e,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(f),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,e){if(b=b||this.findStyleScope(),e=e||"",b){d&&(a=c(a,b.host));var g=this.element.cssTextToScopeStyle(a,f);Polymer.applyStyleToScope(g,b),this.styleCacheForScope(b)[this.localName+e]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){var c=this.styleCacheForScope(a);return c[b]},styleCacheForScope:function(a){if(d){var b=a.host?a.host.localName:a.localName;return h[b]||(h[b]={})}return a._scopeStyles=a._scopeStyles||{}}},h={};a.api.instance.styles=g}(Polymer),function(a){function b(a,b){if("string"!=typeof a){var c=b||document._currentScript;if(b=a,a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a),Platform.consumeDeclarations&&Platform.consumeDeclarations(function(a){if(a)for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.apply(null,c)})}(Polymer),function(a){var b={resolveElementPaths:function(a){Polymer.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){b===document&&(b=document.head),i&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",j=document.head.querySelectorAll(g);j.length&&(f=j[j.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return q?q.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i=window.ShadowDOMPolyfill,j="style",k="@import",l="link[rel=stylesheet]",m="global",n="polymer-scope",o={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Polymer.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(l),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(j),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(k)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(l),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(j+"["+n+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(n)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(m);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+n+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},p=HTMLElement.prototype,q=p.matches||p.matchesSelector||p.webkitMatchesSelector||p.mozMatchesSelector;a.api.declaration.styles=o,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return PolymerGestures.addEventListener(d,c,h),f?void 0:{open:g,discardChanges:g,close:function(){PolymerGestures.removeEventListener(d,c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}if(a.computed){var b=a._computedNames=[];for(var c in a.computed)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c];d&&void 0!==d.reflect&&(b.reflect[c]=Boolean(d.reflect),d=d.value),void 0!==d&&(b[c]=d)}},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a){var b=this.prototype,c=a+"_",d=a+"Observable_";b[c]=b[a],Object.defineProperty(b,a,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(b){var e=this[d];if(e)return void e.setValue(b);var f=this[c];return this[c]=b,this.emitPropertyChangeRecord(a,b,f),b},configurable:!0})},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c);var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a){var d=this.getAttribute(b);if(d)for(var e,f=a.publish||(a.publish={}),g=d.split(c),h=0,i=g.length;i>h;h++)e=g[h].trim(),e&&void 0===f[e]&&(f[e]=void 0)},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&a.content},installBindingDelegate:function(a){a&&(a.bindingDelegate=this.syntax)}};a.api.declaration.mdv=e}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f=window.ShadowDOMPolyfill,g={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),f&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),h[a]=b}return b},findBasePrototype:function(a){return h[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},h={};g.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=g}(Polymer),function(a){function b(a){return document.contains(a)?i:h}function c(){return h.length?h[0]:i[0]}function d(a){e.waitToReady=!0,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a){a.__queue||(a.__queue={},f.push(a))},enqueue:function(a,c,d){var e=a.__queue&&!a.__queue.check;return e&&(b(a).push(a),a.__queue.check=c,a.__queue.go=d),0!==this.indexOf(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?h.length:1e9),c},go:function(a){var b=this.remove(a);b&&(a.__queue.flushable=!0,this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__queue.check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){for(var a,b=0,c=f.length;c>b&&(a=f[b]);b++)if(a.__queue&&!a.__queue.flushable)return;return!0},addToFlushQueue:function(a){g.push(a)},flush:function(){if(!this.flushing){this.flushing=!0;for(var a;g.length;)a=g.shift(),a.__queue.go.call(a),a.__queue=null;this.flushing=!1}},ready:function(){var a=CustomElements.ready;CustomElements.ready=!1,this.flush(),CustomElements.useNative||CustomElements.upgradeDocumentTree(document),CustomElements.ready=a,Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&j.push(a)},flushReadyCallbacks:function(){if(j)for(var a;j.length;)(a=j.shift())()},waitToReady:!0},f=[],g=[],h=[],i=[],j=[];a.elements=f,a.queue=e,a.whenReady=a.whenPolymerReady=d}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this.extends=this.getAttribute("extends"),f.wait(this),this.loadResources(),this.registerWhenReady()},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){this.hasAttribute("noscript")&&!this.noscript&&(this.noscript=!0,Polymer(a))},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.enqueue(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenPolymerReady;a.import=c,a.importElements=b}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
+// @version: 0.4.1-d61654b
+window.PolymerGestures={},function(a){var b=!1,c=document.createElement("meta");if(c.createShadowRoot){var d=c.createShadowRoot(),e=document.createElement("span");d.appendChild(e),c.addEventListener("testpath",function(a){a.path&&(b=a.path[0]===e),a.stopPropagation()});var f=new CustomEvent("testpath",{bubbles:!0});document.head.appendChild(c),e.dispatchEvent(f),c.parentNode.removeChild(c),d=e=null}c=null;var g={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){var d,e;return a?(d=a.elementFromPoint(b,c),d?e=this.targetingShadow(d):a!==document&&(e=this.olderShadow(a)),this.searchRoot(e,b,c)||d):void 0},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){if(b&&a.path&&a.path.length)return a.path[0];var c=a.clientX,d=a.clientY,e=this.owner(a.target);return e.elementFromPoint(c,d)||(e=document),this.searchRoot(e,c,d)},findTouchAction:function(a){var c;if(b&&a.path&&a.path.length){for(var d=a.path,e=0;e<d.length;e++)if(c=d[e],c.nodeType===Node.ELEMENT_NODE&&c.hasAttribute("touch-action"))return c.getAttribute("touch-action")}else for(c=a.target;c;){if(c.nodeType===Node.ELEMENT_NODE&&c.hasAttribute("touch-action"))return c.getAttribute("touch-action");c=c.parentNode||c.host}return"auto"},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>=0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=a.parentNode||a.host,b=b.parentNode||b.host;return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom},path:function(a){var c;if(b&&a.path&&a.path.length)c=a.path;else{c=[];for(var d=this.findTarget(a);d;)c.push(d),d=d.parentNode||d.host}return c}};a.targetFinding=g,a.findTarget=g.findTarget.bind(g),a.deepContains=g.deepContains.bind(g),a.insideNode=g.insideNode}(window.PolymerGestures),function(){function a(a){return"html /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]},"manipulation"],e="",f="string"==typeof document.head.style.touchAction,g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],d[c]=b[c];return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=0;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f._source=d._source||"",f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b,c=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp","preventTap","tapPrevented","_source"],d=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0,function(){},!1],e="undefined"!=typeof SVGElementInstance,f=a.eventFactory,g={IS_IOS:!1,pointermap:new a.PointerMap,requiredGestures:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],dependencyMap:{down:{listeners:0,index:-1},up:{listeners:0,index:-1}},gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){var c=Object.create(null);c.listeners=0,c.index=this.gestures.length;for(var d,e=0;e<b.exposes.length;e++)d=b.exposes[e].toLowerCase(),this.dependencyMap[d]=c;this.gestures.push(b)},register:function(a,b){for(var c,d=this.eventSourceList.length,e=0;d>e&&(c=this.eventSourceList[e]);e++)c.register.call(c,a,b)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.requiredGestures.set(a.pointerId,b),this.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a),this.requiredGestures.delete(a.pointerId)},cancel:function(a){a.tapPrevented=!0,this.fireEvent("up",a),this.requiredGestures.delete(a.pointerId)},addGestureDependency:function(a,b){var c=a._pgEvents;if(c)for(var d,e,f,g=Object.keys(c),h=0;h<g.length;h++)f=g[h],c[f]>0&&(d=this.dependencyMap[f],e=d?d.index:-1,b[e]=!0)},eventHandler:function(c){var d=c.type;if("touchstart"===d||"mousedown"===d||"pointerdown"===d||"MSPointerDown"===d)if(c._handledByPG||(b={}),this.IS_IOS)for(var e,f=a.targetFinding.path(c),g=0;g<f.length;g++)e=f[g],this.addGestureDependency(e,b);else this.addGestureDependency(c.currentTarget,b);if(!c._handledByPG){var h=this.eventMap&&this.eventMap[d];h&&h(c),c._handledByPG=!0}},listen:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.addEvent(a,c)},unlisten:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.removeEvent(a,c)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){var c=f.makePointerEvent(a,b);return c.preventDefault=b.preventDefault,c.tapPrevented=b.tapPrevented,c._target=c._target||b.target,c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,f=Object.create(null),g=0;g<c.length;g++)b=c[g],f[b]=a[b]||d[g],("target"===b||"relatedTarget"===b)&&e&&f[b]instanceof SVGElementInstance&&(f[b]=f[b].correspondingUseElement);return f.preventDefault=function(){a.preventDefault()},f},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=b,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b,c=0;c<this.gestureQueue.length;c++){a=this.gestureQueue[c],b=a._requiredGestures;for(var d,e,f=0;f<this.gestures.length;f++)b[f]&&(d=this.gestures[f],e=d[a.type],e&&e.call(d,a))}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),a._requiredGestures=this.requiredGestures.get(a.pointerId),this.gestureQueue.push(a)}};g.boundHandler=g.eventHandler.bind(g),g.boundGestureTrigger=g.gestureTrigger.bind(g),a.dispatcher=g,a.activateGesture=function(a,b){var c=b.toLowerCase(),d=g.dependencyMap[c];if(d){var e=g.gestures[d.index];if(a._pgListeners||(g.register(a),a._pgListeners=0),e){var f,h=e.defaultActions&&e.defaultActions[c];switch(a.nodeType){case Node.ELEMENT_NODE:f=a;break;case Node.DOCUMENT_FRAGMENT_NODE:f=a.host;break;default:f=null}h&&f&&!f.hasAttribute("touch-action")&&f.setAttribute("touch-action",h)}a._pgEvents||(a._pgEvents={}),a._pgEvents[c]=(a._pgEvents[c]||0)+1,a._pgListeners++}return Boolean(d)},a.addEventListener=function(b,c,d,e){d&&(a.activateGesture(b,c),b.addEventListener(c,d,e))},a.deactivateGesture=function(a,b){var c=b.toLowerCase(),d=g.dependencyMap[c];return d&&(a._pgListeners>0&&a._pgListeners--,0===a._pgListeners&&g.unregister(a),a._pgEvents&&(a._pgEvents[c]>0?a._pgEvents[c]--:a._pgEvents[c]=0)),Boolean(d)},a.removeEventListener=function(b,c,d,e){d&&(a.deactivateGesture(b,c),b.removeEventListener(c,d,e))}}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=!1;try{f=1===new MouseEvent("test",{buttons:1}).buttons}catch(g){}var h={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],exposes:["down","up","move"],register:function(a){b.listen(a,this.events)},unregister:function(a){a!==document&&b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",f||(c.buttons=e[c.which]||0),c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=c.has(this.POINTER_ID);e&&this.mouseup(d);var f=this.prepareEvent(d);f.target=a.findTarget(d),c.set(this.POINTER_ID,f.target),b.down(f)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.get(this.POINTER_ID);if(d){var e=this.prepareEvent(a);e.target=d,0===e.buttons?(b.cancel(e),this.cleanupMouse()):b.move(e)}}},mouseup:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(this.POINTER_ID),b.up(e),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=(a.targetFinding.allShadows.bind(a.targetFinding),b.pointermap),d=(Array.prototype.map.call.bind(Array.prototype.map),2500),e=200,f=20,g=!1,h={IS_IOS:!1,events:["touchstart","touchmove","touchend","touchcancel"],exposes:["down","up","move"],register:function(a,c){(this.IS_IOS?c:!c)&&b.listen(a,this.events)},unregister:function(a){this.IS_IOS||b.unlisten(a,this.events)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y"},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return b===c.EMITTER?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":"XY"},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===c.pointers()||1===c.pointers()&&c.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=null,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,e)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,d){if("touchstart"===this.currentTouchEvent.type){if(this.isPrimaryTouch(b)){var e={clientX:b.clientX,clientY:b.clientY,path:this.currentTouchEvent.path,target:this.currentTouchEvent.target};return a.findTarget(e)}return a.findTarget(b)}return c.get(d)},touchToPointer:function(a){var c=this.currentTouchEvent,d=b.cloneEvent(a),e=d.pointerId=a.identifier+2;d.target=this.findTarget(a,e),d.bubbles=!0,d.cancelable=!0,d.detail=this.clickCount,d.buttons=this.typeToButtons(c.type),d.width=a.webkitRadiusX||a.radiusX||0,d.height=a.webkitRadiusY||a.radiusY||0,d.pressure=a.webkitForce||a.force||.5,d.isPrimary=this.isPrimaryTouch(a),d.pointerType=this.POINTER_TYPE,d._source="touch";var f=this;return d.preventDefault=function(){f.scrolling=!1,f.firstXY=null,c.preventDefault()},d},processTouches:function(a,b){var d=a.changedTouches;this.currentTouchEvent=a;for(var e,f,g=0;g<d.length;g++)e=d[g],f=this.touchToPointer(e),"touchstart"===a.type&&c.set(f.pointerId,f.target),c.has(f.pointerId)&&b.call(this,f),("touchend"===a.type||a._cancel)&&this.cleanUpPointer(f)},shouldScroll:function(b){if(this.firstXY){var c,d=a.targetFinding.findTouchAction(b),e=this.touchActionToScrollType(d);if("none"===e)c=!1;else if("XY"===e)c=!0;else{var f=b.changedTouches[0],g=e,h="Y"===e?"X":"Y",i=Math.abs(f["client"+g]-this.firstXY[g]),j=Math.abs(f["client"+h]-this.firstXY[h]);c=i>=j}return c}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(c.pointers()>=b.length){var d=[];c.forEach(function(a,c){if(1!==c&&!this.findTouch(b,c-2)){var e=a;d.push(e)}},this),d.forEach(function(a){this.cancel(a),c.delete(a.pointerId)})}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){b.down(a)},touchmove:function(a){if(g)a.cancelable&&this.processTouches(a,this.move);else if(this.scrolling){if(this.firstXY){var b=a.changedTouches[0],c=b.clientX-this.firstXY.X,d=b.clientY-this.firstXY.Y,e=Math.sqrt(c*c+d*d);e>=f&&(this.touchcancel(a),this.scrolling=!0,this.firstXY=null)}}else null===this.scrolling&&this.shouldScroll(a)?this.scrolling=!0:(this.scrolling=!1,a.preventDefault(),this.processTouches(a,this.move))},move:function(a){b.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(c){c.relatedTarget=a.findTarget(c),b.up(c)},cancel:function(a){b.cancel(a)},touchcancel:function(a){a._cancel=!0,this.processTouches(a,this.cancel)},cleanUpPointer:function(a){c["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,e=b.changedTouches[0];if(this.isPrimaryTouch(e)){var f={x:e.clientX,y:e.clientY};c.push(f);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,f);setTimeout(g,d)}}};a.touchEvents=h}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){b.listen(a,this.events)},unregister:function(a){a!==document&&b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return c=b.cloneEvent(a),d&&(c.pointerType=this.POINTER_TYPES[a.pointerType]),c._source="ms",c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(d){var e=this.prepareEvent(d);e.target=a.findTarget(d),c.set(d.pointerId,e.target),b.down(e)},MSPointerMove:function(a){var d=c.get(a.pointerId);if(d){var e=this.prepareEvent(a);e.target=d,b.move(e)}},MSPointerUp:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},MSPointerCancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){var c=b.cloneEvent(a);return c._source="pointer",c},register:function(a){b.listen(a,this.events)},unregister:function(a){a!==document&&b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(d){var e=this.prepareEvent(d);e.target=a.findTarget(d),c.set(e.pointerId,e.target),b.down(e)},pointermove:function(a){var d=c.get(a.pointerId);if(d){var e=this.prepareEvent(a);e.target=d,b.move(e)}},pointerup:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},pointercancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher,c=window.navigator;window.PointerEvent?b.registerSource("pointer",a.pointerEvents):c.msPointerEnabled?b.registerSource("ms",a.msEvents):(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents));var d=navigator.userAgent,e=d.match(/iPad|iPhone|iPod/)&&"ontouchstart"in window;b.IS_IOS=e,a.touchEvents.IS_IOS=e,b.register(document,!0)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],exposes:["trackstart","track","trackx","tracky","trackend"],defaultActions:{track:"none",trackx:"pan-y",tracky:"pan-x"},WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);if(g.x)e.xDirection=this.clampDir(g.x);else if("trackx"===a)return;if(g.y)e.yDirection=this.clampDir(g.y);else if("tracky"===a)return;var h={bubbles:!0,cancelable:!0,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId,_source:"track"};"tracky"!==a&&(h.x=b.x,h.dx=f.x,h.ddx=g.x,h.clientX=b.clientX,h.pageX=b.pageX,h.screenX=b.screenX,h.xDirection=e.xDirection),"trackx"!==a&&(h.dy=f.y,h.ddy=g.y,h.y=b.y,h.clientY=b.clientY,h.pageY=b.pageY,h.screenY=b.screenY,h.yDirection=e.yDirection);var i=c.makeGestureEvent(a,h);e.downTarget.dispatchEvent(i)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(!b.tracking){var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,b.lastMoveEvent=b.downEvent,this.fireTrack("trackstart",a,b))}b.tracking&&(this.fireTrack("track",a,b),this.fireTrack("trackx",a,b),this.fireTrack("tracky",a,b)),b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d.delete(a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["down","move","up"],exposes:["hold","holdpulse","release"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},down:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},up:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},move:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,b){var d={bubbles:!0,cancelable:!0,pointerType:this.heldPointer.pointerType,pointerId:this.heldPointer.pointerId,x:this.heldPointer.clientX,y:this.heldPointer.clientY,_source:"hold"};b&&(d.holdTime=b);var e=c.makeGestureEvent(a,d);this.target.dispatchEvent(e)}};b.registerGesture("hold",d)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],exposes:["tap"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){return"mouse"===a.pointerType?1===b.buttons:!a.tapPrevented},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey,_source:"tap"});f.dispatchEvent(g)}}d.delete(b.pointerId)}};c.preventTap=function(a){return function(){a.tapPrevented=!0,d.delete(a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&"\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\ufeff".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b,c;for(a=C();;)if(v("["))c=G(),a=Z.createMemberExpression("[",a,c);else if(v("."))c=F(),a=Z.createMemberExpression(".",a,c);else{if(!v("("))break;b=D(),a=Z.createCallExpression(a,b)}return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=q[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),q[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){this.computed="["==c,this.dynamicDeps="function"==typeof a||a.dynamicDeps||this.computed&&!(b instanceof d),this.simplePath=!this.dynamicDeps&&(b instanceof e||b instanceof d)&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property=!this.computed||this.simplePath?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a,b){for(;a[t]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[t];return a}function o(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function p(){}var q=Object.create(null);d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length,a=n(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof f?this.object.fullPath.slice():[this.object.name];
+a.push(this.property instanceof e?this.property.name:this.property.value),this.fullPath_=Path.get(a)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.computed){var c=this.property;this.valueFn_=function(b,d,e){var f=a(b,d,e),g=c(b,d,e);return d&&d.addPath(f,[g]),f?f[g]:void 0}}else{var b=Path.get(this.property.name);this.valueFn_=function(c,d,e){var f=a(c,d,e);return d&&d.addPath(f,b),b.getValueFrom(f)}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=c[this.name],g=a;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find function or filter: "+this.name);if(d?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("Cannot find function or filter: "+this.name);for(var h=e||[],j=0;j<this.args.length;j++)h.push(i(this.args[j])(a,b,c));return f.apply(g,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d,e){return r[a](b(c,d,e))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);switch(b=i(b),c=i(c),a){case"||":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)||c(a,d,e)};case"&&":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)&&c(a,d,e)}}return function(d,e,f){return s[a](b(d,e,f),c(d,e,f))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),this.dynamicDeps=!0,function(d,e,f){return a(d,e,f)?b(d,e,f):c(d,e,f)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createCallExpression:function(a,b){if(!(a instanceof e))throw Error("Only identifier function invocations are allowed");var c=new g(a.name,b);return function(a,b,d){return c.transform(a,b,d,!1)}},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c,d){for(var e=[],f=0;f<a.length;f++)e.push(a[f](b,c,d));return e}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c,d){for(var e={},f=0;f<a.length;f++)e[a[f].key]=a[f].value(b,c,d);return e}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b,c),e=0;e<this.filters.length;e++)d=this.filters[e].transform(a,b,c,!1,[d]);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(a,void 0,c,!0,[b]);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){return u(c,a,b,d)}}}};var u="__proto__"in{}?function(a,b,c,d){var e={};return e[c]=b,e[d]=void 0,e[t]=a,e.__proto__=a,e}:function(a,b,c,d){var e=Object.create(a);return Object.defineProperty(e,c,{value:b,configurable:!0,writable:!0}),Object.defineProperty(e,d,{value:void 0,configurable:!0,writable:!0}),Object.defineProperty(e,t,{value:a,configurable:!0,writable:!0}),e};a.PolymerExpressions=p,p.getExpression=c}(this),Polymer={version:"0.4.1-d61654b"},"function"==typeof window.Polymer&&(Polymer={}),window.Platform||(logFlags=window.logFlags||{},Platform={flush:function(){}},CustomElements={useNative:!0,ready:!0,takeRecords:function(){},"instanceof":function(a,b){return a instanceof b}},HTMLImports={useNative:!0},addEventListener("HTMLImportsLoaded",function(){document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))}),ShadowDOMPolyfill=null,wrap=unwrap=function(a){return a}),function(a){function b(a,b){b=b||o,d(function(){f(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===q}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===q)&&(b.removeEventListener(r,e),d(a,b))};b.addEventListener(r,e)}}function e(a){a.target.__loaded=!0}function f(a,b){function c(){h==i&&a&&a()}function d(a){e(a),h++,c()}var f=b.querySelectorAll("link[rel=import]"),h=0,i=f.length;if(i)for(var j,k=0;i>k&&(j=f[k]);k++)g(j)?d.call(j,{target:j}):(j.addEventListener("load",d),j.addEventListener("error",d));else c()}function g(a){return l?a.__loaded||a.import&&"loading"!==a.import.readyState:a.__importParsed}function h(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)i(b)&&j(b)}function i(a){return"link"===a.localName&&"import"===a.rel}function j(a){var b=a.import;b?e({target:a}):(a.addEventListener("load",e),a.addEventListener("error",e))}var k="import"in document.createElement("link"),l=k;isIE=/Trident/.test(navigator.userAgent);var m=Boolean(window.ShadowDOMPolyfill),n=function(a){return m?ShadowDOMPolyfill.wrapIfNeeded(a):a},o=n(document),p={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return n(a)},configurable:!0};Object.defineProperty(document,"_currentScript",p),Object.defineProperty(o,"_currentScript",p);var q=isIE?"complete":"interactive",r="readystatechange";l&&(new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&h(b.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var a,b=document.querySelectorAll("link[rel=import]"),c=0,d=b.length;d>c&&(a=b[c]);c++)j(a)}()),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),o.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=l,a.isImportLoaded=g,a.whenReady=b,a.isIE=isIE,a.whenImportsReady=b}(window.HTMLImports),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){"use strict";function b(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function c(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if("undefined"!=typeof navigator&&navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function d(a){return+a===a>>>0&&""!==a}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:R(a)&&R(b)?!0:a!==a&&b!==b}function h(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function i(){}function j(a){function b(){if(!(m>=a.length)){var b=a[m+1];return"inSingleQuote"==n&&"'"==b||"inDoubleQuote"==n&&'"'==b?(m++,d=b,o.append(),!0):void 0}}for(var c,d,e,f,g,j,k,l=[],m=-1,n="beforePath",o={push:function(){void 0!==e&&(l.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};n;)if(m++,c=a[m],"\\"!=c||!b(n)){if(f=h(c),k=W[n],g=k[f]||k["else"]||"error","error"==g)return;if(n=g[0],j=o[g[1]]||i,d=void 0===g[2]?c:g[2],j(),"afterPath"===n)return l}}function k(a){return V.test(a)}function l(a,b){if(b!==X)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));Q&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function m(a){if(a instanceof l)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(d(a.length))return new l(a,X);a=String(a)}var b=Y[a];if(b)return b;var c=j(a);if(!c)return Z;var b=new l(c,X);return Y[a]=b,b}function n(a){return d(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function o(b){for(var c=0;_>c&&b.check_();)c++;return O&&(a.dirtyCheckCycleCount=c),c>0}function p(a){for(var b in a)return!1;return!0}function q(a){return p(a.added)&&p(a.removed)&&p(a.changed)}function r(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function s(){if(!ab.length)return!1;for(var a=0;a<ab.length;a++)ab[a]();return ab.length=0,!0}function t(){function a(a){b&&b.state_===fb&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),cb.push(this)}}}function u(a,b,c){var d=cb.pop()||t();return d.open(a),d.observe(b,c),d}function v(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==fb&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==fb&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),x.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,db.push(this)}}};return i}function w(a,b){return $&&$.object===b||($=db.pop()||v(),$.object=b),$.open(a,b),$}function x(){this.state_=eb,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=ib++}function y(a){x._allObserversCount++,kb&&jb.push(a)}function z(){x._allObserversCount--}function A(a){x.call(this),this.value_=a,this.oldObject_=void 0}function B(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");A.call(this,a)}function C(a,b){x.call(this),this.object_=a,this.path_=m(b),this.directObserver_=void 0}function D(a){x.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function E(a){return a}function F(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||E,this.setValueFn_=c||E,this.dontPassThroughSet_=d}function G(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];nb[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function H(a,b,c){return{index:a,removed:b,addedCount:c}}function I(){}function J(a,b,c,d,e,f){return sb.calcSplices(a,b,c,d,e,f)}function K(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function L(a,b,c,d){for(var e=H(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=K(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function M(a,b){for(var c=[],f=0;f<b.length;f++){var g=b[f];switch(g.type){case"splice":L(c,g.index,g.removed.slice(),g.addedCount);break;case"add":case"update":case"delete":if(!d(g.name))continue;var h=e(g.name);if(0>h)continue;L(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function N(a,b){var c=[];return M(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(J(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var O=a.testingExposeCycleCount,P=b(),Q=c(),R=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},S="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},T="[$_a-zA-Z]",U="[$_a-zA-Z0-9]",V=new RegExp("^"+T+"+"+U+"*$"),W={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},X={},Y={};l.get=m,l.prototype=S({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=k(c)?b?"."+c:c:n(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!f(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=k(c)?"."+c:n(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=k(c)?"."+c:n(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!f(a))return!1;a=a[this[c]]}return f(a)?(a[this[c]]=b,!0):!1}});var Z=new l("",X);Z.valid=!1,Z.getValueFrom=Z.setValueFrom=function(){};var $,_=1e3,ab=[],bb=P?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){s(),b=!1}),function(c){ab.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){ab.push(a)}}(),cb=[],db=[],eb=0,fb=1,gb=2,hb=3,ib=1;x.prototype={open:function(a,b){if(this.state_!=eb)throw Error("Observer has already been opened.");return y(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=fb,this.value_},close:function(){this.state_==fb&&(z(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=gb)},deliver:function(){this.state_==fb&&o(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){x._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var jb,kb=!P;x._allObserversCount=0,kb&&(jb=[]);var lb=!1;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!lb&&kb){lb=!0;var b,c,d=0;do{d++,c=jb,jb=[],b=!1;for(var e=0;e<c.length;e++){var f=c[e];f.state_==fb&&(f.check_()&&(b=!0),jb.push(f))}s()&&(b=!0)}while(_>d&&b);O&&(a.dirtyCheckCycleCount=d),lb=!1}},kb&&(a.Platform.clearObservers=function(){jb=[]}),A.prototype=S({__proto__:x.prototype,arrayObserve:!1,connect_:function(){P?this.directObserver_=u(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(P){if(!a)return!1;c={},b=G(this.value_,a,c)}else c=this.oldObject_,b=r(this.value_,this.oldObject_);return q(b)?!1:(P||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){P?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==fb&&(P?this.directObserver_.deliver(!1):o(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),B.prototype=S({__proto__:A.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(P){if(!a)return!1;b=N(this.value_,a)}else b=J(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(P||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),B.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},C.prototype=S({__proto__:x.prototype,get path(){return this.path_},connect_:function(){P&&(this.directObserver_=w(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||g(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var mb={};D.prototype=S({__proto__:x.prototype,connect_:function(){if(P){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==mb){b=!0;break}b&&(this.directObserver_=w(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===mb&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=eb&&this.state_!=hb)throw Error("Cannot add paths once started.");var b=m(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=eb&&this.state_!=hb)throw Error("Cannot add observers once started.");if(this.observed_.push(mb,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=fb)throw Error("Can only reset while open");this.state_=hb,this.disconnect_()},finishReset:function(){if(this.state_!=hb)throw Error("Can only finishReset after startReset");return this.state_=fb,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==mb&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],h=this.observed_[d+1];if(f===mb){var i=h;e=this.state_===eb?i.open(this.deliver,this):i.discardChanges()}else e=h.getValueFrom(f);b?this.value_[d/2]=e:g(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),F.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!g(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var nb={add:!0,update:!0,"delete":!0},ob=0,pb=1,qb=2,rb=3;I.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(ob):(e.push(pb),d=g),b--,c--):f==h?(e.push(rb),b--,d=h):(e.push(qb),c--,d=i)}else e.push(rb),b--;else e.push(qb),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=H(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[H(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case ob:j&&(l.push(j),j=void 0),m++,n++;break;case pb:j||(j=H(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case qb:j||(j=H(m,[],0)),j.addedCount++,m++;break;case rb:j||(j=H(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var sb=new I;a.Observer=x,a.Observer.runEOM_=bb,a.Observer.observerSentinel_=mb,a.Observer.hasObjectObserve=P,a.ArrayObserver=B,a.ArrayObserver.calculateSplices=function(a,b){return sb.calculateSplices(a,b)},a.ArraySplice=I,a.ObjectObserver=A,a.PathObserver=C,a.CompoundObserver=D,a.Path=l,a.ObserverTransform=F}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);var d=b,e=m(this,"value",d);return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;
+var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue()))},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_,e=!0;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),e=c.ifValue,c.ifOneTime&&!e)return void this.valueChanged();c.ifOneTime||(e=e.open(this.updateIfValue,this))}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b));var f=c.value;return c.oneTime||(f=f.open(this.updateIteratedValue,this)),e?void this.updateValue(f):void this.valueChanged()},getUpdatedValue:function(){var a=this.deps.value;return this.deps.oneTime||(a=a.discardChanges()),a},updateIfValue:function(a){return a?void this.updateValue(this.getUpdatedValue()):void this.valueChanged()},updateIteratedValue:function(a){if(this.deps.hasIf){var b=this.deps.ifValue;if(this.deps.ifOneTime||(b=b.discardChanges()),!b)return void this.valueChanged()}this.updateValue(a)},updateValue:function(a){this.deps.repeat||(a=[a]);var b=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(a);this.valueChanged(a,b)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d.delete(j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b}(Platform),function(a){function b(){e||(e=!0,a.endOfMicrotask(function(){e=!1,logFlags.data&&console.group("Platform.flush()"),a.performMicrotaskCheckpoint(),logFlags.data&&console.groupEnd()}))}var c=document.createElement("style");c.textContent="template {display: none !important;} /* injected by platform.js */";var d=document.querySelector("head");d.insertBefore(c,d.firstChild);var e;if(Observer.hasObjectObserve)b=function(){};else{var f=125;window.addEventListener("WebComponentsReady",function(){b(),a.flushPoll=setInterval(b,f)})}if(window.CustomElements&&!CustomElements.useNative){var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=g.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b}(window.Platform),function(a){function b(a,b,d,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=c(b,h,d),e+"'"+h+"'"+g})}function c(a,b,c){if(b&&"/"===b[0])return b;var e=new URL(b,a);return c?e.href:d(e.href)}function d(a){var b=new URL(document.baseURI),c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b,c):a}function e(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");return f.join("/")+b.search+b.hash}var f={resolveDom:function(a,b){b=b||a.ownerDocument.baseURI,this.resolveAttributes(a,b),this.resolveStyles(a,b);var c=a.querySelectorAll("template");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)d.content&&this.resolveDom(d.content,b)},resolveTemplate:function(a){this.resolveDom(a.content,a.ownerDocument.baseURI)},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,b){b=b||a.ownerDocument.baseURI,a.textContent=this.resolveCssText(a.textContent,b)},resolveCssText:function(a,c,d){return a=b(a,c,d,g),b(a,c,d,h)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(j);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,d){d=d||a.ownerDocument.baseURI,i.forEach(function(e){var f,h=a.attributes[e],i=h&&h.value;i&&i.search(k)<0&&(f="style"===e?b(i,d,!1,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style","url"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(Polymer),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=Platform.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(Polymer),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(Polymer),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}function c(a){for(var b=a||{},c=1;c<arguments.length;c++){var e=arguments[c];try{for(var f in e)d(f,e,b)}catch(g){}}return b}function d(a,b,c){var d=e(b,a);Object.defineProperty(c,a,d)}function e(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||e(Object.getPrototypeOf(a),b)}}a.extend=b,a.mixin=c,Platform.mixin=c}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(a){function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c={};HTMLElement.register=function(a,b){c[a]=b},HTMLElement.getPrototypeForTag=function(a){var b=a?c[a]:HTMLElement.prototype;return b||Object.getPrototypeOf(document.createElement(a))};var d=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,d.apply(this,arguments)};var e=DOMTokenList.prototype.add,f=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)e.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)f.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype.switch=function(a,b){a&&this.remove(a),b&&this.add(b)};var g=function(){return Array.prototype.slice.call(this)},h=window.NamedNodeMap||window.MozNamedAttrMap||{};NodeList.prototype.array=g,h.prototype.array=g,HTMLCollection.prototype.array=g,a.createDOM=b}(Polymer),function(a){function b(a){var e=b.caller,g=e.nom,h=e._super;h||(g||(g=e.nom=c.call(this,e)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(e,g,f(this)));var i=h[g];return i?(i._super||d(i,g,h),i.apply(this,a||[])):void 0}function c(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function d(a,b,c){var d=e(c,b,a);return d[b]&&(d[b].nom=b),a._super=d}function e(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}return Object}function f(a){return a.__proto__}a.super=b}(Polymer),function(a){function b(a){return a}function c(a,b){var c=typeof b;return b instanceof Date&&(c="date"),d[c](a,b)}var d={string:b,undefined:b,date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=c}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Platform.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=null===b||void 0===b?{}:b,g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)},injectBoundHTML:function(a,b){var c=document.createElement("template");c.innerHTML=a;var d=this.instanceTemplate(c);return b&&(b.textContent="",b.appendChild(d)),d}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.logFlags||{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];PolymerGestures.addEventListener(this,c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Platform.flush()}}};a.api.instance.events=d,a.addEventListener=function(a,b,c,d){PolymerGestures.addEventListener(wrap(a),b,c,d)},a.removeEventListener=function(a,b,c,d){PolymerGestures.removeEventListener(wrap(a),b,c,d)}}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b){return a===b?0!==a||1/a===1/b:f(a)&&f(b)?!0:a!==a&&b!==b}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={object:void 0,type:"update",name:void 0,oldValue:void 0},f=Number.isNaN||function(a){return"number"==typeof a&&isNaN(a)},g={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObserver(b);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},propertyChanged_:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a){this.invokeMethod(e,[a])},this),this.registerNamedObserver(a+"__array",f)}},emitPropertyChangeRecord:function(a,c,d){if(!b(c,d)&&(this.propertyChanged_(a,c,d),Observer.hasObjectObserve)){var f=this.notifier_;f||(f=this.notifier_=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},bindToAccessor:function(a,c,d){function e(b,c){j[f]=b;var d=j[h];d&&"function"==typeof d.setValue&&d.setValue(b),j.emitPropertyChangeRecord(a,b,c)}var f=a+"_",g=a+"Observable_",h=a+"ComputedBoundObservable_";this[g]=c;var i=this[f],j=this,k=c.open(e);if(d&&!b(i,k)){var l=d(i,k);b(k,l)||(k=l,c.setValue&&c.setValue(k))}e(k,i);var m={close:function(){c.close(),j[g]=void 0,j[h]=void 0}};return this.registerObserver(m),m},createComputedProperties:function(){if(this._computedNames)for(var a=0;a<this._computedNames.length;a++){var b=this._computedNames[a],c=this.computed[b];try{var d=PolymerExpressions.getExpression(c),e=d.getBinding(this,this.element.syntax);this.bindToAccessor(b,e)}catch(f){console.error("Failed to create computed property",f)}}},bindProperty:function(a,b,d){if(d)return void(this[a]=b);var e=this.element.prototype.computed;if(e&&e[a]){var f=a+"ComputedBoundObservable_";return void(this[f]=b)}return this.bindToAccessor(a,b,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObserver:function(a){return this._observers?void this._observers.push(a):void(this._observers=[a])},closeObservers:function(){if(this._observers){for(var a=this._observers,b=0;b<a.length;b++){var c=a[b];c&&"function"==typeof c.close&&c.close()}this._observers=[]}},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a in this._namedObservers)this.closeNamedObserver(a);this._namedObservers={}}}};a.api.instance.properties=g}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){HTMLTemplateElement.decorate(a);for(var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b),d=c.bindings_,e=0;e<d.length;e++)this.registerObserver(d[e]);return c},bind:function(a,b,c){var d=this.propertyForAttribute(a);if(d){var e=this.bindProperty(d,b,c);return Platform.enableBindingsReflection&&e&&(e.path=b.path_,this._recordBinding(d,e)),this.reflect[d]&&this.reflectPropertyToAttribute(d),e}return this.mixinSuper(arguments)},bindFinished:function(){this.makeElementReady()},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},asyncUnbindAll:function(){this._unbound||(b.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){this._unbound||(this.closeObservers(),this.closeNamedObservers(),this._unbound=!0)},cancelUnbindAll:function(){return this._unbound?void(b.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(b.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},d=/\{\{([^{}]*)}}/;a.bindPattern=d,a.api.instance.mdv=c}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d={PolymerBase:!0,job:function(a,b,c){if("string"!=typeof a)return Polymer.job.call(this,a,b,c);var d="___"+a;this[d]=Polymer.job.call(this,this[d],b,c)},"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.templateInstance&&this.templateInstance.model&&console.warn("Attributes on "+this.localName+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."),this.created(),this.prepareElement(),this.ownerDocument.isStagingDocument||this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.createComputedProperties(),this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.enteredView&&this.enteredView(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},enteredViewCallback:function(){this.attachedCallback()},leftViewCallback:function(){this.detachedCallback()},enteredDocumentCallback:function(){this.attachedCallback()},leftDocumentCallback:function(){this.detachedCallback()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=Platform.ShadowCSS.makeScopeSelector(c,d);return Platform.ShadowCSS.shimCssText(a,e)}var d=(window.logFlags||{},window.ShadowDOMPolyfill),e="element",f="controller",g={STYLE_SCOPE_ATTRIBUTE:e,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(f),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,e){if(b=b||this.findStyleScope(),e=e||"",b){d&&(a=c(a,b.host));var g=this.element.cssTextToScopeStyle(a,f);Polymer.applyStyleToScope(g,b),this.styleCacheForScope(b)[this.localName+e]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){var c=this.styleCacheForScope(a);
+return c[b]},styleCacheForScope:function(a){if(d){var b=a.host?a.host.localName:a.localName;return h[b]||(h[b]={})}return a._scopeStyles=a._scopeStyles||{}}},h={};a.api.instance.styles=g}(Polymer),function(a){function b(a,b){if("string"!=typeof a){var c=b||document._currentScript;if(b=a,a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){i[a]=b}function d(a){i[a]&&(i[a].registerWhenReady(),delete i[a])}function e(a,b){return j[a]=b||{}}function f(a){return j[a]}function g(a,b){if("string"!=typeof b)return!1;var c=HTMLElement.getPrototypeForTag(b),d=c&&c.constructor;return d?CustomElements.instanceof?CustomElements.instanceof(a,d):a instanceof d:!1}var h=a.extend,i=(a.api,{}),j={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,a.instanceOfType=g,window.Polymer=b,h(Polymer,a),Platform.consumeDeclarations&&Platform.consumeDeclarations(function(a){if(a)for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.apply(null,c)})}(Polymer),function(a){var b={resolveElementPaths:function(a){Polymer.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){b===document&&(b=document.head),i&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",j=document.head.querySelectorAll(g);j.length&&(f=j[j.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return q?q.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i=window.ShadowDOMPolyfill,j="style",k="@import",l="link[rel=stylesheet]",m="global",n="polymer-scope",o={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Polymer.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(l),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(j),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(k)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(l),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(j+"["+n+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(n)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(m);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+n+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},p=HTMLElement.prototype,q=p.matches||p.matchesSelector||p.webkitMatchesSelector||p.mozMatchesSelector;a.api.declaration.styles=o,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.logFlags||{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return PolymerGestures.addEventListener(d,c,h),f?void 0:{open:g,discardChanges:g,close:function(){PolymerGestures.removeEventListener(d,c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(c||(c=a.observe={}),b=d.slice(0,-7),c[b]=c[b]||d)},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}if(a.computed){var b=a._computedNames=[];for(var c in a.computed)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c];d&&void 0!==d.reflect&&(b.reflect[c]=Boolean(d.reflect),d=d.value),void 0!==d&&(b[c]=d)}},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a,b){var c=this.prototype,d=a+"_",e=a+"Observable_";c[d]=c[a],Object.defineProperty(c,a,{get:function(){var a=this[e];return a&&a.deliver(),this[d]},set:function(c){if(b)return this[d];var f=this[e];if(f)return void f.setValue(c);var g=this[d];return this[d]=c,this.emitPropertyChangeRecord(a,c,g),c},configurable:!0})},createPropertyAccessors:function(a){var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c,!0);var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)a.computed&&a.computed[c]||this.createPropertyAccessor(c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a){var d=this.getAttribute(b);if(d)for(var e,f=a.publish||(a.publish={}),g=d.split(c),h=0,i=g.length;i>h;h++)e=g[h].trim(),e&&void 0===f[e]&&(f[e]=void 0)},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&a.content},installBindingDelegate:function(a){a&&(a.bindingDelegate=this.syntax)}};a.api.declaration.mdv=e}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f=window.ShadowDOMPolyfill,g={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),f&&Platform.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),h[a]=b}return b},findBasePrototype:function(a){return h[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c.extends=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element.extends):void 0}},h={};g.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=g}(Polymer),function(a){function b(a){return document.contains(a)?j:i}function c(){return i.length?i[0]:j[0]}function d(a){f.waitToReady=!0,Platform.endOfMicrotask(function(){HTMLImports.whenImportsReady(function(){f.addReadyCallback(a),f.waitToReady=!1,f.check()})})}function e(a){if(void 0===a)return void f.ready();var b=setTimeout(function(){f.ready()},a);Polymer.whenReady(function(){clearTimeout(b)})}var f={wait:function(a){a.__queue||(a.__queue={},g.push(a))},enqueue:function(a,c,d){var e=a.__queue&&!a.__queue.check;return e&&(b(a).push(a),a.__queue.check=c,a.__queue.go=d),0!==this.indexOf(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?i.length:1e9),c},go:function(a){var b=this.remove(a);b&&(a.__queue.flushable=!0,this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__queue.check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){for(var a,b=0,c=g.length;c>b&&(a=g[b]);b++)if(a.__queue&&!a.__queue.flushable)return;return!0},addToFlushQueue:function(a){h.push(a)},flush:function(){if(!this.flushing){this.flushing=!0;for(var a;h.length;)a=h.shift(),a.__queue.go.call(a),a.__queue=null;this.flushing=!1}},ready:function(){var a=CustomElements.ready;CustomElements.ready=!1,this.flush(),CustomElements.useNative||CustomElements.upgradeDocumentTree(document),CustomElements.ready=a,Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&k.push(a)},flushReadyCallbacks:function(){if(k)for(var a;k.length;)(a=k.shift())()},waitingFor:function(){for(var a,b=[],c=0,d=g.length;d>c&&(a=g[c]);c++)a.__queue&&!a.__queue.flushable&&b.push(a);return b},waitToReady:!0},g=[],h=[],i=[],j=[],k=[];a.elements=g,a.waitingFor=f.waitingFor.bind(f),a.forceReady=e,a.queue=f,a.whenReady=a.whenPolymerReady=d}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this.extends=this.getAttribute("extends"),f.wait(this),this.loadResources(),this.registerWhenReady()},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this.extends)&&!b(this.extends)&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this.extends),this.register(this.name,this.extends),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){this.hasAttribute("noscript")&&!this.noscript&&(this.noscript=!0,Polymer(a))},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.enqueue(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenPolymerReady;a.import=c,a.importElements=b}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
 //# sourceMappingURL=polymer.js.map
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js.map b/pkg/polymer/lib/src/js/polymer/polymer.js.map
index 0fc102e..8bb7fb3 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js.map
@@ -1 +1 @@
-{"version":3,"file":"polymer.js","sources":["polymer.concat.js"],"names":["window","PolymerGestures","scope","HAS_FULL_PATH","pathTest","document","createElement","createShadowRoot","sr","s","appendChild","addEventListener","ev","path","stopPropagation","CustomEvent","bubbles","head","dispatchEvent","parentNode","removeChild","target","shadow","inEl","shadowRoot","webkitShadowRoot","canTarget","Boolean","elementFromPoint","targetingShadow","this","olderShadow","os","olderShadowRoot","se","querySelector","allShadows","element","shadows","push","searchRoot","inRoot","x","y","t","owner","nodeType","Node","DOCUMENT_NODE","DOCUMENT_FRAGMENT_NODE","findTarget","inEvent","clientX","clientY","findTouchAction","n","i","length","ELEMENT_NODE","hasAttribute","getAttribute","host","LCA","a","b","contains","adepth","depth","bdepth","d","walk","u","deepContains","common","insideNode","node","rect","getBoundingClientRect","left","right","top","bottom","targetFinding","bind","shadowSelector","v","selector","rule","attrib2css","selectors","styles","hasTouchAction","style","touchAction","hasShadowRoot","ShadowDOMPolyfill","forEach","r","String","map","el","textContent","MOUSE_PROPS","MOUSE_DEFAULTS","NOP_FACTORY","eventFactory","preventTap","makeBaseEvent","inType","inDict","e","createEvent","initEvent","cancelable","makeGestureEvent","Object","create","k","keys","makePointerEvent","p","buttons","pressure","pointerId","width","height","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","_source","PointerMap","USE_MAP","m","Map","pointers","POINTERS_FN","values","prototype","size","set","inId","indexOf","has","delete","splice","get","clear","callback","thisArg","call","currentGestures","CLONE_PROPS","CLONE_DEFAULTS","HAS_SVG_INSTANCE","SVGElementInstance","dispatcher","pointermap","requiredGestures","eventMap","eventSources","eventSourceList","gestures","dependencyMap","down","listeners","index","up","gestureQueue","registerSource","name","source","newEvents","events","registerGesture","obj","g","exposes","toLowerCase","register","initial","es","l","unregister","fireEvent","move","type","fillGestureQueue","cancel","tapPrevented","eventHandler","_handledByPG","gesturesWanted","currentTarget","_pgEvents","ri","gk","fn","listen","addEvent","unlisten","removeEvent","eventName","boundHandler","removeEventListener","makeEvent","preventDefault","_target","cloneEvent","eventCopy","correspondingUseElement","clone","gestureTrigger","rg","_requiredGestures","j","requestAnimationFrame","boundGestureTrigger","activateGesture","gesture","dep","recognizer","_pgListeners","actionNode","defaultActions","setAttribute","handler","capture","deactivateGesture","DEDUP_DIST","WHICH_TO_BUTTONS","HAS_BUTTONS","MouseEvent","mouseEvents","POINTER_ID","POINTER_TYPE","lastTouches","isEventSimulatedFromTouch","lts","dx","Math","abs","dy","prepareEvent","which","mousedown","mouseup","mousemove","cleanupMouse","relatedTarget","DEDUP_TIMEOUT","Array","CLICK_COUNT_TIMEOUT","HYSTERESIS","HAS_TOUCH_ACTION","touchEvents","scrollTypes","EMITTER","XSCROLLER","YSCROLLER","touchActionToScrollType","st","firstTouch","isPrimaryTouch","inTouch","identifier","setPrimaryTouch","firstXY","X","Y","scrolling","cancelResetClickCount","removePrimaryPointer","inPointer","resetClickCount","clickCount","resetId","setTimeout","clearTimeout","typeToButtons","ret","touch","id","currentTouchEvent","fastPath","touchToPointer","cte","detail","webkitRadiusX","radiusX","webkitRadiusY","radiusY","webkitForce","force","self","processTouches","inFunction","tl","changedTouches","_cancel","cleanUpPointer","shouldScroll","scrollAxis","oa","da","doa","findTouch","inTL","vacuumTouches","touches","value","key","touchstart","dedupSynthMouse","touchmove","dd","sqrt","touchcancel","touchend","lt","HAS_BITMAP_TYPE","MSPointerEvent","MSPOINTER_TYPE_MOUSE","msEvents","POINTER_TYPES","cleanup","MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel","pointerEvents","pointerdown","pointermove","pointerup","pointercancel","nav","navigator","PointerEvent","msPointerEnabled","undefined","ontouchstart","isSafari","userAgent","match","body","track","trackx","tracky","WIGGLE_THRESHOLD","clampDir","inDelta","calcPositionDelta","inA","inB","pageX","pageY","fireTrack","inTrackingData","downEvent","lastMoveEvent","xDirection","yDirection","gestureProto","trackInfo","ddx","screenX","ddy","screenY","downTarget","tracking","hold","HOLD_DELAY","heldPointer","holdJob","pulse","Date","now","timeStamp","held","fireHold","clearInterval","setInterval","inHoldTime","holdTime","tap","shouldTap","downState","start","altKey","ctrlKey","metaKey","shiftKey","global","assert","condition","message","Error","isDecimalDigit","ch","isWhiteSpace","fromCharCode","isLineTerminator","isIdentifierStart","isIdentifierPart","isKeyword","skipWhitespace","charCodeAt","getIdentifier","slice","scanIdentifier","Token","Identifier","Keyword","NullLiteral","BooleanLiteral","range","scanPunctuator","code2","ch2","code","ch1","Punctuator","throwError","Messages","UnexpectedToken","scanNumericLiteral","number","NumericLiteral","parseFloat","scanStringLiteral","quote","str","octal","StringLiteral","isIdentifierName","token","advance","EOF","lex","lookahead","peek","pos","messageFormat","error","args","arguments","msg","replace","whole","description","throwUnexpected","expect","matchKeyword","keyword","parseArrayInitialiser","elements","parseExpression","delegate","createArrayExpression","parseObjectPropertyKey","createLiteral","createIdentifier","parseObjectProperty","createProperty","parseObjectInitialiser","properties","createObjectExpression","parseGroupExpression","expr","parsePrimaryExpression","createThisExpression","parseArguments","parseNonComputedProperty","parseNonComputedMember","parseComputedMember","parseLeftHandSideExpression","property","createMemberExpression","createCallExpression","parseUnaryExpression","parsePostfixExpression","createUnaryExpression","binaryPrecedence","prec","parseBinaryExpression","stack","operator","pop","createBinaryExpression","parseConditionalExpression","consequent","alternate","createConditionalExpression","parseFilter","createFilter","parseFilters","parseTopLevel","Syntax","parseInExpression","parseAsExpression","createTopLevel","createAsExpression","indexName","createInExpression","parse","inDelegate","state","labelSet","TokenName","ArrayExpression","BinaryExpression","CallExpression","ConditionalExpression","EmptyStatement","ExpressionStatement","Literal","LabeledStatement","LogicalExpression","MemberExpression","ObjectExpression","Program","Property","ThisExpression","UnaryExpression","UnknownLabel","Redeclaration","esprima","prepareBinding","expressionText","filterRegistry","expression","getExpression","scopeIdent","tagName","ex","console","model","oneTime","binding","getBinding","polymerExpressionScopeIdent_","indexIdent","polymerExpressionIndexIdent_","expressionParseCache","ASTDelegate","Expression","valueFn_","IdentPath","Path","object","accessor","computed","dynamicDeps","simplePath","getFn","Filter","notImplemented","arg","valueFn","filters","deps","currentPath","ConstantObservable","value_","convertStylePropertyName","c","findScope","prop","parentScopeName","hasOwnProperty","isLiteralExpression","pathString","isNaN","Number","PolymerExpressions","observer","addPath","getValueFrom","setValue","newValue","setValueFrom",{"end":{"file":"polymer.concat.js","comments_before":[],"nlb":false,"endpos":92826,"pos":92818,"col":8,"line":3185,"value":"fullPath","type":"name"},"start":{"file":"polymer.concat.js","comments_before":[],"nlb":false,"endpos":92826,"pos":92818,"col":8,"line":3185,"value":"fullPath","type":"name"},"name":"fullPath"},"fullPath","fullPath_","parts","context","propName","transform","toModelDirection","initialArgs","toModel","toDOM","apply","unaryOperators","+","-","!","binaryOperators","*","/","%","<",">","<=",">=","==","!=","===","!==","&&","||","op","argument","test","ident","filter","arr","kind","open","discardChanges","deliver","close","firstTime","firstValue","startReset","getValue","finishReset","setValueFn","CompoundObserver","ObserverTransform","count","random","toString","styleObject","join","tokenList","tokens","prepareInstancePositionChanged","template","templateInstance","valid","PathObserver","prepareInstanceModel","scopeName","parentScope","createScopeObject","__proto__","defineProperty","configurable","writable","Polymer","version","Platform","logFlags","flush","CustomElements","useNative","ready","takeRecords","instanceof","base","HTMLImports","wrap","unwrap","whenImportsReady","doc","mainDoc","whenDocumentReady","watchImportsLoad","isDocumentReady","readyState","requiredReadyState","checkReady","READY_EVENT","markTargetLoaded","event","__loaded","checkDone","loaded","loadedImport","imports","querySelectorAll","imp","isImportLoaded","link","__importParsed","handleImports","nodes","isImport","handleImport","localName","rel","import","hasNative","isIE","hasShadowDOMPolyfill","wrapIfNeeded","currentScriptDescriptor","script","currentScript","scripts","MutationObserver","mxns","addedNodes","observe","childList","readyTime","getTime","whenReady","withDependencies","task","depends","marshal","module","dependsOrFactory","moduleFactory","modules","using","modularize","insertBefore","firstChild","detectObjectObserve","recs","records","deliverChangeRecords","unobserve","detectEval","chrome","app","runtime","getDeviceStorage","f","Function","isIndex","toNumber","isObject","areSameValue","numberIsNaN","getPathCharType","char","noop","parsePath","maybeUnescapeQuote","nextChar","mode","newChar","actions","append","transition","action","typeMap","pathStateMachine","isIdent","identRegExp","privateToken","constructorIsPrivate","hasEval","compiledGetValueFromFn","getPath","pathCache","invalidPath","formatAccessor","dirtyCheck","cycles","MAX_DIRTY_CHECK_CYCLES","check_","testingExposeCycleCount","dirtyCheckCycleCount","objectIsEmpty","diffIsEmpty","diff","added","removed","changed","diffObjectFromOldObject","oldObject","isArray","runEOMTasks","eomTasks","newObservedObject","state_","OPENED","discardRecords","first","obs","arrayObserve","discard","observedObjectCache","getObservedObject","dir","newObservedSet","rootObj","rootObjProps","objects","getPrototypeOf","allRootObjNonObservedProps","rec","observers","iterateObjects_","observerCount","record","Observer","unobservedCount","observedSetCache","getObservedSet","lastObservedSet","UNOPENED","callback_","target_","directObserver_","id_","nextObserverId","addToAll","_allObserversCount","collectObservers","allObservers","removeFromAll","ObjectObserver","oldObject_","ArrayObserver","array","object_","path_","reportChangesOnOpen","reportChangesOnOpen_","observed_","identFn","observable","getValueFn","dontPassThroughSet","observable_","getValueFn_","setValueFn_","dontPassThroughSet_","diffObjectFromChangeRecords","changeRecords","oldValues","expectedRecordTypes","oldValue","newSplice","addedCount","ArraySplice","calcSplices","current","currentStart","currentEnd","old","oldStart","oldEnd","arraySplice","intersect","start1","end1","start2","end2","mergeSplice","splices","inserted","insertionOffset","intersectCount","deleteCount","prepend","offset","createInitialSplices","JSON","stringify","projectArraySplices","concat","hasObserve","createObject","proto","newObject","getOwnPropertyNames","getOwnPropertyDescriptor","identStart","identPart","RegExp","beforePath","ws","[","eof","inPath",".","beforeIdent","inIdent","0","beforeElement","'","\"","afterZero","]","inIndex","inSingleQuote","else","inDoubleQuote","afterElement","iterateObjects","runEOM","eomObj","pingPong","eomRunScheduled","CLOSED","RESETTING","connect_","disconnect_","report_","changes","_errorThrownDuringCallback","runningMicrotaskCheckpoint","hasDebugForceFullDelivery","eval","performMicrotaskCheckpoint","anyChanged","toCheck","clearObservers","copyObject","copy","applySplices","previous","spliceArgs","addIndex","skipChanges","observerSentinel","needsDirectObserver","addObserver","observedCallback_","add","update","EDIT_LEAVE","EDIT_UPDATE","EDIT_ADD","EDIT_DELETE","calcEditDistances","rowCount","columnCount","distances","equals","north","west","spliceOperationsFromEditDistances","edits","min","northWest","reverse","prefixCount","suffixCount","minLength","sharedPrefix","sharedSuffix","ops","oldIndex","searchLength","index1","index2","calculateSplices","currentValue","previousValue","runEOM_","observerSentinel_","hasObjectObserve","getTreeScope","getElementById","updateBindings","bindings","bindings_","returnBinding","sanitizeValue","updateText","data","textBinding","updateAttribute","conditional","removeAttribute","attributeBinding","getEventForInputType","checkboxEventType","updateInput","input","santizeFn","inputBinding","bindInputEvent","postEventFn","eventType","booleanSanitize","getAssociatedRadioButtons","form","treeScope","radios","checkedPostEvent","radio","checkedBinding","checked","updateOption","option","select","selectBinding","HTMLSelectElement","optionBinding","bindFinished","maybeUpdateBindings","enable","Text","Element","div","checkbox","initMouseEvent","HTMLInputElement","HTMLElement","sanitizeFn","HTMLTextAreaElement","HTMLOptionElement","getFragmentRoot","searchRefId","ref","protoContent_","templateCreator_","isSVGTemplate","namespaceURI","isHTMLTemplate","isAttributeTemplate","semanticTemplateElements","isTemplate","isTemplate_","forAllTemplatesFrom","subTemplates","allTemplatesSelectors","bootstrapTemplatesRecursivelyFrom","bootstrap","HTMLTemplateElement","decorate","content","mixin","to","from","getOrCreateTemplateContentsOwner","ownerDocument","defaultView","templateContentsOwner_","implementation","createHTMLDocument","lastChild","getTemplateStagingDocument","stagingDocument_","isStagingDocument","href","baseURI","extractTemplateFromAttributeTemplate","attribs","attributes","attrib","templateAttributeDirectives","extractTemplateFromSVGTemplate","liftNonNativeTemplateChildrenIntoContent","useRoot","child","fixTemplateElementPrototype","hasProto","ensureSetModelScheduled","setModelFn_","setModelFnScheduled_","getBindings","delegate_","processBindings","model_","parseMustaches","prepareBindingFn","startIndex","lastIndex","endIndex","onlyOneTime","oneTimeStart","terminator","trim","delegateFn","hasOnePath","isSimplePath","combinator","processOneTimeBinding","processSinglePathBinding","processBinding","instanceBindings","iter","processBindingDirectives_","parseWithDefault","parseAttributeBindings","attr","substring","IF","BIND","REPEAT","if","repeat","TEXT_NODE","cloneAndBindInstance","parent","stagingDocument","importNode","nextSibling","children","setDelegate_","createInstanceBindingMap","getContentUid","contentUidCounter","getInstanceBindingMap","contentId","bindingMaps","bindingMap_","TemplateIterator","templateElement","closed","templateElement_","instances","iteratedValue","presentValue","arrayObserver","opt_this","Document","documentElement","THEAD","TBODY","TFOOT","TH","TR","TD","COLGROUP","COL","CAPTION","OPTION","OPTGROUP","hasTemplateElement","html","TypeError","templateObserver","refChanged_","opt_instanceRef","templateIsDecorated_","isNativeHTMLTemplate","bootstrapContents","liftContents","liftRoot","content_","createDocumentFragment","instanceRef_","htmlElement","HTMLUnknownElement","contentDescriptor","enumerable","directives","iterator_","closeDeps","updateDependencies","attributeFilter","createInstance","bindingDelegate","newDelegate_","refContent_","ref_","emptyInstance","instance","terminator_","instanceRecord","templateInstance_","firstNode","lastNode","collectTerminator","raw","valueChanged","updateIteratedValue","getUpdatedValue","instancePositionChangedFn_","instanceModelFn_","nextRef","ifOneTime","ifValue","hasIf","updateIfValue","updateValue","observeValue","handleSplices","getLastInstanceNode","subtemplateIterator","getLastTemplateNode","insertInstanceAt","fragment","previousInstanceLast","extractInstanceAt","getDelegateFn","instanceCache","removeDelta","closeInstanceBindings","reportInstancesMoved","reportInstanceMoved","forAllTemplatesFrom_","endOfMicrotask","twiddle","iterations","callbacks","atEndOfMicrotask","shift","createTextNode","JsMutationObserver","characterData","flushing","group","groupEnd","FLUSH_POLL_INTERVAL","flushPoll","originalImportNode","deep","imported","upgradeAll","replaceUrlsInCssText","cssText","baseUrl","keepAbsolute","regexp","pre","url","post","urlPath","resolveRelativeUrl","URL","makeDocumentRelPath","root","port","protocol","makeRelPath","sourceUrl","targetUrl","pathname","split","unshift","search","hash","urlResolver","resolveDom","resolveAttributes","resolveStyles","templates","resolveTemplate","resolveStyle","resolveCssText","CSS_URL_REGEXP","CSS_IMPORT_REGEXP","hasAttributes","resolveElementAttributes","URL_ATTRS_SELECTOR","URL_ATTRS","replacement","URL_TEMPLATE_SEARCH","Loader","regex","cache","requests","extractUrls","text","matched","matches","exec","process","done","fetch","inflight","req","xhr","wait","handleXhr","request","response","responseText","resolve","XMLHttpRequest","send","onerror","onload","pending","StyleResolver","loader","flatten","resolveNode","intermediate","loadStyles","loadedStyle","styleResolver","extend","api","pd","nom","inObj","copyProperty","inName","inSource","inTarget","getPropertyDescriptor","inObject","job","stop","Job","go","inContext","boundComplete","complete","h","handle","cancelAnimationFrame","createDOM","inTagOrNode","inHTML","inAttrs","dom","cloneNode","innerHTML","registry","tag","getPrototypeForTag","originalStopPropagation","Event","cancelBubble","DOMTokenList","remove","toggle","bool","switch","oldName","newName","ArraySlice","namedNodeMap","NamedNodeMap","MozNamedAttrMap","NodeList","HTMLCollection","$super","arrayOfArgs","caller","_super","nameInThis","warn","memoizeSuper","n$","method","nextSuper","super","noopHandler","deserializeValue","inferredType","typeHandlers","string","date","boolean","parseInt","function","declaration","publish","apis","utils","async","timeout","cancelAsync","fire","onNode","asyncFire","classFollows","anew","className","classList","injectBoundHTML","instanceTemplate","nop","nob","asyncMethod","log","EVENT_PREFIX","addHostListeners","eventDelegates","methodName","getEventHandler","dispatchMethod","copyInstanceAttributes","a$","_instanceAttributes","takeAttributes","_publishLC","attributeToProperty","propertyForAttribute","bindPattern","stringValue","serializeValue","reflectPropertyToAttribute","serializedValue","resolveBindingValue","updateRecord","createPropertyObserver","_observeNames","o","_propertyObserver","registerObserver","observeArrayValue","openPropertyObserver","notifyPropertyChanges","newValues","paths","called","ov","nv","invokeMethod","deliverChanges","propertyChanged_","reflect","callbackName","closeNamedObserver","registerNamedObserver","emitPropertyChangeRecord","notifier","notifier_","getNotifier","notify","bindToAccessor","resolveFn","privateName","privateObservable","resolvedValue","createComputedProperties","_computedNames","syntax","bindProperty","_observers","closeObservers","o$","_namedObservers","closeNamedObservers","mdv","enableBindingsReflection","_recordBinding","mixinSuper","makeElementReady","asyncUnbindAll","_unbound","unbind","_unbindAllJob","unbindAll","cancelUnbindAll","mustachePattern","isBase","PolymerBase","created","createdCallback","prepareElement","_elementPrepared","shadowRoots","_readied","parseDeclarations","attachedCallback","attached","enteredView","hasBeenAttached","domReady","detachedCallback","preventDispose","detached","leftView","enteredViewCallback","leftViewCallback","enteredDocumentCallback","leftDocumentCallback","parseDeclaration","elementElement","fetchTemplate","shadowFromTemplate","shadowRootReady","lightFromTemplate","refNode","eventController","marshalNodeReferences","$","attributeChangedCallback","attributeChanged","onMutation","listener","mutations","disconnect","subtree","constructor","Base","shimCssText","is","ShadowCSS","makeScopeSelector","STYLE_SCOPE_ATTRIBUTE","STYLE_CONTROLLER_SCOPE","installControllerStyles","findStyleScope","scopeHasNamedStyle","cssTextForScope","installScopeCssText","installScopeStyle","cssTextToScopeStyle","applyStyleToScope","styleCacheForScope","polyfillScopeStyleCache","_scopeStyles","_currentScript","getRegisteredPrototype","registerPrototype","notifyPrototype","waitingForPrototype","client","waitPrototype","registerWhenReady","prototypesByName","consumeDeclarations","declarations","resolveElementPaths","addResolvePathApi","assetPath","resolvePath","importRuleForSheet","sheet","createStyleElement","firstElementChild","s$","nextElementSibling","cssTextFromSheet","__resource","matchesSelector","inSelector","STYLE_SELECTOR","STYLE_LOADABLE_MATCH","SHEET_SELECTOR","STYLE_GLOBAL_SCOPE","SCOPE_ATTR","templateContent","convertSheetsToStyles","findLoadableStyles","templateUrl","copySheetAttributes","replaceChild","loadables","installSheets","cacheSheets","cacheStyles","installLocalSheets","installGlobalStyles","sheets","findNodes","matcher","templateNodes","styleForScope","scopeDescriptor","webkitMatchesSelector","mozMatchesSelector","mixedCaseEventTypes","parseHostEvents","delegates","addAttributeDelegates","hasEventPrefix","removeEventPrefix","prefixLength","findController","controller","prepareEventBinding","bindingValue","inferObservers","explodeObservers","exploded","ni","names","optimizePropertyMaps","_publishNames","publishProperties","requireProperties","lowerCaseMap","propertyInfos","createPropertyAccessor","createPropertyAccessors","ATTRIBUTES_ATTRIBUTE","ATTRIBUTES_REGEX","inheritAttributesObjects","inheritObject","publishAttributes","accumulateInstanceAttributes","clonable","isInstanceAttribute","blackList","extends","noscript","assetpath","cache-csstext","installBindingDelegate","ensurePrototypeTraversal","ancestor","extendeeName","buildPrototype","publishConstructor","extension","generateBasePrototype","desugarBeforeChaining","chainPrototypes","desugarAfterChaining","inheritMetaData","chained","chainObject","extendee","shimStyling","registerCallback","symbol","ctor","extnds","findBasePrototype","ensureBaseApi","memoizedBases","extended","mixinMethod","info","typeExtension","findTypeExtension","registerElement","inherited","queueForElement","mainQueue","importQueue","nextQueued","queue","waitToReady","addReadyCallback","check","__queue","enqueue","shouldAdd","readied","flushable","addToFlushQueue","nextElement","canReady","isEmpty","flushQueue","polyfillWasReady","upgradeDocumentTree","flushReadyCallbacks","readyCallbacks","whenPolymerReady","isRegistered","isCustomTag","init","loadResources","registered","waitingForQueue","waitingForResources","_register","handleNoScript","_needsResources","importElements","elementOrFragment","importUrls","urls","frag","makeSyntax"],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {};\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findTouchAction: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n        }\n      } else {\n        n = inEvent.target;\n        while(n) {\n          if (n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n      // auto is default\n      return \"auto\";\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n\n/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'html /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  // set of recognizers to run for the currently handled event\n  var currentGestures;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    requiredGestures: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    // map gesture event -> {listeners: int, index: gestures[int]}\n    dependencyMap: {\n      // make sure down and up are in the map to trigger \"register\"\n      down: {listeners: 0, index: -1},\n      up: {listeners: 0, index: -1}\n    },\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      var obj = Object.create(null);\n      obj.listeners = 0;\n      obj.index = this.gestures.length;\n      for (var i = 0, g; i < source.exposes.length; i++) {\n        g = source.exposes[i].toLowerCase();\n        this.dependencyMap[g] = obj;\n      }\n      this.gestures.push(source);\n    },\n    register: function(element, initial) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element, initial);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.requiredGestures.set(inEvent.pointerId, currentGestures);\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n\n      var type = inEvent.type;\n\n      // only generate the list of desired events on \"down\"\n      if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') {\n        if (!inEvent._handledByPG) {\n          currentGestures = {};\n        }\n        // map gesture names to ordered set of recognizers\n        var gesturesWanted = inEvent.currentTarget._pgEvents;\n        if (gesturesWanted) {\n          var gk = Object.keys(gesturesWanted);\n          for (var i = 0, r, ri, g; i < gk.length; i++) {\n            // gesture\n            g = gk[i];\n            if (gesturesWanted[g] > 0) {\n              // lookup gesture recognizer\n              r = this.dependencyMap[g];\n              // recognizer index\n              ri = r ? r.index : -1;\n              currentGestures[ri] = true;\n            }\n          }\n        }\n      }\n\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = function() {\n        inEvent.preventDefault();\n      };\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e, rg; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        rg = e._requiredGestures;\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          // only run recognizer if an element in the source event's path is listening for those gestures\n          if (rg[j]) {\n            g = this.gestures[j];\n            fn = g[e.type];\n            if (fn) {\n              fn.call(g, e);\n            }\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      ev._requiredGestures = this.requiredGestures.get(ev.pointerId);\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n\n  /**\n   * Listen for `gesture` on `node` with the `handler` function\n   *\n   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.activateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      var recognizer = dispatcher.gestures[dep.index];\n      if (!node._pgListeners) {\n        dispatcher.register(node);\n        node._pgListeners = 0;\n      }\n      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes\n      if (recognizer) {\n        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];\n        var actionNode;\n        switch(node.nodeType) {\n          case Node.ELEMENT_NODE:\n            actionNode = node;\n          break;\n          case Node.DOCUMENT_FRAGMENT_NODE:\n            actionNode = node.host;\n          break;\n          default:\n            actionNode = null;\n          break;\n        }\n        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {\n          actionNode.setAttribute('touch-action', touchAction);\n        }\n      }\n      if (!node._pgEvents) {\n        node._pgEvents = {};\n      }\n      node._pgEvents[g] = (node._pgEvents[g] || 0) + 1;\n      node._pgListeners++;\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   *\n   * Listen for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.addEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.activateGesture(node, gesture);\n      node.addEventListener(gesture, handler, capture);\n    }\n  };\n\n  /**\n   * Tears down the gesture configuration for `node`\n   *\n   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.deactivateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      if (node._pgListeners > 0) {\n        node._pgListeners--;\n      }\n      if (node._pgListeners === 0) {\n        dispatcher.unregister(node);\n      }\n      if (node._pgEvents) {\n        if (node._pgEvents[g] > 0) {\n          node._pgEvents[g]--;\n        } else {\n          node._pgEvents[g] = 0;\n        }\n      }\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   * Stop listening for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.removeEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.deactivateGesture(node, gesture);\n      node.removeEventListener(gesture, handler, capture);\n    }\n  };\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.findTarget(inEvent);\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var target = pointermap.get(this.POINTER_ID);\n        if (target) {\n          var e = this.prepareEvent(inEvent);\n          e.target = target;\n          // handle case where we missed a mouseup\n          if (e.buttons === 0) {\n            dispatcher.cancel(e);\n            this.cleanupMouse();\n          } else {\n            dispatcher.move(e);\n          }\n        }\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.findTarget(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved\n  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;\n  var HAS_TOUCH_ACTION = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target, initial) {\n      if (initial) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === st.EMITTER) {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: this.currentTouchEvent.target\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = this.findTarget(inTouch, id);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var touchAction = scope.targetFinding.findTouchAction(inEvent);\n        var scrollAxis = this.touchActionToScrollType(touchAction);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36\n        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ\n        if (inEvent.cancelable) {\n          this.processTouches(inEvent, this.move);\n        }\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var nav = window.navigator;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (nav.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n      /*\n       * NOTE: an empty touch listener on body will reactivate nodes imported from templates with touch listeners\n       * Removing it will re-break the nodes\n       *\n       * Work around for https://bugs.webkit.org/show_bug.cgi?id=135628\n       */\n      var isSafari = nav.userAgent.match('Safari') && !nav.userAgent.match('Chrome');\n      if (isSafari) {\n        document.body.addEventListener('touchstart', function(){});\n      }\n    }\n  }\n  dispatcher.register(document, true);\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     exposes: [\n      'trackstart',\n      'track',\n      'trackx',\n      'tracky',\n      'trackend'\n     ],\n     defaultActions: {\n       'track': 'none',\n       'trackx': 'pan-y',\n       'tracky': 'pan-x'\n     },\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       } else if (inType === 'trackx') {\n         return;\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       } else if (inType === 'tracky') {\n         return;\n       }\n       var gestureProto = {\n         bubbles: true,\n         cancelable: true,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       };\n       if (inType !== 'tracky') {\n         gestureProto.x = inEvent.x;\n         gestureProto.dx = d.x;\n         gestureProto.ddx = dd.x;\n         gestureProto.clientX = inEvent.clientX;\n         gestureProto.pageX = inEvent.pageX;\n         gestureProto.screenX = inEvent.screenX;\n         gestureProto.xDirection = t.xDirection;\n       }\n       if (inType !== 'trackx') {\n         gestureProto.dy = d.y;\n         gestureProto.ddy = dd.y;\n         gestureProto.y = inEvent.y;\n         gestureProto.clientY = inEvent.clientY;\n         gestureProto.pageY = inEvent.pageY;\n         gestureProto.screenY = inEvent.screenY;\n         gestureProto.yDirection = t.yDirection;\n       }\n       var e = eventFactory.makeGestureEvent(inType, gestureProto);\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             p.lastMoveEvent = p.downEvent;\n             this.fireTrack('trackstart', inEvent, p);\n           }\n         }\n         if (p.tracking) {\n           this.fireTrack('track', inEvent, p);\n           this.fireTrack('trackx', inEvent, p);\n           this.fireTrack('tracky', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    exposes: [\n      'hold',\n      'holdpulse',\n      'release'\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    exposes: [\n      'tap'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n\n/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n\n// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      switch (op) {\n        case '||':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) ||\n                right(model, observer, filterRegistry);\n          };\n        case '&&':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) &&\n                right(model, observer, filterRegistry);\n          };\n      }\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      this.dynamicDeps = true;\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.4.0-d66a86e'\n};\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n /*\n\tOn supported platforms, platform.js is not needed. To retain compatibility\n\twith the polyfills, we stub out minimal functionality.\n */\nif (!window.Platform) {\n  logFlags = window.logFlags || {};\n\n\n  Platform = {\n  \tflush: function() {}\n  };\n\n  CustomElements = {\n  \tuseNative: true,\n    ready: true,\n    takeRecords: function() {},\n    instanceof: function(obj, base) {\n      return obj instanceof base;\n    }\n  };\n  \n  HTMLImports = {\n  \tuseNative: true\n  };\n\n  \n  addEventListener('HTMLImportsLoaded', function() {\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n\n\n  // ShadowDOM\n  ShadowDOMPolyfill = null;\n  wrap = unwrap = function(n){\n    return n;\n  };\n\n}\n\n/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\nvar hasNative = ('import' in document.createElement('link'));\r\nvar useNative = hasNative;\r\n\r\nisIE = /Trident/.test(navigator.userAgent);\r\n\r\n// TODO(sorvell): SD polyfill intrusion\r\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\r\nvar wrap = function(node) {\r\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\r\n};\r\nvar mainDoc = wrap(document);\r\n    \r\n// NOTE: We cannot polyfill document.currentScript because it's not possible\r\n// both to override and maintain the ability to capture the native value;\r\n// therefore we choose to expose _currentScript both when native imports\r\n// and the polyfill are in use.\r\nvar currentScriptDescriptor = {\r\n  get: function() {\r\n    var script = HTMLImports.currentScript || document.currentScript ||\r\n        // NOTE: only works when called in synchronously executing code.\r\n        // readyState should check if `loading` but IE10 is \r\n        // interactive when scripts run so we cheat.\r\n        (document.readyState !== 'complete' ? \r\n        document.scripts[document.scripts.length - 1] : null);\r\n    return wrap(script);\r\n  },\r\n  configurable: true\r\n};\r\n\r\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\r\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\r\n\r\n// call a callback when all HTMLImports in the document at call (or at least\r\n//  document ready) time have loaded.\r\n// 1. ensure the document is in a ready state (has dom), then \r\n// 2. watch for loading of imports and call callback when done\r\nfunction whenImportsReady(callback, doc) {\r\n  doc = doc || mainDoc;\r\n  // if document is loading, wait and try again\r\n  whenDocumentReady(function() {\r\n    watchImportsLoad(callback, doc);\r\n  }, doc);\r\n}\r\n\r\n// call the callback when the document is in a ready state (has dom)\r\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\r\nvar READY_EVENT = 'readystatechange';\r\nfunction isDocumentReady(doc) {\r\n  return (doc.readyState === 'complete' ||\r\n      doc.readyState === requiredReadyState);\r\n}\r\n\r\n// call <callback> when we ensure the document is in a ready state\r\nfunction whenDocumentReady(callback, doc) {\r\n  if (!isDocumentReady(doc)) {\r\n    var checkReady = function() {\r\n      if (doc.readyState === 'complete' || \r\n          doc.readyState === requiredReadyState) {\r\n        doc.removeEventListener(READY_EVENT, checkReady);\r\n        whenDocumentReady(callback, doc);\r\n      }\r\n    };\r\n    doc.addEventListener(READY_EVENT, checkReady);\r\n  } else if (callback) {\r\n    callback();\r\n  }\r\n}\r\n\r\nfunction markTargetLoaded(event) {\r\n  event.target.__loaded = true;\r\n}\r\n\r\n// call <callback> when we ensure all imports have loaded\r\nfunction watchImportsLoad(callback, doc) {\r\n  var imports = doc.querySelectorAll('link[rel=import]');\r\n  var loaded = 0, l = imports.length;\r\n  function checkDone(d) { \r\n    if (loaded == l) {\r\n      callback && callback();\r\n    }\r\n  }\r\n  function loadedImport(e) {\r\n    markTargetLoaded(e);\r\n    loaded++;\r\n    checkDone();\r\n  }\r\n  if (l) {\r\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\r\n      if (isImportLoaded(imp)) {\r\n        loadedImport.call(imp, {target: imp});\r\n      } else {\r\n        imp.addEventListener('load', loadedImport);\r\n        imp.addEventListener('error', loadedImport);\r\n      }\r\n    }\r\n  } else {\r\n    checkDone();\r\n  }\r\n}\r\n\r\n// NOTE: test for native imports loading is based on explicitly watching\r\n// all imports (see below).\r\nfunction isImportLoaded(link) {\r\n  return useNative ? link.__loaded : link.__importParsed;\r\n}\r\n\r\n// TODO(sorvell): Workaround for \r\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\r\n// this bug is addressed.\r\n// (1) Install a mutation observer to see when HTMLImports have loaded\r\n// (2) if this script is run during document load it will watch any existing\r\n// imports for loading.\r\n//\r\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\r\n// with imports that are added to document.head since the mutation observer \r\n// watches only head for perf reasons, (2) it requires this script\r\n// to run before any imports have completed loading.\r\nif (useNative) {\r\n  new MutationObserver(function(mxns) {\r\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\r\n      if (m.addedNodes) {\r\n        handleImports(m.addedNodes);\r\n      }\r\n    }\r\n  }).observe(document.head, {childList: true});\r\n\r\n  function handleImports(nodes) {\r\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\r\n      if (isImport(n)) {\r\n        handleImport(n);  \r\n      }\r\n    }\r\n  }\r\n\r\n  function isImport(element) {\r\n    return element.localName === 'link' && element.rel === 'import';\r\n  }\r\n\r\n  function handleImport(element) {\r\n    var loaded = element.import;\r\n    if (loaded) {\r\n      markTargetLoaded({target: element});\r\n    } else {\r\n      element.addEventListener('load', markTargetLoaded);\r\n      element.addEventListener('error', markTargetLoaded);\r\n    }\r\n  }\r\n\r\n  // make sure to catch any imports that are in the process of loading\r\n  // when this script is run.\r\n  (function() {\r\n    if (document.readyState === 'loading') {\r\n      var imports = document.querySelectorAll('link[rel=import]');\r\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\r\n        handleImport(imp);\r\n      }\r\n    }\r\n  })();\r\n\r\n}\r\n\r\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \r\n// have loaded. This event is required to simulate the script blocking \r\n// behavior of native imports. A main document script that needs to be sure\r\n// imports have loaded should wait for this event.\r\nwhenImportsReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  mainDoc.dispatchEvent(\r\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\r\n  );\r\n});\r\n\r\n// exports\r\nscope.useNative = useNative;\r\nscope.isImportLoaded = isImportLoaded;\r\nscope.whenReady = whenImportsReady;\r\nscope.isIE = isIE;\r\n\r\n// deprecated\r\nscope.whenImportsReady = whenImportsReady;\r\n\r\n})(window.HTMLImports);\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n\n// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n\n// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n\n// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      var ifValue = true;\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        ifValue = deps.ifValue;\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !ifValue) {\n          this.valueChanged();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          ifValue = ifValue.open(this.updateIfValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      var value = deps.value;\n      if (!deps.oneTime)\n        value = value.open(this.updateIteratedValue, this);\n\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(value);\n    },\n\n    /**\n     * Gets the updated value of the bind/repeat. This can potentially call\n     * user code (if a bindingDelegate is set up) so we try to avoid it if we\n     * already have the value in hand (from Observer.open).\n     */\n    getUpdatedValue: function() {\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      return value;\n    },\n\n    updateIfValue: function(ifValue) {\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(this.getUpdatedValue());\n    },\n\n    updateIteratedValue: function(value) {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      this.updateValue(value);\n    },\n\n    updateValue: function(value) {\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = Platform.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n\n\n  // mixin\n\n  // copy all properties from inProps (et al) to inObj\n  function mixin(inObj/*, inProps, inMoreProps, ...*/) {\n    var obj = inObj || {};\n    for (var i = 1; i < arguments.length; i++) {\n      var p = arguments[i];\n      try {\n        for (var n in p) {\n          copyProperty(n, p, obj);\n        }\n      } catch(x) {\n      }\n    }\n    return obj;\n  }\n\n  // copy property inName from inSource object to inTarget object\n  function copyProperty(inName, inSource, inTarget) {\n    var pd = getPropertyDescriptor(inSource, inName);\n    Object.defineProperty(inTarget, inName, pd);\n  }\n\n  // get property descriptor for inName on inObject, even if\n  // inName exists on some link in inObject's prototype chain\n  function getPropertyDescriptor(inObject, inName) {\n    if (inObject) {\n      var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n      return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n    }\n  }\n\n  // exports\n\n  scope.extend = extend;\n  scope.mixin = mixin;\n\n  // for bc\n  Platform.mixin = mixin;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  \n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n\n  // exports\n\n  scope.createDOM = createDOM;\n\n})(Polymer);\n\n/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function noopHandler(value) {\n    return value;\n  }\n\n  var typeHandlers = {\n    string: noopHandler,\n    'undefined': noopHandler,\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      * @param {Boolean} bubbles Set false to prevent bubbling, defaults to true\n      * @param {Boolean} cancelable Set false to prevent cancellation, defaults to true\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail === null || detail === undefined ? {} : detail;\n      var event = new CustomEvent(type, {\n        bubbles: bubbles !== undefined ? bubbles : true,\n        cancelable: cancelable !== undefined ? cancelable : true,\n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n  // alias PolymerGestures event listener logic\n  scope.addEventListener = PolymerGestures.addEventListener;\n  scope.removeEventListener = PolymerGestures.removeEventListener;\n\n})(Polymer);\n\n/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(splices) {\n            this.invokeMethod(callbackName, [splices]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure template is decorated (lets' things like <tr template ...> work)\n      HTMLTemplateElement.decorate(template);\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      if (!this.ownerDocument.isStagingDocument) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (hasShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      this.styleCacheForScope(scope)[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      var cache = this.styleCacheForScope(scope);\n      return cache[name];\n    },\n    styleCacheForScope: function(scope) {\n      if (hasShadowDOMPolyfill) {\n        var scopeName = scope.host ? scope.host.localName : scope.localName;\n        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});\n      } else {\n        return scope._scopeStyles = (scope._scopeStyles || {});\n      }\n    }\n  };\n\n  var polyfillScopeStyleCache = {};\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (typeof name !== 'string') {\n      var script = prototype || document._currentScript;\n      prototype = name;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  if (Platform.consumeDeclarations) {\n    Platform.consumeDeclarations(function(declarations) {;\n      if (declarations) {\n        for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n          element.apply(null, d);\n        }\n      }\n    });\n  }\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Polymer.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Polymer.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (hasShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        PolymerGestures.addEventListener(node, eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            PolymerGestures.removeEventListener(node, eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    //\n    // `name: value` entries in the `publish` object may need to generate \n    // matching properties on the prototype.\n    //\n    // Values that are objects may have a `reflect` property, which\n    // signals that the value describes property control metadata.\n    // In metadata objects, the prototype default value (if any)\n    // is encoded in the `value` property.\n    //\n    // publish: {\n    //   foo: 5, \n    //   bar: {value: true, reflect: true},\n    //   zot: {}\n    // }\n    //\n    // `reflect` metadata property controls whether changes to the property\n    // are reflected back to the attribute (default false). \n    //\n    // A value is stored on the prototype unless it's === `undefined`,\n    // in which case the base chain is checked for a value.\n    // If the basal value is also undefined, `null` is stored on the prototype.\n    //\n    // The reflection data is stored on another prototype object, `reflect`\n    // which also can be specified directly.\n    //\n    // reflect: {\n    //   foo: true\n    // }\n    //\n    requireProperties: function(propertyInfos, prototype, base) {\n      // per-prototype storage for reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyInfos) {\n        var value = propertyInfos[n];\n        // value has metadata if it has a `reflect` property\n        if (value && value.reflect !== undefined) {\n          prototype.reflect[n] = Boolean(value.reflect);\n          value = value.value;\n        }\n        // only set a value if one is specified\n        if (value !== undefined) {\n          prototype[n] = value;\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute into the 'publish' object\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // create a `publish` object if needed.\n        // the `publish` object is only relevant to this prototype, the \n        // publishing logic in `declaration/properties.js` is responsible for\n        // managing property values on the prototype chain.\n        // TODO(sjmiles): the `publish` object is later chained to it's \n        //                ancestor object, presumably this is only for \n        //                reflection or other non-library uses. \n        var publish = prototype.publish || (prototype.publish = {}); \n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // looks weird, but causes n to exist on `publish` if it does not;\n          // a more careful test would need expensive `in` operator\n          if (n && publish[n] === undefined) {\n            publish[n] = undefined;\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && template.content;\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (hasShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      var polyfillWasReady = CustomElements.ready;\n      CustomElements.ready = false;\n      this.flush();\n      if (!CustomElements.useNative) {\n        CustomElements.upgradeDocumentTree(document);\n      }\n      CustomElements.ready = polyfillWasReady;\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  function whenReady(callback) {\n    queue.waitToReady = true;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenReady;\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenReady = scope.whenReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      queue.wait(this);\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    // TODO(sorvell): we currently queue in the order the prototypes are \n    // registered, but we should queue in the order that polymer-elements\n    // are registered. We are currently blocked from doing this based on \n    // crbug.com/395686.\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n    _register: function() {\n      //console.log('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // imperative element registration\n        Polymer(name);\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.enqueue(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n\n//# sourceMappingURL=polymer.concat.js.map"]}
\ No newline at end of file
+{"version":3,"file":"polymer.js","sources":["polymer.concat.js"],"names":["window","PolymerGestures","scope","HAS_FULL_PATH","pathTest","document","createElement","createShadowRoot","sr","s","appendChild","addEventListener","ev","path","stopPropagation","CustomEvent","bubbles","head","dispatchEvent","parentNode","removeChild","target","shadow","inEl","shadowRoot","webkitShadowRoot","canTarget","Boolean","elementFromPoint","targetingShadow","this","olderShadow","os","olderShadowRoot","se","querySelector","allShadows","element","shadows","push","searchRoot","inRoot","x","y","t","owner","nodeType","Node","DOCUMENT_NODE","DOCUMENT_FRAGMENT_NODE","findTarget","inEvent","length","clientX","clientY","findTouchAction","n","i","ELEMENT_NODE","hasAttribute","getAttribute","host","LCA","a","b","contains","adepth","depth","bdepth","d","walk","u","deepContains","common","insideNode","node","rect","getBoundingClientRect","left","right","top","bottom","event","p","targetFinding","bind","shadowSelector","v","selector","rule","attrib2css","selectors","styles","hasTouchAction","style","touchAction","hasShadowRoot","ShadowDOMPolyfill","forEach","r","String","map","el","textContent","MOUSE_PROPS","MOUSE_DEFAULTS","NOP_FACTORY","eventFactory","preventTap","makeBaseEvent","inType","inDict","e","createEvent","initEvent","cancelable","makeGestureEvent","Object","create","k","keys","makePointerEvent","buttons","pressure","pointerId","width","height","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","_source","PointerMap","USE_MAP","m","Map","pointers","POINTERS_FN","values","prototype","size","set","inId","indexOf","has","delete","splice","get","clear","callback","thisArg","call","currentGestures","CLONE_PROPS","CLONE_DEFAULTS","HAS_SVG_INSTANCE","SVGElementInstance","dispatcher","IS_IOS","pointermap","requiredGestures","eventMap","eventSources","eventSourceList","gestures","dependencyMap","down","listeners","index","up","gestureQueue","registerSource","name","source","newEvents","events","registerGesture","obj","g","exposes","toLowerCase","register","initial","es","l","unregister","fireEvent","move","type","fillGestureQueue","cancel","tapPrevented","addGestureDependency","gesturesWanted","_pgEvents","ri","gk","eventHandler","_handledByPG","nodes","currentTarget","fn","listen","addEvent","unlisten","removeEvent","eventName","boundHandler","removeEventListener","makeEvent","preventDefault","_target","cloneEvent","eventCopy","correspondingUseElement","clone","gestureTrigger","rg","_requiredGestures","j","requestAnimationFrame","boundGestureTrigger","activateGesture","gesture","dep","recognizer","_pgListeners","actionNode","defaultActions","setAttribute","handler","capture","deactivateGesture","DEDUP_DIST","WHICH_TO_BUTTONS","HAS_BUTTONS","MouseEvent","mouseEvents","POINTER_ID","POINTER_TYPE","lastTouches","isEventSimulatedFromTouch","lts","dx","Math","abs","dy","prepareEvent","which","mousedown","mouseup","mousemove","cleanupMouse","relatedTarget","DEDUP_TIMEOUT","Array","CLICK_COUNT_TIMEOUT","HYSTERESIS","HAS_TOUCH_ACTION","touchEvents","scrollTypes","EMITTER","XSCROLLER","YSCROLLER","touchActionToScrollType","st","firstTouch","isPrimaryTouch","inTouch","identifier","setPrimaryTouch","firstXY","X","Y","scrolling","cancelResetClickCount","removePrimaryPointer","inPointer","resetClickCount","clickCount","resetId","setTimeout","clearTimeout","typeToButtons","ret","touch","id","currentTouchEvent","fastPath","touchToPointer","cte","detail","webkitRadiusX","radiusX","webkitRadiusY","radiusY","webkitForce","force","self","processTouches","inFunction","tl","changedTouches","_cancel","cleanUpPointer","shouldScroll","scrollAxis","oa","da","doa","findTouch","inTL","vacuumTouches","touches","value","key","touchstart","dedupSynthMouse","touchmove","dd","sqrt","touchcancel","touchend","lt","HAS_BITMAP_TYPE","MSPointerEvent","MSPOINTER_TYPE_MOUSE","msEvents","POINTER_TYPES","cleanup","MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel","pointerEvents","pointerdown","pointermove","pointerup","pointercancel","nav","navigator","PointerEvent","msPointerEnabled","undefined","ontouchstart","ua","userAgent","match","track","trackx","tracky","WIGGLE_THRESHOLD","clampDir","inDelta","calcPositionDelta","inA","inB","pageX","pageY","fireTrack","inTrackingData","downEvent","lastMoveEvent","xDirection","yDirection","gestureProto","trackInfo","ddx","screenX","ddy","screenY","downTarget","tracking","hold","HOLD_DELAY","heldPointer","holdJob","pulse","Date","now","timeStamp","held","fireHold","clearInterval","setInterval","inHoldTime","holdTime","tap","shouldTap","downState","start","altKey","ctrlKey","metaKey","shiftKey","global","assert","condition","message","Error","isDecimalDigit","ch","isWhiteSpace","fromCharCode","isLineTerminator","isIdentifierStart","isIdentifierPart","isKeyword","skipWhitespace","charCodeAt","getIdentifier","slice","scanIdentifier","Token","Identifier","Keyword","NullLiteral","BooleanLiteral","range","scanPunctuator","code2","ch2","code","ch1","Punctuator","throwError","Messages","UnexpectedToken","scanNumericLiteral","number","NumericLiteral","parseFloat","scanStringLiteral","quote","str","octal","StringLiteral","isIdentifierName","token","advance","EOF","lex","lookahead","peek","pos","messageFormat","error","args","arguments","msg","replace","whole","description","throwUnexpected","expect","matchKeyword","keyword","parseArrayInitialiser","elements","parseExpression","delegate","createArrayExpression","parseObjectPropertyKey","createLiteral","createIdentifier","parseObjectProperty","createProperty","parseObjectInitialiser","properties","createObjectExpression","parseGroupExpression","expr","parsePrimaryExpression","createThisExpression","parseArguments","parseNonComputedProperty","parseNonComputedMember","parseComputedMember","parseLeftHandSideExpression","property","createMemberExpression","createCallExpression","parseUnaryExpression","parsePostfixExpression","createUnaryExpression","binaryPrecedence","prec","parseBinaryExpression","stack","operator","pop","createBinaryExpression","parseConditionalExpression","consequent","alternate","createConditionalExpression","parseFilter","createFilter","parseFilters","parseTopLevel","Syntax","parseInExpression","parseAsExpression","createTopLevel","createAsExpression","indexName","createInExpression","parse","inDelegate","state","labelSet","TokenName","ArrayExpression","BinaryExpression","CallExpression","ConditionalExpression","EmptyStatement","ExpressionStatement","Literal","LabeledStatement","LogicalExpression","MemberExpression","ObjectExpression","Program","Property","ThisExpression","UnaryExpression","UnknownLabel","Redeclaration","esprima","prepareBinding","expressionText","filterRegistry","expression","getExpression","scopeIdent","tagName","ex","console","model","oneTime","binding","getBinding","polymerExpressionScopeIdent_","indexIdent","polymerExpressionIndexIdent_","expressionParseCache","ASTDelegate","Expression","valueFn_","IdentPath","Path","object","accessor","computed","dynamicDeps","simplePath","getFn","Filter","notImplemented","arg","valueFn","filters","deps","currentPath","ConstantObservable","value_","convertStylePropertyName","c","findScope","prop","parentScopeName","hasOwnProperty","isLiteralExpression","pathString","isNaN","Number","PolymerExpressions","observer","addPath","getValueFrom","setValue","newValue","setValueFrom",{"end":{"file":"polymer.concat.js","comments_before":[],"nlb":false,"endpos":93731,"pos":93723,"col":8,"line":3221,"value":"fullPath","type":"name"},"start":{"file":"polymer.concat.js","comments_before":[],"nlb":false,"endpos":93731,"pos":93723,"col":8,"line":3221,"value":"fullPath","type":"name"},"name":"fullPath"},"fullPath","fullPath_","parts","context","propName","transform","toModelDirection","initialArgs","toModel","toDOM","apply","unaryOperators","+","-","!","binaryOperators","*","/","%","<",">","<=",">=","==","!=","===","!==","&&","||","op","argument","test","ident","filter","arr","kind","open","discardChanges","deliver","close","firstTime","firstValue","startReset","getValue","finishReset","setValueFn","CompoundObserver","ObserverTransform","count","random","toString","styleObject","join","tokenList","tokens","prepareInstancePositionChanged","template","templateInstance","valid","PathObserver","prepareInstanceModel","scopeName","parentScope","createScopeObject","__proto__","defineProperty","configurable","writable","Polymer","version","Platform","logFlags","flush","CustomElements","useNative","ready","takeRecords","instanceof","base","HTMLImports","wrap","unwrap","whenImportsReady","doc","mainDoc","whenDocumentReady","watchImportsLoad","isDocumentReady","readyState","requiredReadyState","checkReady","READY_EVENT","markTargetLoaded","__loaded","checkDone","loaded","loadedImport","imports","querySelectorAll","imp","isImportLoaded","link","import","__importParsed","handleImports","isImport","handleImport","localName","rel","hasNative","isIE","hasShadowDOMPolyfill","wrapIfNeeded","currentScriptDescriptor","script","currentScript","scripts","MutationObserver","mxns","addedNodes","observe","childList","readyTime","getTime","whenReady","withDependencies","task","depends","marshal","module","dependsOrFactory","moduleFactory","modules","using","modularize","insertBefore","firstChild","detectObjectObserve","recs","records","deliverChangeRecords","unobserve","detectEval","chrome","app","runtime","getDeviceStorage","f","Function","isIndex","toNumber","isObject","areSameValue","numberIsNaN","getPathCharType","char","noop","parsePath","maybeUnescapeQuote","nextChar","mode","newChar","actions","append","transition","action","typeMap","pathStateMachine","isIdent","identRegExp","privateToken","constructorIsPrivate","hasEval","compiledGetValueFromFn","getPath","pathCache","invalidPath","formatAccessor","dirtyCheck","cycles","MAX_DIRTY_CHECK_CYCLES","check_","testingExposeCycleCount","dirtyCheckCycleCount","objectIsEmpty","diffIsEmpty","diff","added","removed","changed","diffObjectFromOldObject","oldObject","isArray","runEOMTasks","eomTasks","newObservedObject","state_","OPENED","discardRecords","first","obs","arrayObserve","discard","observedObjectCache","getObservedObject","dir","newObservedSet","rootObj","rootObjProps","objects","getPrototypeOf","allRootObjNonObservedProps","rec","observers","iterateObjects_","observerCount","record","Observer","unobservedCount","observedSetCache","getObservedSet","lastObservedSet","UNOPENED","callback_","target_","directObserver_","id_","nextObserverId","addToAll","_allObserversCount","collectObservers","allObservers","removeFromAll","ObjectObserver","oldObject_","ArrayObserver","array","object_","path_","reportChangesOnOpen","reportChangesOnOpen_","observed_","identFn","observable","getValueFn","dontPassThroughSet","observable_","getValueFn_","setValueFn_","dontPassThroughSet_","diffObjectFromChangeRecords","changeRecords","oldValues","expectedRecordTypes","oldValue","newSplice","addedCount","ArraySplice","calcSplices","current","currentStart","currentEnd","old","oldStart","oldEnd","arraySplice","intersect","start1","end1","start2","end2","mergeSplice","splices","inserted","insertionOffset","intersectCount","deleteCount","prepend","offset","createInitialSplices","JSON","stringify","projectArraySplices","concat","hasObserve","createObject","proto","newObject","getOwnPropertyNames","getOwnPropertyDescriptor","identStart","identPart","RegExp","beforePath","ws","[","eof","inPath",".","beforeIdent","inIdent","0","beforeElement","'","\"","afterZero","]","inIndex","inSingleQuote","else","inDoubleQuote","afterElement","iterateObjects","runEOM","eomObj","pingPong","eomRunScheduled","CLOSED","RESETTING","connect_","disconnect_","report_","changes","_errorThrownDuringCallback","runningMicrotaskCheckpoint","performMicrotaskCheckpoint","anyChanged","toCheck","clearObservers","copyObject","copy","applySplices","previous","spliceArgs","addIndex","skipChanges","observerSentinel","needsDirectObserver","addObserver","observedCallback_","add","update","EDIT_LEAVE","EDIT_UPDATE","EDIT_ADD","EDIT_DELETE","calcEditDistances","rowCount","columnCount","distances","equals","north","west","spliceOperationsFromEditDistances","edits","min","northWest","reverse","prefixCount","suffixCount","minLength","sharedPrefix","sharedSuffix","ops","oldIndex","searchLength","index1","index2","calculateSplices","currentValue","previousValue","runEOM_","observerSentinel_","hasObjectObserve","getTreeScope","getElementById","updateBindings","bindings","bindings_","returnBinding","sanitizeValue","updateText","data","textBinding","updateAttribute","conditional","removeAttribute","attributeBinding","getEventForInputType","checkboxEventType","updateInput","input","santizeFn","inputBinding","bindInputEvent","postEventFn","eventType","booleanSanitize","getAssociatedRadioButtons","form","treeScope","radios","checkedPostEvent","radio","checkedBinding","checked","updateOption","option","select","selectBinding","HTMLSelectElement","optionBinding","bindFinished","maybeUpdateBindings","enable","Text","Element","div","checkbox","initMouseEvent","HTMLInputElement","HTMLElement","sanitizeFn","HTMLTextAreaElement","HTMLOptionElement","getFragmentRoot","searchRefId","ref","protoContent_","templateCreator_","isSVGTemplate","namespaceURI","isHTMLTemplate","isAttributeTemplate","semanticTemplateElements","isTemplate","isTemplate_","forAllTemplatesFrom","subTemplates","allTemplatesSelectors","bootstrapTemplatesRecursivelyFrom","bootstrap","HTMLTemplateElement","decorate","content","mixin","to","from","getOrCreateTemplateContentsOwner","ownerDocument","defaultView","templateContentsOwner_","implementation","createHTMLDocument","lastChild","getTemplateStagingDocument","stagingDocument_","isStagingDocument","href","baseURI","extractTemplateFromAttributeTemplate","attribs","attributes","attrib","templateAttributeDirectives","extractTemplateFromSVGTemplate","liftNonNativeTemplateChildrenIntoContent","useRoot","child","fixTemplateElementPrototype","hasProto","ensureSetModelScheduled","setModelFn_","setModelFnScheduled_","getBindings","delegate_","processBindings","model_","parseMustaches","prepareBindingFn","startIndex","lastIndex","endIndex","onlyOneTime","oneTimeStart","terminator","trim","delegateFn","hasOnePath","isSimplePath","combinator","processOneTimeBinding","processSinglePathBinding","processBinding","instanceBindings","iter","processBindingDirectives_","parseWithDefault","parseAttributeBindings","attr","substring","IF","BIND","REPEAT","if","repeat","TEXT_NODE","cloneAndBindInstance","parent","stagingDocument","importNode","nextSibling","children","setDelegate_","createInstanceBindingMap","getContentUid","contentUidCounter","getInstanceBindingMap","contentId","bindingMaps","bindingMap_","TemplateIterator","templateElement","closed","templateElement_","instances","iteratedValue","presentValue","arrayObserver","opt_this","Document","documentElement","THEAD","TBODY","TFOOT","TH","TR","TD","COLGROUP","COL","CAPTION","OPTION","OPTGROUP","hasTemplateElement","html","TypeError","templateObserver","refChanged_","opt_instanceRef","templateIsDecorated_","isNativeHTMLTemplate","bootstrapContents","liftContents","liftRoot","content_","createDocumentFragment","instanceRef_","htmlElement","HTMLUnknownElement","contentDescriptor","enumerable","directives","iterator_","closeDeps","updateDependencies","attributeFilter","createInstance","bindingDelegate","newDelegate_","refContent_","ref_","emptyInstance","instance","terminator_","instanceRecord","templateInstance_","firstNode","lastNode","collectTerminator","raw","valueChanged","updateIteratedValue","getUpdatedValue","instancePositionChangedFn_","instanceModelFn_","nextRef","ifOneTime","ifValue","hasIf","updateIfValue","updateValue","observeValue","handleSplices","getLastInstanceNode","subtemplateIterator","getLastTemplateNode","insertInstanceAt","fragment","previousInstanceLast","extractInstanceAt","getDelegateFn","instanceCache","removeDelta","closeInstanceBindings","reportInstancesMoved","reportInstanceMoved","forAllTemplatesFrom_","endOfMicrotask","twiddle","iterations","callbacks","atEndOfMicrotask","shift","createTextNode","JsMutationObserver","characterData","flushing","group","groupEnd","FLUSH_POLL_INTERVAL","flushPoll","originalImportNode","deep","imported","upgradeAll","replaceUrlsInCssText","cssText","baseUrl","keepAbsolute","regexp","pre","url","post","urlPath","resolveRelativeUrl","URL","makeDocumentRelPath","root","port","protocol","makeRelPath","sourceUrl","targetUrl","pathname","split","unshift","search","hash","urlResolver","resolveDom","resolveAttributes","resolveStyles","templates","resolveTemplate","resolveStyle","resolveCssText","CSS_URL_REGEXP","CSS_IMPORT_REGEXP","hasAttributes","resolveElementAttributes","URL_ATTRS_SELECTOR","URL_ATTRS","replacement","URL_TEMPLATE_SEARCH","Loader","regex","cache","requests","extractUrls","text","matched","matches","exec","process","done","fetch","inflight","req","xhr","wait","handleXhr","request","response","responseText","resolve","XMLHttpRequest","send","onerror","onload","pending","StyleResolver","loader","flatten","resolveNode","intermediate","loadStyles","loadedStyle","styleResolver","extend","api","pd","nom","inObj","copyProperty","inName","inSource","inTarget","getPropertyDescriptor","inObject","job","stop","Job","go","inContext","boundComplete","complete","h","handle","cancelAnimationFrame","createDOM","inTagOrNode","inHTML","inAttrs","dom","cloneNode","innerHTML","registry","tag","getPrototypeForTag","originalStopPropagation","Event","cancelBubble","DOMTokenList","remove","toggle","bool","switch","oldName","newName","ArraySlice","namedNodeMap","NamedNodeMap","MozNamedAttrMap","NodeList","HTMLCollection","$super","arrayOfArgs","caller","_super","nameInThis","warn","memoizeSuper","n$","method","nextSuper","super","noopHandler","deserializeValue","inferredType","typeHandlers","string","date","boolean","parseInt","function","declaration","publish","apis","utils","async","timeout","cancelAsync","fire","onNode","asyncFire","classFollows","anew","className","classList","injectBoundHTML","instanceTemplate","nop","nob","asyncMethod","log","EVENT_PREFIX","addHostListeners","eventDelegates","methodName","getEventHandler","dispatchMethod","handlerFn","copyInstanceAttributes","a$","_instanceAttributes","takeAttributes","_publishLC","attributeToProperty","propertyForAttribute","bindPattern","stringValue","serializeValue","reflectPropertyToAttribute","serializedValue","resolveBindingValue","updateRecord","createPropertyObserver","_observeNames","o","_propertyObserver","registerObserver","observeArrayValue","openPropertyObserver","notifyPropertyChanges","newValues","paths","called","ov","nv","invokeMethod","deliverChanges","propertyChanged_","reflect","callbackName","closeNamedObserver","registerNamedObserver","emitPropertyChangeRecord","notifier","notifier_","getNotifier","notify","bindToAccessor","resolveFn","privateName","setObserveable","privateComputedBoundValue","privateObservable","resolvedValue","createComputedProperties","_computedNames","syntax","bindProperty","_observers","closeObservers","o$","_namedObservers","closeNamedObservers","mdv","enableBindingsReflection","_recordBinding","mixinSuper","makeElementReady","asyncUnbindAll","_unbound","unbind","_unbindAllJob","unbindAll","cancelUnbindAll","mustachePattern","isBase","PolymerBase","created","createdCallback","prepareElement","_elementPrepared","shadowRoots","_readied","parseDeclarations","attachedCallback","attached","enteredView","hasBeenAttached","domReady","detachedCallback","preventDispose","detached","leftView","enteredViewCallback","leftViewCallback","enteredDocumentCallback","leftDocumentCallback","parseDeclaration","elementElement","fetchTemplate","shadowFromTemplate","shadowRootReady","lightFromTemplate","refNode","eventController","marshalNodeReferences","$","attributeChangedCallback","attributeChanged","onMutation","listener","mutations","disconnect","subtree","constructor","Base","shimCssText","is","ShadowCSS","makeScopeSelector","STYLE_SCOPE_ATTRIBUTE","STYLE_CONTROLLER_SCOPE","installControllerStyles","findStyleScope","scopeHasNamedStyle","cssTextForScope","installScopeCssText","installScopeStyle","cssTextToScopeStyle","applyStyleToScope","styleCacheForScope","polyfillScopeStyleCache","_scopeStyles","_currentScript","getRegisteredPrototype","registerPrototype","notifyPrototype","waitingForPrototype","client","waitPrototype","registerWhenReady","prototypesByName","instanceOfType","ctor","consumeDeclarations","declarations","resolveElementPaths","addResolvePathApi","assetPath","resolvePath","importRuleForSheet","sheet","createStyleElement","firstElementChild","s$","nextElementSibling","cssTextFromSheet","__resource","matchesSelector","inSelector","STYLE_SELECTOR","STYLE_LOADABLE_MATCH","SHEET_SELECTOR","STYLE_GLOBAL_SCOPE","SCOPE_ATTR","templateContent","convertSheetsToStyles","findLoadableStyles","templateUrl","copySheetAttributes","replaceChild","loadables","installSheets","cacheSheets","cacheStyles","installLocalSheets","installGlobalStyles","sheets","findNodes","matcher","templateNodes","styleForScope","scopeDescriptor","webkitMatchesSelector","mozMatchesSelector","mixedCaseEventTypes","parseHostEvents","delegates","addAttributeDelegates","hasEventPrefix","removeEventPrefix","prefixLength","findController","controller","prepareEventBinding","bindingValue","inferObservers","explodeObservers","exploded","ni","names","optimizePropertyMaps","_publishNames","publishProperties","requireProperties","lowerCaseMap","propertyInfos","createPropertyAccessor","ignoreWrites","createPropertyAccessors","ATTRIBUTES_ATTRIBUTE","ATTRIBUTES_REGEX","inheritAttributesObjects","inheritObject","publishAttributes","accumulateInstanceAttributes","clonable","isInstanceAttribute","blackList","extends","noscript","assetpath","cache-csstext","installBindingDelegate","ensurePrototypeTraversal","ancestor","extendeeName","buildPrototype","publishConstructor","extension","generateBasePrototype","desugarBeforeChaining","chainPrototypes","desugarAfterChaining","inheritMetaData","chained","chainObject","extendee","shimStyling","registerCallback","symbol","extnds","findBasePrototype","ensureBaseApi","memoizedBases","extended","mixinMethod","info","typeExtension","findTypeExtension","registerElement","inherited","queueForElement","mainQueue","importQueue","nextQueued","queue","waitToReady","addReadyCallback","check","forceReady","__queue","enqueue","shouldAdd","readied","flushable","addToFlushQueue","nextElement","canReady","isEmpty","flushQueue","polyfillWasReady","upgradeDocumentTree","flushReadyCallbacks","readyCallbacks","waitingFor","e$","whenPolymerReady","isRegistered","isCustomTag","init","loadResources","registered","waitingForQueue","waitingForResources","_register","handleNoScript","_needsResources","body","importElements","elementOrFragment","importUrls","urls","frag","makeSyntax"],"mappings":";;;;;;;;;;AASAA,OAAOC,mBAWP,SAAUC,GACR,GAAIC,IAAgB,EAGhBC,EAAWC,SAASC,cAAc,OACtC,IAAIF,EAASG,iBAAkB,CAC7B,GAAIC,GAAKJ,EAASG,mBACdE,EAAIJ,SAASC,cAAc,OAC/BE,GAAGE,YAAYD,GACfL,EAASO,iBAAiB,WAAY,SAASC,GACzCA,EAAGC,OAELV,EAAgBS,EAAGC,KAAK,KAAOJ,GAEjCG,EAAGE,mBAEL,IAAIF,GAAK,GAAIG,aAAY,YAAaC,SAAS,GAE/CX,UAASY,KAAKP,YAAYN,GAC1BK,EAAES,cAAcN,GAChBR,EAASe,WAAWC,YAAYhB,GAChCI,EAAKC,EAAI,KAEXL,EAAW,IAEX,IAAIiB,IACFC,OAAQ,SAASC,GACf,MAAIA,GACKA,EAAKC,YAAcD,EAAKE,iBADjC,QAIFC,UAAW,SAASJ,GAClB,MAAOA,IAAUK,QAAQL,EAAOM,mBAElCC,gBAAiB,SAASN,GACxB,GAAId,GAAIqB,KAAKR,OAAOC,EACpB,OAAIO,MAAKJ,UAAUjB,GACVA,EADT,QAIFsB,YAAa,SAAST,GACpB,GAAIU,GAAKV,EAAOW,eAChB,KAAKD,EAAI,CACP,GAAIE,GAAKZ,EAAOa,cAAc,SAC1BD,KACFF,EAAKE,EAAGD,iBAGZ,MAAOD,IAETI,WAAY,SAASC,GAEnB,IADA,GAAIC,MAAc7B,EAAIqB,KAAKR,OAAOe,GAC5B5B,GACJ6B,EAAQC,KAAK9B,GACbA,EAAIqB,KAAKC,YAAYtB,EAEvB,OAAO6B,IAETE,WAAY,SAASC,EAAQC,EAAGC,GAC9B,GAAIC,GAAOpC,CACX,OAAIiC,IACFG,EAAIH,EAAOb,iBAAiBc,EAAGC,GAC3BC,EAEFpC,EAAKsB,KAAKD,gBAAgBe,GACjBH,IAAWpC,WAEpBG,EAAKsB,KAAKC,YAAYU,IAGjBX,KAAKU,WAAWhC,EAAIkC,EAAGC,IAAMC,GAVtC,QAaFC,MAAO,SAASR,GACd,IAAKA,EACH,MAAOhC,SAIT,KAFA,GAAII,GAAI4B,EAED5B,EAAEU,YACPV,EAAIA,EAAEU,UAMR,OAHIV,GAAEqC,UAAYC,KAAKC,eAAiBvC,EAAEqC,UAAYC,KAAKE,yBACzDxC,EAAIJ,UAECI,GAETyC,WAAY,SAASC,GACnB,GAAIhD,GAAiBgD,EAAQtC,MAAQsC,EAAQtC,KAAKuC,OAChD,MAAOD,GAAQtC,KAAK,EAEtB,IAAI6B,GAAIS,EAAQE,QAASV,EAAIQ,EAAQG,QAEjC7C,EAAIqB,KAAKe,MAAMM,EAAQ9B,OAK3B,OAHKZ,GAAEmB,iBAAiBc,EAAGC,KACzBlC,EAAIJ,UAECyB,KAAKU,WAAW/B,EAAGiC,EAAGC,IAE/BY,gBAAiB,SAASJ,GACxB,GAAIK,EACJ,IAAIrD,GAAiBgD,EAAQtC,MAAQsC,EAAQtC,KAAKuC,QAEhD,IAAK,GADDvC,GAAOsC,EAAQtC,KACV4C,EAAI,EAAGA,EAAI5C,EAAKuC,OAAQK,IAE/B,GADAD,EAAI3C,EAAK4C,GACLD,EAAEV,WAAaC,KAAKW,cAAgBF,EAAEG,aAAa,gBACrD,MAAOH,GAAEI,aAAa,oBAK1B,KADAJ,EAAIL,EAAQ9B,OACNmC,GAAG,CACP,GAAIA,EAAEV,WAAaC,KAAKW,cAAgBF,EAAEG,aAAa,gBACrD,MAAOH,GAAEI,aAAa,eAExBJ,GAAIA,EAAErC,YAAcqC,EAAEK,KAI1B,MAAO,QAETC,IAAK,SAASC,EAAGC,GACf,GAAID,IAAMC,EACR,MAAOD,EAET,IAAIA,IAAMC,EACR,MAAOD,EAET,IAAIC,IAAMD,EACR,MAAOC,EAET,KAAKA,IAAMD,EACT,MAAO1D,SAGT,IAAI0D,EAAEE,UAAYF,EAAEE,SAASD,GAC3B,MAAOD,EAET,IAAIC,EAAEC,UAAYD,EAAEC,SAASF,GAC3B,MAAOC,EAET,IAAIE,GAASpC,KAAKqC,MAAMJ,GACpBK,EAAStC,KAAKqC,MAAMH,GACpBK,EAAIH,EAASE,CAMjB,KALIC,GAAK,EACPN,EAAIjC,KAAKwC,KAAKP,EAAGM,GAEjBL,EAAIlC,KAAKwC,KAAKN,GAAIK,GAEbN,GAAKC,GAAKD,IAAMC,GACrBD,EAAIA,EAAE5C,YAAc4C,EAAEF,KACtBG,EAAIA,EAAE7C,YAAc6C,EAAEH,IAExB,OAAOE,IAETO,KAAM,SAASd,EAAGe,GAChB,IAAK,GAAId,GAAI,EAAGD,GAAUe,EAAJd,EAAQA,IAC5BD,EAAIA,EAAErC,YAAcqC,EAAEK,IAExB,OAAOL,IAETW,MAAO,SAASX,GAEd,IADA,GAAIa,GAAI,EACFb,GACJa,IACAb,EAAIA,EAAErC,YAAcqC,EAAEK,IAExB,OAAOQ,IAETG,aAAc,SAAST,EAAGC,GACxB,GAAIS,GAAS3C,KAAKgC,IAAIC,EAAGC,EAEzB,OAAOS,KAAWV,GAEpBW,WAAY,SAASC,EAAMjC,EAAGC,GAC5B,GAAIiC,GAAOD,EAAKE,uBAChB,OAAQD,GAAKE,MAAQpC,GAAOA,GAAKkC,EAAKG,OAAWH,EAAKI,KAAOrC,GAAOA,GAAKiC,EAAKK,QAEhFpE,KAAM,SAASqE,GACb,GAAIC,EACJ,IAAIhF,GAAiB+E,EAAMrE,MAAQqE,EAAMrE,KAAKuC,OAC5C+B,EAAID,EAAMrE,SACL,CACLsE,IAEA,KADA,GAAI3B,GAAI1B,KAAKoB,WAAWgC,GACjB1B,GACL2B,EAAE5C,KAAKiB,GACPA,EAAIA,EAAErC,YAAcqC,EAAEK,KAG1B,MAAOsB,IAGXjF,GAAMkF,cAAgB/D,EAOtBnB,EAAMgD,WAAa7B,EAAO6B,WAAWmC,KAAKhE,GAS1CnB,EAAMsE,aAAenD,EAAOmD,aAAaa,KAAKhE,GAqB9CnB,EAAMwE,WAAarD,EAAOqD,YAEzB1E,OAAOC,iBAYV,WACE,QAASqF,GAAeC,GACtB,MAAO,eAAiBC,EAASD,GAEnC,QAASC,GAASD,GAChB,MAAO,kBAAoBA,EAAI,KAEjC,QAASE,GAAKF,GACZ,MAAO,uBAAyBA,EAAI,mBAAqBA,EAAI,KAE/D,GAAIG,IACF,OACA,OACA,QACA,SAEED,KAAM,cACNE,WACE,cACA,gBAGJ,gBAEEC,EAAS,GAETC,EAA4D,gBAApCxF,UAASY,KAAK6E,MAAMC,YAE5CC,GAAiBhG,OAAOiG,mBAAqB5F,SAASY,KAAKV,gBAE/D,IAAIsF,EAAgB,CAClBH,EAAWQ,QAAQ,SAASC,GACtBC,OAAOD,KAAOA,GAChBP,GAAUJ,EAASW,GAAKV,EAAKU,GAAK,KAC9BH,IACFJ,GAAUN,EAAea,GAAKV,EAAKU,GAAK,QAG1CP,GAAUO,EAAER,UAAUU,IAAIb,GAAYC,EAAKU,EAAEV,MAAQ,KACjDO,IACFJ,GAAUO,EAAER,UAAUU,IAAIf,GAAkBG,EAAKU,EAAEV,MAAQ,QAKjE,IAAIa,GAAKjG,SAASC,cAAc,QAChCgG,GAAGC,YAAcX,EACjBvF,SAASY,KAAKP,YAAY4F,OA2B9B,SAAUpG,GAER,GAAIsG,IACF,UACA,aACA,OACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,UACA,SACA,gBACA,QACA,SAGEC,IACF,GACA,EACA,KACA,KACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,KACA,EACA,GAGEC,EAAc,WAAY,MAAO,eAEjCC,GAEFC,WAAYF,EACZG,cAAe,SAASC,EAAQC,GAC9B,GAAIC,GAAI3G,SAAS4G,YAAY,QAG7B,OAFAD,GAAEE,UAAUJ,EAAQC,EAAO/F,UAAW,EAAO+F,EAAOI,aAAc,GAClEH,EAAEJ,WAAaD,EAAaC,WAAWI,GAChCA,GAETI,iBAAkB,SAASN,EAAQC,GACjCA,EAASA,GAAUM,OAAOC,OAAO,KAGjC,KAAK,GAAuCC,GADxCP,EAAIlF,KAAK+E,cAAcC,EAAQC,GAC1BtD,EAAI,EAAG+D,EAAOH,OAAOG,KAAKT,GAAYtD,EAAI+D,EAAKpE,OAAQK,IAC9D8D,EAAIC,EAAK/D,GACTuD,EAAEO,GAAKR,EAAOQ,EAEhB,OAAOP,IAETS,iBAAkB,SAASX,EAAQC,GACjCA,EAASA,GAAUM,OAAOC,OAAO,KAIjC,KAAI,GAAWnC,GAFX6B,EAAIlF,KAAK+E,cAAcC,EAAQC,GAE3BtD,EAAI,EAAMA,EAAI+C,EAAYpD,OAAQK,IACxC0B,EAAIqB,EAAY/C,GAChBuD,EAAE7B,GAAK4B,EAAO5B,IAAMsB,EAAehD,EAErCuD,GAAEU,QAAUX,EAAOW,SAAW,CAI9B,IAAIC,GAAW,CAsBf,OApBEA,GADEZ,EAAOY,SACEZ,EAAOY,SAEPX,EAAEU,QAAU,GAAM,EAI/BV,EAAEtE,EAAIsE,EAAE3D,QACR2D,EAAErE,EAAIqE,EAAE1D,QAGR0D,EAAEY,UAAYb,EAAOa,WAAa,EAClCZ,EAAEa,MAAQd,EAAOc,OAAS,EAC1Bb,EAAEc,OAASf,EAAOe,QAAU,EAC5Bd,EAAEW,SAAWA,EACbX,EAAEe,MAAQhB,EAAOgB,OAAS,EAC1Bf,EAAEgB,MAAQjB,EAAOiB,OAAS,EAC1BhB,EAAEiB,YAAclB,EAAOkB,aAAe,GACtCjB,EAAEkB,YAAcnB,EAAOmB,aAAe,EACtClB,EAAEmB,UAAYpB,EAAOoB,YAAa,EAClCnB,EAAEoB,QAAUrB,EAAOqB,SAAW,GACvBpB,GAIX9G,GAAMyG,aAAeA,GACpB3G,OAAOC,iBAcV,SAAUC,GAGR,QAASmI,KACP,GAAIC,EAAS,CACX,GAAIC,GAAI,GAAIC,IAEZ,OADAD,GAAEE,SAAWC,EACNH,EAEPzG,KAAK0F,QACL1F,KAAK6G,UATT,GAAIL,GAAUtI,OAAOwI,KAAOxI,OAAOwI,IAAII,UAAU1C,QAC7CwC,EAAc,WAAY,MAAO5G,MAAK+G,KAY1CR,GAAWO,WACTE,IAAK,SAASC,EAAM5F,GAClB,GAAIM,GAAI3B,KAAK0F,KAAKwB,QAAQD,EACtBtF,GAAI,GACN3B,KAAK6G,OAAOlF,GAAKN,GAEjBrB,KAAK0F,KAAKjF,KAAKwG,GACfjH,KAAK6G,OAAOpG,KAAKY,KAGrB8F,IAAK,SAASF,GACZ,MAAOjH,MAAK0F,KAAKwB,QAAQD,GAAQ,IAEnCG,SAAU,SAASH,GACjB,GAAItF,GAAI3B,KAAK0F,KAAKwB,QAAQD,EACtBtF,GAAI,KACN3B,KAAK0F,KAAK2B,OAAO1F,EAAG,GACpB3B,KAAK6G,OAAOQ,OAAO1F,EAAG,KAG1B2F,IAAK,SAASL,GACZ,GAAItF,GAAI3B,KAAK0F,KAAKwB,QAAQD,EAC1B,OAAOjH,MAAK6G,OAAOlF,IAErB4F,MAAO,WACLvH,KAAK0F,KAAKpE,OAAS,EACnBtB,KAAK6G,OAAOvF,OAAS,GAGvB8C,QAAS,SAASoD,EAAUC,GAC1BzH,KAAK6G,OAAOzC,QAAQ,SAASX,EAAG9B,GAC9B6F,EAASE,KAAKD,EAAShE,EAAGzD,KAAK0F,KAAK/D,GAAI3B,OACvCA,OAEL2G,SAAU,WACR,MAAO3G,MAAK0F,KAAKpE,SAIrBlD,EAAMmI,WAAaA,GAClBrI,OAAOC,iBAWV,SAAUC,GACR,GAuFIuJ,GAvFAC,GAEF,UACA,aACA,OACA,SACA,UACA,UACA,UACA,UACA,UACA,SACA,WACA,UACA,SACA,gBAEA,UAEA,YACA,QACA,SACA,WACA,QACA,QACA,cACA,cACA,YAEA,OACA,SACA,gBACA,QACA,QACA,QACA,YAEA,aACA,eACA,WAGEC,IAEF,GACA,EACA,KACA,KACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,KAEA,EAEA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,EAEA,GACA,KACA,KACA,EACA,EACA,EACA,EACA,cACA,GAGEC,EAAkD,mBAAvBC,oBAE3BlD,EAAezG,EAAMyG,aAiBrBmD,GACFC,QAAQ,EACRC,WAAY,GAAI9J,GAAMmI,WACtB4B,iBAAkB,GAAI/J,GAAMmI,WAC5B6B,SAAU7C,OAAOC,OAAO,MAGxB6C,aAAc9C,OAAOC,OAAO,MAC5B8C,mBACAC,YAEAC,eAEEC,MAAOC,UAAW,EAAGC,MAAO,IAC5BC,IAAKF,UAAW,EAAGC,MAAO,KAE5BE,gBASAC,eAAgB,SAASC,EAAMC,GAC7B,GAAIrK,GAAIqK,EACJC,EAAYtK,EAAEuK,MACdD,KACFA,EAAU7E,QAAQ,SAASc,GACrBvG,EAAEuG,KACJlF,KAAKoI,SAASlD,GAAKvG,EAAEuG,GAAG3B,KAAK5E,KAE9BqB,MACHA,KAAKqI,aAAaU,GAAQpK,EAC1BqB,KAAKsI,gBAAgB7H,KAAK9B,KAG9BwK,gBAAiB,SAASJ,EAAMC,GAC9B,GAAII,GAAM7D,OAAOC,OAAO,KACxB4D,GAAIV,UAAY,EAChBU,EAAIT,MAAQ3I,KAAKuI,SAASjH,MAC1B,KAAK,GAAW+H,GAAP1H,EAAI,EAAMA,EAAIqH,EAAOM,QAAQhI,OAAQK,IAC5C0H,EAAIL,EAAOM,QAAQ3H,GAAG4H,cACtBvJ,KAAKwI,cAAca,GAAKD,CAE1BpJ,MAAKuI,SAAS9H,KAAKuI,IAErBQ,SAAU,SAASjJ,EAASkJ,GAE1B,IAAK,GAAWC,GADZC,EAAI3J,KAAKsI,gBAAgBhH,OACpBK,EAAI,EAAYgI,EAAJhI,IAAW+H,EAAK1J,KAAKsI,gBAAgB3G,IAAKA,IAE7D+H,EAAGF,SAAS9B,KAAKgC,EAAInJ,EAASkJ,IAGlCG,WAAY,SAASrJ,GAEnB,IAAK,GAAWmJ,GADZC,EAAI3J,KAAKsI,gBAAgBhH,OACpBK,EAAI,EAAYgI,EAAJhI,IAAW+H,EAAK1J,KAAKsI,gBAAgB3G,IAAKA,IAE7D+H,EAAGE,WAAWlC,KAAKgC,EAAInJ,IAI3BkI,KAAM,SAASpH,GACbrB,KAAKmI,iBAAiBnB,IAAI3F,EAAQyE,UAAW6B,GAC7C3H,KAAK6J,UAAU,OAAQxI,IAEzByI,KAAM,SAASzI,GAEbA,EAAQ0I,KAAO,OACf/J,KAAKgK,iBAAiB3I,IAExBuH,GAAI,SAASvH,GACXrB,KAAK6J,UAAU,KAAMxI,GACrBrB,KAAKmI,iBAAiBf,OAAO/F,EAAQyE,YAEvCmE,OAAQ,SAAS5I,GACfA,EAAQ6I,cAAe,EACvBlK,KAAK6J,UAAU,KAAMxI,GACrBrB,KAAKmI,iBAAiBf,OAAO/F,EAAQyE,YAEvCqE,qBAAsB,SAAStH,EAAM8E,GACnC,GAAIyC,GAAiBvH,EAAKwH,SAC1B,IAAID,EAEF,IAAK,GAAW/F,GAAGiG,EAAIjB,EADnBkB,EAAKhF,OAAOG,KAAK0E,GACZzI,EAAI,EAAaA,EAAI4I,EAAGjJ,OAAQK,IAEvC0H,EAAIkB,EAAG5I,GACHyI,EAAef,GAAK,IAEtBhF,EAAIrE,KAAKwI,cAAca,GAEvBiB,EAAKjG,EAAIA,EAAEsE,MAAQ,GACnBhB,EAAgB2C,IAAM,IAM9BE,aAAc,SAASnJ,GAKrB,GAAI0I,GAAO1I,EAAQ0I,IAGnB,IAAa,eAATA,GAAkC,cAATA,GAAiC,gBAATA,GAAmC,kBAATA,EAK7E,GAJK1I,EAAQoJ,eACX9C,MAGE3H,KAAKiI,OAEP,IAAK,GAAWvG,GADZgJ,EAAQtM,EAAMkF,cAAcvE,KAAKsC,GAC5BM,EAAI,EAAMA,EAAI+I,EAAMpJ,OAAQK,IACnCD,EAAIgJ,EAAM/I,GACV3B,KAAKmK,qBAAqBzI,EAAGiG,OAG/B3H,MAAKmK,qBAAqB9I,EAAQsJ,cAAehD,EAIrD,KAAItG,EAAQoJ,aAAZ,CAGA,GAAIG,GAAK5K,KAAKoI,UAAYpI,KAAKoI,SAAS2B,EACpCa,IACFA,EAAGvJ,GAELA,EAAQoJ,cAAe,IAGzBI,OAAQ,SAAStL,EAAQ2J,GACvB,IAAK,GAA8BhE,GAA1BvD,EAAI,EAAGgI,EAAIT,EAAO5H,OAAgBqI,EAAJhI,IAAWuD,EAAIgE,EAAOvH,IAAKA,IAChE3B,KAAK8K,SAASvL,EAAQ2F,IAI1B6F,SAAU,SAASxL,EAAQ2J,GACzB,IAAK,GAA8BhE,GAA1BvD,EAAI,EAAGgI,EAAIT,EAAO5H,OAAgBqI,EAAJhI,IAAWuD,EAAIgE,EAAOvH,IAAKA,IAChE3B,KAAKgL,YAAYzL,EAAQ2F,IAG7B4F,SAAU,SAASvL,EAAQ0L,GACzB1L,EAAOV,iBAAiBoM,EAAWjL,KAAKkL,eAE1CF,YAAa,SAASzL,EAAQ0L,GAC5B1L,EAAO4L,oBAAoBF,EAAWjL,KAAKkL,eAW7CE,UAAW,SAASpG,EAAQ3D,GAC1B,GAAI6D,GAAIL,EAAac,iBAAiBX,EAAQ3D,EAI9C,OAHA6D,GAAEmG,eAAiBhK,EAAQgK,eAC3BnG,EAAEgF,aAAe7I,EAAQ6I,aACzBhF,EAAEoG,QAAUpG,EAAEoG,SAAWjK,EAAQ9B,OAC1B2F,GAGT2E,UAAW,SAAS7E,EAAQ3D,GAC1B,GAAI6D,GAAIlF,KAAKoL,UAAUpG,EAAQ3D,EAC/B,OAAOrB,MAAKZ,cAAc8F,IAS5BqG,WAAY,SAASlK,GAEnB,IAAK,GADgCgC,GAAjCmI,EAAYjG,OAAOC,OAAO,MACrB7D,EAAI,EAAGA,EAAIiG,EAAYtG,OAAQK,IACtC0B,EAAIuE,EAAYjG,GAChB6J,EAAUnI,GAAKhC,EAAQgC,IAAMwE,EAAelG,IAIlC,WAAN0B,GAAwB,kBAANA,IAChByE,GAAoB0D,EAAUnI,YAAc0E,sBAC9CyD,EAAUnI,GAAKmI,EAAUnI,GAAGoI,wBAQlC,OAHAD,GAAUH,eAAiB,WACzBhK,EAAQgK,kBAEHG,GAQTpM,cAAe,SAASiC,GACtB,GAAIP,GAAIO,EAAQiK,OAChB,IAAIxK,EAAG,CACLA,EAAE1B,cAAciC,EAGhB,IAAIqK,GAAQ1L,KAAKuL,WAAWlK,EAC5BqK,GAAMnM,OAASuB,EACfd,KAAKgK,iBAAiB0B,KAG1BC,eAAgB,WAEd,IAAK,GAAWzG,GAAG0G,EAAVjK,EAAI,EAAUA,EAAI3B,KAAK6I,aAAavH,OAAQK,IAAK,CACxDuD,EAAIlF,KAAK6I,aAAalH,GACtBiK,EAAK1G,EAAE2G,iBACP,KAAK,GAAWxC,GAAGuB,EAAVkB,EAAI,EAAUA,EAAI9L,KAAKuI,SAASjH,OAAQwK,IAE3CF,EAAGE,KACLzC,EAAIrJ,KAAKuI,SAASuD,GAClBlB,EAAKvB,EAAEnE,EAAE6E,MACLa,GACFA,EAAGlD,KAAK2B,EAAGnE,IAKnBlF,KAAK6I,aAAavH,OAAS,GAE7B0I,iBAAkB,SAASlL,GAEpBkB,KAAK6I,aAAavH,QACrByK,sBAAsB/L,KAAKgM,qBAE7BlN,EAAG+M,kBAAoB7L,KAAKmI,iBAAiBb,IAAIxI,EAAGgH,WACpD9F,KAAK6I,aAAapI,KAAK3B,IAG3BkJ,GAAWkD,aAAelD,EAAWwC,aAAajH,KAAKyE,GACvDA,EAAWgE,oBAAsBhE,EAAW2D,eAAepI,KAAKyE,GAChE5J,EAAM4J,WAAaA,EAWnB5J,EAAM6N,gBAAkB,SAASpJ,EAAMqJ,GACrC,GAAI7C,GAAI6C,EAAQ3C,cACZ4C,EAAMnE,EAAWQ,cAAca,EACnC,IAAI8C,EAAK,CACP,GAAIC,GAAapE,EAAWO,SAAS4D,EAAIxD,MAMzC,IALK9F,EAAKwJ,eACRrE,EAAWwB,SAAS3G,GACpBA,EAAKwJ,aAAe,GAGlBD,EAAY,CACd,GACIE,GADArI,EAAcmI,EAAWG,gBAAkBH,EAAWG,eAAelD,EAEzE,QAAOxG,EAAK7B,UACV,IAAKC,MAAKW,aACR0K,EAAazJ,CACf,MACA,KAAK5B,MAAKE,uBACRmL,EAAazJ,EAAKd,IACpB,MACA,SACEuK,EAAa,KAGbrI,GAAeqI,IAAeA,EAAWzK,aAAa,iBACxDyK,EAAWE,aAAa,eAAgBvI,GAGvCpB,EAAKwH,YACRxH,EAAKwH,cAEPxH,EAAKwH,UAAUhB,IAAMxG,EAAKwH,UAAUhB,IAAM,GAAK,EAC/CxG,EAAKwJ,eAEP,MAAOxM,SAAQsM,IAYjB/N,EAAMS,iBAAmB,SAASgE,EAAMqJ,EAASO,EAASC,GACpDD,IACFrO,EAAM6N,gBAAgBpJ,EAAMqJ,GAC5BrJ,EAAKhE,iBAAiBqN,EAASO,EAASC,KAa5CtO,EAAMuO,kBAAoB,SAAS9J,EAAMqJ,GACvC,GAAI7C,GAAI6C,EAAQ3C,cACZ4C,EAAMnE,EAAWQ,cAAca,EAgBnC,OAfI8C,KACEtJ,EAAKwJ,aAAe,GACtBxJ,EAAKwJ,eAEmB,IAAtBxJ,EAAKwJ,cACPrE,EAAW4B,WAAW/G,GAEpBA,EAAKwH,YACHxH,EAAKwH,UAAUhB,GAAK,EACtBxG,EAAKwH,UAAUhB,KAEfxG,EAAKwH,UAAUhB,GAAK,IAInBxJ,QAAQsM,IAWjB/N,EAAM+M,oBAAsB,SAAStI,EAAMqJ,EAASO,EAASC,GACvDD,IACFrO,EAAMuO,kBAAkB9J,EAAMqJ,GAC9BrJ,EAAKsI,oBAAoBe,EAASO,EAASC,MAG9CxO,OAAOC,iBAWV,SAAWC,GACT,GAAI4J,GAAa5J,EAAM4J,WACnBE,EAAaF,EAAWE,WAExB0E,EAAa,GAEbC,GAAoB,EAAG,EAAG,EAAG,GAE7BC,GAAc,CAClB,KACEA,EAA+D,IAAjD,GAAIC,YAAW,QAASnH,QAAS,IAAIA,QACnD,MAAOV,IAGT,GAAI8H,IACFC,WAAY,EACZC,aAAc,QACdhE,QACE,YACA,YACA,WAEFI,SACE,OACA,KACA,QAEFE,SAAU,SAASjK,GACjByI,EAAW6C,OAAOtL,EAAQS,KAAKkJ,SAEjCU,WAAY,SAASrK,GACfA,IAAWhB,UAGfyJ,EAAW+C,SAASxL,EAAQS,KAAKkJ,SAEnCiE,eAEAC,0BAA2B,SAAS/L,GAGlC,IAAK,GAA2BP,GAF5BuM,EAAMrN,KAAKmN,YACXvM,EAAIS,EAAQE,QAASV,EAAIQ,EAAQG,QAC5BG,EAAI,EAAGgI,EAAI0D,EAAI/L,OAAeqI,EAAJhI,IAAUb,EAAIuM,EAAI1L,IAAKA,IAAK,CAE7D,GAAI2L,GAAKC,KAAKC,IAAI5M,EAAIE,EAAEF,GAAI6M,EAAKF,KAAKC,IAAI3M,EAAIC,EAAED,EAChD,IAAU+L,GAANU,GAA0BV,GAANa,EACtB,OAAO,IAIbC,aAAc,SAASrM,GACrB,GAAI6D,GAAI8C,EAAWuD,WAAWlK,EAQ9B,OAPA6D,GAAEY,UAAY9F,KAAKiN,WACnB/H,EAAEmB,WAAY,EACdnB,EAAEiB,YAAcnG,KAAKkN,aACrBhI,EAAEoB,QAAU,QACPwG,IACH5H,EAAEU,QAAUiH,EAAiB3H,EAAEyI,QAAU,GAEpCzI,GAET0I,UAAW,SAASvM,GAClB,IAAKrB,KAAKoN,0BAA0B/L,GAAU,CAC5C,GAAIgC,GAAI6E,EAAWf,IAAInH,KAAKiN,WAGxB5J,IACFrD,KAAK6N,QAAQxM,EAEf,IAAI6D,GAAIlF,KAAK0N,aAAarM,EAC1B6D,GAAE3F,OAASnB,EAAMgD,WAAWC,GAC5B6G,EAAWlB,IAAIhH,KAAKiN,WAAY/H,EAAE3F,QAClCyI,EAAWS,KAAKvD,KAGpB4I,UAAW,SAASzM,GAClB,IAAKrB,KAAKoN,0BAA0B/L,GAAU,CAC5C,GAAI9B,GAAS2I,EAAWZ,IAAItH,KAAKiN,WACjC,IAAI1N,EAAQ,CACV,GAAI2F,GAAIlF,KAAK0N,aAAarM,EAC1B6D,GAAE3F,OAASA,EAEO,IAAd2F,EAAEU,SACJoC,EAAWiC,OAAO/E,GAClBlF,KAAK+N,gBAEL/F,EAAW8B,KAAK5E,MAKxB2I,QAAS,SAASxM,GAChB,IAAKrB,KAAKoN,0BAA0B/L,GAAU,CAC5C,GAAI6D,GAAIlF,KAAK0N,aAAarM,EAC1B6D,GAAE8I,cAAgB5P,EAAMgD,WAAWC,GACnC6D,EAAE3F,OAAS2I,EAAWZ,IAAItH,KAAKiN,YAC/BjF,EAAWY,GAAG1D,GACdlF,KAAK+N,iBAGTA,aAAc,WACZ7F,EAAW,UAAUlI,KAAKiN,aAI9B7O,GAAM4O,YAAcA,GACnB9O,OAAOC,iBAWV,SAAUC,GACR,GAAI4J,GAAa5J,EAAM4J,WAEnBE,GADa9J,EAAMkF,cAAchD,WAAWiD,KAAKnF,EAAMkF,eAC1C0E,EAAWE,YAGxB+F,GAFWC,MAAMpH,UAAUvC,IAAImD,KAAKnE,KAAK2K,MAAMpH,UAAUvC,KAEzC,MAChB4J,EAAsB,IACtBC,EAAa,GAIbC,GAAmB,EAGnBC,GACFrG,QAAQ,EACRiB,QACE,aACA,YACA,WACA,eAEFI,SACE,OACA,KACA,QAEFE,SAAU,SAASjK,EAAQkK,IACrBzJ,KAAKiI,OAASwB,GAAWA,IAC3BzB,EAAW6C,OAAOtL,EAAQS,KAAKkJ,SAGnCU,WAAY,SAASrK,GACdS,KAAKiI,QACRD,EAAW+C,SAASxL,EAAQS,KAAKkJ,SAGrCqF,aACEC,QAAS,OACTC,UAAW,QACXC,UAAW,SAEbC,wBAAyB,SAAS1K,GAChC,GAAInD,GAAImD,EACJ2K,EAAK5O,KAAKuO,WACd,OAAIzN,KAAM8N,EAAGJ,QACJ,OACE1N,IAAM8N,EAAGH,UACX,IACE3N,IAAM8N,EAAGF,UACX,IAEA,MAGXxB,aAAc,QACd2B,WAAY,KACZC,eAAgB,SAASC,GACvB,MAAO/O,MAAK6O,aAAeE,EAAQC,YAErCC,gBAAiB,SAASF,IAEM,IAA1B7G,EAAWvB,YAA+C,IAA1BuB,EAAWvB,YAAoBuB,EAAWf,IAAI,MAChFnH,KAAK6O,WAAaE,EAAQC,WAC1BhP,KAAKkP,SAAWC,EAAGJ,EAAQxN,QAAS6N,EAAGL,EAAQvN,SAC/CxB,KAAKqP,UAAY,KACjBrP,KAAKsP,0BAGTC,qBAAsB,SAASC,GACzBA,EAAUnJ,YACZrG,KAAK6O,WAAa,KAClB7O,KAAKkP,QAAU,KACflP,KAAKyP,oBAGTC,WAAY,EACZC,QAAS,KACTF,gBAAiB,WACf,GAAI7E,GAAK,WACP5K,KAAK0P,WAAa,EAClB1P,KAAK2P,QAAU,MACfpM,KAAKvD,KACPA,MAAK2P,QAAUC,WAAWhF,EAAIuD,IAEhCmB,sBAAuB,WACjBtP,KAAK2P,SACPE,aAAa7P,KAAK2P,UAGtBG,cAAe,SAAS/F,GACtB,GAAIgG,GAAM,CAIV,QAHa,eAAThG,GAAkC,cAATA,KAC3BgG,EAAM,GAEDA,GAET3O,WAAY,SAAS4O,EAAOC,GAC1B,GAAoC,eAAhCjQ,KAAKkQ,kBAAkBnG,KAAuB,CAChD,GAAI/J,KAAK8O,eAAekB,GAAQ,CAC9B,GAAIG,IACF5O,QAASyO,EAAMzO,QACfC,QAASwO,EAAMxO,QACfzC,KAAMiB,KAAKkQ,kBAAkBnR,KAC7BQ,OAAQS,KAAKkQ,kBAAkB3Q,OAEjC,OAAOnB,GAAMgD,WAAW+O,GAExB,MAAO/R,GAAMgD,WAAW4O,GAI5B,MAAO9H,GAAWZ,IAAI2I,IAExBG,eAAgB,SAASrB,GACvB,GAAIsB,GAAMrQ,KAAKkQ,kBACXhL,EAAI8C,EAAWuD,WAAWwD,GAI1BkB,EAAK/K,EAAEY,UAAYiJ,EAAQC,WAAa,CAC5C9J,GAAE3F,OAASS,KAAKoB,WAAW2N,EAASkB,GACpC/K,EAAEhG,SAAU,EACZgG,EAAEG,YAAa,EACfH,EAAEoL,OAAStQ,KAAK0P,WAChBxK,EAAEU,QAAU5F,KAAK8P,cAAcO,EAAItG,MACnC7E,EAAEa,MAAQgJ,EAAQwB,eAAiBxB,EAAQyB,SAAW,EACtDtL,EAAEc,OAAS+I,EAAQ0B,eAAiB1B,EAAQ2B,SAAW,EACvDxL,EAAEW,SAAWkJ,EAAQ4B,aAAe5B,EAAQ6B,OAAS,GACrD1L,EAAEmB,UAAYrG,KAAK8O,eAAeC,GAClC7J,EAAEiB,YAAcnG,KAAKkN,aACrBhI,EAAEoB,QAAU,OAEZ,IAAIuK,GAAO7Q,IAMX,OALAkF,GAAEmG,eAAiB,WACjBwF,EAAKxB,WAAY,EACjBwB,EAAK3B,QAAU,KACfmB,EAAIhF,kBAECnG,GAET4L,eAAgB,SAASzP,EAAS0P,GAChC,GAAIC,GAAK3P,EAAQ4P,cACjBjR,MAAKkQ,kBAAoB7O,CACzB,KAAK,GAAWP,GAAGuC,EAAV1B,EAAI,EAASA,EAAIqP,EAAG1P,OAAQK,IACnCb,EAAIkQ,EAAGrP,GACP0B,EAAIrD,KAAKoQ,eAAetP,GACH,eAAjBO,EAAQ0I,MACV7B,EAAWlB,IAAI3D,EAAEyC,UAAWzC,EAAE9D,QAE5B2I,EAAWf,IAAI9D,EAAEyC,YACnBiL,EAAWrJ,KAAK1H,KAAMqD,IAEH,aAAjBhC,EAAQ0I,MAAuB1I,EAAQ6P,UACzClR,KAAKmR,eAAe9N,IAM1B+N,aAAc,SAAS/P,GACrB,GAAIrB,KAAKkP,QAAS,CAChB,GAAIa,GACA9L,EAAc7F,EAAMkF,cAAc7B,gBAAgBJ,GAClDgQ,EAAarR,KAAK2O,wBAAwB1K,EAC9C,IAAmB,SAAfoN,EAEFtB,GAAM,MACD,IAAmB,OAAfsB,EAETtB,GAAM,MACD,CACL,GAAIjP,GAAIO,EAAQ4P,eAAe,GAE3BhP,EAAIoP,EACJC,EAAoB,MAAfD,EAAqB,IAAM,IAChCE,EAAKhE,KAAKC,IAAI1M,EAAE,SAAWmB,GAAKjC,KAAKkP,QAAQjN,IAC7CuP,EAAMjE,KAAKC,IAAI1M,EAAE,SAAWwQ,GAAMtR,KAAKkP,QAAQoC,GAGnDvB,GAAMwB,GAAMC,EAEd,MAAOzB,KAGX0B,UAAW,SAASC,EAAMzK,GACxB,IAAK,GAA4BnG,GAAxBa,EAAI,EAAGgI,EAAI+H,EAAKpQ,OAAeqI,EAAJhI,IAAUb,EAAI4Q,EAAK/P,IAAKA,IAC1D,GAAIb,EAAEkO,aAAe/H,EACnB,OAAO,GAUb0K,cAAe,SAAStQ,GACtB,GAAI2P,GAAK3P,EAAQuQ,OAGjB,IAAI1J,EAAWvB,YAAcqK,EAAG1P,OAAQ,CACtC,GAAIiB,KACJ2F,GAAW9D,QAAQ,SAASyN,EAAOC,GAIjC,GAAY,IAARA,IAAc9R,KAAKyR,UAAUT,EAAIc,EAAM,GAAI,CAC7C,GAAIzO,GAAIwO,CACRtP,GAAE9B,KAAK4C,KAERrD,MACHuC,EAAE6B,QAAQ,SAASf,GACjBrD,KAAKiK,OAAO5G,GACZ6E,EAAWd,OAAO/D,EAAEyC,eAI1BiM,WAAY,SAAS1Q,GACnBrB,KAAK2R,cAActQ,GACnBrB,KAAKiP,gBAAgB5N,EAAQ4P,eAAe,IAC5CjR,KAAKgS,gBAAgB3Q,GAChBrB,KAAKqP,YACRrP,KAAK0P,aACL1P,KAAK8Q,eAAezP,EAASrB,KAAKyI,QAGtCA,KAAM,SAAS+G,GACbxH,EAAWS,KAAK+G,IAElByC,UAAW,SAAS5Q,GAClB,GAAIgN,EAGEhN,EAAQgE,YACVrF,KAAK8Q,eAAezP,EAASrB,KAAK8J,UAGpC,IAAK9J,KAAKqP,WAQH,GAAIrP,KAAKkP,QAAS,CACvB,GAAIpO,GAAIO,EAAQ4P,eAAe,GAC3B3D,EAAKxM,EAAES,QAAUvB,KAAKkP,QAAQC,EAC9B1B,EAAK3M,EAAEU,QAAUxB,KAAKkP,QAAQE,EAC9B8C,EAAK3E,KAAK4E,KAAK7E,EAAKA,EAAKG,EAAKA,EAC9ByE,IAAM9D,IACRpO,KAAKoS,YAAY/Q,GACjBrB,KAAKqP,WAAY,EACjBrP,KAAKkP,QAAU,WAfM,QAAnBlP,KAAKqP,WAAsBrP,KAAKoR,aAAa/P,GAC/CrB,KAAKqP,WAAY,GAEjBrP,KAAKqP,WAAY,EACjBhO,EAAQgK,iBACRrL,KAAK8Q,eAAezP,EAASrB,KAAK8J,QAe1CA,KAAM,SAAS0F,GACbxH,EAAW8B,KAAK0F,IAElB6C,SAAU,SAAShR,GACjBrB,KAAKgS,gBAAgB3Q,GACrBrB,KAAK8Q,eAAezP,EAASrB,KAAK4I,KAEpCA,GAAI,SAAS4G,GACXA,EAAUxB,cAAgB5P,EAAMgD,WAAWoO,GAC3CxH,EAAWY,GAAG4G,IAEhBvF,OAAQ,SAASuF,GACfxH,EAAWiC,OAAOuF,IAEpB4C,YAAa,SAAS/Q,GACpBA,EAAQ6P,SAAU,EAClBlR,KAAK8Q,eAAezP,EAASrB,KAAKiK,SAEpCkH,eAAgB,SAAS3B,GACvBtH,EAAW,UAAUsH,EAAU1J,WAC/B9F,KAAKuP,qBAAqBC,IAG5BwC,gBAAiB,SAAS3Q,GACxB,GAAIgM,GAAMjP,EAAM4O,YAAYG,YACxBrM,EAAIO,EAAQ4P,eAAe,EAE/B,IAAIjR,KAAK8O,eAAehO,GAAI,CAE1B,GAAIwR,IAAM1R,EAAGE,EAAES,QAASV,EAAGC,EAAEU,QAC7B6L,GAAI5M,KAAK6R,EACT,IAAI1H,GAAK,SAAUyC,EAAKiF,GACtB,GAAI3Q,GAAI0L,EAAInG,QAAQoL,EAChB3Q,GAAI,IACN0L,EAAIhG,OAAO1F,EAAG,IAEf4B,KAAK,KAAM8J,EAAKiF,EACnB1C,YAAWhF,EAAIqD,KAKrB7P,GAAMkQ,YAAcA,GACnBpQ,OAAOC,iBAWV,SAAUC,GACR,GAAI4J,GAAa5J,EAAM4J,WACnBE,EAAaF,EAAWE,WACxBqK,EAAkBrU,OAAOsU,gBAAwE,gBAA/CtU,QAAOsU,eAAeC,qBACxEC,GACFxJ,QACE,gBACA,gBACA,cACA,mBAEFM,SAAU,SAASjK,GACjByI,EAAW6C,OAAOtL,EAAQS,KAAKkJ,SAEjCU,WAAY,SAASrK,GACfA,IAAWhB,UAGfyJ,EAAW+C,SAASxL,EAAQS,KAAKkJ,SAEnCyJ,eACE,GACA,cACA,QACA,MACA,SAEFjF,aAAc,SAASrM,GACrB,GAAI6D,GAAI7D,CAMR,OALA6D,GAAI8C,EAAWuD,WAAWlK,GACtBkR,IACFrN,EAAEiB,YAAcnG,KAAK2S,cAActR,EAAQ8E,cAE7CjB,EAAEoB,QAAU,KACLpB,GAET0N,QAAS,SAAS3C,GAChB/H,EAAW,UAAU+H,IAEvB4C,cAAe,SAASxR,GACtB,GAAI6D,GAAIlF,KAAK0N,aAAarM,EAC1B6D,GAAE3F,OAASnB,EAAMgD,WAAWC,GAC5B6G,EAAWlB,IAAI3F,EAAQyE,UAAWZ,EAAE3F,QACpCyI,EAAWS,KAAKvD,IAElB4N,cAAe,SAASzR,GACtB,GAAI9B,GAAS2I,EAAWZ,IAAIjG,EAAQyE,UACpC,IAAIvG,EAAQ,CACV,GAAI2F,GAAIlF,KAAK0N,aAAarM,EAC1B6D,GAAE3F,OAASA,EACXyI,EAAW8B,KAAK5E,KAGpB6N,YAAa,SAAS1R,GACpB,GAAI6D,GAAIlF,KAAK0N,aAAarM,EAC1B6D,GAAE8I,cAAgB5P,EAAMgD,WAAWC,GACnC6D,EAAE3F,OAAS2I,EAAWZ,IAAIpC,EAAEY,WAC5BkC,EAAWY,GAAG1D,GACdlF,KAAK4S,QAAQvR,EAAQyE,YAEvBkN,gBAAiB,SAAS3R,GACxB,GAAI6D,GAAIlF,KAAK0N,aAAarM,EAC1B6D,GAAE8I,cAAgB5P,EAAMgD,WAAWC,GACnC6D,EAAE3F,OAAS2I,EAAWZ,IAAIpC,EAAEY,WAC5BkC,EAAWiC,OAAO/E,GAClBlF,KAAK4S,QAAQvR,EAAQyE,YAIzB1H,GAAMsU,SAAWA,GAChBxU,OAAOC,iBAWV,SAAUC,GACR,GAAI4J,GAAa5J,EAAM4J,WACnBE,EAAaF,EAAWE,WACxB+K,GACF/J,QACE,cACA,cACA,YACA,iBAEFwE,aAAc,SAASrM,GACrB,GAAI6D,GAAI8C,EAAWuD,WAAWlK,EAE9B,OADA6D,GAAEoB,QAAU,UACLpB,GAETsE,SAAU,SAASjK,GACjByI,EAAW6C,OAAOtL,EAAQS,KAAKkJ,SAEjCU,WAAY,SAASrK,GACfA,IAAWhB,UAGfyJ,EAAW+C,SAASxL,EAAQS,KAAKkJ,SAEnC0J,QAAS,SAAS3C,GAChB/H,EAAW,UAAU+H,IAEvBiD,YAAa,SAAS7R,GACpB,GAAI6D,GAAIlF,KAAK0N,aAAarM,EAC1B6D,GAAE3F,OAASnB,EAAMgD,WAAWC,GAC5B6G,EAAWlB,IAAI9B,EAAEY,UAAWZ,EAAE3F,QAC9ByI,EAAWS,KAAKvD,IAElBiO,YAAa,SAAS9R,GACpB,GAAI9B,GAAS2I,EAAWZ,IAAIjG,EAAQyE,UACpC,IAAIvG,EAAQ,CACV,GAAI2F,GAAIlF,KAAK0N,aAAarM,EAC1B6D,GAAE3F,OAASA,EACXyI,EAAW8B,KAAK5E,KAGpBkO,UAAW,SAAS/R,GAClB,GAAI6D,GAAIlF,KAAK0N,aAAarM,EAC1B6D,GAAE8I,cAAgB5P,EAAMgD,WAAWC,GACnC6D,EAAE3F,OAAS2I,EAAWZ,IAAIpC,EAAEY,WAC5BkC,EAAWY,GAAG1D,GACdlF,KAAK4S,QAAQvR,EAAQyE,YAEvBuN,cAAe,SAAShS,GACtB,GAAI6D,GAAIlF,KAAK0N,aAAarM,EAC1B6D,GAAE8I,cAAgB5P,EAAMgD,WAAWC,GACnC6D,EAAE3F,OAAS2I,EAAWZ,IAAIpC,EAAEY,WAC5BkC,EAAWiC,OAAO/E,GAClBlF,KAAK4S,QAAQvR,EAAQyE,YAIzB1H,GAAM6U,cAAgBA,GACrB/U,OAAOC,iBAgBV,SAAUC,GAER,GAAI4J,GAAa5J,EAAM4J,WACnBsL,EAAMpV,OAAOqV,SAEbrV,QAAOsV,aACTxL,EAAWc,eAAe,UAAW1K,EAAM6U,eAClCK,EAAIG,iBACbzL,EAAWc,eAAe,KAAM1K,EAAMsU,WAEtC1K,EAAWc,eAAe,QAAS1K,EAAM4O,aACb0G,SAAxBxV,OAAOyV,cACT3L,EAAWc,eAAe,QAAS1K,EAAMkQ,aAK7C,IAAIsF,GAAKL,UAAUM,UACf5L,EAAS2L,EAAGE,MAAM,qBAAuB,gBAAkB5V,OAE/D8J,GAAWC,OAASA,EACpB7J,EAAMkQ,YAAYrG,OAASA,EAE3BD,EAAWwB,SAASjL,UAAU,IAC7BL,OAAOC,iBA2GT,SAAUC,GACR,GAAI4J,GAAa5J,EAAM4J,WACnBnD,EAAezG,EAAMyG,aACrBqD,EAAa,GAAI9J,GAAMmI,WACvBwN,GACF7K,QACE,OACA,OACA,MAEFI,SACC,aACA,QACA,SACA,SACA,YAEDiD,gBACEwH,MAAS,OACTC,OAAU,QACVC,OAAU,SAEZC,iBAAkB,EAClBC,SAAU,SAASC,GACjB,MAAOA,GAAU,EAAI,EAAI,IAE3BC,kBAAmB,SAASC,EAAKC,GAC/B,GAAI3T,GAAI,EAAGC,EAAI,CAKf,OAJIyT,IAAOC,IACT3T,EAAI2T,EAAIC,MAAQF,EAAIE,MACpB3T,EAAI0T,EAAIE,MAAQH,EAAIG,QAEd7T,EAAGA,EAAGC,EAAGA,IAEnB6T,UAAW,SAAS1P,EAAQ3D,EAASsT,GACnC,GAAI7T,GAAI6T,EACJpS,EAAIvC,KAAKqU,kBAAkBvT,EAAE8T,UAAWvT,GACxC6Q,EAAKlS,KAAKqU,kBAAkBvT,EAAE+T,cAAexT,EACjD,IAAI6Q,EAAGtR,EACLE,EAAEgU,WAAa9U,KAAKmU,SAASjC,EAAGtR,OAC3B,IAAe,WAAXoE,EACT,MAEF,IAAIkN,EAAGrR,EACLC,EAAEiU,WAAa/U,KAAKmU,SAASjC,EAAGrR,OAC3B,IAAe,WAAXmE,EACT,MAEF,IAAIgQ,IACF9V,SAAS,EACTmG,YAAY,EACZ4P,UAAWnU,EAAEmU,UACbjH,cAAe3M,EAAQ2M,cACvB7H,YAAa9E,EAAQ8E,YACrBL,UAAWzE,EAAQyE,UACnBQ,QAAS,QAEI,YAAXtB,IACFgQ,EAAapU,EAAIS,EAAQT,EACzBoU,EAAa1H,GAAK/K,EAAE3B,EACpBoU,EAAaE,IAAMhD,EAAGtR,EACtBoU,EAAazT,QAAUF,EAAQE,QAC/ByT,EAAaR,MAAQnT,EAAQmT,MAC7BQ,EAAaG,QAAU9T,EAAQ8T,QAC/BH,EAAaF,WAAahU,EAAEgU,YAEf,WAAX9P,IACFgQ,EAAavH,GAAKlL,EAAE1B,EACpBmU,EAAaI,IAAMlD,EAAGrR,EACtBmU,EAAanU,EAAIQ,EAAQR,EACzBmU,EAAaxT,QAAUH,EAAQG,QAC/BwT,EAAaP,MAAQpT,EAAQoT,MAC7BO,EAAaK,QAAUhU,EAAQgU,QAC/BL,EAAaD,WAAajU,EAAEiU,WAE9B,IAAI7P,GAAIL,EAAaS,iBAAiBN,EAAQgQ,EAC9ClU,GAAEwU,WAAWlW,cAAc8F,IAE7BuD,KAAM,SAASpH,GACb,GAAIA,EAAQgF,YAAsC,UAAxBhF,EAAQ8E,YAA8C,IAApB9E,EAAQuE,SAAgB,GAAO,CACzF,GAAIvC,IACFuR,UAAWvT,EACXiU,WAAYjU,EAAQ9B,OACpB0V,aACAJ,cAAe,KACfC,WAAY,EACZC,WAAY,EACZQ,UAAU,EAEZrN,GAAWlB,IAAI3F,EAAQyE,UAAWzC,KAGtCyG,KAAM,SAASzI,GACb,GAAIgC,GAAI6E,EAAWZ,IAAIjG,EAAQyE,UAC/B,IAAIzC,EAAG,CACL,IAAKA,EAAEkS,SAAU,CACf,GAAIhT,GAAIvC,KAAKqU,kBAAkBhR,EAAEuR,UAAWvT,GACxCyI,EAAOvH,EAAE3B,EAAI2B,EAAE3B,EAAI2B,EAAE1B,EAAI0B,EAAE1B,CAE3BiJ,GAAO9J,KAAKkU,mBACd7Q,EAAEkS,UAAW,EACblS,EAAEwR,cAAgBxR,EAAEuR,UACpB5U,KAAK0U,UAAU,aAAcrT,EAASgC,IAGtCA,EAAEkS,WACJvV,KAAK0U,UAAU,QAASrT,EAASgC,GACjCrD,KAAK0U,UAAU,SAAUrT,EAASgC,GAClCrD,KAAK0U,UAAU,SAAUrT,EAASgC,IAEpCA,EAAEwR,cAAgBxT,IAGtBuH,GAAI,SAASvH,GACX,GAAIgC,GAAI6E,EAAWZ,IAAIjG,EAAQyE,UAC3BzC,KACEA,EAAEkS,UACJvV,KAAK0U,UAAU,WAAYrT,EAASgC,GAEtC6E,EAAWd,OAAO/F,EAAQyE,aAIhCkC,GAAWmB,gBAAgB,QAAS4K,IACnC7V,OAAOC,iBAuDX,SAAUC,GACR,GAAI4J,GAAa5J,EAAM4J,WACnBnD,EAAezG,EAAMyG,aACrB2Q,GAEFC,WAAY,IAEZvB,iBAAkB,GAClBhL,QACE,OACA,OACA,MAEFI,SACE,OACA,YACA,WAEFoM,YAAa,KACbC,QAAS,KACTC,MAAO,WACL,GAAIJ,GAAOK,KAAKC,MAAQ9V,KAAK0V,YAAYK,UACrChM,EAAO/J,KAAKgW,KAAO,YAAc,MACrChW,MAAKiW,SAASlM,EAAMyL,GACpBxV,KAAKgW,MAAO,GAEd/L,OAAQ,WACNiM,cAAclW,KAAK2V,SACf3V,KAAKgW,MACPhW,KAAKiW,SAAS,WAEhBjW,KAAKgW,MAAO,EACZhW,KAAK0V,YAAc,KACnB1V,KAAKT,OAAS,KACdS,KAAK2V,QAAU,MAEjBlN,KAAM,SAASpH,GACTA,EAAQgF,YAAcrG,KAAK0V,cAC7B1V,KAAK0V,YAAcrU,EACnBrB,KAAKT,OAAS8B,EAAQ9B,OACtBS,KAAK2V,QAAUQ,YAAYnW,KAAK4V,MAAMrS,KAAKvD,MAAOA,KAAKyV,cAG3D7M,GAAI,SAASvH,GACPrB,KAAK0V,aAAe1V,KAAK0V,YAAY5P,YAAczE,EAAQyE,WAC7D9F,KAAKiK,UAGTH,KAAM,SAASzI,GACb,GAAIrB,KAAK0V,aAAe1V,KAAK0V,YAAY5P,YAAczE,EAAQyE,UAAW,CACxE,GAAIlF,GAAIS,EAAQE,QAAUvB,KAAK0V,YAAYnU,QACvCV,EAAIQ,EAAQG,QAAUxB,KAAK0V,YAAYlU,OACtCZ,GAAIA,EAAIC,EAAIA,EAAKb,KAAKkU,kBACzBlU,KAAKiK,WAIXgM,SAAU,SAASjR,EAAQoR,GACzB,GAAI/S,IACFnE,SAAS,EACTmG,YAAY,EACZc,YAAanG,KAAK0V,YAAYvP,YAC9BL,UAAW9F,KAAK0V,YAAY5P,UAC5BlF,EAAGZ,KAAK0V,YAAYnU,QACpBV,EAAGb,KAAK0V,YAAYlU,QACpB8E,QAAS,OAEP8P,KACF/S,EAAEgT,SAAWD,EAEf,IAAIlR,GAAIL,EAAaS,iBAAiBN,EAAQ3B,EAC9CrD,MAAKT,OAAOH,cAAc8F,IAG9B8C,GAAWmB,gBAAgB,OAAQqM,IAClCtX,OAAOC,iBAwCV,SAAUC,GACR,GAAI4J,GAAa5J,EAAM4J,WACnBnD,EAAezG,EAAMyG,aACrBqD,EAAa,GAAI9J,GAAMmI,WACvB+P,GACFpN,QACE,OACA,MAEFI,SACE,OAEFb,KAAM,SAASpH,GACTA,EAAQgF,YAAchF,EAAQ6I,cAChChC,EAAWlB,IAAI3F,EAAQyE,WACrBvG,OAAQ8B,EAAQ9B,OAChBqG,QAASvE,EAAQuE,QACjBhF,EAAGS,EAAQE,QACXV,EAAGQ,EAAQG,WAIjB+U,UAAW,SAASrR,EAAGsR,GACrB,MAAsB,UAAlBtR,EAAEiB,YAEyB,IAAtBqQ,EAAU5Q,SAEXV,EAAEgF,cAEZtB,GAAI,SAASvH,GACX,GAAIoV,GAAQvO,EAAWZ,IAAIjG,EAAQyE,UACnC,IAAI2Q,GAASzW,KAAKuW,UAAUlV,EAASoV,GAAQ,CAE3C,GAAI3V,GAAI1C,EAAMkF,cAActB,IAAIyU,EAAMlX,OAAQ8B,EAAQ2M,cACtD,IAAIlN,EAAG,CACL,GAAIoE,GAAIL,EAAaS,iBAAiB,OACpCpG,SAAS,EACTmG,YAAY,EACZzE,EAAGS,EAAQE,QACXV,EAAGQ,EAAQG,QACX8O,OAAQjP,EAAQiP,OAChBnK,YAAa9E,EAAQ8E,YACrBL,UAAWzE,EAAQyE,UACnB4Q,OAAQrV,EAAQqV,OAChBC,QAAStV,EAAQsV,QACjBC,QAASvV,EAAQuV,QACjBC,SAAUxV,EAAQwV,SAClBvQ,QAAS,OAEXxF,GAAE1B,cAAc8F,IAGpBgD,EAAWd,OAAO/F,EAAQyE,YAI9BjB,GAAaC,WAAa,SAASI,GACjC,MAAO,YACLA,EAAEgF,cAAe,EACjBhC,EAAWd,OAAOlC,EAAEY,aAGxBkC,EAAWmB,gBAAgB,MAAOmN,IACjCpY,OAAOC,iBAkCV,SAAW2Y,GACP,YAiEA,SAASC,GAAOC,EAAWC,GACvB,IAAKD,EACD,KAAM,IAAIE,OAAM,WAAaD,GAIrC,QAASE,GAAeC,GACpB,MAAQA,IAAM,IAAY,IAANA,EAMxB,QAASC,GAAaD,GAClB,MAAe,MAAPA,GACI,IAAPA,GACO,KAAPA,GACO,KAAPA,GACO,MAAPA,GACAA,GAAM,MAAU,yGAAyGlQ,QAAQ5C,OAAOgT,aAAaF,IAAO,EAKrK,QAASG,GAAiBH,GACtB,MAAe,MAAPA,GAAsB,KAAPA,GAAsB,OAAPA,GAA0B,OAAPA,EAK7D,QAASI,GAAkBJ,GACvB,MAAe,MAAPA,GAAsB,KAAPA,GAClBA,GAAM,IAAY,IAANA,GACZA,GAAM,IAAY,KAANA,EAGrB,QAASK,GAAiBL,GACtB,MAAe,MAAPA,GAAsB,KAAPA,GAClBA,GAAM,IAAY,IAANA,GACZA,GAAM,IAAY,KAANA,GACZA,GAAM,IAAY,IAANA,EAKrB,QAASM,GAAUzH,GACf,MAAe,SAAPA,EAKZ,QAAS0H,KACL,KAAerW,EAARqH,GAAkB0O,EAAarO,EAAO4O,WAAWjP,OACnDA,EAIT,QAASkP,KACL,GAAIpB,GAAOW,CAGX,KADAX,EAAQ9N,IACOrH,EAARqH,IACHyO,EAAKpO,EAAO4O,WAAWjP,GACnB8O,EAAiBL,OACfzO,CAMV,OAAOK,GAAO8O,MAAMrB,EAAO9N,GAG/B,QAASoP,KACL,GAAItB,GAAOxG,EAAIlG,CAoBf,OAlBA0M,GAAQ9N,EAERsH,EAAK4H,IAKD9N,EADc,IAAdkG,EAAG3O,OACI0W,EAAMC,WACNP,EAAUzH,GACV+H,EAAME,QACC,SAAPjI,EACA+H,EAAMG,YACC,SAAPlI,GAAwB,UAAPA,EACjB+H,EAAMI,eAENJ,EAAMC,YAIblO,KAAMA,EACN8H,MAAO5B,EACPoI,OAAQ5B,EAAO9N,IAOvB,QAAS2P,KACL,GAEIC,GAEAC,EAJA/B,EAAQ9N,EACR8P,EAAOzP,EAAO4O,WAAWjP,GAEzB+P,EAAM1P,EAAOL,EAGjB,QAAQ8P,GAGR,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IAED,QADE9P,GAEEoB,KAAMiO,EAAMW,WACZ9G,MAAOvN,OAAOgT,aAAamB,GAC3BJ,OAAQ5B,EAAO9N,GAGvB,SAII,GAHA4P,EAAQvP,EAAO4O,WAAWjP,EAAQ,GAGpB,KAAV4P,EACA,OAAQE,GACR,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KAED,MADA9P,IAAS,GAELoB,KAAMiO,EAAMW,WACZ9G,MAAOvN,OAAOgT,aAAamB,GAAQnU,OAAOgT,aAAaiB,GACvDF,OAAQ5B,EAAO9N,GAGvB,KAAK,IACL,IAAK,IAOD,MANAA,IAAS,EAGwB,KAA7BK,EAAO4O,WAAWjP,MAChBA,GAGFoB,KAAMiO,EAAMW,WACZ9G,MAAO7I,EAAO8O,MAAMrB,EAAO9N,GAC3B0P,OAAQ5B,EAAO9N,KAe/B,MAJA6P,GAAMxP,EAAOL,EAAQ,GAIjB+P,IAAQF,GAAQ,KAAKtR,QAAQwR,IAAQ,GACrC/P,GAAS,GAELoB,KAAMiO,EAAMW,WACZ9G,MAAO6G,EAAMF,EACbH,OAAQ5B,EAAO9N,KAInB,eAAezB,QAAQwR,IAAQ,KAC7B/P,GAEEoB,KAAMiO,EAAMW,WACZ9G,MAAO6G,EACPL,OAAQ5B,EAAO9N,SAIvBiQ,MAAeC,EAASC,gBAAiB,WAI7C,QAASC,KACL,GAAIC,GAAQvC,EAAOW,CAQnB,IANAA,EAAKpO,EAAOL,GACZoO,EAAOI,EAAeC,EAAGQ,WAAW,KAAe,MAAPR,EACxC,sEAEJX,EAAQ9N,EACRqQ,EAAS,GACE,MAAP5B,EAAY,CAaZ,IAZA4B,EAAShQ,EAAOL,KAChByO,EAAKpO,EAAOL,GAIG,MAAXqQ,GAEI5B,GAAMD,EAAeC,EAAGQ,WAAW,KACnCgB,KAAeC,EAASC,gBAAiB,WAI1C3B,EAAenO,EAAO4O,WAAWjP,KACpCqQ,GAAUhQ,EAAOL,IAErByO,GAAKpO,EAAOL,GAGhB,GAAW,MAAPyO,EAAY,CAEZ,IADA4B,GAAUhQ,EAAOL,KACVwO,EAAenO,EAAO4O,WAAWjP,KACpCqQ,GAAUhQ,EAAOL,IAErByO,GAAKpO,EAAOL,GAGhB,GAAW,MAAPyO,GAAqB,MAAPA,EAOd,GANA4B,GAAUhQ,EAAOL,KAEjByO,EAAKpO,EAAOL,IACD,MAAPyO,GAAqB,MAAPA,KACd4B,GAAUhQ,EAAOL,MAEjBwO,EAAenO,EAAO4O,WAAWjP,IACjC,KAAOwO,EAAenO,EAAO4O,WAAWjP,KACpCqQ,GAAUhQ,EAAOL,SAGrBiQ,MAAeC,EAASC,gBAAiB,UAQjD,OAJItB,GAAkBxO,EAAO4O,WAAWjP,KACpCiQ,KAAeC,EAASC,gBAAiB,YAIzC/O,KAAMiO,EAAMiB,eACZpH,MAAOqH,WAAWF,GAClBX,OAAQ5B,EAAO9N,IAMvB,QAASwQ,KACL,GAAcC,GAAO3C,EAAOW,EAAxBiC,EAAM,GAAsBC,GAAQ,CASxC,KAPAF,EAAQpQ,EAAOL,GACfoO,EAAkB,MAAVqC,GAA4B,MAAVA,EACtB,2CAEJ3C,EAAQ9N,IACNA,EAEarH,EAARqH,GAAgB,CAGnB,GAFAyO,EAAKpO,EAAOL,KAERyO,IAAOgC,EAAO,CACdA,EAAQ,EACR,OACG,GAAW,OAAPhC,EAEP,GADAA,EAAKpO,EAAOL,KACPyO,GAAOG,EAAiBH,EAAGQ,WAAW,IA0B3B,OAARR,GAAkC,OAAlBpO,EAAOL,MACrBA,MA1BN,QAAQyO,GACR,IAAK,IACDiC,GAAO,IACP,MACJ,KAAK,IACDA,GAAO,IACP,MACJ,KAAK,IACDA,GAAO,GACP,MACJ,KAAK,IACDA,GAAO,IACP,MACJ,KAAK,IACDA,GAAO,IACP,MACJ,KAAK,IACDA,GAAO,GACP,MAEJ,SACIA,GAAOjC,MAQZ,CAAA,GAAIG,EAAiBH,EAAGQ,WAAW,IACtC,KAEAyB,IAAOjC,GAQf,MAJc,KAAVgC,GACAR,KAAeC,EAASC,gBAAiB,YAIzC/O,KAAMiO,EAAMuB,cACZ1H,MAAOwH,EACPC,MAAOA,EACPjB,OAAQ5B,EAAO9N,IAIvB,QAAS6Q,GAAiBC,GACtB,MAAOA,GAAM1P,OAASiO,EAAMC,YACxBwB,EAAM1P,OAASiO,EAAME,SACrBuB,EAAM1P,OAASiO,EAAMI,gBACrBqB,EAAM1P,OAASiO,EAAMG,YAG7B,QAASuB,KACL,GAAItC,EAIJ,OAFAO,KAEIhP,GAASrH,GAELyI,KAAMiO,EAAM2B,IACZtB,OAAQ1P,EAAOA,KAIvByO,EAAKpO,EAAO4O,WAAWjP,GAGZ,KAAPyO,GAAoB,KAAPA,GAAoB,KAAPA,EACnBkB,IAIA,KAAPlB,GAAoB,KAAPA,EACN+B,IAGP3B,EAAkBJ,GACXW,IAKA,KAAPX,EACID,EAAenO,EAAO4O,WAAWjP,EAAQ,IAClCoQ,IAEJT,IAGPnB,EAAeC,GACR2B,IAGJT,KAGX,QAASsB,KACL,GAAIH,EASJ,OAPAA,GAAQI,EACRlR,EAAQ8Q,EAAMpB,MAAM,GAEpBwB,EAAYH,IAEZ/Q,EAAQ8Q,EAAMpB,MAAM,GAEboB,EAGX,QAASK,KACL,GAAIC,EAEJA,GAAMpR,EACNkR,EAAYH,IACZ/Q,EAAQoR,EAKZ,QAASnB,GAAWa,EAAOO,GACvB,GAAIC,GACAC,EAAOhM,MAAMpH,UAAUgR,MAAMpQ,KAAKyS,UAAW,GAC7CC,EAAMJ,EAAcK,QAChB,SACA,SAAUC,EAAO3R,GAEb,MADAoO,GAAOpO,EAAQuR,EAAK5Y,OAAQ,sCACrB4Y,EAAKvR,IAOxB,MAHAsR,GAAQ,GAAI/C,OAAMkD,GAClBH,EAAMtR,MAAQA,EACdsR,EAAMM,YAAcH,EACdH,EAKV,QAASO,GAAgBf,GACrBb,EAAWa,EAAOZ,EAASC,gBAAiBW,EAAM5H,OAMtD,QAAS4I,GAAO5I,GACZ,GAAI4H,GAAQG,KACRH,EAAM1P,OAASiO,EAAMW,YAAcc,EAAM5H,QAAUA,IACnD2I,EAAgBf,GAMxB,QAAS3F,GAAMjC,GACX,MAAOgI,GAAU9P,OAASiO,EAAMW,YAAckB,EAAUhI,QAAUA,EAKtE,QAAS6I,GAAaC,GAClB,MAAOd,GAAU9P,OAASiO,EAAME,SAAW2B,EAAUhI,QAAU8I,EAwBnE,QAASC,KACL,GAAIC,KAIJ,KAFAJ,EAAO,MAEC3G,EAAM,MACNA,EAAM,MACN8F,IACAiB,EAASpa,KAAK,QAEdoa,EAASpa,KAAKqa,MAEThH,EAAM,MACP2G,EAAO,KAOnB,OAFAA,GAAO,KAEAM,EAASC,sBAAsBH,GAK1C,QAASI,KACL,GAAIxB,EAOJ,OALA9B,KACA8B,EAAQG,IAIJH,EAAM1P,OAASiO,EAAMuB,eAAiBE,EAAM1P,OAASiO,EAAMiB,eACpD8B,EAASG,cAAczB,GAG3BsB,EAASI,iBAAiB1B,EAAM5H,OAG3C,QAASuJ,KACL,GAAI3B,GAAO3H,CAWX,OATA2H,GAAQI,EACRlC,KAEI8B,EAAM1P,OAASiO,EAAM2B,KAAOF,EAAM1P,OAASiO,EAAMW,aACjD6B,EAAgBf,GAGpB3H,EAAMmJ,IACNR,EAAO,KACAM,EAASM,eAAe,OAAQvJ,EAAKgJ,MAGhD,QAASQ,KACL,GAAIC,KAIJ,KAFAd,EAAO,MAEC3G,EAAM,MACVyH,EAAW9a,KAAK2a,KAEXtH,EAAM,MACP2G,EAAO,IAMf,OAFAA,GAAO,KAEAM,EAASS,uBAAuBD,GAK3C,QAASE,KACL,GAAIC,EAQJ,OANAjB,GAAO,KAEPiB,EAAOZ,KAEPL,EAAO,KAEAiB,EAMX,QAASC,KACL,GAAI5R,GAAM0P,EAAOiC,CAEjB,OAAI5H,GAAM,KACC2H,KAGX1R,EAAO8P,EAAU9P,KAEbA,IAASiO,EAAMC,WACfyD,EAAOX,EAASI,iBAAiBvB,IAAM/H,OAChC9H,IAASiO,EAAMuB,eAAiBxP,IAASiO,EAAMiB,eACtDyC,EAAOX,EAASG,cAActB,KACvB7P,IAASiO,EAAME,QAClBwC,EAAa,UACbd,IACA8B,EAAOX,EAASa,wBAEb7R,IAASiO,EAAMI,gBACtBqB,EAAQG,IACRH,EAAM5H,MAAyB,SAAhB4H,EAAM5H,MACrB6J,EAAOX,EAASG,cAAczB,IACvB1P,IAASiO,EAAMG,aACtBsB,EAAQG,IACRH,EAAM5H,MAAQ,KACd6J,EAAOX,EAASG,cAAczB,IACvB3F,EAAM,KACb4H,EAAOd,IACA9G,EAAM,OACb4H,EAAOJ,KAGPI,EACOA,MAGXlB,GAAgBZ,MAKpB,QAASiC,KACL,GAAI3B,KAIJ,IAFAO,EAAO,MAEF3G,EAAM,KACP,KAAexS,EAARqH,IACHuR,EAAKzZ,KAAKqa,OACNhH,EAAM,OAGV2G,EAAO,IAMf,OAFAA,GAAO,KAEAP,EAGX,QAAS4B,KACL,GAAIrC,EAQJ,OANAA,GAAQG,IAEHJ,EAAiBC,IAClBe,EAAgBf,GAGbsB,EAASI,iBAAiB1B,EAAM5H,OAG3C,QAASkK,KAGL,MAFAtB,GAAO,KAEAqB,IAGX,QAASE,KACL,GAAIN,EAQJ,OANAjB,GAAO,KAEPiB,EAAOZ,KAEPL,EAAO,KAEAiB,EAGX,QAASO,KACL,GAAIP,GAAMxB,EAAMgC,CAIhB,KAFAR,EAAOC,MAGH,GAAI7H,EAAM,KACNoI,EAAWF,IACXN,EAAOX,EAASoB,uBAAuB,IAAKT,EAAMQ,OAC/C,IAAIpI,EAAM,KACboI,EAAWH,IACXL,EAAOX,EAASoB,uBAAuB,IAAKT,EAAMQ,OAC/C,CAAA,IAAIpI,EAAM,KAIb,KAHAoG,GAAO2B,IACPH,EAAOX,EAASqB,qBAAqBV,EAAMxB,GAMnD,MAAOwB,GASX,QAASW,KACL,GAAI5C,GAAOiC,CAcX,OAZI7B,GAAU9P,OAASiO,EAAMW,YAAckB,EAAU9P,OAASiO,EAAME,QAChEwD,EAAOY,KACAxI,EAAM,MAAQA,EAAM,MAAQA,EAAM,MACzC2F,EAAQG,IACR8B,EAAOW,IACPX,EAAOX,EAASwB,sBAAsB9C,EAAM5H,MAAO6J,IAC5ChB,EAAa,WAAaA,EAAa,SAAWA,EAAa,UACtE9B,KAAeC,EAASC,iBAExB4C,EAAOY,KAGJZ,EAGX,QAASc,GAAiB/C,GACtB,GAAIgD,GAAO,CAEX,IAAIhD,EAAM1P,OAASiO,EAAMW,YAAcc,EAAM1P,OAASiO,EAAME,QACxD,MAAO,EAGX,QAAQuB,EAAM5H,OACd,IAAK,KACD4K,EAAO,CACP,MAEJ,KAAK,KACDA,EAAO,CACP,MAEJ,KAAK,KACL,IAAK,KACL,IAAK,MACL,IAAK,MACDA,EAAO,CACP,MAEJ,KAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,aACDA,EAAO,CACP,MAEJ,KAAK,KACDA,EAAO,CACP,MAEJ,KAAK,IACL,IAAK,IACDA,EAAO,CACP,MAEJ,KAAK,IACL,IAAK,IACL,IAAK,IACDA,EAAO,GAOX,MAAOA,GAWX,QAASC,KACL,GAAIhB,GAAMjC,EAAOgD,EAAME,EAAO1Z,EAAO2Z,EAAU5Z,EAAMrB,CAMrD,IAJAqB,EAAOqZ,IAEP5C,EAAQI,EACR4C,EAAOD,EAAiB/C,GACX,IAATgD,EACA,MAAOzZ,EASX,KAPAyW,EAAMgD,KAAOA,EACb7C,IAEA3W,EAAQoZ,IAERM,GAAS3Z,EAAMyW,EAAOxW,IAEdwZ,EAAOD,EAAiB3C,IAAc,GAAG,CAG7C,KAAQ8C,EAAMrb,OAAS,GAAOmb,GAAQE,EAAMA,EAAMrb,OAAS,GAAGmb,MAC1DxZ,EAAQ0Z,EAAME,MACdD,EAAWD,EAAME,MAAMhL,MACvB7O,EAAO2Z,EAAME,MACbnB,EAAOX,EAAS+B,uBAAuBF,EAAU5Z,EAAMC,GACvD0Z,EAAMlc,KAAKib,EAIfjC,GAAQG,IACRH,EAAMgD,KAAOA,EACbE,EAAMlc,KAAKgZ,GACXiC,EAAOW,IACPM,EAAMlc,KAAKib,GAMf,IAFA/Z,EAAIgb,EAAMrb,OAAS,EACnBoa,EAAOiB,EAAMhb,GACNA,EAAI,GACP+Z,EAAOX,EAAS+B,uBAAuBH,EAAMhb,EAAI,GAAGkQ,MAAO8K,EAAMhb,EAAI,GAAI+Z,GACzE/Z,GAAK,CAGT,OAAO+Z,GAMX,QAASqB,KACL,GAAIrB,GAAMsB,EAAYC,CAatB,OAXAvB,GAAOgB,IAEH5I,EAAM,OACN8F,IACAoD,EAAaD,IACbtC,EAAO,KACPwC,EAAYF,IAEZrB,EAAOX,EAASmC,4BAA4BxB,EAAMsB,EAAYC,IAG3DvB,EAaX,QAASyB,KACL,GAAInO,GAAYkL,CAUhB,OARAlL,GAAa4K,IAET5K,EAAWjF,OAASiO,EAAMC,YAC1BuC,EAAgBxL,GAGpBkL,EAAOpG,EAAM,KAAO+H,OAEbd,EAASqC,aAAapO,EAAW6C,MAAOqI,GAOnD,QAASmD,KACL,KAAOvJ,EAAM,MACT8F,IACAuD,IAqBR,QAASG,KACL3F,IACAmC,GAEA,IAAI4B,GAAOZ,IACPY,KACwB,MAApB7B,EAAUhI,OAAoC,MAAnBgI,EAAUhI,OAC9B6J,EAAK3R,OAASwT,EAAOtF,WAC5BuF,EAAkB9B,IAElB2B,IACwB,OAApBxD,EAAUhI,MACV4L,EAAkB/B,GAElBX,EAAS2C,eAAehC,KAKhC7B,EAAU9P,OAASiO,EAAM2B,KACzBa,EAAgBX,GAIxB,QAAS4D,GAAkB/B,GACvB9B,GACA,IAAI5K,GAAa4K,IAAM/H,KACvBkJ,GAAS4C,mBAAmBjC,EAAM1M,GAGtC,QAASwO,GAAkBxO,GACvB,GAAI4O,EACoB,OAApB/D,EAAUhI,QACV+H,IACIC,EAAU9P,OAASiO,EAAMC,YACzBuC,EAAgBX,GACpB+D,EAAYhE,IAAM/H,OAGtB+H,GACA,IAAI8B,GAAOZ,IACXuC,KACAtC,EAAS8C,mBAAmB7O,EAAWjG,KAAM6U,EAAWlC,GAG5D,QAASoC,GAAMrF,EAAMsF,GAUjB,MATAhD,GAAWgD,EACX/U,EAASyP,EACT9P,EAAQ,EACRrH,EAAS0H,EAAO1H,OAChBuY,EAAY,KACZmE,GACIC,aAGGX,IAx+BX,GAAItF,GACAkG,EACAX,EACA1E,EACA7P,EACAL,EACArH,EACAyZ,EACAlB,EACAmE,CAEJhG,IACII,eAAgB,EAChBuB,IAAK,EACL1B,WAAY,EACZC,QAAS,EACTC,YAAa,EACbc,eAAgB,EAChBN,WAAY,EACZY,cAAe,GAGnB2E,KACAA,EAAUlG,EAAMI,gBAAkB,UAClC8F,EAAUlG,EAAM2B,KAAO,QACvBuE,EAAUlG,EAAMC,YAAc,aAC9BiG,EAAUlG,EAAME,SAAW,UAC3BgG,EAAUlG,EAAMG,aAAe,OAC/B+F,EAAUlG,EAAMiB,gBAAkB,UAClCiF,EAAUlG,EAAMW,YAAc,aAC9BuF,EAAUlG,EAAMuB,eAAiB,SAEjCgE,GACIY,gBAAiB,kBACjBC,iBAAkB,mBAClBC,eAAgB,iBAChBC,sBAAuB,wBACvBC,eAAgB,iBAChBC,oBAAqB,sBACrBvG,WAAY,aACZwG,QAAS,UACTC,iBAAkB,mBAClBC,kBAAmB,oBACnBC,iBAAkB,mBAClBC,iBAAkB,mBAClBC,QAAS,UACTC,SAAU,WACVC,eAAgB,iBAChBC,gBAAiB,mBAIrBpG,GACIC,gBAAkB,sBAClBoG,aAAc,uBACdC,cAAe,oCAgrBnB,IAAI7C,IAAyBL,EAuJzBnB,GAAkBiC,CA6GtBjG,GAAOsI,SACHtB,MAAOA,IAEZ9d,MASH,SAAW8W,GACT,YAEA,SAASuI,GAAeC,EAAgBvW,EAAMlG,EAAM0c,GAClD,GAAIC,EACJ,KAEE,GADAA,EAAaC,EAAcH,GACvBE,EAAWE,aACV7c,EAAK7B,WAAaC,KAAKW,cACN,aAAjBiB,EAAK8c,SACK,SAAT5W,GAA4B,WAATA,GACvB,KAAMmO,OAAM,4DAEd,MAAO0I,GAEP,WADAC,SAAQ5F,MAAM,8BAAgCqF,EAAgBM,GAIhE,MAAO,UAASE,EAAOjd,EAAMkd,GAC3B,GAAIC,GAAUR,EAAWS,WAAWH,EAAOP,EAAgBQ,EAO3D,OANIP,GAAWE,YAAcM,IAC3Bnd,EAAKqd,6BAA+BV,EAAWE,WAC3CF,EAAWW,aACbtd,EAAKud,6BAA+BZ,EAAWW,aAG5CH,GAOX,QAASP,GAAcH,GACrB,GAAIE,GAAaa,EAAqBf,EACtC,KAAKE,EAAY,CACf,GAAIzE,GAAW,GAAIuF,EACnBlB,SAAQtB,MAAMwB,EAAgBvE,GAC9ByE,EAAa,GAAIe,GAAWxF,GAC5BsF,EAAqBf,GAAkBE,EAEzC,MAAOA,GAGT,QAASf,GAAQ5M,GACf7R,KAAK6R,MAAQA,EACb7R,KAAKwgB,SAAW9M,OAgBlB,QAAS+M,GAAU1X,GACjB/I,KAAK+I,KAAOA,EACZ/I,KAAKjB,KAAO2hB,KAAKpZ,IAAIyB,GA2BvB,QAAS6V,GAAiB+B,EAAQzE,EAAU0E,GAC1C5gB,KAAK6gB,SAAuB,KAAZD,EAEhB5gB,KAAK8gB,YAA+B,kBAAVH,IACPA,EAAOG,aACN9gB,KAAK6gB,YAAc3E,YAAoBuC,IAE3Dze,KAAK+gB,YACA/gB,KAAK8gB,cACL5E,YAAoBuE,IAAavE,YAAoBuC,MACrDkC,YAAkB/B,IAAoB+B,YAAkBF,IAE7DzgB,KAAK2gB,OAAS3gB,KAAK+gB,WAAaJ,EAASK,EAAML,GAC/C3gB,KAAKkc,UAAYlc,KAAK6gB,UAAY7gB,KAAK+gB,WACnC7E,EAAW8E,EAAM9E,GAuEvB,QAAS+E,GAAOlY,EAAMmR,GACpBla,KAAK+I,KAAOA,EACZ/I,KAAKka,OACL,KAAK,GAAIvY,GAAI,EAAGA,EAAIuY,EAAK5Y,OAAQK,IAC/B3B,KAAKka,KAAKvY,GAAKqf,EAAM9G,EAAKvY,IA0C9B,QAASuf,KAAmB,KAAMhK,OAAM,mBA0BxC,QAAS8J,GAAMG,GACb,MAAqB,kBAAPA,GAAoBA,EAAMA,EAAIC,UAG9C,QAASd,KACPtgB,KAAKwf,WAAa,KAClBxf,KAAKqhB,WACLrhB,KAAKshB,QACLthB,KAAKuhB,YAAc7N,OACnB1T,KAAK0f,WAAahM,OAClB1T,KAAKmgB,WAAazM,OAClB1T,KAAK8gB,aAAc,EA2IrB,QAASU,GAAmB3P,GAC1B7R,KAAKyhB,OAAS5P,EAUhB,QAAS0O,GAAWxF,GAIlB,GAHA/a,KAAK0f,WAAa3E,EAAS2E,WAC3B1f,KAAKmgB,WAAapF,EAASoF,YAEtBpF,EAASyE,WACZ,KAAMtI,OAAM,uBAEdlX,MAAKwf,WAAazE,EAASyE,WAC3BwB,EAAMhhB,KAAKwf,YAEXxf,KAAKqhB,QAAUtG,EAASsG,QACxBrhB,KAAK8gB,YAAc/F,EAAS+F,YAmE9B,QAASY,GAAyB3Y,GAChC,MAAOzE,QAAOyE,GAAMsR,QAAQ,SAAU,SAASsH,GAC7C,MAAO,IAAMA,EAAEpY,gBASnB,QAASqY,GAAU9B,EAAO+B,GACxB,KAAO/B,EAAMgC,KACLvc,OAAOuB,UAAUib,eAAera,KAAKoY,EAAO+B,IAClD/B,EAAQA,EAAMgC,EAGhB,OAAOhC,GAGT,QAASkC,GAAoBC,GAC3B,OAAQA,GACN,IAAK,GACH,OAAO,CAET,KAAK,QACL,IAAK,OACL,IAAK,OACH,OAAO,EAGX,MAAKC,OAAMC,OAAOF,KAGX,GAFE,EAKX,QAASG,MA7eT,GAAI/B,GAAuB9a,OAAOC,OAAO,KAkBzCiZ,GAAQ3X,WACNsa,QAAS,WACP,IAAKphB,KAAKwgB,SAAU,CAClB,GAAI3O,GAAQ7R,KAAK6R,KACjB7R,MAAKwgB,SAAW,WACd,MAAO3O,IAIX,MAAO7R,MAAKwgB,WAShBC,EAAU3Z,WACRsa,QAAS,WACP,IAAKphB,KAAKwgB,SAAU,CAClB,GACIzhB,IADOiB,KAAK+I,KACL/I,KAAKjB,KAChBiB,MAAKwgB,SAAW,SAASV,EAAOuC,GAI9B,MAHIA,IACFA,EAASC,QAAQxC,EAAO/gB,GAEnBA,EAAKwjB,aAAazC,IAI7B,MAAO9f,MAAKwgB,UAGdgC,SAAU,SAAS1C,EAAO2C,GAIxB,MAHwB,IAApBziB,KAAKjB,KAAKuC,OACZwe,EAAQ8B,EAAU9B,EAAO9f,KAAKjB,KAAK,IAE9BiB,KAAKjB,KAAK2jB,aAAa5C,EAAO2C,KAqBzC7D,EAAiB9X,WACf6b,GAAIC,YACF,IAAK5iB,KAAK6iB,UAAW,CAEnB,GAAIC,GAAQ9iB,KAAK2gB,iBAAkB/B,GAC/B5e,KAAK2gB,OAAOiC,SAAS9K,SAAW9X,KAAK2gB,OAAO5X,KAChD+Z;EAAMriB,KAAKT,KAAKkc,mBAAoBuE,GAChCzgB,KAAKkc,SAASnT,KAAO/I,KAAKkc,SAASrK,OACvC7R,KAAK6iB,UAAYnC,KAAKpZ,IAAIwb,GAG5B,MAAO9iB,MAAK6iB,WAGdzB,QAAS,WACP,IAAKphB,KAAKwgB,SAAU,CAClB,GAAIG,GAAS3gB,KAAK2gB,MAElB,IAAI3gB,KAAK+gB,WAAY,CACnB,GAAIhiB,GAAOiB,KAAK4iB,QAEhB5iB,MAAKwgB,SAAW,SAASV,EAAOuC,GAI9B,MAHIA,IACFA,EAASC,QAAQxC,EAAO/gB,GAEnBA,EAAKwjB,aAAazC,QAEtB,IAAK9f,KAAK6gB,SAWV,CAEL,GAAI3E,GAAWlc,KAAKkc,QAEpBlc,MAAKwgB,SAAW,SAASV,EAAOuC,EAAU9C,GACxC,GAAIwD,GAAUpC,EAAOb,EAAOuC,EAAU9C,GAClCyD,EAAW9G,EAAS4D,EAAOuC,EAAU9C,EAIzC,OAHI8C,IACFA,EAASC,QAAQS,GAAUC,IAEtBD,EAAUA,EAAQC,GAAYtP,YArBd,CACzB,GAAI3U,GAAO2hB,KAAKpZ,IAAItH,KAAKkc,SAASnT,KAElC/I,MAAKwgB,SAAW,SAASV,EAAOuC,EAAU9C,GACxC,GAAIwD,GAAUpC,EAAOb,EAAOuC,EAAU9C,EAKtC,OAHI8C,IACFA,EAASC,QAAQS,EAAShkB,GAErBA,EAAKwjB,aAAaQ,KAgB/B,MAAO/iB,MAAKwgB,UAGdgC,SAAU,SAAS1C,EAAO2C,GACxB,GAAIziB,KAAK+gB,WAEP,MADA/gB,MAAK4iB,SAASF,aAAa5C,EAAO2C,GAC3BA,CAGT,IAAI9B,GAAS3gB,KAAK2gB,OAAOb,GACrBkD,EAAWhjB,KAAKkc,mBAAoBuE,GAAYzgB,KAAKkc,SAASnT,KAC9D/I,KAAKkc,SAAS4D,EAClB,OAAOa,GAAOqC,GAAYP,IAY9BxB,EAAOna,WACLmc,UAAW,SAASnD,EAAOuC,EAAU9C,EAAgB2D,EACjCC,GAClB,GAAIvY,GAAK2U,EAAevf,KAAK+I,MACzBga,EAAUjD,CACd,IAAIlV,EACFmY,EAAUrP,WAGV,IADA9I,EAAKmY,EAAQ/iB,KAAK+I,OACb6B,EAEH,WADAiV,SAAQ5F,MAAM,mCAAqCja,KAAK+I,KAc5D,IANIma,EACFtY,EAAKA,EAAGwY,QACoB,kBAAZxY,GAAGyY,QACnBzY,EAAKA,EAAGyY,OAGO,kBAANzY,GAET,WADAiV,SAAQ5F,MAAM,mCAAqCja,KAAK+I,KAK1D,KAAK,GADDmR,GAAOiJ,MACFxhB,EAAI,EAAGA,EAAI3B,KAAKka,KAAK5Y,OAAQK,IACpCuY,EAAKzZ,KAAKugB,EAAMhhB,KAAKka,KAAKvY,IAAIme,EAAOuC,EAAU9C,GAGjD,OAAO3U,GAAG0Y,MAAMP,EAAS7I,IAM7B,IAAIqJ,IACFC,IAAK,SAAS/f,GAAK,OAAQA,GAC3BggB,IAAK,SAAShgB,GAAK,OAAQA,GAC3BigB,IAAK,SAASjgB,GAAK,OAAQA,IAGzBkgB,GACFH,IAAK,SAAS7Z,EAAGtF,GAAK,MAAOsF,GAAEtF,GAC/Bof,IAAK,SAAS9Z,EAAGtF,GAAK,MAAOsF,GAAEtF,GAC/Buf,IAAK,SAASja,EAAGtF,GAAK,MAAOsF,GAAEtF,GAC/Bwf,IAAK,SAASla,EAAGtF,GAAK,MAAOsF,GAAEtF,GAC/Byf,IAAK,SAASna,EAAGtF,GAAK,MAAOsF,GAAEtF,GAC/B0f,IAAK,SAASpa,EAAGtF,GAAK,MAASA,GAAFsF,GAC7Bqa,IAAK,SAASra,EAAGtF,GAAK,MAAOsF,GAAEtF,GAC/B4f,KAAM,SAASta,EAAGtF,GAAK,MAAUA,IAAHsF,GAC9Bua,KAAM,SAASva,EAAGtF,GAAK,MAAOsF,IAAGtF,GACjC8f,KAAM,SAASxa,EAAGtF,GAAK,MAAOsF,IAAGtF,GACjC+f,KAAM,SAASza,EAAGtF,GAAK,MAAOsF,IAAGtF,GACjCggB,MAAO,SAAS1a,EAAGtF,GAAK,MAAOsF,KAAItF,GACnCigB,MAAO,SAAS3a,EAAGtF,GAAK,MAAOsF,KAAItF,GACnCkgB,KAAM,SAAS5a,EAAGtF,GAAK,MAAOsF,IAAGtF,GACjCmgB,KAAM,SAAS7a,EAAGtF,GAAK,MAAOsF,IAAGtF,GAiBnCic,GAAYxZ,WACVyV,sBAAuB,SAASkI,EAAIC,GAClC,IAAKnB,EAAekB,GAClB,KAAMvN,OAAM,wBAA0BuN,EAIxC,OAFAC,GAAW1D,EAAM0D,GAEV,SAAS5E,EAAOuC,EAAU9C,GAC/B,MAAOgE,GAAekB,GAAIC,EAAS5E,EAAOuC,EAAU9C,MAIxDzC,uBAAwB,SAAS2H,EAAIzhB,EAAMC,GACzC,IAAK0gB,EAAgBc,GACnB,KAAMvN,OAAM,wBAA0BuN,EAKxC,QAHAzhB,EAAOge,EAAMhe,GACbC,EAAQ+d,EAAM/d,GAENwhB,GACN,IAAK,KAEH,MADAzkB,MAAK8gB,aAAc,EACZ,SAAShB,EAAOuC,EAAU9C,GAC/B,MAAOvc,GAAK8c,EAAOuC,EAAU9C,IACzBtc,EAAM6c,EAAOuC,EAAU9C,GAE/B,KAAK,KAEH,MADAvf,MAAK8gB,aAAc,EACZ,SAAShB,EAAOuC,EAAU9C,GAC/B,MAAOvc,GAAK8c,EAAOuC,EAAU9C,IACzBtc,EAAM6c,EAAOuC,EAAU9C,IAIjC,MAAO,UAASO,EAAOuC,EAAU9C,GAC/B,MAAOoE,GAAgBc,GAAIzhB,EAAK8c,EAAOuC,EAAU9C,GACtBtc,EAAM6c,EAAOuC,EAAU9C,MAItDrC,4BAA6B,SAASyH,EAAM3H,EAAYC,GAOtD,MANA0H,GAAO3D,EAAM2D,GACb3H,EAAagE,EAAMhE,GACnBC,EAAY+D,EAAM/D,GAElBjd,KAAK8gB,aAAc,EAEZ,SAAShB,EAAOuC,EAAU9C,GAC/B,MAAOoF,GAAK7E,EAAOuC,EAAU9C,GACzBvC,EAAW8C,EAAOuC,EAAU9C,GAC5BtC,EAAU6C,EAAOuC,EAAU9C,KAInCpE,iBAAkB,SAASpS,GACzB,GAAI6b,GAAQ,GAAInE,GAAU1X,EAE1B,OADA6b,GAAM7a,KAAO,aACN6a,GAGTzI,uBAAwB,SAASyE,EAAUD,EAAQzE,GACjD,GAAI0D,GAAK,GAAIhB,GAAiB+B,EAAQzE,EAAU0E,EAGhD,OAFIhB,GAAGkB,cACL9gB,KAAK8gB,aAAc,GACdlB,GAGTxD,qBAAsB,SAASoD,EAAYtF,GACzC,KAAMsF,YAAsBiB,IAC1B,KAAMvJ,OAAM,mDAEd,IAAI2N,GAAS,GAAI5D,GAAOzB,EAAWzW,KAAMmR,EAEzC,OAAO,UAAS4F,EAAOuC,EAAU9C,GAC/B,MAAOsF,GAAO5B,UAAUnD,EAAOuC,EAAU9C,GAAgB,KAI7DrE,cAAe,SAASzB,GACtB,MAAO,IAAIgF,GAAQhF,EAAM5H,QAG3BmJ,sBAAuB,SAASH,GAC9B,IAAK,GAAIlZ,GAAI,EAAGA,EAAIkZ,EAASvZ,OAAQK,IACnCkZ,EAASlZ,GAAKqf,EAAMnG,EAASlZ,GAE/B,OAAO,UAASme,EAAOuC,EAAU9C,GAE/B,IAAK,GADDuF,MACKnjB,EAAI,EAAGA,EAAIkZ,EAASvZ,OAAQK,IACnCmjB,EAAIrkB,KAAKoa,EAASlZ,GAAGme,EAAOuC,EAAU9C,GACxC,OAAOuF,KAIXzJ,eAAgB,SAAS0J,EAAMjT,EAAKD,GAClC,OACEC,IAAKA,YAAe2O,GAAY3O,EAAI/I,KAAO+I,EAAID,MAC/CA,MAAOA,IAIX2J,uBAAwB,SAASD,GAC/B,IAAK,GAAI5Z,GAAI,EAAGA,EAAI4Z,EAAWja,OAAQK,IACrC4Z,EAAW5Z,GAAGkQ,MAAQmP,EAAMzF,EAAW5Z,GAAGkQ,MAE5C,OAAO,UAASiO,EAAOuC,EAAU9C,GAE/B,IAAK,GADDnW,MACKzH,EAAI,EAAGA,EAAI4Z,EAAWja,OAAQK,IACrCyH,EAAImS,EAAW5Z,GAAGmQ,KACdyJ,EAAW5Z,GAAGkQ,MAAMiO,EAAOuC,EAAU9C,EAC3C,OAAOnW,KAIXgU,aAAc,SAASrU,EAAMmR,GAC3Bla,KAAKqhB,QAAQ5gB,KAAK,GAAIwgB,GAAOlY,EAAMmR,KAGrCyD,mBAAoB,SAAS6B,EAAYE,GACvC1f,KAAKwf,WAAaA,EAClBxf,KAAK0f,WAAaA,GAGpB7B,mBAAoB,SAAS6B,EAAYS,EAAYX,GACnDxf,KAAKwf,WAAaA,EAClBxf,KAAK0f,WAAaA,EAClB1f,KAAKmgB,WAAaA,GAGpBzC,eAAgB,SAAS8B,GACvBxf,KAAKwf,WAAaA,GAGpB5D,qBAAsBsF,GAOxBM,EAAmB1a,WACjBke,KAAM,WAAa,MAAOhlB,MAAKyhB,QAC/BwD,eAAgB,WAAa,MAAOjlB,MAAKyhB,QACzCyD,QAAS,aACTC,MAAO,cAiBT5E,EAAWzZ,WACTmZ,WAAY,SAASH,EAAOP,EAAgBQ,GAU1C,QAASqB,KAEP,GAAIgE,EAEF,MADAA,IAAY,EACLC,CAGLxU,GAAKiQ,aACPuB,EAASiD,YAEX,IAAIzT,GAAQhB,EAAK0U,SAASzF,EACAjP,EAAKiQ,YAAcuB,EAAW3O,OAC9B6L,EAI1B,OAHI1O,GAAKiQ,aACPuB,EAASmD,cAEJ3T,EAGT,QAAS4T,GAAWhD,GAElB,MADA5R,GAAK2R,SAAS1C,EAAO2C,EAAUlD,GACxBkD,EA9BT,GAAI1C,EACF,MAAO/f,MAAKulB,SAASzF,EAAOpM,OAAW6L,EAEzC,IAAI8C,GAAW,GAAIqD,kBAEfL,EAAarlB,KAAKulB,SAASzF,EAAOuC,EAAU9C,GAC5C6F,GAAY,EACZvU,EAAO7Q,IA0BX,OAAO,IAAI2lB,mBAAkBtD,EAAUjB,EAASqE,GAAY,IAG9DF,SAAU,SAASzF,EAAOuC,EAAU9C,GAElC,IAAK,GADD1N,GAAQmP,EAAMhhB,KAAKwf,YAAYM,EAAOuC,EAAU9C,GAC3C5d,EAAI,EAAGA,EAAI3B,KAAKqhB,QAAQ/f,OAAQK,IACvCkQ,EAAQ7R,KAAKqhB,QAAQ1f,GAAGshB,UAAUnD,EAAOuC,EAAU9C,GAC/C,GAAQ1N,GAGd,OAAOA,IAGT2Q,SAAU,SAAS1C,EAAO2C,EAAUlD,GAElC,IADA,GAAIqG,GAAQ5lB,KAAKqhB,QAAUrhB,KAAKqhB,QAAQ/f,OAAS,EAC1CskB,IAAU,GACfnD,EAAWziB,KAAKqhB,QAAQuE,GAAO3C,UAAUnD,EAAOpM,OAC5C6L,GAAgB,GAAOkD,GAG7B,OAAIziB,MAAKwf,WAAWgD,SACXxiB,KAAKwf,WAAWgD,SAAS1C,EAAO2C,GADzC,QAeJ,IAAIX,GAAkB,IAAMvU,KAAKsY,SAASC,SAAS,IAAIhO,MAAM,EAiC7DsK,GAAmBtb,WAEjBif,YAAa,SAASlU,GACpB,GAAIiR,KACJ,KAAK,GAAIhR,KAAOD,GACdiR,EAAMriB,KAAKihB,EAAyB5P,GAAO,KAAOD,EAAMC,GAE1D,OAAOgR,GAAMkD,KAAK,OAGpBC,UAAW,SAASpU,GAClB,GAAIqU,KACJ,KAAK,GAAIpU,KAAOD,GACVA,EAAMC,IACRoU,EAAOzlB,KAAKqR,EAEhB,OAAOoU,GAAOF,KAAK,MAIrBG,+BAAgC,SAASC,GACvC,GAAIjG,GAAaiG,EAAShG,4BAC1B,IAAKD,EAGL,MAAO,UAASkG,EAAkB1d,GAChC0d,EAAiBvG,MAAMK,GAAcxX,IAIzC0W,eAAgB,SAAS4C,EAAYlZ,EAAMlG,GACzC,GAAI9D,GAAO2hB,KAAKpZ,IAAI2a,EAEpB,EAAA,GAAKD,EAAoBC,KAAeljB,EAAKunB,MAa7C,MAAOjH,GAAe4C,EAAYlZ,EAAMlG,EAAM7C,KAZ5C,IAAmB,GAAfjB,EAAKuC,OACP,MAAO,UAASwe,EAAOjd,EAAMkd,GAC3B,GAAIA,EACF,MAAOhhB,GAAKwjB,aAAazC,EAE3B,IAAI1hB,GAAQwjB,EAAU9B,EAAO/gB,EAAK,GAClC,OAAO,IAAIwnB,cAAanoB,EAAOW,MASvCynB,qBAAsB,SAASJ,GAC7B,GAAIK,GAAYL,EAASlG,4BACzB,IAAKuG,EAAL,CAGA,GAAIC,GAAcN,EAASC,iBACvBD,EAASC,iBAAiBvG,MAC1BsG,EAAStG,MAETlC,EAAYwI,EAAShG,4BAEzB,OAAO,UAASN,GACd,MAAO6G,GAAkBD,EAAa5G,EAAO2G,EAAW7I,MAK9D,IAAI+I,GAAqB,gBACvB,SAASD,EAAa5G,EAAO2G,EAAW7I,GACtC,GAAIxf,KAKJ,OAJAA,GAAMqoB,GAAa3G,EACnB1hB,EAAMwf,GAAalK,OACnBtV,EAAM0jB,GAAmB4E,EACzBtoB,EAAMwoB,UAAYF,EACXtoB,GAET,SAASsoB,EAAa5G,EAAO2G,EAAW7I,GACtC,GAAIxf,GAAQmH,OAAOC,OAAOkhB,EAO1B,OANAnhB,QAAOshB,eAAezoB,EAAOqoB,GACvB5U,MAAOiO,EAAOgH,cAAc,EAAMC,UAAU,IAClDxhB,OAAOshB,eAAezoB,EAAOwf,GACvB/L,MAAO6B,OAAWoT,cAAc,EAAMC,UAAU,IACtDxhB,OAAOshB,eAAezoB,EAAO0jB,GACvBjQ,MAAO6U,EAAaI,cAAc,EAAMC,UAAU,IACjD3oB,EAGX0Y,GAAOsL,mBAAqBA,EAC5BA,EAAmB3C,cAAgBA,GAClCzf,MAUHgnB,SACEC,QAAS,iBAemB,kBAAnB/oB,QAAO8oB,UAChBA,YAiBG9oB,OAAOgpB,WACVC,SAAWjpB,OAAOipB,aAGlBD,UACCE,MAAO,cAGRC,gBACCC,WAAW,EACVC,OAAO,EACPC,YAAa,aACbC,aAAY,SAASre,EAAKse,GACxB,MAAOte,aAAese,KAI1BC,aACCL,WAAW,GAIZzoB,iBAAiB,oBAAqB,WACpCN,SAASa,cACP,GAAIH,aAAY,sBAAuBC,SAAS,OAMpDiF,kBAAoB,KACpByjB,KAAOC,OAAS,SAASnmB,GACvB,MAAOA,KAcX,SAAUtD,GAsCV,QAAS0pB,GAAiBtgB,EAAUugB,GAClCA,EAAMA,GAAOC,EAEbC,EAAkB,WAChBC,EAAiB1gB,EAAUugB,IAC1BA,GAML,QAASI,GAAgBJ,GACvB,MAA2B,aAAnBA,EAAIK,YACRL,EAAIK,aAAeC,EAIzB,QAASJ,GAAkBzgB,EAAUugB,GACnC,GAAKI,EAAgBJ,GASVvgB,GACTA,QAVyB,CACzB,GAAI8gB,GAAa,YACQ,aAAnBP,EAAIK,YACJL,EAAIK,aAAeC,KACrBN,EAAI5c,oBAAoBod,EAAaD,GACrCL,EAAkBzgB,EAAUugB,IAGhCA,GAAIlpB,iBAAiB0pB,EAAaD,IAMtC,QAASE,GAAiBplB,GACxBA,EAAM7D,OAAOkpB,UAAW,EAI1B,QAASP,GAAiB1gB,EAAUugB,GAGlC,QAASW,KACHC,GAAUhf,GACZnC,GAAYA,IAGhB,QAASohB,GAAa1jB,GACpBsjB,EAAiBtjB,GACjByjB,IACAD,IAVF,GAAIG,GAAUd,EAAIe,iBAAiB,oBAC/BH,EAAS,EAAGhf,EAAIkf,EAAQvnB,MAW5B,IAAIqI,EACF,IAAK,GAASof,GAALpnB,EAAE,EAAWgI,EAAFhI,IAASonB,EAAIF,EAAQlnB,IAAKA,IACxCqnB,EAAeD,GACjBH,EAAalhB,KAAKqhB,GAAMxpB,OAAQwpB,KAEhCA,EAAIlqB,iBAAiB,OAAQ+pB,GAC7BG,EAAIlqB,iBAAiB,QAAS+pB,QAIlCF,KAUJ,QAASM,GAAeC,GACtB,MAAO3B,GAAY2B,EAAKR,UACnBQ,EAAKC,QAAqC,YAA3BD,EAAKC,OAAOd,WAC5Ba,EAAKE,eAuBT,QAASC,GAAc1e,GACrB,IAAK,GAAyBhJ,GAArBC,EAAE,EAAGgI,EAAEe,EAAMpJ,OAAcqI,EAAFhI,IAASD,EAAEgJ,EAAM/I,IAAKA,IAClD0nB,EAAS3nB,IACX4nB,EAAa5nB,GAKnB,QAAS2nB,GAAS9oB,GAChB,MAA6B,SAAtBA,EAAQgpB,WAAwC,WAAhBhpB,EAAQipB,IAGjD,QAASF,GAAa/oB,GACpB,GAAIooB,GAASpoB,EAAQ2oB,MACjBP,GACFH,GAAkBjpB,OAAQgB,KAE1BA,EAAQ1B,iBAAiB,OAAQ2pB,GACjCjoB,EAAQ1B,iBAAiB,QAAS2pB,IAtJxC,GAAIiB,GAAa,UAAYlrB,UAASC,cAAc,QAChD8oB,EAAYmC,CAEhBC,MAAO,UAAU/E,KAAKpR,UAAUM,UAGhC,IAAI8V,GAAuB9pB,QAAQ3B,OAAOiG,mBACtCyjB,EAAO,SAAS/kB,GAClB,MAAO8mB,GAAuBxlB,kBAAkBylB,aAAa/mB,GAAQA,GAEnEmlB,EAAUJ,EAAKrpB,UAMfsrB,GACFviB,IAAK,WACH,GAAIwiB,GAASnC,YAAYoC,eAAiBxrB,SAASwrB,gBAItB,aAAxBxrB,SAAS6pB,WACV7pB,SAASyrB,QAAQzrB,SAASyrB,QAAQ1oB,OAAS,GAAK,KACpD,OAAOsmB,GAAKkC,IAEdhD,cAAc,EAGhBvhB,QAAOshB,eAAetoB,SAAU,iBAAkBsrB,GAClDtkB,OAAOshB,eAAemB,EAAS,iBAAkB6B,EAejD,IAAIxB,GAAqBqB,KAAO,WAAa,cACzCnB,EAAc,kBA6EdjB,KACF,GAAI2C,kBAAiB,SAASC,GAC5B,IAAK,GAAwBzjB,GAApB9E,EAAE,EAAGgI,EAAEugB,EAAK5oB,OAAgBqI,EAAJhI,IAAW8E,EAAEyjB,EAAKvoB,IAAKA,IAClD8E,EAAE0jB,YACJf,EAAc3iB,EAAE0jB,cAGnBC,QAAQ7rB,SAASY,MAAOkrB,WAAW,IA0BtC,WACE,GAA4B,YAAxB9rB,SAAS6pB,WAEX,IAAK,GAA2BW,GAD5BF,EAAUtqB,SAASuqB,iBAAiB,oBAC/BnnB,EAAE,EAAGgI,EAAEkf,EAAQvnB,OAAgBqI,EAAFhI,IAASonB,EAAIF,EAAQlnB,IAAKA,IAC9D2nB,EAAaP,OAWrBjB,EAAiB,WACfH,YAAYJ,OAAQ,EACpBI,YAAY2C,WAAY,GAAIzU,OAAO0U,UACnCvC,EAAQ5oB,cACN,GAAIH,aAAY,qBAAsBC,SAAS,OAKnDd,EAAMkpB,UAAYA,EAClBlpB,EAAM4qB,eAAiBA,EACvB5qB,EAAMosB,UAAY1C,EAClB1pB,EAAMsrB,KAAOA,KAGbtrB,EAAM0pB,iBAAmBA,GAEtB5pB,OAAOypB,aAUV,SAAUvpB,GAER,QAASqsB,GAAiBC,EAAMC,GAK9B,MAJAA,GAAUA,MACLA,EAAQpmB,MACXomB,GAAWA,IAEND,EAAKpH,MAAMtjB,KAAM2qB,EAAQpmB,IAAIqmB,IAGtC,QAASC,GAAO9hB,EAAM+hB,EAAkBC,GACtC,GAAIF,EACJ,QAAQ1Q,UAAU7Y,QAChB,IAAK,GACH,MACF,KAAK,GACHupB,EAAS,IACT,MACF,KAAK,GAEHA,EAASC,EAAiBxH,MAAMtjB,KAChC,MACF,SAEE6qB,EAASJ,EAAiBM,EAAeD,GAG7CE,EAAQjiB,GAAQ8hB,EAGlB,QAASD,GAAQ7hB,GACf,MAAOiiB,GAAQjiB,GAKjB,QAASkiB,GAAMN,EAASD,GACtB/C,YAAYG,iBAAiB,WAC3B2C,EAAiBC,EAAMC,KAJ3B,GAAIK,KAUJ5sB,GAAMwsB,QAAUA,EAEhBxsB,EAAM8sB,WAAaL,EACnBzsB,EAAM6sB,MAAQA,GAEb/sB,QAWH,WAQE,GAAI8F,GAAQzF,SAASC,cAAc,QACnCwF,GAAMS,YAAc,kHAQpB,IAAItF,GAAOZ,SAAS8B,cAAc,OAClClB,GAAKgsB,aAAannB,EAAO7E,EAAKisB,aAE7BlE,UAWH,SAAUpQ,GACR,YAKA,SAASuU,KAQP,QAAS7jB,GAAS8jB,GAChBC,EAAUD,EARZ,GAA8B,kBAAnB/lB,QAAO6kB,SACW,kBAAlBlc,OAAMkc,QACf,OAAO,CAGT,IAAImB,MAMA5G,KACAG,IAUJ,OATAvf,QAAO6kB,QAAQzF,EAAMnd,GACrB0G,MAAMkc,QAAQtF,EAAKtd,GACnBmd,EAAK1U,GAAK,EACV0U,EAAK1U,GAAK,QACH0U,GAAK1U,GACZ6U,EAAIrkB,KAAK,EAAG,GACZqkB,EAAIxjB,OAAS,EAEbiE,OAAOimB,qBAAqBhkB,GACL,IAAnB+jB,EAAQjqB,QACH,EAEc,OAAnBiqB,EAAQ,GAAGxhB,MACQ,UAAnBwhB,EAAQ,GAAGxhB,MACQ,UAAnBwhB,EAAQ,GAAGxhB,MACQ,UAAnBwhB,EAAQ,GAAGxhB,MACQ,UAAnBwhB,EAAQ,GAAGxhB,MACN,GAGTxE,OAAOkmB,UAAU9G,EAAMnd,GACvB0G,MAAMud,UAAU3G,EAAKtd,IAEd,GAKT,QAASkkB,KAGP,GAAsB,mBAAXC,SAA0BA,OAAOC,KAAOD,OAAOC,IAAIC,QAC5D,OAAO,CAMT,IAAwB,mBAAbtY,YAA4BA,UAAUuY,iBAC/C,OAAO,CAGT,KACE,GAAIC,GAAI,GAAIC,UAAS,GAAI,eACzB,OAAOD,KACP,MAAOnM,GACP,OAAO,GAMX,QAASqM,GAAQttB,GACf,OAAQA,IAAMA,IAAM,GAAW,KAANA,EAG3B,QAASutB,GAASvtB,GAChB,OAAQA,EAGV,QAASwtB,GAAS/iB,GAChB,MAAOA,KAAQ7D,OAAO6D,GAOxB,QAASgjB,GAAappB,EAAMC,GAC1B,MAAID,KAASC,EACK,IAATD,GAAc,EAAIA,IAAS,EAAIC,EACpCopB,EAAYrpB,IAASqpB,EAAYppB,IAC5B,EAEFD,IAASA,GAAQC,IAAUA,EAqBpC,QAASqpB,GAAgBC,GACvB,GAAa7Y,SAAT6Y,EACF,MAAO,KAET,IAAI9T,GAAO8T,EAAK3U,WAAW,EAE3B,QAAOa,GACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,MAAO8T,EAET,KAAK,IACL,IAAK,IACH,MAAO,OAET,KAAK,IACL,IAAK,GACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,OACL,IAAK,MACL,IAAK,MACH,MAAO,KAIX,MAAa9T,IAAR,IAAwB,KAARA,GAA0BA,GAAR,IAAwB,IAARA,EAC9C,QAGGA,GAAR,IAAwB,IAARA,EACX,SAEF,OAuET,QAAS+T,MAET,QAASC,GAAU1tB,GAsBjB,QAAS2tB,KACP,KAAI/jB,GAAS5J,EAAKuC,QAAlB,CAGA,GAAIqrB,GAAW5tB,EAAK4J,EAAQ,EAC5B,OAAa,iBAARikB,GAAuC,KAAZD,GACnB,iBAARC,GAAuC,KAAZD,GAC9BhkB,IACAkkB,EAAUF,EACVG,EAAQC,UACD,GALT,QASF,IAnCA,GAEIpL,GAAGkL,EAAS/a,EAAK/H,EAAMijB,EAAYC,EAAQC,EAF3CxnB,KACAiD,EAAQ,GAC4CikB,EAAO,aAE3DE,GACFrsB,KAAM,WACQiT,SAAR5B,IAGJpM,EAAKjF,KAAKqR,GACVA,EAAM4B,SAGRqZ,OAAQ,WACMrZ,SAAR5B,EACFA,EAAM+a,EAEN/a,GAAO+a,IAkBND,GAIL,GAHAjkB,IACAgZ,EAAI5iB,EAAK4J,GAEA,MAALgZ,IAAa+K,EAAmBE,GAApC,CAOA,GAJA7iB,EAAOuiB,EAAgB3K,GACvBuL,EAAUC,EAAiBP,GAC3BI,EAAaE,EAAQnjB,IAASmjB,EAAQ,SAAW,QAE/B,SAAdF,EACF,MAOF,IALAJ,EAAOI,EAAW,GAClBC,EAASH,EAAQE,EAAW,KAAOR,EACnCK,EAA4BnZ,SAAlBsZ,EAAW,GAAmBrL,EAAIqL,EAAW,GACvDC,IAEa,cAATL,EACF,MAAOlnB,IAOb,QAAS0nB,GAAQzuB,GACf,MAAO0uB,GAAY1I,KAAKhmB,GAK1B,QAAS+hB,GAAKoC,EAAOwK,GACnB,GAAIA,IAAiBC,EACnB,KAAMrW,OAAM,wCAEd,KAAK,GAAIvV,GAAI,EAAGA,EAAImhB,EAAMxhB,OAAQK,IAChC3B,KAAKS,KAAK6D,OAAOwe,EAAMnhB,IAGrB6rB,IAAWxtB,KAAKsB,SAClBtB,KAAKuiB,aAAeviB,KAAKytB,0BAO7B,QAASC,GAAQzL,GACf,GAAIA,YAAsBvB,GACxB,MAAOuB,EAKT,KAHkB,MAAdA,GAA2C,GAArBA,EAAW3gB,UACnC2gB,EAAa,IAEU,gBAAdA,GAAwB,CACjC,GAAIgK,EAAQhK,EAAW3gB,QAErB,MAAO,IAAIof,GAAKuB,EAAYsL,EAG9BtL,GAAa3d,OAAO2d,GAGtB,GAAIljB,GAAO4uB,EAAU1L,EACrB,IAAIljB,EACF,MAAOA,EAET,IAAI+jB,GAAQ2J,EAAUxK,EACtB,KAAKa,EACH,MAAO8K,EAET,IAAI7uB,GAAO,GAAI2hB,GAAKoC,EAAOyK,EAE3B,OADAI,GAAU1L,GAAcljB,EACjBA,EAKT,QAAS8uB,GAAe/b,GACtB,MAAIma,GAAQna,GACH,IAAMA,EAAM,IAEZ,KAAOA,EAAIuI,QAAQ,KAAM,OAAS,KAqF7C,QAASyT,GAAWzL,GAElB,IADA,GAAI0L,GAAS,EACGC,EAATD,GAAmC1L,EAAS4L,UACjDF,GAKF,OAHIG,KACFpX,EAAOqX,qBAAuBJ,GAEzBA,EAAS,EAGlB,QAASK,GAAczN,GACrB,IAAK,GAAIkB,KAAQlB,GACf,OAAO,CACT,QAAO,EAGT,QAAS0N,GAAYC,GACnB,MAAOF,GAAcE,EAAKC,QACnBH,EAAcE,EAAKE,UACnBJ,EAAcE,EAAKG,SAG5B,QAASC,GAAwB/N,EAAQgO,GACvC,GAAIJ,MACAC,KACAC,IAEJ,KAAK,GAAI5M,KAAQ8M,GAAW,CAC1B,GAAIlM,GAAW9B,EAAOkB,IAELnO,SAAb+O,GAA0BA,IAAakM,EAAU9M,MAG/CA,IAAQlB,GAKV8B,IAAakM,EAAU9M,KACzB4M,EAAQ5M,GAAQY,GALhB+L,EAAQ3M,GAAQnO,QAQpB,IAAK,GAAImO,KAAQlB,GACXkB,IAAQ8M,KAGZJ,EAAM1M,GAAQlB,EAAOkB,GAMvB,OAHI3T,OAAM0gB,QAAQjO,IAAWA,EAAOrf,SAAWqtB,EAAUrtB,SACvDmtB,EAAQntB,OAASqf,EAAOrf,SAGxBitB,MAAOA,EACPC,QAASA,EACTC,QAASA,GAKb,QAASI,KACP,IAAKC,GAASxtB,OACZ,OAAO,CAET,KAAK,GAAIK,GAAI,EAAGA,EAAImtB,GAASxtB,OAAQK,IACnCmtB,GAASntB,IAGX,OADAmtB,IAASxtB,OAAS,GACX,EA4BT,QAASytB,KAMP,QAASvnB,GAAS+jB,GACZlJ,GAAYA,EAAS2M,SAAWC,KAAWC,GAC7C7M,EAAS4L,OAAO1C,GAPpB,GAAIlJ,GACA1B,EACAuO,GAAiB,EACjBC,GAAQ,CAOZ,QACEnK,KAAM,SAASoK,GACb,GAAI/M,EACF,KAAMnL,OAAM,wBAETiY,IACH5pB,OAAOimB,qBAAqBhkB,GAE9B6a,EAAW+M,EACXD,GAAQ,GAEV/E,QAAS,SAAShhB,EAAKimB,GACrB1O,EAASvX,EACLimB,EACFnhB,MAAMkc,QAAQzJ,EAAQnZ,GAEtBjC,OAAO6kB,QAAQzJ,EAAQnZ,IAE3B0d,QAAS,SAASoK,GAChBJ,EAAiBI,EACjB/pB,OAAOimB,qBAAqBhkB,GAC5B0nB,GAAiB,GAEnB/J,MAAO,WACL9C,EAAW3O,OACXnO,OAAOkmB,UAAU9K,EAAQnZ,GACzB+nB,GAAoB9uB,KAAKT,QA2B/B,QAASwvB,GAAkBnN,EAAU1B,EAAQ0O,GAC3C,GAAII,GAAMF,GAAoB1S,OAASkS,GAGvC,OAFAU,GAAIzK,KAAK3C,GACToN,EAAIrF,QAAQzJ,EAAQ0O,GACbI,EAKT,QAASC,KAOP,QAAStF,GAAQhhB,EAAKyY,GACfzY,IAGDA,IAAQumB,IACVC,EAAa/N,IAAQ,GAEnBgO,EAAQ3oB,QAAQkC,GAAO,IACzBymB,EAAQpvB,KAAK2I,GACb7D,OAAO6kB,QAAQhhB,EAAK5B,IAGtB4iB,EAAQ7kB,OAAOuqB,eAAe1mB,GAAMyY,IAGtC,QAASkO,GAA2BzE,GAClC,IAAK,GAAI3pB,GAAI,EAAGA,EAAI2pB,EAAKhqB,OAAQK,IAAK,CACpC,GAAIquB,GAAM1E,EAAK3pB,EACf,IAAIquB,EAAIrP,SAAWgP,GACfC,EAAaI,EAAIjnB,OACJ,iBAAbinB,EAAIjmB,KACN,OAAO,EAGX,OAAO,EAGT,QAASvC,GAAS8jB,GAChB,IAAIyE,EAA2BzE,GAA/B,CAIA,IAAK,GADDjJ,GACK1gB,EAAI,EAAGA,EAAIsuB,EAAU3uB,OAAQK,IACpC0gB,EAAW4N,EAAUtuB,GACjB0gB,EAAS2M,QAAUC,IACrB5M,EAAS6N,gBAAgB9F,EAI7B,KAAK,GAAIzoB,GAAI,EAAGA,EAAIsuB,EAAU3uB,OAAQK,IACpC0gB,EAAW4N,EAAUtuB,GACjB0gB,EAAS2M,QAAUC,IACrB5M,EAAS4L,UAhDf,GAGI0B,GACAC,EAJAO,EAAgB,EAChBF,KACAJ,KAmDAO,GACFzP,OAAQjN,OACRmc,QAASA,EACT7K,KAAM,SAASoK,EAAKzO,GACbgP,IACHA,EAAUhP,EACViP,MAGFK,EAAUxvB,KAAK2uB,GACfe,IACAf,EAAIc,gBAAgB9F,IAEtBjF,MAAO,WAEL,GADAgL,MACIA,EAAgB,GAApB,CAIA,IAAK,GAAIxuB,GAAI,EAAGA,EAAIkuB,EAAQvuB,OAAQK,IAClC4D,OAAOkmB,UAAUoE,EAAQluB,GAAI6F,GAC7B6oB,EAASC,iBAGXL,GAAU3uB,OAAS,EACnBuuB,EAAQvuB,OAAS,EACjBquB,EAAUjc,OACVkc,EAAelc,OACf6c,GAAiB9vB,KAAKT,QAI1B,OAAOowB,GAKT,QAASI,GAAenO,EAAUjZ,GAMhC,MALKqnB,IAAmBA,EAAgB9P,SAAWvX,IACjDqnB,EAAkBF,GAAiB1T,OAAS6S,IAC5Ce,EAAgB9P,OAASvX,GAE3BqnB,EAAgBzL,KAAK3C,EAAUjZ,GACxBqnB,EAUT,QAASJ,KACPrwB,KAAKgvB,OAAS0B,GACd1wB,KAAK2wB,UAAYjd,OACjB1T,KAAK4wB,QAAUld,OACf1T,KAAK6wB,gBAAkBnd,OACvB1T,KAAKyhB,OAAS/N,OACd1T,KAAK8wB,IAAMC,KA2Db,QAASC,GAAS3O,GAChBgO,EAASY,qBACJC,IAGLC,GAAa1wB,KAAK4hB,GAGpB,QAAS+O,KACPf,EAASY,qBAmDX,QAASI,GAAe1Q,GACtB0P,EAAS3oB,KAAK1H,MACdA,KAAKyhB,OAASd,EACd3gB,KAAKsxB,WAAa5d,OA0FpB,QAAS6d,GAAcC,GACrB,IAAKtjB,MAAM0gB,QAAQ4C,GACjB,KAAMta,OAAM,kCACdma,GAAe3pB,KAAK1H,KAAMwxB,GAgD5B,QAASjL,GAAa5F,EAAQ5hB,GAC5BsxB,EAAS3oB,KAAK1H,MAEdA,KAAKyxB,QAAU9Q,EACf3gB,KAAK0xB,MAAQhE,EAAQ3uB,GACrBiB,KAAK6wB,gBAAkBnd,OA8CzB,QAASgS,GAAiBiM,GACxBtB,EAAS3oB,KAAK1H,MAEdA,KAAK4xB,qBAAuBD,EAC5B3xB,KAAKyhB,UACLzhB,KAAK6wB,gBAAkBnd,OACvB1T,KAAK6xB,aAgIP,QAASC,GAAQjgB,GAAS,MAAOA,GAEjC,QAAS8T,GAAkBoM,EAAYC,EAAYvM,EACxBwM,GACzBjyB,KAAK2wB,UAAYjd,OACjB1T,KAAK4wB,QAAUld,OACf1T,KAAKyhB,OAAS/N,OACd1T,KAAKkyB,YAAcH,EACnB/xB,KAAKmyB,YAAcH,GAAcF,EACjC9xB,KAAKoyB,YAAc3M,GAAcqM,EAGjC9xB,KAAKqyB,oBAAsBJ,EAsD7B,QAASK,GAA4B3R,EAAQ4R,EAAeC,GAI1D,IAAK,GAHDjE,MACAC,KAEK7sB,EAAI,EAAGA,EAAI4wB,EAAcjxB,OAAQK,IAAK,CAC7C,GAAIyuB,GAASmC,EAAc5wB,EACtB8wB,IAAoBrC,EAAOrmB,OAM1BqmB,EAAOrnB,OAAQypB,KACnBA,EAAUpC,EAAOrnB,MAAQqnB,EAAOsC,UAEf,UAAftC,EAAOrmB,OAGQ,OAAfqmB,EAAOrmB,KAUPqmB,EAAOrnB,OAAQwlB,UACVA,GAAM6B,EAAOrnB,YACbypB,GAAUpC,EAAOrnB,OAExBylB,EAAQ4B,EAAOrnB,OAAQ,EAbnBqnB,EAAOrnB,OAAQylB,SACVA,GAAQ4B,EAAOrnB,MAEtBwlB,EAAM6B,EAAOrnB,OAAQ,KAfvB8W,QAAQ5F,MAAM,8BAAgCmW,EAAOrmB,MACrD8V,QAAQ5F,MAAMmW,IA4BlB,IAAK,GAAIvO,KAAQ0M,GACfA,EAAM1M,GAAQlB,EAAOkB,EAEvB,KAAK,GAAIA,KAAQ2M,GACfA,EAAQ3M,GAAQnO,MAElB,IAAI+a,KACJ,KAAK,GAAI5M,KAAQ2Q,GACf,KAAI3Q,IAAQ0M,IAAS1M,IAAQ2M,IAA7B,CAGA,GAAI/L,GAAW9B,EAAOkB,EAClB2Q,GAAU3Q,KAAUY,IACtBgM,EAAQ5M,GAAQY,GAGpB,OACE8L,MAAOA,EACPC,QAASA,EACTC,QAASA,GAIb,QAASkE,GAAUhqB,EAAO6lB,EAASoE,GACjC,OACEjqB,MAAOA,EACP6lB,QAASA,EACToE,WAAYA,GAShB,QAASC,MA0OT,QAASC,GAAYC,EAASC,EAAcC,EACvBC,EAAKC,EAAUC,GAClC,MAAOC,IAAYP,YAAYC,EAASC,EAAcC,EACvBC,EAAKC,EAAUC,GAGhD,QAASE,GAAUC,EAAQC,EAAMC,EAAQC,GAEvC,MAAWD,GAAPD,GAAwBD,EAAPG,EACZ,GAGLF,GAAQC,GAAUC,GAAQH,EACrB,EAGIE,EAATF,EACSG,EAAPF,EACKA,EAAOC,EAEPC,EAAOD,EAGLD,EAAPE,EACKA,EAAOH,EAEPC,EAAOD,EAIpB,QAASI,GAAYC,EAASjrB,EAAO6lB,EAASoE,GAO5C,IAAK,GALDvrB,GAASsrB,EAAUhqB,EAAO6lB,EAASoE,GAEnCiB,GAAW,EACXC,EAAkB,EAEbnyB,EAAI,EAAGA,EAAIiyB,EAAQtyB,OAAQK,IAAK,CACvC,GAAIoxB,GAAUa,EAAQjyB,EAGtB,IAFAoxB,EAAQpqB,OAASmrB,GAEbD,EAAJ,CAGA,GAAIE,GAAiBT,EAAUjsB,EAAOsB,MACPtB,EAAOsB,MAAQtB,EAAOmnB,QAAQltB,OAC9ByxB,EAAQpqB,MACRoqB,EAAQpqB,MAAQoqB,EAAQH,WAEvD,IAAImB,GAAkB,EAAG,CAGvBH,EAAQvsB,OAAO1F,EAAG,GAClBA,IAEAmyB,GAAmBf,EAAQH,WAAaG,EAAQvE,QAAQltB,OAExD+F,EAAOurB,YAAcG,EAAQH,WAAamB,CAC1C,IAAIC,GAAc3sB,EAAOmnB,QAAQltB,OACfyxB,EAAQvE,QAAQltB,OAASyyB,CAE3C,IAAK1sB,EAAOurB,YAAeoB,EAGpB,CACL,GAAIxF,GAAUuE,EAAQvE,OAEtB,IAAInnB,EAAOsB,MAAQoqB,EAAQpqB,MAAO,CAEhC,GAAIsrB,GAAU5sB,EAAOmnB,QAAQ1W,MAAM,EAAGib,EAAQpqB,MAAQtB,EAAOsB,MAC7DuF,OAAMpH,UAAUrG,KAAK6iB,MAAM2Q,EAASzF,GACpCA,EAAUyF,EAGZ,GAAI5sB,EAAOsB,MAAQtB,EAAOmnB,QAAQltB,OAASyxB,EAAQpqB,MAAQoqB,EAAQH,WAAY,CAE7E,GAAI7F,GAAS1lB,EAAOmnB,QAAQ1W,MAAMib,EAAQpqB,MAAQoqB,EAAQH,WAAavrB,EAAOsB,MAC9EuF,OAAMpH,UAAUrG,KAAK6iB,MAAMkL,EAASzB,GAGtC1lB,EAAOmnB,QAAUA,EACbuE,EAAQpqB,MAAQtB,EAAOsB,QACzBtB,EAAOsB,MAAQoqB,EAAQpqB,WAnBzBkrB,IAAW,MAsBR,IAAIxsB,EAAOsB,MAAQoqB,EAAQpqB,MAAO,CAGvCkrB,GAAW,EAEXD,EAAQvsB,OAAO1F,EAAG,EAAG0F,GACrB1F,GAEA,IAAIuyB,GAAS7sB,EAAOurB,WAAavrB,EAAOmnB,QAAQltB,MAChDyxB,GAAQpqB,OAASurB,EACjBJ,GAAmBI,IAIlBL,GACHD,EAAQnzB,KAAK4G,GAGjB,QAAS8sB,GAAqB3C,EAAOe,GAGnC,IAAK,GAFDqB,MAEKjyB,EAAI,EAAGA,EAAI4wB,EAAcjxB,OAAQK,IAAK,CAC7C,GAAIyuB,GAASmC,EAAc5wB,EAC3B,QAAOyuB,EAAOrmB,MACZ,IAAK,SACH4pB,EAAYC,EAASxD,EAAOznB,MAAOynB,EAAO5B,QAAQ1W,QAASsY,EAAOwC,WAClE,MACF,KAAK,MACL,IAAK,SACL,IAAK,SACH,IAAK3G,EAAQmE,EAAOrnB,MAClB,QACF,IAAIJ,GAAQujB,EAASkE,EAAOrnB,KAC5B,IAAY,EAARJ,EACF,QACFgrB,GAAYC,EAASjrB,GAAQynB,EAAOsC,UAAW,EAC/C,MACF,SACE7S,QAAQ5F,MAAM,2BAA6Bma,KAAKC,UAAUjE,KAKhE,MAAOwD,GAGT,QAASU,GAAoB9C,EAAOe,GAClC,GAAIqB,KAcJ,OAZAO,GAAqB3C,EAAOe,GAAenuB,QAAQ,SAASiD,GAC1D,MAAyB,IAArBA,EAAOurB,YAA4C,GAAzBvrB,EAAOmnB,QAAQltB,YACvC+F,EAAOmnB,QAAQ,KAAOgD,EAAMnqB,EAAOsB,QACrCirB,EAAQnzB,KAAK4G,SAKjBusB,EAAUA,EAAQW,OAAOzB,EAAYtB,EAAOnqB,EAAOsB,MAAOtB,EAAOsB,MAAQtB,EAAOurB,WAC3CvrB,EAAOmnB,QAAS,EAAGnnB,EAAOmnB,QAAQltB,YAGlEsyB,EA7oDT,GAAI1F,GAA0BpX,EAAOoX,wBA2CjCsG,EAAanJ,IAwBbmC,EAAU9B,IAcVW,EAAcvV,EAAOqL,OAAOD,OAAS,SAASrQ,GAChD,MAAwB,gBAAVA,IAAsBiF,EAAOoL,MAAMrQ,IAY/C4iB,EAAgB,gBAClB,SAASrrB,GAAO,MAAOA,IACvB,SAASA,GACP,GAAIsrB,GAAQtrB,EAAIwd,SAChB,KAAK8N,EACH,MAAOtrB,EACT,IAAIurB,GAAYpvB,OAAOC,OAAOkvB,EAK9B,OAJAnvB,QAAOqvB,oBAAoBxrB,GAAKhF,QAAQ,SAAS2E,GAC/CxD,OAAOshB,eAAe8N,EAAW5rB,EACZxD,OAAOsvB,yBAAyBzrB,EAAKL,MAErD4rB,GAGPG,EAAa,aACbC,EAAY,gBACZ1H,EAAc,GAAI2H,QAAO,IAAMF,EAAa,IAAMC,EAAY,MA2C9D5H,GACF8H,YACEC,IAAO,cACPtQ,OAAU,UAAW,UACrBuQ,KAAM,iBACNC,KAAQ,cAGVC,QACEH,IAAO,UACPI,KAAM,eACNH,KAAM,iBACNC,KAAQ,cAGVG,aACEL,IAAO,eACPtQ,OAAU,UAAW,WAGvB4Q,SACE5Q,OAAU,UAAW,UACrB6Q,GAAM,UAAW,UACjBzc,QAAW,UAAW,UACtBkc,IAAO,SAAU,QACjBI,KAAM,cAAe,QACrBH,KAAM,gBAAiB,QACvBC,KAAQ,YAAa,SAGvBM,eACER,IAAO,iBACPO,GAAM,YAAa,UACnBzc,QAAW,UAAW,UACtB2c,KAAM,gBAAiB,SAAU,IACjCC,KAAM,gBAAiB,SAAU,KAGnCC,WACEX,IAAO,eAAgB,QACvBY,KAAM,SAAU,SAGlBC,SACEN,GAAM,UAAW,UACjBzc,QAAW,UAAW,UACtBkc,IAAO,gBACPY,KAAM,SAAU,SAGlBE,eACEL,KAAM,gBACNP,KAAQ,SACRa,QAAS,gBAAiB,WAG5BC,eACEN,KAAM,gBACNR,KAAQ,SACRa,QAAS,gBAAiB,WAG5BE,cACEjB,IAAO,gBACPY,KAAM,SAAU,UAyEhBvI,KAgBAI,IA+BJjN,GAAKpZ,IAAMomB,EAUXhN,EAAK5Z,UAAY2tB,GACf7N,aACAN,OAAO,EAEPR,SAAU,WAER,IAAK,GADD7D,GAAa,GACRtgB,EAAI,EAAGA,EAAI3B,KAAKsB,OAAQK,IAAK,CACpC,GAAImQ,GAAM9R,KAAK2B,EAEbsgB,IADEmL,EAAQtb,GACInQ,EAAI,IAAMmQ,EAAMA,EAEhB+b,EAAe/b,GAIjC,MAAOmQ,IAGTM,aAAc,SAASnZ,GACrB,IAAK,GAAIzH,GAAI,EAAGA,EAAI3B,KAAKsB,OAAQK,IAAK,CACpC,GAAW,MAAPyH,EACF,MACFA,GAAMA,EAAIpJ,KAAK2B,IAEjB,MAAOyH,IAGTgtB,eAAgB,SAAShtB,EAAKghB,GAC5B,IAAK,GAAIzoB,GAAI,EAAGA,EAAI3B,KAAKsB,OAAQK,IAAK,CAGpC,GAFIA,IACFyH,EAAMA,EAAIpJ,KAAK2B,EAAI,MAChBwqB,EAAS/iB,GACZ,MACFghB,GAAQhhB,EAAKpJ,KAAK,MAItBytB,uBAAwB,WACtB,GAAIpU,GAAM,GACN4I,EAAa,KACjB5I,IAAO,iBAGP,KAFA,GACIvH,GADAnQ,EAAI,EAEDA,EAAK3B,KAAKsB,OAAS,EAAIK,IAC5BmQ,EAAM9R,KAAK2B,GACXsgB,GAAcmL,EAAQtb,GAAO,IAAMA,EAAM+b,EAAe/b,GACxDuH,GAAO,aAAe4I,EAAa,UAErC5I,IAAO,KAEP,IAAIvH,GAAM9R,KAAK2B,EAIf,OAHAsgB,IAAcmL,EAAQtb,GAAO,IAAMA,EAAM+b,EAAe/b,GAExDuH,GAAO,YAAc4I,EAAa,+BAC3B,GAAI+J,UAAS,MAAO3S,IAG7BqJ,aAAc,SAAStZ,EAAKyI,GAC1B,IAAK7R,KAAKsB,OACR,OAAO,CAET,KAAK,GAAIK,GAAI,EAAGA,EAAI3B,KAAKsB,OAAS,EAAGK,IAAK,CACxC,IAAKwqB,EAAS/iB,GACZ,OAAO,CACTA,GAAMA,EAAIpJ,KAAK2B,IAGjB,MAAKwqB,GAAS/iB,IAGdA,EAAIpJ,KAAK2B,IAAMkQ,GACR,IAHE,IAOb,IAAI+b,GAAc,GAAIlN,GAAK,GAAI6M,EAC/BK,GAAYtH,OAAQ,EACpBsH,EAAYrL,aAAeqL,EAAYlL,aAAe,YAEtD,IAqQI+N,GArQAzC,EAAyB,IA8DzBc,MAYAuH,GAAS7B,EAAa,WACxB,GAAI8B,IAAWC,UAAU,GACrBC,GAAkB,CAOtB,OALAjxB,QAAO6kB,QAAQkM,EAAQ,WACrBzH,IACA2H,GAAkB,IAGb,SAAS5rB,GACdkkB,GAASruB,KAAKmK,GACT4rB,IACHA,GAAkB,EAClBF,EAAOC,UAAYD,EAAOC,cAIhC,WACE,MAAO,UAAS3rB,GACdkkB,GAASruB,KAAKmK,OAId2kB,MAyEAgB,MAsGAG,GAAW,EACXzB,GAAS,EACTwH,GAAS,EACTC,GAAY,EAEZ3F,GAAiB,CAWrBV,GAASvpB,WACPke,KAAM,SAASxd,EAAUjI,GACvB,GAAIS,KAAKgvB,QAAU0B,GACjB,KAAMxZ,OAAM,oCAOd,OALA8Z,GAAShxB,MACTA,KAAK2wB,UAAYnpB,EACjBxH,KAAK4wB,QAAUrxB,EACfS,KAAK22B,WACL32B,KAAKgvB,OAASC,GACPjvB,KAAKyhB,QAGd0D,MAAO,WACDnlB,KAAKgvB,QAAUC,KAGnBmC,EAAcpxB,MACdA,KAAK42B,cACL52B,KAAKyhB,OAAS/N,OACd1T,KAAK2wB,UAAYjd,OACjB1T,KAAK4wB,QAAUld,OACf1T,KAAKgvB,OAASyH,KAGhBvR,QAAS,WACHllB,KAAKgvB,QAAUC,IAGnBnB,EAAW9tB,OAGb62B,QAAS,SAASC,GAChB,IACE92B,KAAK2wB,UAAUrN,MAAMtjB,KAAK4wB,QAASkG,GACnC,MAAOlX,GACPyQ,EAAS0G,4BAA6B,EACtClX,QAAQ5F,MAAM,+CACE2F,EAAGjD,OAASiD,MAIhCqF,eAAgB,WAEd,MADAjlB,MAAKiuB,OAAOva,QAAW,GAChB1T,KAAKyhB,QAIhB,IACI0P,IADAD,IAAoBsD,CAExBnE,GAASY,mBAAqB,EAE1BC,KACFC,MAeF,IAAI6F,KAA6B,CAEjClgB,GAAOoQ,SAAWpQ,EAAOoQ,aAEzBpQ,EAAOoQ,SAAS+P,2BAA6B,WAC3C,IAAID,IAGC9F,GAAL,CAGA8F,IAA6B,CAE7B,IACIE,GAAYC,EADZpJ,EAAS,CAGb,GAAG,CACDA,IACAoJ,EAAUhG,GACVA,MACA+F,GAAa,CAEb,KAAK,GAAIv1B,GAAI,EAAGA,EAAIw1B,EAAQ71B,OAAQK,IAAK,CACvC,GAAI0gB,GAAW8U,EAAQx1B,EACnB0gB,GAAS2M,QAAUC,KAGnB5M,EAAS4L,WACXiJ,GAAa,GAEf/F,GAAa1wB,KAAK4hB,IAEhBwM,MACFqI,GAAa,SACClJ,EAATD,GAAmCmJ,EAExChJ,KACFpX,EAAOqX,qBAAuBJ,GAEhCiJ,IAA6B,IAG3B9F,KACFpa,EAAOoQ,SAASkQ,eAAiB,WAC/BjG,QAUJE,EAAevqB,UAAY2tB,GACzB7N,UAAWyJ,EAASvpB,UAEpBuoB,cAAc,EAEdsH,SAAU,WACJnC,EACFx0B,KAAK6wB,gBAAkBrB,EAAkBxvB,KAAMA,KAAKyhB,OACXzhB,KAAKqvB,cAE9CrvB,KAAKsxB,WAAatxB,KAAKq3B,WAAWr3B,KAAKyhB,SAK3C4V,WAAY,SAAS1W,GACnB,GAAI2W,GAAOppB,MAAM0gB,QAAQjO,QACzB,KAAK,GAAIkB,KAAQlB,GACf2W,EAAKzV,GAAQlB,EAAOkB,EAItB,OAFI3T,OAAM0gB,QAAQjO,KAChB2W,EAAKh2B,OAASqf,EAAOrf,QAChBg2B,GAGTrJ,OAAQ,SAASsE,GACf,GAAIjE,GACAkE,CACJ,IAAIgC,EAAY,CACd,IAAKjC,EACH,OAAO,CAETC,MACAlE,EAAOgE,EAA4BtyB,KAAKyhB,OAAQ8Q,EACbC,OAEnCA,GAAYxyB,KAAKsxB,WACjBhD,EAAOI,EAAwB1uB,KAAKyhB,OAAQzhB,KAAKsxB,WAGnD,OAAIjD,GAAYC,IACP,GAEJkG,IACHx0B,KAAKsxB,WAAatxB,KAAKq3B,WAAWr3B,KAAKyhB,SAEzCzhB,KAAK62B,SACHvI,EAAKC,UACLD,EAAKE,YACLF,EAAKG,YACL,SAASvS,GACP,MAAOsW,GAAUtW,OAId,IAGT0a,YAAa,WACPpC,GACFx0B,KAAK6wB,gBAAgB1L,QACrBnlB,KAAK6wB,gBAAkBnd,QAEvB1T,KAAKsxB,WAAa5d,QAItBwR,QAAS,WACHllB,KAAKgvB,QAAUC,KAGfuF,EACFx0B,KAAK6wB,gBAAgB3L,SAAQ,GAE7B4I,EAAW9tB,QAGfilB,eAAgB,WAMd,MALIjlB,MAAK6wB,gBACP7wB,KAAK6wB,gBAAgB3L,SAAQ,GAE7BllB,KAAKsxB,WAAatxB,KAAKq3B,WAAWr3B,KAAKyhB,QAElCzhB,KAAKyhB,UAUhB8P,EAAczqB,UAAY2tB,GAExB7N,UAAWyK,EAAevqB,UAE1BuoB,cAAc,EAEdgI,WAAY,SAASvS,GACnB,MAAOA,GAAIhN,SAGbmW,OAAQ,SAASsE,GACf,GAAIqB,EACJ,IAAIY,EAAY,CACd,IAAKjC,EACH,OAAO,CACTqB,GAAUU,EAAoBt0B,KAAKyhB,OAAQ8Q,OAE3CqB,GAAUd,EAAY9yB,KAAKyhB,OAAQ,EAAGzhB,KAAKyhB,OAAOngB,OAC5BtB,KAAKsxB,WAAY,EAAGtxB,KAAKsxB,WAAWhwB,OAG5D,OAAKsyB,IAAYA,EAAQtyB,QAGpBkzB,IACHx0B,KAAKsxB,WAAatxB,KAAKq3B,WAAWr3B,KAAKyhB,SAEzCzhB,KAAK62B,SAASjD,KACP,IANE,KAUbrC,EAAcgG,aAAe,SAASC,EAAUzE,EAASa,GACvDA,EAAQxvB,QAAQ,SAASiD,GAGvB,IAFA,GAAIowB,IAAcpwB,EAAOsB,MAAOtB,EAAOmnB,QAAQltB,QAC3Co2B,EAAWrwB,EAAOsB,MACf+uB,EAAWrwB,EAAOsB,MAAQtB,EAAOurB,YACtC6E,EAAWh3B,KAAKsyB,EAAQ2E,IACxBA,GAGFxpB,OAAMpH,UAAUO,OAAOic,MAAMkU,EAAUC,MAY3ClR,EAAazf,UAAY2tB,GACvB7N,UAAWyJ,EAASvpB,UAEpB6b,GAAI5jB,QACF,MAAOiB,MAAK0xB,OAGdiF,SAAU,WACJnC,IACFx0B,KAAK6wB,gBAAkBL,EAAexwB,KAAMA,KAAKyxB,UAEnDzxB,KAAKiuB,OAAOva,QAAW,IAGzBkjB,YAAa,WACX52B,KAAKyhB,OAAS/N,OAEV1T,KAAK6wB,kBACP7wB,KAAK6wB,gBAAgB1L,MAAMnlB,MAC3BA,KAAK6wB,gBAAkBnd,SAI3Bwc,gBAAiB,SAAS9F,GACxBpqB,KAAK0xB,MAAM0E,eAAep2B,KAAKyxB,QAASrH,IAG1C6D,OAAQ,SAASsE,EAAeoF,GAC9B,GAAIjF,GAAW1yB,KAAKyhB,MAEpB,OADAzhB,MAAKyhB,OAASzhB,KAAK0xB,MAAMnP,aAAaviB,KAAKyxB,SACvCkG,GAAevL,EAAapsB,KAAKyhB,OAAQiR,IACpC,GAET1yB,KAAK62B,SAAS72B,KAAKyhB,OAAQiR,EAAU1yB,QAC9B,IAGTwiB,SAAU,SAASC,GACbziB,KAAK0xB,OACP1xB,KAAK0xB,MAAMhP,aAAa1iB,KAAKyxB,QAAShP,KAa5C,IAAImV,MAEJlS,GAAiB5e,UAAY2tB,GAC3B7N,UAAWyJ,EAASvpB,UAEpB6vB,SAAU,WACR,GAAInC,EAAY,CAGd,IAAK,GAFD7T,GACAkX,GAAsB,EACjBl2B,EAAI,EAAGA,EAAI3B,KAAK6xB,UAAUvwB,OAAQK,GAAK,EAE9C,GADAgf,EAAS3gB,KAAK6xB,UAAUlwB,GACpBgf,IAAWiX,GAAkB,CAC/BC,GAAsB,CACtB,OAIAA,IACF73B,KAAK6wB,gBAAkBL,EAAexwB,KAAM2gB,IAGhD3gB,KAAKiuB,OAAOva,QAAY1T,KAAK4xB,uBAG/BgF,YAAa,WACX,IAAK,GAAIj1B,GAAI,EAAGA,EAAI3B,KAAK6xB,UAAUvwB,OAAQK,GAAK,EAC1C3B,KAAK6xB,UAAUlwB,KAAOi2B,IACxB53B,KAAK6xB,UAAUlwB,EAAI,GAAGwjB,OAE1BnlB,MAAK6xB,UAAUvwB,OAAS,EACxBtB,KAAKyhB,OAAOngB,OAAS,EAEjBtB,KAAK6wB,kBACP7wB,KAAK6wB,gBAAgB1L,MAAMnlB,MAC3BA,KAAK6wB,gBAAkBnd,SAI3B4O,QAAS,SAAS3B,EAAQ5hB,GACxB,GAAIiB,KAAKgvB,QAAU0B,IAAY1wB,KAAKgvB,QAAU0H,GAC5C,KAAMxf,OAAM,iCAEd,IAAInY,GAAO2uB,EAAQ3uB,EAEnB,IADAiB,KAAK6xB,UAAUpxB,KAAKkgB,EAAQ5hB,GACvBiB,KAAK4xB,qBAAV,CAEA,GAAIjpB,GAAQ3I,KAAK6xB,UAAUvwB,OAAS,EAAI,CACxCtB,MAAKyhB,OAAO9Y,GAAS5J,EAAKwjB,aAAa5B,KAGzCmX,YAAa,SAASzV,GACpB,GAAIriB,KAAKgvB,QAAU0B,IAAY1wB,KAAKgvB,QAAU0H,GAC5C,KAAMxf,OAAM,qCAGd,IADAlX,KAAK6xB,UAAUpxB,KAAKm3B,GAAkBvV,GACjCriB,KAAK4xB,qBAAV,CAEA,GAAIjpB,GAAQ3I,KAAK6xB,UAAUvwB,OAAS,EAAI,CACxCtB,MAAKyhB,OAAO9Y,GAAS0Z,EAAS2C,KAAKhlB,KAAKklB,QAASllB,QAGnDslB,WAAY,WACV,GAAItlB,KAAKgvB,QAAUC,GACjB,KAAM/X,OAAM,4BAEdlX,MAAKgvB,OAAS0H,GACd12B,KAAK42B,eAGPpR,YAAa,WACX,GAAIxlB,KAAKgvB,QAAU0H,GACjB,KAAMxf,OAAM,wCAId,OAHAlX,MAAKgvB,OAASC,GACdjvB,KAAK22B,WAEE32B,KAAKyhB,QAGdyO,gBAAiB,SAAS9F,GAExB,IAAK,GADDzJ,GACKhf,EAAI,EAAGA,EAAI3B,KAAK6xB,UAAUvwB,OAAQK,GAAK,EAC9Cgf,EAAS3gB,KAAK6xB,UAAUlwB,GACpBgf,IAAWiX,IACb53B,KAAK6xB,UAAUlwB,EAAI,GAAGy0B,eAAezV,EAAQyJ,IAInD6D,OAAQ,SAASsE,EAAeoF,GAE9B,IAAK,GADDnF,GACK7wB,EAAI,EAAGA,EAAI3B,KAAK6xB,UAAUvwB,OAAQK,GAAK,EAAG,CACjD,GAEIkQ,GAFA8O,EAAS3gB,KAAK6xB,UAAUlwB,GACxB5C,EAAOiB,KAAK6xB,UAAUlwB,EAAE,EAE5B,IAAIgf,IAAWiX,GAAkB,CAC/B,GAAI7F,GAAahzB,CACjB8S,GAAQ7R,KAAKgvB,SAAW0B,GACpBqB,EAAW/M,KAAKhlB,KAAKklB,QAASllB,MAC9B+xB,EAAW9M,qBAEfpT,GAAQ9S,EAAKwjB,aAAa5B,EAGxBgX,GACF33B,KAAKyhB,OAAO9f,EAAI,GAAKkQ,EAInBua,EAAava,EAAO7R,KAAKyhB,OAAO9f,EAAI,MAGxC6wB,EAAYA,MACZA,EAAU7wB,EAAI,GAAK3B,KAAKyhB,OAAO9f,EAAI,GACnC3B,KAAKyhB,OAAO9f,EAAI,GAAKkQ,GAGvB,MAAK2gB,IAKLxyB,KAAK62B,SAAS72B,KAAKyhB,OAAQ+Q,EAAWxyB,KAAK6xB,aACpC,IALE,KAwBblM,EAAkB7e,WAChBke,KAAM,SAASxd,EAAUjI,GAKvB,MAJAS,MAAK2wB,UAAYnpB,EACjBxH,KAAK4wB,QAAUrxB,EACfS,KAAKyhB,OACDzhB,KAAKmyB,YAAYnyB,KAAKkyB,YAAYlN,KAAKhlB,KAAK+3B,kBAAmB/3B,OAC5DA,KAAKyhB,QAGdsW,kBAAmB,SAASlmB,GAE1B,GADAA,EAAQ7R,KAAKmyB,YAAYtgB,IACrBua,EAAava,EAAO7R,KAAKyhB,QAA7B,CAEA,GAAIiR,GAAW1yB,KAAKyhB,MACpBzhB,MAAKyhB,OAAS5P,EACd7R,KAAK2wB,UAAUjpB,KAAK1H,KAAK4wB,QAAS5wB,KAAKyhB,OAAQiR,KAGjDzN,eAAgB,WAEd,MADAjlB,MAAKyhB,OAASzhB,KAAKmyB,YAAYnyB,KAAKkyB,YAAYjN,kBACzCjlB,KAAKyhB,QAGdyD,QAAS,WACP,MAAOllB,MAAKkyB,YAAYhN,WAG1B1C,SAAU,SAAS3Q,GAEjB,MADAA,GAAQ7R,KAAKoyB,YAAYvgB,IACpB7R,KAAKqyB,qBAAuBryB,KAAKkyB,YAAY1P,SACzCxiB,KAAKkyB,YAAY1P,SAAS3Q,GADnC,QAIFsT,MAAO,WACDnlB,KAAKkyB,aACPlyB,KAAKkyB,YAAY/M,QACnBnlB,KAAK2wB,UAAYjd,OACjB1T,KAAK4wB,QAAUld,OACf1T,KAAKkyB,YAAcxe,OACnB1T,KAAKyhB,OAAS/N,OACd1T,KAAKmyB,YAAcze,OACnB1T,KAAKoyB,YAAc1e,QAIvB,IAAI+e,KACFuF,KAAK,EACLC,QAAQ,EACR7wB,UAAQ,GAsEN8wB,GAAa,EACbC,GAAc,EACdC,GAAW,EACXC,GAAc,CAIlBxF,GAAY/rB,WAaVwxB,kBAAmB,SAASvF,EAASC,EAAcC,EACvBC,EAAKC,EAAUC,GAOzC,IAAK,GALDmF,GAAWnF,EAASD,EAAW,EAC/BqF,EAAcvF,EAAaD,EAAe,EAC1CyF,EAAY,GAAIvqB,OAAMqqB,GAGjB52B,EAAI,EAAO42B,EAAJ52B,EAAcA,IAC5B82B,EAAU92B,GAAK,GAAIuM,OAAMsqB,GACzBC,EAAU92B,GAAG,GAAKA,CAIpB,KAAK,GAAImK,GAAI,EAAO0sB,EAAJ1sB,EAAiBA,IAC/B2sB,EAAU,GAAG3sB,GAAKA,CAEpB,KAAK,GAAInK,GAAI,EAAO42B,EAAJ52B,EAAcA,IAC5B,IAAK,GAAImK,GAAI,EAAO0sB,EAAJ1sB,EAAiBA,IAC/B,GAAI9L,KAAK04B,OAAO3F,EAAQC,EAAelnB,EAAI,GAAIonB,EAAIC,EAAWxxB,EAAI,IAChE82B,EAAU92B,GAAGmK,GAAK2sB,EAAU92B,EAAI,GAAGmK,EAAI,OACpC,CACH,GAAI6sB,GAAQF,EAAU92B,EAAI,GAAGmK,GAAK,EAC9B8sB,EAAOH,EAAU92B,GAAGmK,EAAI,GAAK,CACjC2sB,GAAU92B,GAAGmK,GAAa8sB,EAARD,EAAeA,EAAQC,EAK/C,MAAOH,IAMTI,kCAAmC,SAASJ,GAK1C,IAJA,GAAI92B,GAAI82B,EAAUn3B,OAAS,EACvBwK,EAAI2sB,EAAU,GAAGn3B,OAAS,EAC1ByxB,EAAU0F,EAAU92B,GAAGmK,GACvBgtB,KACGn3B,EAAI,GAAKmK,EAAI,GAClB,GAAS,GAALnK,EAKJ,GAAS,GAALmK,EAAJ,CAKA,GAIIitB,GAJAC,EAAYP,EAAU92B,EAAI,GAAGmK,EAAI,GACjC8sB,EAAOH,EAAU92B,EAAI,GAAGmK,GACxB6sB,EAAQF,EAAU92B,GAAGmK,EAAI,EAI3BitB,GADSJ,EAAPC,EACWI,EAAPJ,EAAmBA,EAAOI,EAElBA,EAARL,EAAoBA,EAAQK,EAEhCD,GAAOC,GACLA,GAAajG,EACf+F,EAAMr4B,KAAKy3B,KAEXY,EAAMr4B,KAAK03B,IACXpF,EAAUiG,GAEZr3B,IACAmK,KACSitB,GAAOH,GAChBE,EAAMr4B,KAAK43B,IACX12B,IACAoxB,EAAU6F,IAEVE,EAAMr4B,KAAK23B,IACXtsB,IACAinB,EAAU4F,OA9BVG,GAAMr4B,KAAK43B,IACX12B,QANAm3B,GAAMr4B,KAAK23B,IACXtsB,GAuCJ,OADAgtB,GAAMG,UACCH,GA2BThG,YAAa,SAASC,EAASC,EAAcC,EACvBC,EAAKC,EAAUC,GACnC,GAAI8F,GAAc,EACdC,EAAc,EAEdC,EAAY7rB,KAAKwrB,IAAI9F,EAAaD,EAAcI,EAASD,EAY7D,IAXoB,GAAhBH,GAAiC,GAAZG,IACvB+F,EAAcl5B,KAAKq5B,aAAatG,EAASG,EAAKkG,IAE5CnG,GAAcF,EAAQzxB,QAAU8xB,GAAUF,EAAI5xB,SAChD63B,EAAcn5B,KAAKs5B,aAAavG,EAASG,EAAKkG,EAAYF,IAE5DlG,GAAgBkG,EAChB/F,GAAY+F,EACZjG,GAAckG,EACd/F,GAAU+F,EAENlG,EAAaD,GAAgB,GAAKI,EAASD,GAAY,EACzD,QAEF,IAAIH,GAAgBC,EAAY,CAE9B,IADA,GAAI5rB,GAASsrB,EAAUK,KAAkB,GACvBI,EAAXD,GACL9rB,EAAOmnB,QAAQ/tB,KAAKyyB,EAAIC,KAE1B,QAAS9rB,GACJ,GAAI8rB,GAAYC,EACrB,OAAST,EAAUK,KAAkBC,EAAaD,GAUpD,KAAK,GARDuG,GAAMv5B,KAAK64B,kCACX74B,KAAKs4B,kBAAkBvF,EAASC,EAAcC,EACvBC,EAAKC,EAAUC,IAEtC/rB,EAASqM,OACTkgB,KACAjrB,EAAQqqB,EACRwG,EAAWrG,EACNxxB,EAAI,EAAGA,EAAI43B,EAAIj4B,OAAQK,IAC9B,OAAO43B,EAAI53B,IACT,IAAKu2B,IACC7wB,IACFusB,EAAQnzB,KAAK4G,GACbA,EAASqM,QAGX/K,IACA6wB,GACA,MACF,KAAKrB,IACE9wB,IACHA,EAASsrB,EAAUhqB,KAAW,IAEhCtB,EAAOurB,aACPjqB,IAEAtB,EAAOmnB,QAAQ/tB,KAAKyyB,EAAIsG,IACxBA,GACA,MACF,KAAKpB,IACE/wB,IACHA,EAASsrB,EAAUhqB,KAAW,IAEhCtB,EAAOurB,aACPjqB,GACA,MACF,KAAK0vB,IACEhxB,IACHA,EAASsrB,EAAUhqB,KAAW,IAEhCtB,EAAOmnB,QAAQ/tB,KAAKyyB,EAAIsG,IACxBA,IAQN,MAHInyB,IACFusB,EAAQnzB,KAAK4G,GAERusB,GAGTyF,aAAc,SAAStG,EAASG,EAAKuG,GACnC,IAAK,GAAI93B,GAAI,EAAO83B,EAAJ93B,EAAkBA,IAChC,IAAK3B,KAAK04B,OAAO3F,EAAQpxB,GAAIuxB,EAAIvxB,IAC/B,MAAOA,EACX,OAAO83B,IAGTH,aAAc,SAASvG,EAASG,EAAKuG,GAInC,IAHA,GAAIC,GAAS3G,EAAQzxB,OACjBq4B,EAASzG,EAAI5xB,OACbskB,EAAQ,EACG6T,EAAR7T,GAAwB5lB,KAAK04B,OAAO3F,IAAU2G,GAASxG,IAAMyG,KAClE/T,GAEF,OAAOA,IAGTgU,iBAAkB,SAAS7G,EAASyE,GAClC,MAAOx3B,MAAK8yB,YAAYC,EAAS,EAAGA,EAAQzxB,OAAQk2B,EAAU,EACtCA,EAASl2B,SAGnCo3B,OAAQ,SAASmB,EAAcC,GAC7B,MAAOD,KAAiBC,GAI5B,IAAIzG,IAAc,GAAIR,EAuJtB/b,GAAOuZ,SAAWA,EAClBvZ,EAAOuZ,SAAS0J,QAAU1D,GAC1Bvf,EAAOuZ,SAAS2J,kBAAoBpC,GACpC9gB,EAAOuZ,SAAS4J,iBAAmBzF,EACnC1d,EAAOya,cAAgBA,EACvBza,EAAOya,cAAcqI,iBAAmB,SAAS7G,EAASyE,GACxD,MAAOnE,IAAYuG,iBAAiB7G,EAASyE,IAG/C1gB,EAAO+b,YAAcA,EACrB/b,EAAOua,eAAiBA,EACxBva,EAAOyP,aAAeA,EACtBzP,EAAO4O,iBAAmBA,EAC1B5O,EAAO4J,KAAOA,EACd5J,EAAO6O,kBAAoBA,GACR,mBAAX7O,SAA0BA,QAA4B,mBAAX+T,SAA0BA,OAAS/T,OAAS9W,MAAQ9B,QASzG,WACE,YAIA,SAASg8B,GAAar3B,GACpB,KAAOA,EAAKxD,YACVwD,EAAOA,EAAKxD,UAGd,OAAsC,kBAAxBwD,GAAKs3B,eAAgCt3B,EAAO,KAS5D,QAASu3B,GAAev3B,EAAMkG,EAAMiX,GAClC,GAAIqa,GAAWx3B,EAAKy3B,SAOpB,OANKD,KACHA,EAAWx3B,EAAKy3B,cAEdD,EAAStxB,IACXiX,EAAQjX,GAAMoc,QAETkV,EAAStxB,GAAQiX,EAG1B,QAASua,GAAc13B,EAAMkG,EAAMiX,GACjC,MAAOA,GAGT,QAASwa,GAAc3oB,GACrB,MAAgB,OAATA,EAAgB,GAAKA,EAG9B,QAAS4oB,GAAW53B,EAAMgP,GACxBhP,EAAK63B,KAAOF,EAAc3oB,GAG5B,QAAS8oB,GAAY93B,GACnB,MAAO,UAASgP,GACd,MAAO4oB,GAAW53B,EAAMgP,IA6B5B,QAAS+oB,GAAgBp2B,EAAIuE,EAAM8xB,EAAahpB,GAC9C,MAAIgpB,QACEhpB,EACFrN,EAAGgI,aAAazD,EAAM,IAEtBvE,EAAGs2B,gBAAgB/xB,QAIvBvE,GAAGgI,aAAazD,EAAMyxB,EAAc3oB,IAGtC,QAASkpB,GAAiBv2B,EAAIuE,EAAM8xB,GAClC,MAAO,UAAShpB,GACd+oB,EAAgBp2B,EAAIuE,EAAM8xB,EAAahpB,IAiD3C,QAASmpB,GAAqBz6B,GAC5B,OAAQA,EAAQwJ,MACd,IAAK,WACH,MAAOkxB,EACT,KAAK,QACL,IAAK,kBACL,IAAK,aACH,MAAO,QACT,KAAK,QACH,GAAI,eAAetW,KAAKpR,UAAUM,WAChC,MAAO,QACX,SACE,MAAO,SAIb,QAASqnB,GAAYC,EAAOjf,EAAUrK,EAAOupB,GAC3CD,EAAMjf,IAAakf,GAAaZ,GAAe3oB,GAGjD,QAASwpB,GAAaF,EAAOjf,EAAUkf,GACrC,MAAO,UAASvpB,GACd,MAAOqpB,GAAYC,EAAOjf,EAAUrK,EAAOupB,IAI/C,QAAS5O,MAET,QAAS8O,GAAeH,EAAOjf,EAAU6V,EAAYwJ,GAGnD,QAAS/wB,KACPunB,EAAWvP,SAAS2Y,EAAMjf,IAC1B6V,EAAW9M,kBACVsW,GAAe/O,GAAM2O,GACtBjU,SAAS+P,6BANX,GAAIuE,GAAYR,EAAqBG,EAUrC,OAFAA,GAAMt8B,iBAAiB28B,EAAWhxB,IAGhC2a,MAAO,WACLgW,EAAMhwB,oBAAoBqwB,EAAWhxB,GACrCunB,EAAW5M,SAGb+M,YAAaH,GAIjB,QAAS0J,GAAgB5pB,GACvB,MAAOhS,SAAQgS,GAYjB,QAAS6pB,GAA0Bn7B,GACjC,GAAIA,EAAQo7B,KACV,MAAO9W,GAAOtkB,EAAQo7B,KAAK9gB,SAAU,SAASrW,GAC5C,MAAOA,IAAMjE,GACK,SAAdiE,EAAGmb,SACQ,SAAXnb,EAAGuF,MACHvF,EAAGuE,MAAQxI,EAAQwI,MAGzB,IAAI6yB,GAAY1B,EAAa35B,EAC7B,KAAKq7B,EACH,QACF,IAAIC,GAASD,EAAU9S,iBACnB,6BAA+BvoB,EAAQwI,KAAO,KAClD,OAAO8b,GAAOgX,EAAQ,SAASr3B,GAC7B,MAAOA,IAAMjE,IAAYiE,EAAGm3B,OAKlC,QAASG,GAAiBX,GAIF,UAAlBA,EAAMxb,SACS,UAAfwb,EAAMpxB,MACR2xB,EAA0BP,GAAO/2B,QAAQ,SAAS23B,GAChD,GAAIC,GAAiBD,EAAMzB,UAAU2B,OACjCD,IAEFA,EAAe9J,YAAY1P,UAAS,KA4C5C,QAAS0Z,GAAaC,EAAQtqB,GAC5B,GACIuqB,GACAC,EACA3J,EAHArzB,EAAa88B,EAAO98B,UAIpBA,aAAsBi9B,oBACtBj9B,EAAWi7B,WACXj7B,EAAWi7B,UAAUzoB,QACvBuqB,EAAS/8B,EACTg9B,EAAgBD,EAAO9B,UAAUzoB,MACjC6gB,EAAW0J,EAAOvqB,OAGpBsqB,EAAOtqB,MAAQ2oB,EAAc3oB,GAEzBuqB,GAAUA,EAAOvqB,OAAS6gB,IAC5B2J,EAAcnK,YAAY1P,SAAS4Z,EAAOvqB,OAC1CwqB,EAAcnK,YAAYjN,iBAC1BiC,SAAS+P,8BAIb,QAASsF,GAAcJ,GACrB,MAAO,UAAStqB,GACdqqB,EAAaC,EAAQtqB,IArSzB,GAAIgT,GAAS3W,MAAMpH,UAAU+d,OAAOnd,KAAKnE,KAAK2K,MAAMpH,UAAU+d,OAU9D5jB,MAAK6F,UAAUvD,KAAO,SAASwF,EAAMgpB,GACnClS,QAAQ5F,MAAM,8BAA+Bja,KAAM+I,EAAMgpB,IAG3D9wB,KAAK6F,UAAU01B,aAAe,YA+B9B,IAAIC,GAAsBlC,CAE1Bh1B,QAAOshB,eAAeK,SAAU,4BAC9B5f,IAAK,WACH,MAAOm1B,KAAwBrC,GAEjCpzB,IAAK,SAAS01B,GAEZ,MADAD,GAAsBC,EAAStC,EAAiBG,EACzCmC,GAET5V,cAAc,IAGhB6V,KAAK71B,UAAUvD,KAAO,SAASwF,EAAM8I,EAAOkO,GAC1C,GAAa,gBAAThX,EACF,MAAO9H,MAAK6F,UAAUvD,KAAKmE,KAAK1H,KAAM+I,EAAM8I,EAAOkO,EAErD,IAAIA,EACF,MAAO0a,GAAWz6B,KAAM6R,EAE1B,IAAIkgB,GAAalgB,CAEjB,OADA4oB,GAAWz6B,KAAM+xB,EAAW/M,KAAK2V,EAAY36B,QACtCy8B,EAAoBz8B,KAAM+I,EAAMgpB,IAqBzC6K,QAAQ91B,UAAUvD,KAAO,SAASwF,EAAM8I,EAAOkO,GAC7C,GAAI8a,GAAuC,KAAzB9xB,EAAKA,EAAKzH,OAAS,EAMrC,IALIu5B,IACF76B,KAAK86B,gBAAgB/xB,GACrBA,EAAOA,EAAK+O,MAAM,EAAG,KAGnBiI,EACF,MAAO6a,GAAgB56B,KAAM+I,EAAM8xB,EAAahpB,EAGlD,IAAIkgB,GAAalgB,CAIjB,OAHA+oB,GAAgB56B,KAAM+I,EAAM8xB,EACxB9I,EAAW/M,KAAK+V,EAAiB/6B,KAAM+I,EAAM8xB,KAE1C4B,EAAoBz8B,KAAM+I,EAAMgpB,GAGzC,IAAIkJ,IACJ,WAGE,GAAI4B,GAAMt+B,SAASC,cAAc,OAC7Bs+B,EAAWD,EAAIj+B,YAAYL,SAASC,cAAc,SACtDs+B,GAAStwB,aAAa,OAAQ,WAC9B,IAAI2iB,GACAvJ,EAAQ,CACZkX,GAASj+B,iBAAiB,QAAS,WACjC+mB,IACAuJ,EAAQA,GAAS,UAEnB2N,EAASj+B,iBAAiB,SAAU,WAClC+mB,IACAuJ,EAAQA,GAAS,UAGnB,IAAI/rB,GAAQ7E,SAAS4G,YAAY,aACjC/B,GAAM25B,eAAe,SAAS,GAAM,EAAM7+B,OAAQ,EAAG,EAAG,EAAG,EAAG,GAAG,GAC7D,GAAO,GAAO,EAAO,EAAG,MAC5B4+B,EAAS19B,cAAcgE,GAGvB63B,EAA6B,GAATrV,EAAa,SAAWuJ,KAqG9C6N,iBAAiBl2B,UAAUvD,KAAO,SAASwF,EAAM8I,EAAOkO,GACtD,GAAa,UAAThX,GAA6B,YAATA,EACtB,MAAOk0B,aAAYn2B,UAAUvD,KAAKmE,KAAK1H,KAAM+I,EAAM8I,EAAOkO,EAE5D/f,MAAK86B,gBAAgB/xB,EACrB,IAAIm0B,GAAqB,WAARn0B,EAAoB0yB,EAAkBjB,EACnDe,EAAsB,WAARxyB,EAAoB+yB,EAAmBtP,CAEzD,IAAIzM,EACF,MAAOmb,GAAYl7B,KAAM+I,EAAM8I,EAAOqrB,EAGxC,IAAInL,GAAalgB,EACbmO,EAAUsb,EAAet7B,KAAM+I,EAAMgpB,EAAYwJ,EAMrD,OALAL,GAAYl7B,KAAM+I,EACNgpB,EAAW/M,KAAKqW,EAAar7B,KAAM+I,EAAMm0B,IACzCA,GAGL9C,EAAep6B,KAAM+I,EAAMiX,IAGpCmd,oBAAoBr2B,UAAUvD,KAAO,SAASwF,EAAM8I,EAAOkO,GACzD,GAAa,UAAThX,EACF,MAAOk0B,aAAYn2B,UAAUvD,KAAKmE,KAAK1H,KAAM+I,EAAM8I,EAAOkO,EAI5D,IAFA/f,KAAK86B,gBAAgB,SAEjB/a,EACF,MAAOmb,GAAYl7B,KAAM,QAAS6R,EAEpC,IAAIkgB,GAAalgB,EACbmO,EAAUsb,EAAet7B,KAAM,QAAS+xB,EAG5C,OAFAmJ,GAAYl7B,KAAM,QACN+xB,EAAW/M,KAAKqW,EAAar7B,KAAM,QAASw6B,KACjDiC,EAAoBz8B,KAAM+I,EAAMiX,IA+BzCod,kBAAkBt2B,UAAUvD,KAAO,SAASwF,EAAM8I,EAAOkO,GACvD,GAAa,UAAThX,EACF,MAAOk0B,aAAYn2B,UAAUvD,KAAKmE,KAAK1H,KAAM+I,EAAM8I,EAAOkO,EAI5D,IAFA/f,KAAK86B,gBAAgB,SAEjB/a,EACF,MAAOmc,GAAal8B,KAAM6R,EAE5B,IAAIkgB,GAAalgB,EACbmO,EAAUsb,EAAet7B,KAAM,QAAS+xB,EAE5C,OADAmK,GAAal8B,KAAM+xB,EAAW/M,KAAKuX,EAAcv8B,QAC1Cy8B,EAAoBz8B,KAAM+I,EAAMiX,IAGzCsc,kBAAkBx1B,UAAUvD,KAAO,SAASwF,EAAM8I,EAAOkO,GAIvD,GAHa,kBAAThX,IACFA,EAAO,iBAEI,kBAATA,GAAqC,UAATA,EAC9B,MAAOk0B,aAAYn2B,UAAUvD,KAAKmE,KAAK1H,KAAM+I,EAAM8I,EAAOkO,EAI5D,IAFA/f,KAAK86B,gBAAgB/xB,GAEjBgX,EACF,MAAOmb,GAAYl7B,KAAM+I,EAAM8I,EAEjC,IAAIkgB,GAAalgB,EACbmO,EAAUsb,EAAet7B,KAAM+I,EAAMgpB,EAKzC,OAJAmJ,GAAYl7B,KAAM+I,EACNgpB,EAAW/M,KAAKqW,EAAar7B,KAAM+I,KAGxCqxB,EAAep6B,KAAM+I,EAAMiX,KAEnChgB,MASH,SAAU8W,GACR,YAEA,SAASC,GAAOtT,GACd,IAAKA,EACH,KAAM,IAAIyT,OAAM,oBAKpB,QAASmmB,GAAgBx6B,GAEvB,IADA,GAAIQ,GACGA,EAAIR,EAAKxD,YACdwD,EAAOQ,CAGT,OAAOR,GAGT,QAASy6B,GAAYz6B,EAAMoN,GACzB,GAAKA,EAAL,CAKA,IAFA,GAAIstB,GACA75B,EAAW,IAAMuM,GACbstB,IACN16B,EAAOw6B,EAAgBx6B,GAEnBA,EAAK26B,cACPD,EAAM16B,EAAK26B,cAAcn9B,cAAcqD,GAChCb,EAAKs3B,iBACZoD,EAAM16B,EAAKs3B,eAAelqB,KAExBstB,GAAQ16B,EAAK46B,mBAGjB56B,EAAOA,EAAK46B,gBAGd,OAAOF,IAiIT,QAASG,GAAcl5B,GACrB,MAAqB,YAAdA,EAAGmb,SACgB,8BAAnBnb,EAAGm5B,aAGZ,QAASC,GAAep5B,GACtB,MAAqB,YAAdA,EAAGmb,SACgB,gCAAnBnb,EAAGm5B,aAGZ,QAASE,GAAoBr5B,GAC3B,MAAO3E,SAAQi+B,EAAyBt5B,EAAGmb,UAC5Bnb,EAAG3C,aAAa,aAGjC,QAASk8B,GAAWv5B,GAIlB,MAHuBkP,UAAnBlP,EAAGw5B,cACLx5B,EAAGw5B,YAA4B,YAAdx5B,EAAGmb,SAAyBke,EAAoBr5B,IAE5DA,EAAGw5B,YAYZ,QAASC,GAAoBp7B,EAAM+H,GACjC,GAAIszB,GAAer7B,EAAKimB,iBAAiBqV,EAErCJ,GAAWl7B,IACb+H,EAAG/H,GACLuB,EAAQ85B,EAActzB,GAGxB,QAASwzB,GAAkCv7B,GACzC,QAASw7B,GAAUjY,GACZkY,oBAAoBC,SAASnY,IAChCgY,EAAkChY,EAASoY,SAG/CP,EAAoBp7B,EAAMw7B,GAgB5B,QAASI,GAAMC,EAAIC,GACjBp5B,OAAOqvB,oBAAoB+J,GAAMv6B,QAAQ,SAAS2E,GAChDxD,OAAOshB,eAAe6X,EAAI31B,EACJxD,OAAOsvB,yBAAyB8J,EAAM51B,MAKhE,QAAS61B,GAAiCxY,GACxC,GAAI2B,GAAM3B,EAASyY,aACnB,KAAK9W,EAAI+W,YACP,MAAO/W,EACT,IAAIxlB,GAAIwlB,EAAIgX,sBACZ,KAAKx8B,EAAG,CAIN,IADAA,EAAIwlB,EAAIiX,eAAeC,mBAAmB,IACnC18B,EAAE28B,WACP38B,EAAEjD,YAAYiD,EAAE28B,UAElBnX,GAAIgX,uBAAyBx8B,EAE/B,MAAOA,GAGT,QAAS48B,GAA2B/Y,GAClC,IAAKA,EAASgZ,iBAAkB,CAC9B,GAAIr+B,GAAQqlB,EAASyY,aACrB,KAAK99B,EAAMq+B,iBAAkB,CAC3Br+B,EAAMq+B,iBAAmBr+B,EAAMi+B,eAAeC,mBAAmB,IACjEl+B,EAAMq+B,iBAAiBC,mBAAoB,CAI3C,IAAI3X,GAAO3mB,EAAMq+B,iBAAiB5gC,cAAc,OAChDkpB,GAAK4X,KAAO/gC,SAASghC,QACrBx+B,EAAMq+B,iBAAiBjgC,KAAKP,YAAY8oB,GAExC3mB,EAAMq+B,iBAAiBA,iBAAmBr+B,EAAMq+B,iBAGlDhZ,EAASgZ,iBAAmBr+B,EAAMq+B,iBAGpC,MAAOhZ,GAASgZ,iBAgBlB,QAASI,GAAqCh7B,GAC5C,GAAI4hB,GAAW5hB,EAAGq6B,cAAcrgC,cAAc,WAC9CgG,GAAGnF,WAAW8rB,aAAa/E,EAAU5hB,EAIrC,KAFA,GAAIi7B,GAAUj7B,EAAGk7B,WACb9Z,EAAQ6Z,EAAQn+B,OACbskB,IAAU,GAAG,CAClB,GAAI+Z,GAASF,EAAQ7Z,EACjBga,GAA4BD,EAAO52B,QACjB,aAAhB42B,EAAO52B,MACTqd,EAAS5Z,aAAamzB,EAAO52B,KAAM42B,EAAO9tB,OAC5CrN,EAAGs2B,gBAAgB6E,EAAO52B,OAI9B,MAAOqd,GAGT,QAASyZ,GAA+Br7B,GACtC,GAAI4hB,GAAW5hB,EAAGq6B,cAAcrgC,cAAc,WAC9CgG,GAAGnF,WAAW8rB,aAAa/E,EAAU5hB,EAIrC,KAFA,GAAIi7B,GAAUj7B,EAAGk7B,WACb9Z,EAAQ6Z,EAAQn+B,OACbskB,IAAU,GAAG,CAClB,GAAI+Z,GAASF,EAAQ7Z,EACrBQ,GAAS5Z,aAAamzB,EAAO52B,KAAM42B,EAAO9tB,OAC1CrN,EAAGs2B,gBAAgB6E,EAAO52B,MAI5B,MADAvE,GAAGnF,WAAWC,YAAYkF,GACnB4hB,EAGT,QAAS0Z,GAAyC1Z,EAAU5hB,EAAIu7B,GAC9D,GAAIvB,GAAUpY,EAASoY,OACvB,IAAIuB,EAEF,WADAvB,GAAQ5/B,YAAY4F,EAKtB,KADA,GAAIw7B,GACGA,EAAQx7B,EAAG4mB,YAChBoT,EAAQ5/B,YAAYohC,GA4FxB,QAASC,GAA4Bz7B,GAC/B07B,EACF17B,EAAGoiB,UAAY0X,oBAAoBx3B,UAEnC23B,EAAMj6B,EAAI85B,oBAAoBx3B,WAGlC,QAASq5B,GAAwB/Z,GAC1BA,EAASga,cACZha,EAASga,YAAc,WACrBha,EAASia,sBAAuB,CAChC;GAAI97B,GAAM+7B,EAAYla,EAClBA,EAASma,WAAana,EAASma,UAAUlhB,eAC7CmhB,GAAgBpa,EAAU7hB,EAAK6hB,EAASqa,UAIvCra,EAASia,uBACZja,EAASia,sBAAuB,EAChChQ,SAAS0J,QAAQ3T,EAASga,cAyM9B,QAASM,GAAe/hC,EAAGoK,EAAMlG,EAAM89B,GACrC,GAAKhiC,GAAMA,EAAE2C,OAAb,CAOA,IAJA,GAAI4kB,GACA5kB,EAAS3C,EAAE2C,OACXs/B,EAAa,EAAGC,EAAY,EAAGC,EAAW,EAC1CC,GAAc,EACCz/B,EAAZu/B,GAAoB,CACzB,GAAID,GAAajiC,EAAEuI,QAAQ,KAAM25B,GAC7BG,EAAeriC,EAAEuI,QAAQ,KAAM25B,GAC/B9gB,GAAU,EACVkhB,EAAa,IAWjB,IATID,GAAgB,IACF,EAAbJ,GAAiCA,EAAfI,KACrBJ,EAAaI,EACbjhB,GAAU,EACVkhB,EAAa,MAGfH,EAAwB,EAAbF,EAAiB,GAAKjiC,EAAEuI,QAAQ+5B,EAAYL,EAAa,GAErD,EAAXE,EAAc,CAChB,IAAK5a,EACH,MAEFA,GAAOzlB,KAAK9B,EAAEmZ,MAAM+oB,GACpB,OAGF3a,EAASA,MACTA,EAAOzlB,KAAK9B,EAAEmZ,MAAM+oB,EAAWD,GAC/B,IAAI3e,GAAatjB,EAAEmZ,MAAM8oB,EAAa,EAAGE,GAAUI,MACnDhb,GAAOzlB,KAAKsf,GACZghB,EAAcA,GAAehhB,CAC7B,IAAIohB,GAAaR,GACAA,EAAiB1e,EAAYlZ,EAAMlG,EAGlDqjB,GAAOzlB,KADS,MAAd0gC,EACUzgB,KAAKpZ,IAAI2a,GAET,MAEdiE,EAAOzlB,KAAK0gC,GACZN,EAAYC,EAAW,EAyBzB,MAtBID,KAAcv/B,GAChB4kB,EAAOzlB,KAAK,IAEdylB,EAAOkb,WAA+B,IAAlBlb,EAAO5kB,OAC3B4kB,EAAOmb,aAAenb,EAAOkb,YACM,IAAblb,EAAO,IACM,IAAbA,EAAO,GAC7BA,EAAO6a,YAAcA,EAErB7a,EAAOob,WAAa,SAASz6B,GAG3B,IAAK,GAFD4b,GAAWyD,EAAO,GAEbvkB,EAAI,EAAGA,EAAIukB,EAAO5kB,OAAQK,GAAK,EAAG,CACzC,GAAIkQ,GAAQqU,EAAOkb,WAAav6B,EAASA,GAAQlF,EAAI,GAAK,EAC5C+R,UAAV7B,IACF4Q,GAAY5Q,GACd4Q,GAAYyD,EAAOvkB,EAAI,GAGzB,MAAO8gB,IAGFyD,GAGT,QAASqb,GAAsBx4B,EAAMmd,EAAQrjB,EAAMid,GACjD,GAAIoG,EAAOkb,WAAY,CACrB,GAAID,GAAajb,EAAO,GACpBrU,EAAQsvB,EAAaA,EAAWrhB,EAAOjd,GAAM,GACxBqjB,EAAO,GAAG3D,aAAazC,EAChD,OAAOoG,GAAOmb,aAAexvB,EAAQqU,EAAOob,WAAWzvB,GAIzD,IAAK,GADDhL,MACKlF,EAAI,EAAGA,EAAIukB,EAAO5kB,OAAQK,GAAK,EAAG,CACzC,GAAIw/B,GAAajb,EAAOvkB,EAAI,EAC5BkF,IAAQlF,EAAI,GAAK,GAAKw/B,EAAaA,EAAWrhB,EAAOjd,GACjDqjB,EAAOvkB,EAAI,GAAG4gB,aAAazC,GAGjC,MAAOoG,GAAOob,WAAWz6B,GAG3B,QAAS26B,GAAyBz4B,EAAMmd,EAAQrjB,EAAMid,GACpD,GAAIqhB,GAAajb,EAAO,GACpB7D,EAAW8e,EAAaA,EAAWrhB,EAAOjd,GAAM,GAChD,GAAI0jB,cAAazG,EAAOoG,EAAO,GAEnC,OAAOA,GAAOmb,aAAehf,EACzB,GAAIsD,mBAAkBtD,EAAU6D,EAAOob,YAG7C,QAASG,GAAe14B,EAAMmd,EAAQrjB,EAAMid,GAC1C,GAAIoG,EAAO6a,YACT,MAAOQ,GAAsBx4B,EAAMmd,EAAQrjB,EAAMid,EAEnD,IAAIoG,EAAOkb,WACT,MAAOI,GAAyBz4B,EAAMmd,EAAQrjB,EAAMid,EAItD,KAAK,GAFDuC,GAAW,GAAIqD,kBAEV/jB,EAAI,EAAGA,EAAIukB,EAAO5kB,OAAQK,GAAK,EAAG,CACzC,GAAIoe,GAAUmG,EAAOvkB,GACjBw/B,EAAajb,EAAOvkB,EAAI,EAE5B,IAAIw/B,EAAJ,CACE,GAAItvB,GAAQsvB,EAAWrhB,EAAOjd,EAAMkd,EAChCA,GACFsC,EAASC,QAAQzQ,GAEjBwQ,EAASyV,YAAYjmB,OALzB,CASA,GAAI9S,GAAOmnB,EAAOvkB,EAAI,EAClBoe,GACFsC,EAASC,QAAQvjB,EAAKwjB,aAAazC,IAEnCuC,EAASC,QAAQxC,EAAO/gB,IAG5B,MAAO,IAAI4mB,mBAAkBtD,EAAU6D,EAAOob,YAGhD,QAASd,GAAgB39B,EAAMw3B,EAAUva,EAAO4hB,GAC9C,IAAK,GAAI//B,GAAI,EAAGA,EAAI04B,EAAS/4B,OAAQK,GAAK,EAAG,CAC3C,GAAIoH,GAAOsxB,EAAS14B,GAChBukB,EAASmU,EAAS14B,EAAI,GACtBkQ,EAAQ4vB,EAAe14B,EAAMmd,EAAQrjB,EAAMid,GAC3CE,EAAUnd,EAAKU,KAAKwF,EAAM8I,EAAOqU,EAAO6a,YACxC/gB,IAAW0hB,GACbA,EAAiBjhC,KAAKuf,GAI1B,GADAnd,EAAK25B,eACAnC,EAAS0D,WAAd,CAGAl7B,EAAK49B,OAAS3gB,CACd,IAAI6hB,GAAO9+B,EAAK++B,0BAA0BvH,EACtCqH,IAAoBC,GACtBD,EAAiBjhC,KAAKkhC,IAG1B,QAASE,GAAiBr9B,EAAIuE,EAAM43B,GAClC,GAAIl9B,GAAIe,EAAG1C,aAAaiH,EACxB,OAAO23B,GAAoB,IAALj9B,EAAU,OAASA,EAAGsF,EAAMvE,EAAIm8B,GAGxD,QAASmB,GAAuBvhC,EAASogC,GACvC5pB,EAAOxW,EAMP,KAAK,GAJD85B,MAIK14B,EAAI,EAAGA,EAAIpB,EAAQm/B,WAAWp+B,OAAQK,IAAK,CAUlD,IATA,GAAIogC,GAAOxhC,EAAQm/B,WAAW/9B,GAC1BoH,EAAOg5B,EAAKh5B,KACZ8I,EAAQkwB,EAAKlwB,MAOE,MAAZ9I,EAAK,IACVA,EAAOA,EAAKi5B,UAAU,EAGxB,KAAIjE,EAAWx9B,IACVwI,IAASk5B,GAAMl5B,IAASm5B,GAAQn5B,IAASo5B,EAD9C,CAKA,GAAIjc,GAASwa,EAAe7uB,EAAO9I,EAAMxI,EACbogC,EACvBza,IAGLmU,EAAS55B,KAAKsI,EAAMmd,IAatB,MAVI6X,GAAWx9B,KACb85B,EAAS0D,YAAa,EACtB1D,EAAS+H,GAAKP,EAAiBthC,EAAS0hC,EAAItB,GAC5CtG,EAAS92B,KAAOs+B,EAAiBthC,EAAS2hC,EAAMvB,GAChDtG,EAASgI,OAASR,EAAiBthC,EAAS4hC,EAAQxB,IAEhDtG,EAAS+H,IAAO/H,EAAS92B,MAAS82B,EAASgI,SAC7ChI,EAAS92B,KAAOm9B,EAAe,OAAQwB,EAAM3hC,EAASogC,KAGnDtG,EAGT,QAASiG,GAAYz9B,EAAM89B,GACzB,GAAI99B,EAAK7B,WAAaC,KAAKW,aACzB,MAAOkgC,GAAuBj/B,EAAM89B,EAEtC,IAAI99B,EAAK7B,WAAaC,KAAKqhC,UAAW,CACpC,GAAIpc,GAASwa,EAAe79B,EAAK63B,KAAM,cAAe73B,EAC1B89B,EAC5B,IAAIza,EACF,OAAQ,cAAeA,GAG3B,SAGF,QAASqc,GAAqB1/B,EAAM2/B,EAAQC,EAAiBpI,EAAUva,EACzC/E,EACA2mB,GAK5B,IAAK,GAHDh2B,GAAQ82B,EAAO5jC,YAAY6jC,EAAgBC,WAAW7/B,GAAM,IAE5DlB,EAAI,EACCq+B,EAAQn9B,EAAKuoB,WAAY4U,EAAOA,EAAQA,EAAM2C,YACrDJ,EAAqBvC,EAAOt0B,EAAO+2B,EACbpI,EAASuI,SAASjhC,KAClBme,EACA/E,EACA2mB,EAUxB,OAPIrH,GAAS0D,aACXO,oBAAoBC,SAAS7yB,EAAO7I,GAChCkY,GACFrP,EAAMm3B,aAAa9nB,IAGvBylB,EAAgB90B,EAAO2uB,EAAUva,EAAO4hB,GACjCh2B,EAGT,QAASo3B,GAAyBjgC,EAAM89B,GACtC,GAAIp8B,GAAM+7B,EAAYz9B,EAAM89B,EAC5Bp8B,GAAIq+B,WAEJ,KAAK,GADDj6B,GAAQ,EACHq3B,EAAQn9B,EAAKuoB,WAAY4U,EAAOA,EAAQA,EAAM2C,YACrDp+B,EAAIq+B,SAASj6B,KAAWm6B,EAAyB9C,EAAOW,EAG1D,OAAOp8B,GAOT,QAASw+B,GAAcvE,GACrB,GAAIvuB,GAAKuuB,EAAQ1N,GAGjB,OAFK7gB,KACHA,EAAKuuB,EAAQ1N,IAAMkS,KACd/yB,EAUT,QAASgzB,GAAsBzE,EAAS+B,GACtC,GAAI2C,GAAYH,EAAcvE,EAC9B,IAAI+B,EAAW,CACb,GAAIh8B,GAAMg8B,EAAU4C,YAAYD,EAKhC,OAJK3+B,KACHA,EAAMg8B,EAAU4C,YAAYD,GACxBJ,EAAyBtE,EAAS+B,EAAUlhB,qBAE3C9a,EAGT,GAAIA,GAAMi6B,EAAQ4E,WAKlB,OAJK7+B,KACHA,EAAMi6B,EAAQ4E,YACVN,EAAyBtE,EAAS9qB,aAEjCnP,EAeT,QAAS8+B,GAAiBC,GACxBtjC,KAAKujC,QAAS,EACdvjC,KAAKwjC,iBAAmBF,EACxBtjC,KAAKyjC,aACLzjC,KAAKshB,KAAO5N,OACZ1T,KAAK0jC,iBACL1jC,KAAK2jC,aAAejwB,OACpB1T,KAAK4jC,cAAgBlwB,OAl7BvB,GAyCIhN,GAzCAtC,EAAU8J,MAAMpH,UAAU1C,QAAQsD,KAAKnE,KAAK2K,MAAMpH,UAAU1C,QA0C5D0S,GAAOpQ,KAA+C,kBAAjCoQ,GAAOpQ,IAAII,UAAU1C,QAC5CsC,EAAMoQ,EAAOpQ,KAEbA,EAAM,WACJ1G,KAAK0F,QACL1F,KAAK6G,WAGPH,EAAII,WACFE,IAAK,SAAS8K,EAAKD,GACjB,GAAIlJ,GAAQ3I,KAAK0F,KAAKwB,QAAQ4K,EAClB,GAARnJ,GACF3I,KAAK0F,KAAKjF,KAAKqR,GACf9R,KAAK6G,OAAOpG,KAAKoR,IAEjB7R,KAAK6G,OAAO8B,GAASkJ,GAIzBvK,IAAK,SAASwK,GACZ,GAAInJ,GAAQ3I,KAAK0F,KAAKwB,QAAQ4K,EAC9B,MAAY,EAARnJ,GAGJ,MAAO3I,MAAK6G,OAAO8B,IAGrBvB,SAAQ,SAAS0K,GACf,GAAInJ,GAAQ3I,KAAK0F,KAAKwB,QAAQ4K,EAC9B,OAAY,GAARnJ,GACK,GAET3I,KAAK0F,KAAK2B,OAAOsB,EAAO,GACxB3I,KAAK6G,OAAOQ,OAAOsB,EAAO,IACnB,IAGTvE,QAAS,SAAS2nB,EAAG8X,GACnB,IAAK,GAAIliC,GAAI,EAAGA,EAAI3B,KAAK0F,KAAKpE,OAAQK,IACpCoqB,EAAErkB,KAAKm8B,GAAY7jC,KAAMA,KAAK6G,OAAOlF,GAAI3B,KAAK0F,KAAK/D,GAAI3B,QAyB/B,mBAArBzB,UAAS4D,WAClB2hC,SAASh9B,UAAU3E,SAAW,SAASU,GACrC,MAAIA,KAAS7C,MAAQ6C,EAAKxD,aAAeW,MAChC,EACFA,KAAK+jC,gBAAgB5hC,SAASU,IAIzC,IAAIq/B,GAAO,OACPC,EAAS,SACTF,EAAK,KAELrC,GACFxZ,UAAY,EACZic,QAAU,EACV9+B,MAAQ,EACRg6B,KAAO,GAGLO,GACFkG,OAAS,EACTC,OAAS,EACTC,OAAS,EACTC,IAAM,EACNC,IAAM,EACNC,IAAM,EACNC,UAAY,EACZC,KAAO,EACPC,SAAW,EACXC,QAAU,EACVC,UAAY,GAGVC,EAAoD,mBAAxBrG,oBAC5BqG,KAIF,WACE,GAAI7jC,GAAIvC,SAASC,cAAc,YAC3B+D,EAAIzB,EAAE09B,QAAQK,cACd+F,EAAOriC,EAAE3D,YAAY2D,EAAE/D,cAAc,SACrCW,EAAOylC,EAAKhmC,YAAY2D,EAAE/D,cAAc,SACxCkpB,EAAOnlB,EAAE/D,cAAc,OAC3BkpB,GAAK4X,KAAO/gC,SAASghC,QACrBpgC,EAAKP,YAAY8oB,KAIrB,IAAIyW,GAAwB,aACxB54B,OAAOG,KAAKo4B,GAA0Bv5B,IAAI,SAASob,GACjD,MAAOA,GAAQpW,cAAgB,eAC9Byc,KAAK,KA2BZznB,UAASM,iBAAiB,mBAAoB,WAC5Cu/B,EAAkC7/B,UAElC2oB,SAAS+P,+BACR,GAmBE0N,IAMH7tB,EAAOwnB,oBAAsB,WAC3B,KAAMuG,WAAU,wBAIpB,IA6GIC,GA7GA5E,EAAW,eA8GgB,mBAApBjW,oBACT6a,EAAmB,GAAI7a,kBAAiB,SAASsB,GAC/C,IAAK,GAAI5pB,GAAI,EAAGA,EAAI4pB,EAAQjqB,OAAQK,IAClC4pB,EAAQ5pB,GAAGpC,OAAOwlC,iBAWxBzG,oBAAoBC,SAAW,SAAS/5B,EAAIwgC,GAC1C,GAAIxgC,EAAGygC,qBACL,OAAO,CAET,IAAI3B,GAAkB9+B,CACtB8+B,GAAgB2B,sBAAuB,CAEvC,IAAIC,GAAuBtH,EAAe0F,IACfqB,EACvBQ,EAAoBD,EACpBE,GAAgBF,EAChBG,GAAW,CAgBf,IAdKH,IACCrH,EAAoByF,IACtBvsB,GAAQiuB,GACR1B,EAAkB9D,EAAqCh7B,GACvD8+B,EAAgB2B,sBAAuB,EACvCC,EAAuBP,EACvBU,GAAW,GACF3H,EAAc4F,KACvBA,EAAkBzD,EAA+Br7B,GACjD8+B,EAAgB2B,sBAAuB,EACvCC,EAAuBP,KAItBO,EAAsB,CACzBjF,EAA4BqD,EAC5B,IAAIvb,GAAM6W,EAAiC0E,EAC3CA,GAAgBgC,SAAWvd,EAAIwd,yBAejC,MAZIP,GAGF1B,EAAgBkC,aAAeR,EACtBI,EACTtF,EAAyCwD,EACA9+B,EACA6gC,GAChCF,GACT/G,EAAkCkF,EAAgB9E,UAG7C,GAOTF,oBAAoBD,UAAYD,CAEhC,IAAIqH,GAAc3uB,EAAO4uB,oBAAsBzI,YAE3C0I,GACFr+B,IAAK,WACH,MAAOtH,MAAKslC,UAEdM,YAAY,EACZ9e,cAAc,EAGX6d,KAGHrG,oBAAoBx3B,UAAYvB,OAAOC,OAAOigC,EAAY3+B,WAE1DvB,OAAOshB,eAAeyX,oBAAoBx3B,UAAW,UAC/B6+B,IA0BxBlH,EAAMH,oBAAoBx3B,WACxBvD,KAAM,SAASwF,EAAM8I,EAAOkO,GAC1B,GAAY,OAARhX,EACF,MAAO6zB,SAAQ91B,UAAUvD,KAAKmE,KAAK1H,KAAM+I,EAAM8I,EAAOkO,EAExD,IAAIlP,GAAO7Q,KACPu9B,EAAMxd,EAAUlO,EAAQA,EAAMmT,KAAK,SAASuY,GAC9C1sB,EAAKrE,aAAa,MAAO+wB,GACzB1sB,EAAKk0B,eAKP,OAFA/kC,MAAKwM,aAAa,MAAO+wB,GACzBv9B,KAAK+kC,cACDhlB,EAAJ,QAGK/f,KAAKs6B,UAGRt6B,KAAKs6B,UAAUiD,IAAM1rB,EAFrB7R,KAAKs6B,WAAciD,IAAK1rB,GAKnBA,IAGT+vB,0BAA2B,SAASiE,GAIlC,MAHI7lC,MAAK8lC,WACP9lC,KAAK8lC,UAAUC,YAEZF,EAAWzD,IAAOyD,EAAWtiC,MAASsiC,EAAWxD,QASjDriC,KAAK8lC,YACR9lC,KAAK8lC,UAAY,GAAIzC,GAAiBrjC,OAGxCA,KAAK8lC,UAAUE,mBAAmBH,EAAY7lC,KAAKygC,QAE/CqE,GACFA,EAAiB1a,QAAQpqB,MAAQ0/B,YAAY,EACZuG,iBAAkB,SAG9CjmC,KAAK8lC,gBAnBN9lC,KAAK8lC,YACP9lC,KAAK8lC,UAAU3gB,QACfnlB,KAAK8lC,UAAYpyB,UAoBvBwyB,eAAgB,SAASpmB,EAAOqmB,EAAiB5F,GAC3C4F,EACF5F,EAAYvgC,KAAKomC,aAAaD,GACtB5F,IACRA,EAAYvgC,KAAKugC,WAEdvgC,KAAKqmC,cACRrmC,KAAKqmC,YAAcrmC,KAAKsmC,KAAK9H,QAC/B,IAAIA,GAAUx+B,KAAKqmC,WACnB,IAA2B,OAAvB7H,EAAQpT,WACV,MAAOmb,EAET,IAAIhiC,GAAM0+B,EAAsBzE,EAAS+B,GACrCkC,EAAkBtD,EAA2Bn/B,MAC7CwmC,EAAW/D,EAAgB8C,wBAC/BiB,GAAS/I,iBAAmBz9B,KAC5BwmC,EAAShJ,cAAgBgB,EACzBgI,EAASlM,aACTkM,EAASC,YAAc,IASvB,KAAK,GARDC,GAAiBF,EAASG,mBAC5BC,UAAW,KACXC,SAAU,KACV/mB,MAAOA,GAGLne,EAAI,EACJmlC,GAAoB,EACf9G,EAAQxB,EAAQpT,WAAY4U,EAAOA,EAAQA,EAAM2C,YAAa,CAK3C,OAAtB3C,EAAM2C,cACRmE,GAAoB,EAEtB,IAAIp7B,GAAQ62B,EAAqBvC,EAAOwG,EAAU/D,EACjBl+B,EAAIq+B,SAASjhC,KACbme,EACAygB,EACAiG,EAASlM,UAC1C5uB,GAAMi7B,kBAAoBD,EACtBI,IACFN,EAASC,YAAc/6B,GAO3B,MAJAg7B,GAAeE,UAAYJ,EAASpb,WACpCsb,EAAeG,SAAWL,EAAStH,UACnCsH,EAAS/I,iBAAmB/pB,OAC5B8yB,EAAShJ,cAAgB9pB,OAClB8yB,GAGT7jB,GAAI7C,SACF,MAAO9f,MAAKygC,QAGd9d,GAAI7C,OAAMA,GACR9f,KAAKygC,OAAS3gB,EACdqgB,EAAwBngC,OAG1B2iB,GAAIwjB,mBACF,MAAOnmC,MAAKugC,WAAavgC,KAAKugC,UAAUwG,KAG1ChC,YAAa,WACN/kC,KAAK8lC,WAAa9lC,KAAKqmC,cAAgBrmC,KAAKsmC,KAAK9H,UAGtDx+B,KAAKqmC,YAAc3yB,OACnB1T,KAAK8lC,UAAUkB,eACfhnC,KAAK8lC,UAAUmB,oBAAoBjnC,KAAK8lC,UAAUoB,qBAGpD3/B,MAAO,WACLvH,KAAKygC,OAAS/sB,OACd1T,KAAKugC,UAAY7sB,OACb1T,KAAKs6B,WAAat6B,KAAKs6B,UAAUiD,KACnCv9B,KAAKs6B,UAAUiD,IAAIpY,QACrBnlB,KAAKqmC,YAAc3yB,OACd1T,KAAK8lC,YAEV9lC,KAAK8lC,UAAUkB,eACfhnC,KAAK8lC,UAAU3gB,QACfnlB,KAAK8lC,UAAYpyB,SAGnBmvB,aAAc,SAAS9nB,GACrB/a,KAAKugC,UAAYxlB,EACjB/a,KAAKojC,YAAc1vB,OACf1T,KAAK8lC,YACP9lC,KAAK8lC,UAAUqB,2BAA6BzzB,OAC5C1T,KAAK8lC,UAAUsB,iBAAmB1zB,SAItC0yB,aAAc,SAASD,GAIrB,QAAShF,GAAWp4B,GAClB,GAAI6B,GAAKu7B,GAAmBA,EAAgBp9B,EAC5C,IAAiB,kBAAN6B,GAGX,MAAO,YACL,MAAOA,GAAG0Y,MAAM6iB,EAAiBhsB,YATrC,GAAKgsB,EAaL,OACEhD,eACA4D,IAAKZ,EACL9mB,eAAgB8hB,EAAW,kBAC3B3a,qBAAsB2a,EAAW,wBACjChb,+BACIgb,EAAW,oCAInBxe,GAAIwjB,iBAAgBA,GAClB,GAAInmC,KAAKugC,UACP,KAAMrpB,OAAM,wEAIdlX,MAAK6iC,aAAa7iC,KAAKomC,aAAaD,KAGtCxjB,GAAI2jB,QACF,GAAI/I,GAAMD,EAAYt9B,KAAMA,KAAK8B,aAAa,OAI9C,IAHKy7B,IACHA,EAAMv9B,KAAKwlC,eAERjI,EACH,MAAOv9B,KAET,IAAIqnC,GAAU9J,EAAI+I,IAClB,OAAOe,GAAUA,EAAU9J,IAqQ/B,IAAIyF,GAAoB,CAqCxBz9B,QAAOshB,eAAe5lB,KAAK6F,UAAW,oBACpCQ,IAAK,WACH,GAAIk/B,GAAWxmC,KAAK2mC,iBACpB,OAAOH,GAAWA,EACbxmC,KAAKX,WAAaW,KAAKX,WAAWgnB,iBAAmB3S,SAI9D,IAAI6yB,GAAgBhoC,SAASgnC,wBAC7BgB,GAAcjM,aACdiM,EAAcE,YAAc,KAY5BpD,EAAiBv8B,WACfi/B,UAAW,WACT,GAAIzkB,GAAOthB,KAAKshB,IACZA,KACEA,EAAKgmB,aAAc,GACrBhmB,EAAKimB,QAAQpiB,QACX7D,EAAKvB,WAAY,GACnBuB,EAAKzP,MAAMsT,UAIjB6gB,mBAAoB,SAASH,EAAY/lB,GACvC9f,KAAK+lC,WAEL,IAAIzkB,GAAOthB,KAAKshB,QACZ8E,EAAWpmB,KAAKwjC,iBAEhB+D,GAAU,CACd,IAAI1B,EAAWzD,GAAI,CAQjB,GAPA9gB,EAAKkmB,OAAQ,EACblmB,EAAKgmB,UAAYzB,EAAWzD,GAAGrB,YAC/Bzf,EAAKimB,QAAU9F,EAAeQ,EAAI4D,EAAWzD,GAAIhc,EAAUtG,GAE3DynB,EAAUjmB,EAAKimB,QAGXjmB,EAAKgmB,YAAcC,EAErB,WADAvnC,MAAKgnC,cAIF1lB,GAAKgmB,YACRC,EAAUA,EAAQviB,KAAKhlB,KAAKynC,cAAeznC,OAG3C6lC,EAAWxD,QACb/gB,EAAK+gB,QAAS,EACd/gB,EAAKvB,QAAU8lB,EAAWxD,OAAOtB,YACjCzf,EAAKzP,MAAQ4vB,EAAeU,EAAQ0D,EAAWxD,OAAQjc,EAAUtG,KAEjEwB,EAAK+gB,QAAS,EACd/gB,EAAKvB,QAAU8lB,EAAWtiC,KAAKw9B,YAC/Bzf,EAAKzP,MAAQ4vB,EAAeS,EAAM2D,EAAWtiC,KAAM6iB,EAAUtG,GAG/D,IAAIjO,GAAQyP,EAAKzP,KAIjB,OAHKyP,GAAKvB,UACRlO,EAAQA,EAAMmT,KAAKhlB,KAAKinC,oBAAqBjnC,OAE1CunC,MAKLvnC,MAAK0nC,YAAY71B,OAJf7R,MAAKgnC,gBAYTE,gBAAiB,WACf,GAAIr1B,GAAQ7R,KAAKshB,KAAKzP,KAGtB,OAFK7R,MAAKshB,KAAKvB,UACblO,EAAQA,EAAMoT,kBACTpT,GAGT41B,cAAe,SAASF,GACtB,MAAKA,OAKLvnC,MAAK0nC,YAAY1nC,KAAKknC,uBAJpBlnC,MAAKgnC,gBAOTC,oBAAqB,SAASp1B,GAC5B,GAAI7R,KAAKshB,KAAKkmB,MAAO,CACnB,GAAID,GAAUvnC,KAAKshB,KAAKimB,OAGxB,IAFKvnC,KAAKshB,KAAKgmB,YACbC,EAAUA,EAAQtiB,mBACfsiB,EAEH,WADAvnC,MAAKgnC,eAKThnC,KAAK0nC,YAAY71B,IAGnB61B,YAAa,SAAS71B,GACf7R,KAAKshB,KAAK+gB,SACbxwB,GAASA,GACX,IAAIuY,GAAUpqB,KAAKshB,KAAK+gB,SACTriC,KAAKshB,KAAKvB,SACX7R,MAAM0gB,QAAQ/c,EAC5B7R,MAAKgnC,aAAan1B,EAAOuY,IAG3B4c,aAAc,SAASn1B,EAAO81B,GACvBz5B,MAAM0gB,QAAQ/c,KACjBA,MAEEA,IAAU7R,KAAK0jC,gBAGnB1jC,KAAKyrB,YACLzrB,KAAK2jC,aAAe9xB,EAChB81B,IACF3nC,KAAK4jC,cAAgB,GAAIrS,eAAcvxB,KAAK2jC,cAC5C3jC,KAAK4jC,cAAc5e,KAAKhlB,KAAK4nC,cAAe5nC,OAG9CA,KAAK4nC,cAAcrW,cAAcqI,iBAAiB55B,KAAK2jC,aACL3jC,KAAK0jC,kBAGzDmE,oBAAqB,SAASl/B,GAC5B,GAAa,IAATA,EACF,MAAO3I,MAAKwjC,gBACd,IAAIgD,GAAWxmC,KAAKyjC,UAAU96B,GAC1Bs4B,EAAauF,EAASC,WAC1B,KAAKxF,EACH,MAAOjhC,MAAK6nC,oBAAoBl/B,EAAQ,EAE1C,IAAIs4B,EAAWjgC,WAAaC,KAAKW,cAC7B5B,KAAKwjC,mBAAqBvC,EAC5B,MAAOA,EAGT,IAAI6G,GAAsB7G,EAAW6E,SACrC,OAAKgC,GAGEA,EAAoBC,sBAFlB9G,GAKX8G,oBAAqB,WACnB,MAAO/nC,MAAK6nC,oBAAoB7nC,KAAKyjC,UAAUniC,OAAS,IAG1D0mC,iBAAkB,SAASr/B,EAAOs/B,GAChC,GAAIC,GAAuBloC,KAAK6nC,oBAAoBl/B,EAAQ,GACxD65B,EAASxiC,KAAKwjC,iBAAiBnkC,UACnCW,MAAKyjC,UAAUp8B,OAAOsB,EAAO,EAAGs/B,GAEhCzF,EAAOrX,aAAa8c,EAAUC,EAAqBvF,cAGrDwF,kBAAmB,SAASx/B,GAM1B,IALA,GAAIu/B,GAAuBloC,KAAK6nC,oBAAoBl/B,EAAQ,GACxDk+B,EAAW7mC,KAAK6nC,oBAAoBl/B,GACpC65B,EAASxiC,KAAKwjC,iBAAiBnkC,WAC/BmnC,EAAWxmC,KAAKyjC,UAAUp8B,OAAOsB,EAAO,GAAG,GAExCk+B,IAAaqB,GAAsB,CACxC,GAAIrlC,GAAOqlC,EAAqBvF,WAC5B9/B,IAAQgkC,IACVA,EAAWqB,GAEb1B,EAAS5nC,YAAY4jC,EAAOljC,YAAYuD,IAG1C,MAAO2jC,IAGT4B,cAAe,SAASx9B,GAEtB,MADAA,GAAKA,GAAMA,EAAG5K,KAAKwjC,kBACE,kBAAP54B,GAAoBA,EAAK,MAGzCg9B,cAAe,SAAShU,GACtB,IAAI5zB,KAAKujC,QAAW3P,EAAQtyB,OAA5B,CAGA,GAAI8kB,GAAWpmB,KAAKwjC,gBAEpB,KAAKpd,EAAS/mB,WAEZ,WADAW,MAAKmlB,OAIPoM,eAAcgG,aAAav3B,KAAK0jC,cAAe1jC,KAAK2jC,aACzB/P,EAE3B,IAAI7Y,GAAWqL,EAASma,SACM7sB,UAA1B1T,KAAKonC,mBACPpnC,KAAKonC,iBACDpnC,KAAKooC,cAAcrtB,GAAYA,EAASyL,uBAGN9S,SAApC1T,KAAKmnC,6BACPnnC,KAAKmnC,2BACDnnC,KAAKooC,cAAcrtB,GACAA,EAASoL,gCAMlC,KAAK,GAFDkiB,GAAgB,GAAI3hC,GACpB4hC,EAAc,EACT3mC,EAAI,EAAGA,EAAIiyB,EAAQtyB,OAAQK,IAAK,CAGvC,IAAK,GAFD0F,GAASusB,EAAQjyB,GACjB6sB,EAAUnnB,EAAOmnB,QACZ1iB,EAAI,EAAGA,EAAI0iB,EAAQltB,OAAQwK,IAAK,CACvC,GAAIgU,GAAQ0O,EAAQ1iB,GAChB06B,EAAWxmC,KAAKmoC,kBAAkB9gC,EAAOsB,MAAQ2/B,EACjD9B,KAAaD,GACf8B,EAAcrhC,IAAI8Y,EAAO0mB,GAI7B8B,GAAejhC,EAAOurB,WAIxB,IAAK,GAAIjxB,GAAI,EAAGA,EAAIiyB,EAAQtyB,OAAQK,IAGlC,IAFA,GAAI0F,GAASusB,EAAQjyB,GACjB+1B,EAAWrwB,EAAOsB,MACf+uB,EAAWrwB,EAAOsB,MAAQtB,EAAOurB,WAAY8E,IAAY,CAC9D,GAAI5X,GAAQ9f,KAAK0jC,cAAchM,GAC3B8O,EAAW6B,EAAc/gC,IAAIwY,EAC7B0mB,GACF6B,EAAcjhC,OAAO0Y,IAEjB9f,KAAKonC,mBACPtnB,EAAQ9f,KAAKonC,iBAAiBtnB,IAI9B0mB,EADY9yB,SAAVoM,EACSymB,EAEAngB,EAAS8f,eAAepmB,EAAOpM,OAAWqH,IAIzD/a,KAAKgoC,iBAAiBtQ,EAAU8O,GAIpC6B,EAAcjkC,QAAQ,SAASoiC,GAC7BxmC,KAAKuoC,sBAAsB/B,IAC1BxmC,MAECA,KAAKmnC,4BACPnnC,KAAKwoC,qBAAqB5U,KAG9B6U,oBAAqB,SAAS9/B,GAC5B,GAAI69B,GAAWxmC,KAAKyjC,UAAU96B,EAC1B69B,KAAaD,GAGjBvmC,KAAKmnC,2BAA2BX,EAASG,kBAAmBh+B,IAG9D6/B,qBAAsB,SAAS5U,GAG7B,IAAK,GAFDjrB,GAAQ,EACRurB,EAAS,EACJvyB,EAAI,EAAGA,EAAIiyB,EAAQtyB,OAAQK,IAAK,CACvC,GAAI0F,GAASusB,EAAQjyB,EACrB,IAAc,GAAVuyB,EACF,KAAOvrB,EAAQtB,EAAOsB,OACpB3I,KAAKyoC,oBAAoB9/B,GACzBA,QAGFA,GAAQtB,EAAOsB,KAGjB,MAAOA,EAAQtB,EAAOsB,MAAQtB,EAAOurB,YACnC5yB,KAAKyoC,oBAAoB9/B,GACzBA,GAGFurB,IAAU7sB,EAAOurB,WAAavrB,EAAOmnB,QAAQltB,OAG/C,GAAc,GAAV4yB,EAIJ,IADA,GAAI5yB,GAAStB,KAAKyjC,UAAUniC,OACbA,EAARqH,GACL3I,KAAKyoC,oBAAoB9/B,GACzBA,KAIJ4/B,sBAAuB,SAAS/B,GAE9B,IAAK,GADDnM,GAAWmM,EAASlM,UACf34B,EAAI,EAAGA,EAAI04B,EAAS/4B,OAAQK,IACnC04B,EAAS14B,GAAGwjB,SAIhBsG,UAAW,WACJzrB,KAAK4jC,gBAGV5jC,KAAK4jC,cAAcze,QACnBnlB,KAAK4jC,cAAgBlwB,SAGvByR,MAAO,WACL,IAAInlB,KAAKujC,OAAT,CAEAvjC,KAAKyrB,WACL,KAAK,GAAI9pB,GAAI,EAAGA,EAAI3B,KAAKyjC,UAAUniC,OAAQK,IACzC3B,KAAKuoC,sBAAsBvoC,KAAKyjC,UAAU9hC,GAG5C3B,MAAKyjC,UAAUniC,OAAS,EACxBtB,KAAK+lC,YACL/lC,KAAKwjC,iBAAiBsC,UAAYpyB,OAClC1T,KAAKujC,QAAS,KAKlBjF,oBAAoBoK,qBAAuBzK,GAC1Cj+B,MAWH,SAAU5B,GAMV,QAASuqC,GAAenhC,GACtBohC,EAAQnkC,YAAcokC,IACtBC,EAAUroC,KAAK+G,GAGjB,QAASuhC,KACP,KAAOD,EAAUxnC,QACfwnC,EAAUE,UAXd,GAAIH,GAAa,EACbC,KACAF,EAAUrqC,SAAS0qC,eAAe,GAatC,KAAK/qC,OAAO+rB,kBAAoBif,oBAAoBH,GACjD3e,QAAQwe,GAAUO,eAAe,IAKpC/qC,EAAMuqC,eAAiBA,GAEpBzhB,UAYH,SAAU9oB,GAUV,QAASgpB,KACFgiB,IACHA,GAAW,EACXhrC,EAAMuqC,eAAe,WACnBS,GAAW,EACXjiB,SAASuT,MAAQ7a,QAAQwpB,MAAM,oBAC/BjrC,EAAM64B,6BACN9P,SAASuT,MAAQ7a,QAAQypB,cAd/B,GAAItlC,GAAQzF,SAASC,cAAc,QACnCwF,GAAMS,YAAc,oEACpB,IAAItF,GAAOZ,SAAS8B,cAAc,OAClClB,GAAKgsB,aAAannB,EAAO7E,EAAKisB,WAG9B,IAAIge,EAeJ,IAAK/Y,SAAS4J,iBAQZ7S,EAAQ,iBARsB,CAC9B,GAAImiB,GAAsB,GAC1BrrC,QAAOW,iBAAiB,qBAAsB,WAC5CuoB,IACAhpB,EAAMorC,UAAYrzB,YAAYiR,EAAOmiB,KAOzC,GAAIrrC,OAAOmpB,iBAAmBA,eAAeC,UAAW,CACtD,GAAImiB,GAAqB3F,SAASh9B,UAAU47B,UAC5CoB,UAASh9B,UAAU47B,WAAa,SAAS7/B,EAAM6mC,GAC7C,GAAIC,GAAWF,EAAmB/hC,KAAK1H,KAAM6C,EAAM6mC,EAEnD,OADAriB,gBAAeuiB,WAAWD,GACnBA,GAKXvrC,EAAMgpB,MAAQA,GAEXlpB,OAAOgpB,UAYV,SAAU9oB,GAwEV,QAASyrC,GAAqBC,EAASC,EAASC,EAAcC,GAC5D,MAAOH,GAAQzvB,QAAQ4vB,EAAQ,SAASxjC,EAAGyjC,EAAKC,EAAKC,GACnD,GAAIC,GAAUF,EAAI9vB,QAAQ,QAAS,GAEnC,OADAgwB,GAAUC,EAAmBP,EAASM,EAASL,GACxCE,EAAM,IAAOG,EAAU,IAAOD,IAIzC,QAASE,GAAmBP,EAASI,EAAKH,GAExC,GAAIG,GAAkB,MAAXA,EAAI,GACb,MAAOA,EAET,IAAI1nC,GAAI,GAAI8nC,KAAIJ,EAAKJ,EACrB,OAAOC,GAAevnC,EAAE68B,KAAOkL,EAAoB/nC,EAAE68B,MAGvD,QAASkL,GAAoBL,GAC3B,GAAIM,GAAO,GAAIF,KAAIhsC,SAASghC,SACxB98B,EAAI,GAAI8nC,KAAIJ,EAAKM,EACrB,OAAIhoC,GAAEV,OAAS0oC,EAAK1oC,MAAQU,EAAEioC,OAASD,EAAKC,MACxCjoC,EAAEkoC,WAAaF,EAAKE,SACfC,EAAYH,EAAMhoC,GAElB0nC,EAKX,QAASS,GAAYC,EAAWC,GAK9B,IAJA,GAAI9hC,GAAS6hC,EAAUE,SACnBxrC,EAASurC,EAAUC,SACnBpsC,EAAIqK,EAAOgiC,MAAM,KACjBlqC,EAAIvB,EAAOyrC,MAAM,KACdrsC,EAAE2C,QAAU3C,EAAE,KAAOmC,EAAE,IAC5BnC,EAAEqqC,QACFloC,EAAEkoC,OAEJ,KAAK,GAAIrnC,GAAI,EAAGgI,EAAIhL,EAAE2C,OAAS,EAAOqI,EAAJhI,EAAOA,IACvCb,EAAEmqC,QAAQ,KAEZ,OAAOnqC,GAAEklB,KAAK,KAAO8kB,EAAUI,OAASJ,EAAUK,KA/GpD,GAAIC,IACFC,WAAY,SAASZ,EAAMN,GACzBA,EAAMA,GAAOM,EAAK5L,cAAcU,QAChCv/B,KAAKsrC,kBAAkBb,EAAMN,GAC7BnqC,KAAKurC,cAAcd,EAAMN,EAEzB,IAAIqB,GAAYf,EAAK3hB,iBAAiB,WACtC,IAAI0iB,EACF,IAAK,GAAiC1qC,GAA7Ba,EAAI,EAAGgI,EAAI6hC,EAAUlqC,OAAgBqI,EAAJhI,IAAWb,EAAI0qC,EAAU7pC,IAAKA,IAClEb,EAAE09B,SACJx+B,KAAKqrC,WAAWvqC,EAAE09B,QAAS2L,IAKnCsB,gBAAiB,SAASrlB,GACxBpmB,KAAKqrC,WAAWjlB,EAASoY,QAASpY,EAASyY,cAAcU,UAE3DgM,cAAe,SAASd,EAAMN,GAC5B,GAAIrmC,GAAS2mC,EAAK3hB,iBAAiB,QACnC,IAAIhlB,EACF,IAAK,GAA8BnF,GAA1BgD,EAAI,EAAGgI,EAAI7F,EAAOxC,OAAgBqI,EAAJhI,IAAWhD,EAAImF,EAAOnC,IAAKA,IAChE3B,KAAK0rC,aAAa/sC,EAAGwrC,IAI3BuB,aAAc,SAAS1nC,EAAOmmC,GAC5BA,EAAMA,GAAOnmC,EAAM66B,cAAcU,QACjCv7B,EAAMS,YAAczE,KAAK2rC,eAAe3nC,EAAMS,YAAa0lC,IAE7DwB,eAAgB,SAAS7B,EAASC,EAASC,GAEzC,MADAF,GAAUD,EAAqBC,EAASC,EAASC,EAAc4B,GACxD/B,EAAqBC,EAASC,EAASC,EAAc6B,IAE9DP,kBAAmB,SAASb,EAAMN,GAC5BM,EAAKqB,eAAiBrB,EAAKqB,iBAC7B9rC,KAAK+rC,yBAAyBtB,EAAMN,EAGtC,IAAIz/B,GAAQ+/B,GAAQA,EAAK3hB,iBAAiBkjB,EAC1C,IAAIthC,EACF,IAAK,GAA6BhJ,GAAzBC,EAAI,EAAGgI,EAAIe,EAAMpJ,OAAgBqI,EAAJhI,IAAWD,EAAIgJ,EAAM/I,IAAKA,IAC9D3B,KAAK+rC,yBAAyBrqC,EAAGyoC,IAIvC4B,yBAA0B,SAASlpC,EAAMsnC,GACvCA,EAAMA,GAAOtnC,EAAKg8B,cAAcU,QAChC0M,EAAU7nC,QAAQ,SAASX,GACzB,GAEIyoC,GAFAnK,EAAOl/B,EAAK68B,WAAWj8B,GACvBoO,EAAQkwB,GAAQA,EAAKlwB,KAErBA,IAASA,EAAMq5B,OAAOiB,GAAuB,IAE7CD,EADQ,UAANzoC,EACYomC,EAAqBh4B,EAAOs4B,GAAK,EAAOyB,GAExCtB,EAAmBH,EAAKt4B,GAExCkwB,EAAKlwB,MAAQq6B,OAMjBN,EAAiB,sBACjBC,EAAoB,qCACpBI,GAAa,OAAQ,MAAO,SAAU,QAAS,OAC/CD,EAAqB,IAAMC,EAAUjmB,KAAK,OAAS,IACnDmmB,EAAsB,QA+C1B/tC,GAAMgtC,YAAcA,GAEjBpkB,SAWH,SAAU5oB,GAIR,QAASguC,GAAOC,GACdrsC,KAAKssC,MAAQ/mC,OAAOC,OAAO,MAC3BxF,KAAKuE,IAAMgB,OAAOC,OAAO,MACzBxF,KAAKusC,SAAW,EAChBvsC,KAAKqsC,MAAQA,EAPf,GAAI1D,GAAiBzhB,SAASyhB,cAS9ByD,GAAOtlC,WAIL0lC,YAAa,SAASC,EAAM/kB,GAG1B,IAFA,GACIglB,GAASjqC,EADTkqC,KAEID,EAAU1sC,KAAKqsC,MAAMO,KAAKH,IAChChqC,EAAI,GAAI8nC,KAAImC,EAAQ,GAAIhlB,GACxBilB,EAAQlsC,MAAMisC,QAASA,EAAQ,GAAIvC,IAAK1nC,EAAE68B,MAE5C,OAAOqN,IAITE,QAAS,SAASJ,EAAMhC,EAAMjjC,GAC5B,GAAImlC,GAAU3sC,KAAKwsC,YAAYC,EAAMhC,GAGjCqC,EAAOtlC,EAASjE,KAAK,KAAMvD,KAAKuE,IACpCvE,MAAK+sC,MAAMJ,EAASG,IAGtBC,MAAO,SAASJ,EAASnlC,GACvB,GAAIwlC,GAAWL,EAAQrrC,MAGvB,KAAK0rC,EACH,MAAOxlC,IAYT,KAAK,GADDf,GAAGwmC,EAAK9C,EAPR2C,EAAO,WACU,MAAbE,GACJxlC,KAMK7F,EAAI,EAAOqrC,EAAJrrC,EAAcA,IAC5B8E,EAAIkmC,EAAQhrC,GACZwoC,EAAM1jC,EAAE0jC,IACR8C,EAAMjtC,KAAKssC,MAAMnC,GAEZ8C,IACHA,EAAMjtC,KAAKktC,IAAI/C,GACf8C,EAAIn5B,MAAQrN,EACZzG,KAAKssC,MAAMnC,GAAO8C,GAGpBA,EAAIE,KAAKL,IAGbM,UAAW,SAASC,GAClB,GAAIv5B,GAAQu5B,EAAQv5B,MAChBq2B,EAAMr2B,EAAMq2B,IAGZmD,EAAWD,EAAQC,UAAYD,EAAQE,cAAgB,EAC3DvtC,MAAKuE,IAAI4lC,GAAOmD,EAChBttC,KAAK+sC,MAAM/sC,KAAKwsC,YAAYc,EAAUnD,GAAMkD,EAAQG,UAEtDN,IAAK,SAAS/C,GACZnqC,KAAKusC,UACL,IAAIc,GAAU,GAAII,eAwBlB,OAvBAJ,GAAQroB,KAAK,MAAOmlB,GAAK,GACzBkD,EAAQK,OACRL,EAAQM,QAAUN,EAAQO,OAAS5tC,KAAKotC,UAAU7pC,KAAKvD,KAAMqtC,GAG7DA,EAAQQ,WACRR,EAAQG,QAAU,WAEhB,IAAI,GADAK,GAAUR,EAAQQ,QACdlsC,EAAI,EAAGA,EAAIksC,EAAQvsC,OAAQK,IACjCksC,EAAQlsC,IAEV0rC,GAAQQ,QAAU,MAIpBR,EAAQF,KAAO,SAASviC,GAClByiC,EAAQQ,QACVR,EAAQQ,QAAQptC,KAAKmK,GAErB+9B,EAAe/9B,IAIZyiC,IAIXjvC,EAAMguC,OAASA,GACdplB,SAWH,SAAU5oB,GAKV,QAAS0vC,KACP9tC,KAAK+tC,OAAS,GAAI3B,GAAOpsC,KAAKqsC,OAJhC,GAAIjB,GAAchtC,EAAMgtC,YACpBgB,EAAShuC,EAAMguC,MAKnB0B,GAAchnC,WACZulC,MAAO,+CAEPmB,QAAS,SAASf,EAAMtC,EAAK3iC,GAC3B,GAAIslC,GAAO,SAASvoC,GAClBiD,EAASxH,KAAKguC,QAAQvB,EAAMtC,EAAK5lC,KACjChB,KAAKvD,KACPA,MAAK+tC,OAAOlB,QAAQJ,EAAMtC,EAAK2C,IAGjCmB,YAAa,SAASjqC,EAAOmmC,EAAK3iC,GAChC,GAAIilC,GAAOzoC,EAAMS,YACbqoC,EAAO,SAASL,GAClBzoC,EAAMS,YAAcgoC,EACpBjlC,EAASxD,GAEXhE,MAAKwtC,QAAQf,EAAMtC,EAAK2C,IAG1BkB,QAAS,SAASvB,EAAM/kB,EAAMnjB,GAG5B,IAAK,GADDuP,GAAOq2B,EAAK+D,EADZvB,EAAU3sC,KAAK+tC,OAAOvB,YAAYC,EAAM/kB,GAEnC/lB,EAAI,EAAGA,EAAIgrC,EAAQrrC,OAAQK,IAClCmS,EAAQ64B,EAAQhrC,GAChBwoC,EAAMr2B,EAAMq2B,IAEZ+D,EAAe9C,EAAYO,eAAepnC,EAAI4lC,GAAMA,GAAK,GAEzD+D,EAAeluC,KAAKguC,QAAQE,EAAcxmB,EAAMnjB,GAChDkoC,EAAOA,EAAKpyB,QAAQvG,EAAM44B,QAASwB,EAErC,OAAOzB,IAET0B,WAAY,SAASrqC,EAAQ4jB,EAAMlgB,GAGjC,QAAS4mC,KACPzlB,IACIA,IAAWhf,GAAKnC,GAClBA,IAGJ,IAAK,GAAS7I,GARVgqB,EAAO,EAAGhf,EAAI7F,EAAOxC,OAQhBK,EAAE,EAASgI,EAAFhI,IAAShD,EAAEmF,EAAOnC,IAAKA,IACvC3B,KAAKiuC,YAAYtvC,EAAG+oB,EAAM0mB,IAKhC,IAAIC,GAAgB,GAAIP,EAGxB1vC,GAAMiwC,cAAgBA,GAEnBrnB,SAWH,SAAU5oB,GAGR,QAASkwC,GAAOxnC,EAAWynC,GAiBzB,MAhBIznC,IAAaynC,GAEfhpC,OAAOqvB,oBAAoB2Z,GAAKnqC,QAAQ,SAAS1C,GAE/C,GAAI8sC,GAAKjpC,OAAOsvB,yBAAyB0Z,EAAK7sC,EAC1C8sC,KAEFjpC,OAAOshB,eAAe/f,EAAWpF,EAAG8sC,GAEb,kBAAZA,GAAG38B,QAEZ28B,EAAG38B,MAAM48B,IAAM/sC,MAKhBoF,EAOT,QAAS23B,GAAMiQ,GAEb,IAAK,GADDtlC,GAAMslC,MACD/sC,EAAI,EAAGA,EAAIwY,UAAU7Y,OAAQK,IAAK,CACzC,GAAI0B,GAAI8W,UAAUxY,EAClB,KACE,IAAK,GAAID,KAAK2B,GACZsrC,EAAajtC,EAAG2B,EAAG+F,GAErB,MAAMxI,KAGV,MAAOwI,GAIT,QAASulC,GAAaC,EAAQC,EAAUC,GACtC,GAAIN,GAAKO,EAAsBF,EAAUD,EACzCrpC,QAAOshB,eAAeioB,EAAUF,EAAQJ,GAK1C,QAASO,GAAsBC,EAAUJ,GACvC,GAAII,EAAU,CACZ,GAAIR,GAAKjpC,OAAOsvB,yBAAyBma,EAAUJ,EACnD,OAAOJ,IAAMO,EAAsBxpC,OAAOuqB,eAAekf,GAAWJ,IAMxExwC,EAAMkwC,OAASA,EACflwC,EAAMqgC,MAAQA,EAGdvX,SAASuX,MAAQA,GAEhBzX,SAWH,SAAU5oB,GA6CR,QAAS6wC,GAAIA,EAAKznC,EAAU2lC,GAO1B,MANI8B,GACFA,EAAIC,OAEJD,EAAM,GAAIE,GAAInvC,MAEhBivC,EAAIG,GAAG5nC,EAAU2lC,GACV8B,EAzCT,GAAIE,GAAM,SAASE,GACjBrvC,KAAK+iB,QAAUssB,EACfrvC,KAAKsvC,cAAgBtvC,KAAKuvC,SAAShsC,KAAKvD,MAE1CmvC,GAAIroC,WACFsoC,GAAI,SAAS5nC,EAAU2lC,GACrBntC,KAAKwH,SAAWA,CAChB,IAAIgoC,EACCrC,IAMHqC,EAAI5/B,WAAW5P,KAAKsvC,cAAenC,GACnCntC,KAAKyvC,OAAS,WACZ5/B,aAAa2/B,MAPfA,EAAIzjC,sBAAsB/L,KAAKsvC,eAC/BtvC,KAAKyvC,OAAS,WACZC,qBAAqBF,MAS3BN,KAAM,WACAlvC,KAAKyvC,SACPzvC,KAAKyvC,SACLzvC,KAAKyvC,OAAS,OAGlBF,SAAU,WACJvvC,KAAKyvC,SACPzvC,KAAKkvC,OACLlvC,KAAKwH,SAASE,KAAK1H,KAAK+iB,YAiB9B3kB,EAAM6wC,IAAMA,GAEXjoB,SAWH,SAAU5oB,GAiER,QAASuxC,GAAUC,EAAaC,EAAQC,GACtC,GAAIC,GAA4B,gBAAfH,GACbrxC,SAASC,cAAcoxC,GAAeA,EAAYI,WAAU,EAEhE,IADAD,EAAIE,UAAYJ,EACZC,EACF,IAAK,GAAIpuC,KAAKouC,GACZC,EAAIvjC,aAAa9K,EAAGouC,EAAQpuC,GAGhC,OAAOquC,GAxET,GAAIG,KAEJjT,aAAYzzB,SAAW,SAAS2mC,EAAKrpC,GACnCopC,EAASC,GAAOrpC,GAIlBm2B,YAAYmT,mBAAqB,SAASD,GACxC,GAAIrpC,GAAaqpC,EAA8BD,EAASC,GAAjClT,YAAYn2B,SAEnC,OAAOA,IAAavB,OAAOuqB,eAAevxB,SAASC,cAAc2xC,IAInE,IAAIE,GAA0BC,MAAMxpC,UAAU9H,eAC9CsxC,OAAMxpC,UAAU9H,gBAAkB,WAChCgB,KAAKuwC,cAAe,EACpBF,EAAwB/sB,MAAMtjB,KAAMma,WAStC,IAAI6d,GAAMwY,aAAa1pC,UAAUkxB,IAC7ByY,EAASD,aAAa1pC,UAAU2pC,MACpCD,cAAa1pC,UAAUkxB,IAAM,WAC3B,IAAK,GAAIr2B,GAAI,EAAGA,EAAIwY,UAAU7Y,OAAQK,IACpCq2B,EAAItwB,KAAK1H,KAAMma,UAAUxY,KAG7B6uC,aAAa1pC,UAAU2pC,OAAS,WAC9B,IAAK,GAAI9uC,GAAI,EAAGA,EAAIwY,UAAU7Y,OAAQK,IACpC8uC,EAAO/oC,KAAK1H,KAAMma,UAAUxY,KAGhC6uC,aAAa1pC,UAAU4pC,OAAS,SAAS3nC,EAAM4nC,GACrB,GAApBx2B,UAAU7Y,SACZqvC,GAAQ3wC,KAAKmC,SAAS4G,IAExB4nC,EAAO3wC,KAAKg4B,IAAIjvB,GAAQ/I,KAAKywC,OAAO1nC,IAEtCynC,aAAa1pC,UAAU8pC,OAAS,SAASC,EAASC,GAChDD,GAAW7wC,KAAKywC,OAAOI,GACvBC,GAAW9wC,KAAKg4B,IAAI8Y,GAKtB,IAAIC,GAAa,WACf,MAAO7iC,OAAMpH,UAAUgR,MAAMpQ,KAAK1H,OAGhCgxC,EAAgB9yC,OAAO+yC,cAAgB/yC,OAAOgzC,mBAElDC,UAASrqC,UAAU0qB,MAAQuf,EAC3BC,EAAalqC,UAAU0qB,MAAQuf,EAC/BK,eAAetqC,UAAU0qB,MAAQuf,EAkBjC3yC,EAAMuxC,UAAYA,GAEjB3oB,SAWF,SAAU5oB,GAgBP,QAASizC,GAAOC,GAMd,GAAIC,GAASF,EAAOE,OAEhB9C,EAAM8C,EAAO9C,IAEb+C,EAASD,EAAOC,MACfA,KACE/C,IACHA,EAAM8C,EAAO9C,IAAMgD,EAAW/pC,KAAK1H,KAAMuxC,IAEtC9C,GACH5uB,QAAQ6xB,KAAK,iFAQfF,EAASG,EAAaJ,EAAQ9C,EAAK3e,EAAe9vB,OAGpD,IAAI4K,GAAK4mC,EAAO/C,EAChB,OAAI7jC,IAEGA,EAAG4mC,QAENG,EAAa/mC,EAAI6jC,EAAK+C,GAIjB5mC,EAAG0Y,MAAMtjB,KAAMsxC,QARxB,OAYF,QAASG,GAAW5/B,GAElB,IADA,GAAIxO,GAAIrD,KAAK4mB,UACNvjB,GAAKA,IAAM45B,YAAYn2B,WAAW,CAGvC,IAAK,GAAsBpF,GADvBkwC,EAAKrsC,OAAOqvB,oBAAoBvxB,GAC3B1B,EAAE,EAAGgI,EAAEioC,EAAGtwC,OAAaqI,EAAFhI,IAAQD,EAAEkwC,EAAGjwC,IAAKA,IAAK,CACnD,GAAIY,GAAIgD,OAAOsvB,yBAAyBxxB,EAAG3B,EAC3C,IAAuB,kBAAZa,GAAEsP,OAAwBtP,EAAEsP,QAAUA,EAC/C,MAAOnQ,GAGX2B,EAAIA,EAAEujB,WAIV,QAAS+qB,GAAaE,EAAQ9oC,EAAM2rB,GAIlC,GAAI/1B,GAAImzC,EAAUpd,EAAO3rB,EAAM8oC,EAM/B,OALIlzC,GAAEoK,KAGJpK,EAAEoK,GAAM0lC,IAAM1lC,GAET8oC,EAAOL,OAAS7yC,EAGzB,QAASmzC,GAAUpd,EAAO3rB,EAAMwoC,GAE9B,KAAO7c,GAAO,CACZ,GAAKA,EAAM3rB,KAAUwoC,GAAW7c,EAAM3rB,GACpC,MAAO2rB,EAETA,GAAQ5E,EAAe4E,GAMzB,MAAOnvB,QAMT,QAASuqB,GAAehpB,GACtB,MAAOA,GAAU8f,UAkBnBxoB,EAAM2zC,MAAQV,GAEfrqB,SAWH,SAAU5oB,GAER,QAAS4zC,GAAYngC,GACnB,MAAOA,GA8CT,QAASogC,GAAiBpgC,EAAOgoB,GAE/B,GAAIqY,SAAsBrY,EAM1B,OAJIA,aAAwBhkB,QAC1Bq8B,EAAe,QAGVC,EAAaD,GAAcrgC,EAAOgoB,GAnD3C,GAAIsY,IACFC,OAAQJ,EACRt+B,UAAas+B,EACbK,KAAM,SAASxgC,GACb,MAAO,IAAIgE,MAAKA,KAAKiI,MAAMjM,IAAUgE,KAAKC,QAE5Cw8B,UAAS,SAASzgC,GAChB,MAAc,KAAVA,GACK,EAEQ,UAAVA,GAAoB,IAAUA,GAEvCmH,OAAQ,SAASnH,GACf,GAAInQ,GAAIwX,WAAWrH,EAKnB,OAHU,KAANnQ,IACFA,EAAI6wC,SAAS1gC,IAERqQ,MAAMxgB,GAAKmQ,EAAQnQ,GAK5Bif,OAAQ,SAAS9O,EAAOgoB,GACtB,GAAqB,OAAjBA,EACF,MAAOhoB,EAET,KAIE,MAAOuiB,MAAKtW,MAAMjM,EAAMwI,QAAQ,KAAM,MACtC,MAAMnV,GAEN,MAAO2M,KAIX2gC,WAAY,SAAS3gC,EAAOgoB,GAC1B,MAAOA,IAiBXz7B,GAAM6zC,iBAAmBA,GAExBjrB,SAUH,SAAU5oB,GAIR,GAAIkwC,GAASlwC,EAAMkwC,OAIfC,IAEJA,GAAIkE,eACJlE,EAAI/H,YAEJ+H,EAAImE,QAAU,SAASC,EAAM7rC,GAC3B,IAAK,GAAIpF,KAAKixC,GACZrE,EAAOxnC,EAAW6rC,EAAKjxC,KAM3BtD,EAAMmwC,IAAMA,GAEXvnB,SAWH,SAAU5oB,GAER,GAAIw0C,IASFC,MAAO,SAAShB,EAAQ33B,EAAM44B,GAG5B5rB,SAASE,QAETlN,EAAQA,GAAQA,EAAK5Y,OAAU4Y,GAAQA,EAEvC,IAAItP,GAAK,YACN5K,KAAK6xC,IAAWA,GAAQvuB,MAAMtjB,KAAMka,IACrC3W,KAAKvD,MAEHyvC,EAASqD,EAAUljC,WAAWhF,EAAIkoC,GAClC/mC,sBAAsBnB,EAE1B,OAAOkoC,GAAUrD,GAAUA,GAE7BsD,YAAa,SAAStD,GACP,EAATA,EACFC,sBAAsBD,GAEtB5/B,aAAa4/B,IAajBuD,KAAM,SAASjpC,EAAMuG,EAAQ2iC,EAAQ/zC,EAASmG,GAC5C,GAAIxC,GAAOowC,GAAUjzC,KACjBsQ,EAAoB,OAAXA,GAA8BoD,SAAXpD,KAA4BA,EACxDlN,EAAQ,GAAInE,aAAY8K,GAC1B7K,QAAqBwU,SAAZxU,EAAwBA,GAAU,EAC3CmG,WAA2BqO,SAAfrO,EAA2BA,GAAa,EACpDiL,OAAQA,GAGV,OADAzN,GAAKzD,cAAcgE,GACZA,GAST8vC,UAAW,WACTlzC,KAAK6yC,MAAM,OAAQ14B,YASrBg5B,aAAc,SAASC,EAAMlgB,EAAKmgB,GAC5BngB,GACFA,EAAIogB,UAAU7C,OAAO4C,GAEnBD,GACFA,EAAKE,UAAUtb,IAAIqb,IASvBE,gBAAiB,SAAS3O,EAAMrkC,GAC9B,GAAI6lB,GAAW7nB,SAASC,cAAc,WACtC4nB,GAAS6pB,UAAYrL,CACrB,IAAIqD,GAAWjoC,KAAKwzC,iBAAiBptB,EAKrC,OAJI7lB,KACFA,EAAQkE,YAAc,GACtBlE,EAAQ3B,YAAYqpC,IAEfA,IAKPwL,EAAM,aAGNC,IAIJd,GAAMe,YAAcf,EAAMC,MAI1Bz0C,EAAMmwC,IAAI/H,SAASoM,MAAQA,EAC3Bx0C,EAAMq1C,IAAMA,EACZr1C,EAAMs1C,IAAMA,GAEX1sB,SAWH,SAAU5oB,GAIR,GAAIw1C,GAAM11C,OAAOipB,aACb0sB,EAAe,MAGf3qC,GAEF2qC,aAAcA,EAEdC,iBAAkB,WAChB,GAAI5qC,GAASlJ,KAAK+zC,cAClBH,GAAI1qC,QAAW3D,OAAOG,KAAKwD,GAAQ5H,OAAS,GAAMue,QAAQ+zB,IAAI,yBAA0B5zC,KAAKupB,UAAWrgB,EAKxG,KAAK,GAAIa,KAAQb,GAAQ,CACvB,GAAI8qC,GAAa9qC,EAAOa,EACxB5L,iBAAgBU,iBAAiBmB,KAAM+J,EAAM/J,KAAKO,QAAQ0zC,gBAAgBj0C,KAAMA,KAAMg0C,MAI1FE,eAAgB,SAAS9qC,EAAKyoC,EAAQ33B,GACpC,GAAI9Q,EAAK,CACPwqC,EAAI1qC,QAAU2W,QAAQwpB,MAAM,qBAAsBjgC,EAAImgB,UAAWsoB,EACjE,IAAIjnC,GAAuB,kBAAXinC,GAAwBA,EAASzoC,EAAIyoC,EACjDjnC,IACFA,EAAGsP,EAAO,QAAU,QAAQ9Q,EAAK8Q,GAEnC05B,EAAI1qC,QAAU2W,QAAQypB,WACtBpiB,SAASE,UAOfhpB,GAAMmwC,IAAI/H,SAASt9B,OAASA,EAG5B9K,EAAMS,iBAAmB,SAASgE,EAAM24B,EAAW2Y,EAAWznC,GAC5DvO,gBAAgBU,iBAAiB+oB,KAAK/kB,GAAO24B,EAAW2Y,EAAWznC,IAErEtO,EAAM+M,oBAAsB,SAAStI,EAAM24B,EAAW2Y,EAAWznC,GAC/DvO,gBAAgBgN,oBAAoByc,KAAK/kB,GAAO24B,EAAW2Y,EAAWznC,KAGvEsa,SAWH,SAAU5oB,GAIR,GAAIshC,IACF0U,uBAAwB,WACtB,GAAIC,GAAKr0C,KAAKs0C,mBACd,KAAK,GAAI7uC,KAAK4uC,GACPr0C,KAAK6B,aAAa4D,IACrBzF,KAAKwM,aAAa/G,EAAG4uC,EAAG5uC,KAK9B8uC,eAAgB,WAGd,GAAIv0C,KAAKw0C,WACP,IAAK,GAA0CvyC,GAAtCN,EAAE,EAAG0yC,EAAGr0C,KAAK0/B,WAAY/1B,EAAE0qC,EAAG/yC,QAAYW,EAAEoyC,EAAG1yC,KAASgI,EAAFhI,EAAKA,IAClE3B,KAAKy0C,oBAAoBxyC,EAAE8G,KAAM9G,EAAE4P,QAMzC4iC,oBAAqB,SAAS1rC,EAAM8I,GAGlC,GAAI9I,GAAO/I,KAAK00C,qBAAqB3rC,EACrC,IAAIA,EAAM,CAIR,GAAI8I,GAASA,EAAMq5B,OAAO9sC,EAAMu2C,cAAgB,EAC9C,MAGF,IAAI9a,GAAe75B,KAAK+I,GAEpB8I,EAAQ7R,KAAKiyC,iBAAiBpgC,EAAOgoB,EAErChoB,KAAUgoB,IAEZ75B,KAAK+I,GAAQ8I,KAKnB6iC,qBAAsB,SAAS3rC,GAC7B,GAAI+K,GAAQ9T,KAAKw0C,YAAcx0C,KAAKw0C,WAAWzrC,EAE/C,OAAO+K,IAGTm+B,iBAAkB,SAAS2C,EAAa/a,GACtC,MAAOz7B,GAAM6zC,iBAAiB2C,EAAa/a,IAE7Cgb,eAAgB,SAAShjC,EAAOqgC,GAC9B,MAAqB,YAAjBA,EACKrgC,EAAQ,GAAK6B,OACM,WAAjBw+B,GAA8C,aAAjBA,GACvBx+B,SAAV7B,EACEA,EAFF,QAKTijC,2BAA4B,SAAS/rC,GACnC,GAAImpC,SAAsBlyC,MAAK+I,GAE3BgsC,EAAkB/0C,KAAK60C,eAAe70C,KAAK+I,GAAOmpC,EAE9Bx+B,UAApBqhC,EACF/0C,KAAKwM,aAAazD,EAAMgsC,GAME,YAAjB7C,GACTlyC,KAAK86B,gBAAgB/xB,IAO3B3K,GAAMmwC,IAAI/H,SAAS9G,WAAaA,GAE/B1Y,SAWH,SAAU5oB,GAyBR,QAASguB,GAAappB,EAAMC,GAC1B,MAAID,KAASC,EACK,IAATD,GAAc,EAAIA,IAAS,EAAIC,EACpCopB,EAAYrpB,IAASqpB,EAAYppB,IAC5B,EAEFD,IAASA,GAAQC,IAAUA,EAKpC,QAAS+xC,GAAoBtiB,EAAU7gB,GACrC,MAAc6B,UAAV7B,GAAoC,OAAb6gB,EAClB7gB,EAES,OAAVA,GAA4B6B,SAAV7B,EAAuB6gB,EAAW7gB,EApC9D,GAAI+hC,GAAM11C,OAAOipB,aAUb8tB,GACFt0B,OAAQjN,OACR3J,KAAM,SACNhB,KAAM2K,OACNgf,SAAUhf,QAGR2Y,EAAclK,OAAOD,OAAS,SAASrQ,GACzC,MAAwB,gBAAVA,IAAsBqQ,MAAMrQ,IAqBxC0J,GACF25B,uBAAwB,WACtB,GAAItD,GAAK5xC,KAAKm1C,aACd,IAAIvD,GAAMA,EAAGtwC,OAAQ,CACnB,GAAI8zC,GAAIp1C,KAAKq1C,kBAAoB,GAAI3vB,mBAAiB,EACtD1lB,MAAKs1C,iBAAiBF,EAKtB,KAAK,GAAsB1zC,GAAlBC,EAAE,EAAGgI,EAAEioC,EAAGtwC,OAAcqI,EAAFhI,IAASD,EAAEkwC,EAAGjwC,IAAKA,IAChDyzC,EAAE9yB,QAAQtiB,KAAM0B,GAChB1B,KAAKu1C,kBAAkB7zC,EAAG1B,KAAK0B,GAAI,QAIzC8zC,qBAAsB,WAChBx1C,KAAKq1C,mBACPr1C,KAAKq1C,kBAAkBrwB,KAAKhlB,KAAKy1C,sBAAuBz1C,OAG5Dy1C,sBAAuB,SAASC,EAAWljB,EAAWmjB,GACpD,GAAI5sC,GAAM8oC,EAAQ+D,IAClB,KAAK,GAAIj0C,KAAK6wB,GAIZ,GAFAzpB,EAAO4sC,EAAM,EAAIh0C,EAAI,GACrBkwC,EAAS7xC,KAAKoqB,QAAQrhB,GACV,CACV,GAAI8sC,GAAKrjB,EAAU7wB,GAAIm0C,EAAKJ,EAAU/zC,EAEtC3B,MAAKu1C,kBAAkBxsC,EAAM+sC,EAAID,GAC5BD,EAAO/D,KAEEn+B,SAAPmiC,GAA2B,OAAPA,GAAwBniC,SAAPoiC,GAA2B,OAAPA,KAC5DF,EAAO/D,IAAU,EAKjB7xC,KAAK+1C,aAAalE,GAASgE,EAAIC,EAAI37B,eAM7C67B,eAAgB,WACVh2C,KAAKq1C,mBACPr1C,KAAKq1C,kBAAkBnwB,WAG3B+wB,iBAAkB,SAASltC,GACrB/I,KAAKk2C,QAAQntC,IACf/I,KAAK80C,2BAA2B/rC,IAGpCwsC,kBAAmB,SAASxsC,EAAM8I,EAAOqhB,GAEvC,GAAIijB,GAAen2C,KAAKoqB,QAAQrhB,EAChC,IAAIotC,IAEEjoC,MAAM0gB,QAAQsE,KAChB0gB,EAAIxpB,SAAWvK,QAAQ+zB,IAAI,mDAAoD5zC,KAAKupB,UAAWxgB,GAC/F/I,KAAKo2C,mBAAmBrtC,EAAO,YAG7BmF,MAAM0gB,QAAQ/c,IAAQ,CACxB+hC,EAAIxpB,SAAWvK,QAAQ+zB,IAAI,iDAAkD5zC,KAAKupB,UAAWxgB,EAAM8I,EACnG,IAAIwQ,GAAW,GAAIkP,eAAc1f,EACjCwQ,GAAS2C,KAAK,SAAS4O,GACrB5zB,KAAK+1C,aAAaI,GAAeviB,KAChC5zB,MACHA,KAAKq2C,sBAAsBttC,EAAO,UAAWsZ,KAInDi0B,yBAA0B,SAASvtC,EAAM8I,EAAO6gB,GAE9C,IAAItG,EAAava,EAAO6gB,KAGxB1yB,KAAKi2C,iBAAiBltC,EAAM8I,EAAO6gB,GAE9BrC,SAAS4J,kBAAd,CAGA,GAAIsc,GAAWv2C,KAAKw2C,SACfD,KACHA,EAAWv2C,KAAKw2C,UAAYjxC,OAAOkxC,YAAYz2C,OAEjDi1C,EAAat0B,OAAS3gB,KACtBi1C,EAAalsC,KAAOA,EACpBksC,EAAaviB,SAAWA,EAExB6jB,EAASG,OAAOzB,KAElB0B,eAAgB,SAAS5tC,EAAMgpB,EAAY6kB,GAYzC,QAASlP,GAAY71B,EAAO6gB,GAC1B7hB,EAAKgmC,GAAehlC,CAEpB,IAAIilC,GAAiBjmC,EAAKkmC,EACtBD,IAAoD,kBAA3BA,GAAet0B,UAC1Cs0B,EAAet0B,SAAS3Q,GAG1BhB,EAAKylC,yBAAyBvtC,EAAM8I,EAAO6gB,GAnB7C,GAAImkB,GAAc9tC,EAAO,IACrBiuC,EAAqBjuC,EAAO,cAG5BguC,EAA4BhuC,EAAO,0BAEvC/I,MAAKg3C,GAAqBjlB,CAE1B,IAAIW,GAAW1yB,KAAK62C,GAEhBhmC,EAAO7Q,KAYP6R,EAAQkgB,EAAW/M,KAAK0iB,EAE5B,IAAIkP,IAAcxqB,EAAasG,EAAU7gB,GAAQ,CAC/C,GAAIolC,GAAgBL,EAAUlkB,EAAU7gB,EACnCua,GAAava,EAAOolC,KACvBplC,EAAQolC,EACJllB,EAAWvP,UACbuP,EAAWvP,SAAS3Q,IAI1B61B,EAAY71B,EAAO6gB,EAEnB,IAAIrQ,IACF8C,MAAO,WACL4M,EAAW5M,QACXtU,EAAKmmC,GAAqBtjC,OAC1B7C,EAAKkmC,GAA6BrjC,QAItC,OADA1T,MAAKs1C,iBAAiBjzB,GACfA,GAET60B,yBAA0B,WACxB,GAAKl3C,KAAKm3C,eAIV,IAAK,GAAIx1C,GAAI,EAAGA,EAAI3B,KAAKm3C,eAAe71C,OAAQK,IAAK,CACnD,GAAIoH,GAAO/I,KAAKm3C,eAAex1C,GAC3B2d,EAAiBtf,KAAK6gB,SAAS9X,EACnC,KACE,GAAIyW,GAAa4C,mBAAmB3C,cAAcH,GAC9CyS,EAAavS,EAAWS,WAAWjgB,KAAMA,KAAKO,QAAQ62C,OAC1Dp3C,MAAK22C,eAAe5tC,EAAMgpB,GAC1B,MAAOnS,GACPC,QAAQ5F,MAAM,qCAAsC2F,MAI1Dy3B,aAAc,SAASn7B,EAAU6V,EAAYhS,GAC3C,GAAIA,EAEF,YADA/f,KAAKkc,GAAY6V,EAGnB,IAAIlR,GAAW7gB,KAAKO,QAAQuG,UAAU+Z,QAKtC,IAAIA,GAAYA,EAAS3E,GAAW,CAClC,GAAI66B,GAA4B76B,EAAW,0BAE3C,aADAlc,KAAK+2C,GAA6BhlB,GAIpC,MAAO/xB,MAAK22C,eAAez6B,EAAU6V,EAAYijB,IAEnDe,aAAc,SAASlE,EAAQ33B,GAC7B,GAAItP,GAAK5K,KAAK6xC,IAAWA,CACP,mBAAPjnC,IACTA,EAAG0Y,MAAMtjB,KAAMka,IAGnBo7B,iBAAkB,SAASjzB,GACzB,MAAKriB,MAAKs3C,eAKVt3C,MAAKs3C,WAAW72C,KAAK4hB,QAJnBriB,KAAKs3C,YAAcj1B,KAOvBk1B,eAAgB,WACd,GAAKv3C,KAAKs3C,WAAV,CAKA,IAAK,GADDrnB,GAAYjwB,KAAKs3C,WACZ31C,EAAI,EAAGA,EAAIsuB,EAAU3uB,OAAQK,IAAK,CACzC,GAAI0gB,GAAW4N,EAAUtuB,EACrB0gB,IAAqC,kBAAlBA,GAAS8C,OAC9B9C,EAAS8C,QAIbnlB,KAAKs3C,gBAGPjB,sBAAuB,SAASttC,EAAMsZ,GACpC,GAAIm1B,GAAKx3C,KAAKy3C,kBAAoBz3C,KAAKy3C,mBACvCD,GAAGzuC,GAAQsZ,GAEb+zB,mBAAoB,SAASrtC,GAC3B,GAAIyuC,GAAKx3C,KAAKy3C,eACd,OAAID,IAAMA,EAAGzuC,IACXyuC,EAAGzuC,GAAMoc,QACTqyB,EAAGzuC,GAAQ,MACJ,GAHT,QAMF2uC,oBAAqB,WACnB,GAAI13C,KAAKy3C,gBAAiB,CACxB,IAAK,GAAI91C,KAAK3B,MAAKy3C,gBACjBz3C,KAAKo2C,mBAAmBz0C,EAE1B3B,MAAKy3C,qBAYXr5C,GAAMmwC,IAAI/H,SAASjrB,WAAaA,GAE/ByL,SAWH,SAAU5oB,GAIR,GAAIw1C,GAAM11C,OAAOipB,UAAY,EAGzBwwB,GACFnE,iBAAkB,SAASptB,GAEzBkY,oBAAoBC,SAASnY,EAM7B,KAAK,GAJDgxB,GAASp3C,KAAKo3C,SAAYhxB,EAAS+f,iBACnCnmC,KAAKO,QAAQ62C,OACbrH,EAAM3pB,EAAS8f,eAAelmC,KAAMo3C,GACpCnnB,EAAY8f,EAAIzV,UACX34B,EAAI,EAAGA,EAAIsuB,EAAU3uB,OAAQK,IACpC3B,KAAKs1C,iBAAiBrlB,EAAUtuB,GAElC,OAAOouC,IAETxsC,KAAM,SAASwF,EAAMgpB,EAAYhS,GAC/B,GAAI7D,GAAWlc,KAAK00C,qBAAqB3rC,EACzC,IAAKmT,EAIE,CAEL,GAAImG,GAAWriB,KAAKq3C,aAAan7B,EAAU6V,EAAYhS,EAUvD,OAPImH,UAAS0wB,0BAA4Bv1B,IACvCA,EAAStjB,KAAOgzB,EAAWL,MAC3B1xB,KAAK63C,eAAe37B,EAAUmG,IAE5BriB,KAAKk2C,QAAQh6B,IACflc,KAAK80C,2BAA2B54B,GAE3BmG,EAbP,MAAOriB,MAAK83C,WAAW39B,YAgB3BqiB,aAAc,WACZx8B,KAAK+3C,oBAEPF,eAAgB,SAAS9uC,EAAMsZ,GAC7BriB,KAAKs6B,UAAYt6B,KAAKs6B,cACtBt6B,KAAKs6B,UAAUvxB,GAAQsZ,GAKzB21B,eAAgB,WACTh4C,KAAKi4C,WACRrE,EAAIsE,QAAUr4B,QAAQ+zB,IAAI,sBAAuB5zC,KAAKupB,WACtDvpB,KAAKm4C,cAAgBn4C,KAAKivC,IAAIjvC,KAAKm4C,cAAen4C,KAAKo4C,UAAW,KAGtEA,UAAW,WACJp4C,KAAKi4C,WACRj4C,KAAKu3C,iBACLv3C,KAAK03C,sBACL13C,KAAKi4C,UAAW,IAGpBI,gBAAiB,WACf,MAAIr4C,MAAKi4C,cACPrE,EAAIsE,QAAUr4B,QAAQ6xB,KAAK,gDAAiD1xC,KAAKupB,aAGnFqqB,EAAIsE,QAAUr4B,QAAQ+zB,IAAI,uBAAwB5zC,KAAKupB,gBACnDvpB,KAAKm4C,gBACPn4C,KAAKm4C,cAAgBn4C,KAAKm4C,cAAcjJ,YAsB1CoJ,EAAkB,gBAItBl6C,GAAMu2C,YAAc2D,EACpBl6C,EAAMmwC,IAAI/H,SAASmR,IAAMA,GAExB3wB,SAWH,SAAU5oB,GAuNR,QAASm6C,GAAO53B,GACd,MAAOA,GAAOoB,eAAe,eAK/B,QAASy2B,MA3NT,GAAI9wB,IACF8wB,aAAa,EACbvJ,IAAK,SAASA,EAAKznC,EAAU2lC,GAC3B,GAAmB,gBAAR8B,GAIT,MAAOjoB,SAAQioB,IAAIvnC,KAAK1H,KAAMivC,EAAKznC,EAAU2lC,EAH7C,IAAIzrC,GAAI,MAAQutC,CAChBjvC,MAAK0B,GAAKslB,QAAQioB,IAAIvnC,KAAK1H,KAAMA,KAAK0B,GAAI8F,EAAU2lC,IAKxD4E,QAAO/qB,QAAQ+qB,MAEf0G,QAAS,aAITlxB,MAAO,aAEPmxB,gBAAiB,WACX14C,KAAKqmB,kBAAoBrmB,KAAKqmB,iBAAiBvG,OACjDD,QAAQ6xB,KAAK,iBAAmB1xC,KAAKupB,UAAY,wGAInDvpB,KAAKy4C,UACLz4C,KAAK24C,iBACA34C,KAAK6+B,cAAcQ,mBACtBr/B,KAAK+3C,oBAITY,eAAgB,WACd,MAAI34C,MAAK44C,qBACP/4B,SAAQ6xB,KAAK,2BAA4B1xC,KAAKupB,YAGhDvpB,KAAK44C,kBAAmB,EAExB54C,KAAK64C,eAEL74C,KAAKk1C,yBACLl1C,KAAKw1C,uBAELx1C,KAAKo0C,yBAELp0C,KAAKu0C,qBAELv0C,MAAK8zC,qBAEPiE,iBAAkB,WACZ/3C,KAAK84C,WAGT94C,KAAK84C,UAAW,EAChB94C,KAAKk3C,2BAILl3C,KAAK+4C,kBAAkB/4C,KAAK4mB,WAI5B5mB,KAAK86B,gBAAgB,cAErB96B,KAAKunB,UAEPyxB,iBAAkB,WAChBh5C,KAAKq4C,kBAEDr4C,KAAKi5C,UACPj5C,KAAKi5C,WAGHj5C,KAAKk5C,aACPl5C,KAAKk5C,cAMFl5C,KAAKm5C,kBACRn5C,KAAKm5C,iBAAkB,EACnBn5C,KAAKo5C,UACPp5C,KAAK6yC,MAAM,cAIjBwG,iBAAkB,WACXr5C,KAAKs5C,gBACRt5C,KAAKg4C,iBAGHh4C,KAAKu5C,UACPv5C,KAAKu5C,WAGHv5C,KAAKw5C,UACPx5C,KAAKw5C,YAITC,oBAAqB,WACnBz5C,KAAKg5C,oBAGPU,iBAAkB,WAChB15C,KAAKq5C,oBAGPM,wBAAyB,WACvB35C,KAAKg5C,oBAGPY,qBAAsB,WACpB55C,KAAKq5C,oBAGPN,kBAAmB,SAAS11C,GACtBA,GAAKA,EAAE9C,UACTP,KAAK+4C,kBAAkB11C,EAAEujB,WACzBvjB,EAAEw2C,iBAAiBnyC,KAAK1H,KAAMqD,EAAE9C,WAIpCs5C,iBAAkB,SAASC,GACzB,GAAI1zB,GAAWpmB,KAAK+5C,cAAcD,EAClC,IAAI1zB,EAAU,CACZ,GAAIqkB,GAAOzqC,KAAKg6C,mBAAmB5zB,EACnCpmB,MAAK64C,YAAYiB,EAAe/wC,MAAQ0hC,IAI5CsP,cAAe,SAASD,GACtB,MAAOA,GAAez5C,cAAc,aAGtC25C,mBAAoB,SAAS5zB,GAC3B,GAAIA,EAAU,CAEZ,GAAIqkB,GAAOzqC,KAAKvB,mBAKZsxC,EAAM/vC,KAAKwzC,iBAAiBptB,EAMhC,OAJAqkB,GAAK7rC,YAAYmxC,GAEjB/vC,KAAKi6C,gBAAgBxP,EAAMrkB,GAEpBqkB,IAIXyP,kBAAmB,SAAS9zB,EAAU+zB,GACpC,GAAI/zB,EAAU,CAKZpmB,KAAKo6C,gBAAkBp6C,IAKvB,IAAI+vC,GAAM/vC,KAAKwzC,iBAAiBptB,EAUhC,OARI+zB,GACFn6C,KAAKmrB,aAAa4kB,EAAKoK,GAEvBn6C,KAAKpB,YAAYmxC,GAGnB/vC,KAAKi6C,gBAAgBj6C,MAEd+vC,IAGXkK,gBAAiB,SAASxP,GAExBzqC,KAAKq6C,sBAAsB5P,IAG7B4P,sBAAuB,SAAS5P,GAE9B,GAAI6P,GAAIt6C,KAAKs6C,EAAIt6C,KAAKs6C,KAEtB,IAAI7P,EAEF,IAAK,GAAsB/oC,GADvBkwC,EAAKnH,EAAK3hB,iBAAiB,QACtBnnB,EAAE,EAAGgI,EAAEioC,EAAGtwC,OAAcqI,EAAFhI,IAASD,EAAEkwC,EAAGjwC,IAAKA,IAChD24C,EAAE54C,EAAEuO,IAAMvO,GAIhB64C,yBAA0B,SAASxxC,GAEpB,UAATA,GAA6B,UAATA,GACtB/I,KAAKy0C,oBAAoB1rC,EAAM/I,KAAK8B,aAAaiH,IAE/C/I,KAAKw6C,kBACPx6C,KAAKw6C,iBAAiBl3B,MAAMtjB,KAAMma,YAGtCsgC,WAAY,SAAS53C,EAAM63C,GACzB,GAAIr4B,GAAW,GAAI4H,kBAAiB,SAAS0wB,GAC3CD,EAAShzC,KAAK1H,KAAMqiB,EAAUs4B,GAC9Bt4B,EAASu4B,cACTr3C,KAAKvD,MACPqiB,GAAS+H,QAAQvnB,GAAOwnB,WAAW,EAAMwwB,SAAS,KAYtDrC,GAAY1xC,UAAY4gB,EACxBA,EAAKozB,YAActC,EAInBp6C,EAAM28C,KAAOvC,EACbp6C,EAAMm6C,OAASA,EACfn6C,EAAMmwC,IAAI/H,SAAS9e,KAAOA,GAEzBV,SAWH,SAAU5oB,GAyFR,QAAS0xB,GAAehpB,GACtB,MAAOA,GAAU8f,UAGnB,QAASo0B,GAAYlR,EAAS/nC,GAC5B,GAAIgH,GAAO,GAAIkyC,GAAK,CAChBl5C,KACFgH,EAAOhH,EAAKwnB,UACZ0xB,EAAKl5C,EAAKF,aAAa,MAEzB,IAAI6B,GAAWwjB,SAASg0B,UAAUC,kBAAkBpyC,EAAMkyC,EAC1D,OAAO/zB,UAASg0B,UAAUF,YAAYlR,EAASpmC,GAhGjD,GACIimB,IADMzrB,OAAOipB,aACUjpB,OAAOiG,mBAI9Bi3C,EAAwB,UACxBC,EAAyB,aAEzBv3C,GACFs3C,sBAAuBA,EAMvBE,wBAAyB,WAEvB,GAAIl9C,GAAQ4B,KAAKu7C,gBACjB,IAAIn9C,IAAU4B,KAAKw7C,mBAAmBp9C,EAAO4B,KAAKupB,WAAY,CAG5D,IADA,GAAImL,GAAQ5E,EAAe9vB,MAAO8pC,EAAU,GACrCpV,GAASA,EAAMn0B,SACpBupC,GAAWpV,EAAMn0B,QAAQk7C,gBAAgBJ,GACzC3mB,EAAQ5E,EAAe4E,EAErBoV,IACF9pC,KAAK07C,oBAAoB5R,EAAS1rC,KAIxCu9C,kBAAmB,SAAS33C,EAAO+E,EAAM3K,GACvC,GAAIA,GAAQA,GAAS4B,KAAKu7C,iBAAkBxyC,EAAOA,GAAQ,EAC3D,IAAI3K,IAAU4B,KAAKw7C,mBAAmBp9C,EAAO4B,KAAKupB,UAAYxgB,GAAO,CACnE,GAAI+gC,GAAU,EACd,IAAI9lC,YAAiBkK,OACnB,IAAK,GAAyBvP,GAArBgD,EAAE,EAAGgI,EAAE3F,EAAM1C,OAAcqI,EAAFhI,IAAShD,EAAEqF,EAAMrC,IAAKA,IACtDmoC,GAAWnrC,EAAE8F,YAAc,WAG7BqlC,GAAU9lC,EAAMS,WAElBzE,MAAK07C,oBAAoB5R,EAAS1rC,EAAO2K,KAG7C2yC,oBAAqB,SAAS5R,EAAS1rC,EAAO2K,GAG5C,GAFA3K,EAAQA,GAAS4B,KAAKu7C,iBACtBxyC,EAAOA,GAAQ,GACV3K,EAAL,CAGIurB,IACFmgB,EAAUkR,EAAYlR,EAAS1rC,EAAM2D,MAEvC,IAAIiC,GAAQhE,KAAKO,QAAQq7C,oBAAoB9R,EACzCuR,EACJr0B,SAAQ60B,kBAAkB73C,EAAO5F,GAEjC4B,KAAK87C,mBAAmB19C,GAAO4B,KAAKupB,UAAYxgB,IAAQ,IAE1DwyC,eAAgB,SAAS14C,GAGvB,IADA,GAAInB,GAAImB,GAAQ7C,KACT0B,EAAErC,YACPqC,EAAIA,EAAErC,UAER,OAAOqC,IAET85C,mBAAoB,SAASp9C,EAAO2K,GAClC,GAAIujC,GAAQtsC,KAAK87C,mBAAmB19C,EACpC;MAAOkuC,GAAMvjC,IAEf+yC,mBAAoB,SAAS19C,GAC3B,GAAIurB,EAAsB,CACxB,GAAIlD,GAAYroB,EAAM2D,KAAO3D,EAAM2D,KAAKwnB,UAAYnrB,EAAMmrB,SAC1D,OAAOwyB,GAAwBt1B,KAAes1B,EAAwBt1B,OAEtE,MAAOroB,GAAM49C,aAAgB59C,EAAM49C,mBAKrCD,IAoBJ39C,GAAMmwC,IAAI/H,SAAS1iC,OAASA,GAE3BkjB,SAWH,SAAU5oB,GAUR,QAASmC,GAAQwI,EAAMjC,GACrB,GAAoB,gBAATiC,GAAmB,CAC5B,GAAI+gB,GAAShjB,GAAavI,SAAS09C,cAInC,IAHAn1C,EAAYiC,EACZA,EAAO+gB,GAAUA,EAAOzqB,YAAcyqB,EAAOzqB,WAAWyC,aACpDgoB,EAAOzqB,WAAWyC,aAAa,QAAU,IACxCiH,EACH,KAAM,sCAGV,GAAImzC,EAAuBnzC,GACzB,KAAM,sDAAwDA,CAGhEozC,GAAkBpzC,EAAMjC,GAExBs1C,EAAgBrzC,GAKlB,QAASszC,GAAoBtzC,EAAMuzC,GACjCC,EAAcxzC,GAAQuzC,EAKxB,QAASF,GAAgBrzC,GACnBwzC,EAAcxzC,KAChBwzC,EAAcxzC,GAAMyzC,0BACbD,GAAcxzC,IAgBzB,QAASozC,GAAkBpzC,EAAMjC,GAC/B,MAAO21C,GAAiB1zC,GAAQjC,MAGlC,QAASo1C,GAAuBnzC,GAC9B,MAAO0zC,GAAiB1zC,GAG1B,QAAS2zC,GAAen8C,EAASwJ,GAC/B,GAAoB,gBAATA,GACT,OAAO,CAET,IAAI2qB,GAAQuI,YAAYmT,mBAAmBrmC,GACvC4yC,EAAOjoB,GAASA,EAAMomB,WAC1B,OAAK6B,GAGDt1B,eAAeI,WACVJ,eAAeI,WAAWlnB,EAASo8C,GAErCp8C,YAAmBo8C,IALjB,EAnEX,GAAIrO,GAASlwC,EAAMkwC,OA+BfiO,GA9BMn+C,EAAMmwC,QAiDZkO,IA2BJr+C,GAAM89C,uBAAyBA,EAC/B99C,EAAMi+C,oBAAsBA,EAC5Bj+C,EAAMs+C,eAAiBA,EAOvBx+C,OAAO8oB,QAAUzmB,EAKjB+tC,EAAOtnB,QAAS5oB,GAOZ8oB,SAAS01B,qBACX11B,SAAS01B,oBAAoB,SAASC,GACpC,GAAIA,EACF,IAAK,GAAgCt6C,GAA5BZ,EAAE,EAAGgI,EAAEkzC,EAAav7C,OAAcqI,EAAFhI,IAASY,EAAEs6C,EAAal7C,IAAKA,IACpEpB,EAAQ+iB,MAAM,KAAM/gB,MAM3BykB,SAWH,SAAU5oB,GAEV,GAAIW,IACF+9C,oBAAqB,SAASj6C,GAC5BmkB,QAAQokB,YAAYC,WAAWxoC,IAEjCk6C,kBAAmB,WAEjB,GAAIC,GAAYh9C,KAAK8B,aAAa,cAAgB,GAC9C2oC,EAAO,GAAIF,KAAIyS,EAAWh9C,KAAK6+B,cAAcU,QACjDv/B,MAAK8G,UAAUm2C,YAAc,SAAS5S,EAAS3iB,GAC7C,GAAIjlB,GAAI,GAAI8nC,KAAIF,EAAS3iB,GAAQ+iB,EACjC,OAAOhoC,GAAE68B,OAMflhC,GAAMmwC,IAAIkE,YAAY1zC,KAAOA,GAE1BioB,SAWH,SAAU5oB,GA4KR,QAAS8+C,GAAmBC,EAAOpT,GACjC,GAAIzK,GAAO,GAAIiL,KAAI4S,EAAMr7C,aAAa,QAASioC,GAASzK,IACxD,OAAO,YAAeA,EAAO,KAG/B,QAASuc,GAAkB73C,EAAO5F,GAChC,GAAI4F,EAAO,CACL5F,IAAUG,WACZH,EAAQG,SAASY,MAEfwqB,IACFvrB,EAAQG,SAASY,KAOnB,IAAIuM,GAAQ0xC,EAAmBp5C,EAAMS,aACjCs9B,EAAO/9B,EAAMlC,aAAas5C,EAC1BrZ,IACFr2B,EAAMc,aAAa4uC,EAAuBrZ,EAI5C,IAAIoY,GAAU/7C,EAAMi/C,iBACpB,IAAIj/C,IAAUG,SAASY,KAAM,CAC3B,GAAIuE,GAAW,SAAW03C,EAAwB,IAC9CkC,EAAK/+C,SAASY,KAAK2pB,iBAAiBplB,EACpC45C,GAAGh8C,SACL64C,EAAUmD,EAAGA,EAAGh8C,OAAO,GAAGi8C,oBAG9Bn/C,EAAM+sB,aAAazf,EAAOyuC,IAI9B,QAASiD,GAAmBtT,EAAS1rC,GACnCA,EAAQA,GAASG,SACjBH,EAAQA,EAAMI,cAAgBJ,EAAQA,EAAMygC,aAC5C,IAAI76B,GAAQ5F,EAAMI,cAAc,QAEhC,OADAwF,GAAMS,YAAcqlC,EACb9lC,EAGT,QAASw5C,GAAiBL,GACxB,MAAQA,IAASA,EAAMM,YAAe,GAGxC,QAASC,GAAgB76C,EAAM86C,GAC7B,MAAIhR,GACKA,EAAQjlC,KAAK7E,EAAM86C,GAD5B,OA1NF,GACIpP,IADMrwC,OAAOipB,aACP/oB,EAAMmwC,IAAI/H,SAAS1iC,QACzBs3C,EAAwB7M,EAAI6M,sBAE5BzxB,EAAuBzrB,OAAOiG,kBAI9By5C,EAAiB,QACjBC,EAAuB,UACvBC,EAAiB,uBACjBC,EAAqB,SACrBC,EAAa,gBAEbl6C,GAEFqqC,WAAY,SAAS3mC,GACnB,GAAI4e,GAAWpmB,KAAK+5C,gBAChBvb,EAAUpY,GAAYpmB,KAAKi+C,iBAC/B,IAAIzf,EAAS,CACXx+B,KAAKk+C,sBAAsB1f,EAC3B,IAAI16B,GAAS9D,KAAKm+C,mBAAmB3f,EACrC,IAAI16B,EAAOxC,OAAQ,CACjB,GAAI88C,GAAch4B,EAASyY,cAAcU,OACzC,OAAOvY,SAAQqnB,cAAcF,WAAWrqC,EAAQs6C,EAAa52C,IAG7DA,GACFA,KAGJ02C,sBAAuB,SAASzT,GAE9B,IAAK,GAAsB9rC,GAAGgjB,EAD1B27B,EAAK7S,EAAK3hB,iBAAiBg1B,GACtBn8C,EAAE,EAAGgI,EAAE2zC,EAAGh8C,OAAiBqI,EAAFhI,IAAShD,EAAE2+C,EAAG37C,IAAKA,IACnDggB,EAAIy7B,EAAmBF,EAAmBv+C,EAAGqB,KAAK6+B,cAAcU,SAC5Dv/B,KAAK6+B,eACT7+B,KAAKq+C,oBAAoB18B,EAAGhjB,GAC5BA,EAAEU,WAAWi/C,aAAa38B,EAAGhjB,IAGjC0/C,oBAAqB,SAASr6C,EAAOilB,GACnC,IAAK,GAA0ChnB,GAAtCN,EAAE,EAAG0yC,EAAGprB,EAAKyW,WAAY/1B,EAAE0qC,EAAG/yC,QAAYW,EAAEoyC,EAAG1yC,KAASgI,EAAFhI,EAAKA,IACnD,QAAXM,EAAE8G,MAA6B,SAAX9G,EAAE8G,MACxB/E,EAAMwI,aAAavK,EAAE8G,KAAM9G,EAAE4P,QAInCssC,mBAAoB,SAAS1T,GAC3B,GAAI8T,KACJ,IAAI9T,EAEF,IAAK,GAAsB9rC,GADvB2+C,EAAK7S,EAAK3hB,iBAAiB80B,GACtBj8C,EAAE,EAAGgI,EAAE2zC,EAAGh8C,OAAcqI,EAAFhI,IAAShD,EAAE2+C,EAAG37C,IAAKA,IAC5ChD,EAAE8F,YAAYqP,MAAM+pC,IACtBU,EAAU99C,KAAK9B,EAIrB,OAAO4/C,IAOTC,cAAe,WACbx+C,KAAKy+C,cACLz+C,KAAK0+C,cACL1+C,KAAK2+C,qBACL3+C,KAAK4+C,uBAKPH,YAAa,WACXz+C,KAAK6+C,OAAS7+C,KAAK8+C,UAAUhB,GAC7B99C,KAAK6+C,OAAOz6C,QAAQ,SAASzF,GACvBA,EAAEU,YACJV,EAAEU,WAAWC,YAAYX,MAI/B+/C,YAAa,WACX1+C,KAAK8D,OAAS9D,KAAK8+C,UAAUlB,EAAiB,IAAMI,EAAa,KACjEh+C,KAAK8D,OAAOM,QAAQ,SAASzF,GACvBA,EAAEU,YACJV,EAAEU,WAAWC,YAAYX,MAa/BggD,mBAAoB,WAClB,GAAIE,GAAS7+C,KAAK6+C,OAAOh6B,OAAO,SAASlmB,GACvC,OAAQA,EAAEkD,aAAam8C,KAErBxf,EAAUx+B,KAAKi+C,iBACnB,IAAIzf,EAAS,CACX,GAAIsL,GAAU,EAId,IAHA+U,EAAOz6C,QAAQ,SAAS+4C,GACtBrT,GAAW0T,EAAiBL,GAAS,OAEnCrT,EAAS,CACX,GAAI9lC,GAAQo5C,EAAmBtT,EAAS9pC,KAAK6+B,cAC7CL,GAAQrT,aAAannB,EAAOw6B,EAAQpT,eAI1C0zB,UAAW,SAASp7C,EAAUq7C,GAC5B,GAAIr0C,GAAQ1K,KAAK8oB,iBAAiBplB,GAAU8tB,QACxCgN,EAAUx+B,KAAKi+C,iBACnB,IAAIzf,EAAS,CACX,GAAIwgB,GAAgBxgB,EAAQ1V,iBAAiBplB,GAAU8tB,OACvD9mB,GAAQA,EAAM6pB,OAAOyqB,GAEvB,MAAOD,GAAUr0C,EAAMma,OAAOk6B,GAAWr0C,GAW3Ck0C,oBAAqB,WACnB,GAAI56C,GAAQhE,KAAKi/C,cAAclB,EAC/BlC,GAAkB73C,EAAOzF,SAASY,OAEpCs8C,gBAAiB,SAASyD,GACxB,GAAIpV,GAAU,GAEVpmC,EAAW,IAAMs6C,EAAa,IAAMkB,EAAkB,IACtDH,EAAU,SAASpgD,GACrB,MAAO++C,GAAgB/+C,EAAG+E,IAExBm7C,EAAS7+C,KAAK6+C,OAAOh6B,OAAOk6B,EAChCF,GAAOz6C,QAAQ,SAAS+4C,GACtBrT,GAAW0T,EAAiBL,GAAS,QAGvC,IAAIr5C,GAAS9D,KAAK8D,OAAO+gB,OAAOk6B,EAIhC,OAHAj7C,GAAOM,QAAQ,SAASJ,GACtB8lC,GAAW9lC,EAAMS,YAAc,SAE1BqlC,GAETmV,cAAe,SAASC,GACtB,GAAIpV,GAAU9pC,KAAKy7C,gBAAgByD,EACnC,OAAOl/C,MAAK47C,oBAAoB9R,EAASoV,IAE3CtD,oBAAqB,SAAS9R,EAASoV,GACrC,GAAIpV,EAAS,CACX,GAAI9lC,GAAQo5C,EAAmBtT,EAG/B,OAFA9lC,GAAMwI,aAAa4uC,EAAuBp7C,KAAK8B,aAAa,QACxD,IAAMo9C,GACHl7C,KA2DTX,EAAI45B,YAAYn2B,UAChB6lC,EAAUtpC,EAAEspC,SAAWtpC,EAAEq6C,iBAAmBr6C,EAAE87C,uBAC3C97C,EAAE+7C,kBAIThhD,GAAMmwC,IAAIkE,YAAY3uC,OAASA,EAC/B1F,EAAMy9C,kBAAoBA,GAEzB70B,SAWH,SAAU5oB,GAIR,GACImwC,IADMrwC,OAAOipB,aACP/oB,EAAMmwC,IAAI/H,SAASt9B,QACzB2qC,EAAetF,EAAIsF,aAGnBwL,MAEF,uBACA,qBACA,sBACA,cACA,aACA,kBACAj7C,QAAQ,SAASc,GACjBm6C,EAAoBn6C,EAAEqE,eAAiBrE,GAGzC,IAAIgE,IACFo2C,gBAAiB,WAEf,GAAIC,GAAYv/C,KAAK8G,UAAUitC,cAE/B/zC,MAAKw/C,sBAAsBD,IAE7BC,sBAAuB,SAASD,GAE9B,IAAK,GAASt9C,GAALN,EAAE,EAAMM,EAAEjC,KAAK0/B,WAAW/9B,GAAIA,IAEjC3B,KAAKy/C,eAAex9C,EAAE8G,QAExBw2C,EAAUv/C,KAAK0/C,kBAAkBz9C,EAAE8G,OAAS9G,EAAE4P,MAAMwI,QAAQ,KAAM,IAC7DA,QAAQ,KAAM,IAAI6mB,SAK7Bue,eAAgB,SAAU/9C,GACxB,MAAOA,IAAe,MAATA,EAAE,IAAyB,MAATA,EAAE,IAAyB,MAATA,EAAE,IAErDg+C,kBAAmB,SAASh+C,GAC1B,MAAOA,GAAEoW,MAAM6nC,IAEjBC,eAAgB,SAAS/8C,GACvB,KAAOA,EAAKxD,YAAY,CACtB,GAAIwD,EAAKu3C,gBACP,MAAOv3C,GAAKu3C,eAEdv3C,GAAOA,EAAKxD,WAEd,MAAOwD,GAAKd,MAEdkyC,gBAAiB,SAAS4L,EAAYtgD,EAAQsyC,GAC5C,GAAI3oC,GAASlJ,IACb,OAAO,UAASkF,GACT26C,GAAeA,EAAWrH,cAC7BqH,EAAa32C,EAAO02C,eAAergD,GAGrC,IAAI2a,IAAQhV,EAAGA,EAAEoL,OAAQpL,EAAEyF,cAC3Bk1C,GAAW3L,eAAe2L,EAAYhO,EAAQ33B,KAGlD4lC,oBAAqB,SAAS79B,EAAYlZ,GACxC,GAAK/I,KAAKy/C,eAAe12C,GAAzB,CAGA,GAAIyyB,GAAYx7B,KAAK0/C,kBAAkB32C,EACvCyyB,GAAY6jB,EAAoB7jB,IAAcA,CAE9C,IAAItyB,GAASlJ,IAEb,OAAO,UAAS8f,EAAOjd,EAAMkd,GAW3B,QAASggC,KACP,MAAO,MAAQ99B,EAAa,MAX9B,GAAIxV,GAAUvD,EAAO+qC,gBAAgBvgC,OAAW7Q,EAAMof,EAGtD,OAFA9jB,iBAAgBU,iBAAiBgE,EAAM24B,EAAW/uB,GAE9CsT,EAAJ,QAYEiF,KAAM+6B,EACN96B,eAAgB86B,EAChB56B,MAAO,WACLhnB,gBAAgBgN,oBAAoBtI,EAAM24B,EAAW/uB,SAO3DkzC,EAAe9L,EAAavyC,MAGhClD,GAAMmwC,IAAIkE,YAAYvpC,OAASA,GAE9B8d,SAWH,SAAU5oB,GAIR,GAAImd,IACFykC,eAAgB,SAASl5C,GAEvB,GAAiCoV,GAA7BkO,EAAUtjB,EAAUsjB,OACxB,KAAK,GAAI1oB,KAAKoF,GACQ,YAAhBpF,EAAEoW,MAAM,MACLsS,IACHA,EAAYtjB,EAAUsjB,YAExBlO,EAAWxa,EAAEoW,MAAM,EAAG,IACtBsS,EAAQlO,GAAYkO,EAAQlO,IAAaxa,IAI/Cu+C,iBAAkB,SAASn5C,GAEzB,GAAIsuC,GAAItuC,EAAUsjB,OAClB,IAAIgrB,EAAG,CACL,GAAI8K,KACJ,KAAK,GAAIx+C,KAAK0zC,GAEZ,IAAK,GAAS+K,GADVC,EAAQ1+C,EAAEspC,MAAM,KACXrpC,EAAE,EAAOw+C,EAAGC,EAAMz+C,GAAIA,IAC7Bu+C,EAASC,GAAM/K,EAAE1zC,EAGrBoF,GAAUsjB,QAAU81B,IAGxBG,qBAAsB,SAASv5C,GAC7B,GAAIA,EAAUsjB,QAAS,CAErB,GAAInoB,GAAI6E,EAAUquC,gBAClB,KAAK,GAAIzzC,KAAKoF,GAAUsjB,QAEtB,IAAK,GAAS+1B,GADVC,EAAQ1+C,EAAEspC,MAAM,KACXrpC,EAAE,EAAOw+C,EAAGC,EAAMz+C,GAAIA,IAC7BM,EAAExB,KAAK0/C,GAIb,GAAIr5C,EAAU4rC,QAAS,CAErB,GAAIzwC,GAAI6E,EAAUw5C,gBAClB,KAAK,GAAI5+C,KAAKoF,GAAU4rC,QACtBzwC,EAAExB,KAAKiB,GAGX,GAAIoF,EAAU+Z,SAAU,CAEtB,GAAI5e,GAAI6E,EAAUqwC,iBAClB,KAAK,GAAIz1C,KAAKoF,GAAU+Z,SACtB5e,EAAExB,KAAKiB,KAIb6+C,kBAAmB,SAASz5C,EAAW4gB,GAErC,GAAIgrB,GAAU5rC,EAAU4rC,OACpBA,KAEF1yC,KAAKwgD,kBAAkB9N,EAAS5rC,EAAW4gB,GAE3C5gB,EAAU0tC,WAAax0C,KAAKygD,aAAa/N,KAgC7C8N,kBAAmB,SAASE,EAAe55C,GAEzCA,EAAUovC,QAAUpvC,EAAUovC,WAG9B,KAAK,GAAIx0C,KAAKg/C,GAAe,CAC3B,GAAI7uC,GAAQ6uC,EAAch/C,EAEtBmQ,IAA2B6B,SAAlB7B,EAAMqkC,UACjBpvC,EAAUovC,QAAQx0C,GAAK7B,QAAQgS,EAAMqkC,SACrCrkC,EAAQA,EAAMA,OAGF6B,SAAV7B,IACF/K,EAAUpF,GAAKmQ,KAIrB4uC,aAAc,SAASllC,GACrB,GAAIhX,KACJ,KAAK,GAAI7C,KAAK6Z,GACZhX,EAAI7C,EAAE6H,eAAiB7H,CAEzB,OAAO6C,IAETo8C,uBAAwB,SAAS53C,EAAM63C,GACrC,GAAIlsB,GAAQ10B,KAAK8G,UAEb+vC,EAAc9tC,EAAO,IACrBiuC,EAAqBjuC,EAAO,aAChC2rB,GAAMmiB,GAAeniB,EAAM3rB,GAE3BxD,OAAOshB,eAAe6N,EAAO3rB,GAC3BzB,IAAK,WACH,GAAIyqB,GAAa/xB,KAAKg3C,EAItB,OAHIjlB,IACFA,EAAW7M,UAENllB,KAAK62C,IAEd7vC,IAAK,SAAS6K,GACZ,GAAI+uC,EACF,MAAO5gD,MAAK62C,EAGd,IAAI9kB,GAAa/xB,KAAKg3C,EACtB,IAAIjlB,EAEF,WADAA,GAAWvP,SAAS3Q,EAItB,IAAI6gB,GAAW1yB,KAAK62C,EAIpB,OAHA72C,MAAK62C,GAAehlC,EACpB7R,KAAKs2C,yBAAyBvtC,EAAM8I,EAAO6gB,GAEpC7gB,GAETiV,cAAc,KAGlB+5B,wBAAyB,SAAS/5C,GAChC,GAAI8qC,GAAK9qC,EAAUqwC,cACnB,IAAIvF,GAAMA,EAAGtwC,OACX,IAAK,GAAsBI,GAAlBC,EAAE,EAAGgI,EAAEioC,EAAGtwC,OAAkBqI,EAAFhI,IAASD,EAAEkwC,EAAGjwC,IAAKA,IACpD3B,KAAK2gD,uBAAuBj/C,GAAG,EAGnC,IAAIkwC,GAAK9qC,EAAUw5C,aACnB,IAAI1O,GAAMA,EAAGtwC,OACX,IAAK,GAAsBI,GAAlBC,EAAE,EAAGgI,EAAEioC,EAAGtwC,OAAkBqI,EAAFhI,IAASD,EAAEkwC,EAAGjwC,IAAKA,IAG/CmF,EAAU+Z,UAAa/Z,EAAU+Z,SAASnf,IAC7C1B,KAAK2gD,uBAAuBj/C,IAStCtD,GAAMmwC,IAAIkE,YAAYl3B,WAAaA,GAElCyL,SAUH,SAAU5oB,GAIR,GAAI0iD,GAAuB,aACvBC,EAAmB,OAInBrhB,GAEFshB,yBAA0B,SAASl6C,GAEjC9G,KAAKihD,cAAcn6C,EAAW,aAE9B9G,KAAKihD,cAAcn6C,EAAW,wBAGhCo6C,kBAAmB,SAASp6C,GAE1B,GAAI44B,GAAa1/B,KAAK8B,aAAag/C,EACnC,IAAIphB,EAYF,IAAK,GAAyBh+B,GAJ1BgxC,EAAU5rC,EAAU4rC,UAAY5rC,EAAU4rC,YAE1C0N,EAAQ1gB,EAAWsL,MAAM+V,GAEpBp/C,EAAE,EAAGgI,EAAEy2C,EAAM9+C,OAAaqI,EAAFhI,EAAKA,IAEpCD,EAAI0+C,EAAMz+C,GAAGu/B,OAGTx/B,GAAoBgS,SAAfg/B,EAAQhxC,KACfgxC,EAAQhxC,GAAKgS,SAOrBytC,6BAA8B,WAK5B,IAAK,GAAsBl/C,GAHvBm/C,EAAWphD,KAAK8G,UAAUwtC,oBAE1BD,EAAKr0C,KAAK0/B,WACL/9B,EAAE,EAAGgI,EAAE0qC,EAAG/yC,OAAcqI,EAAFhI,IAASM,EAAEoyC,EAAG1yC,IAAKA,IAC5C3B,KAAKqhD,oBAAoBp/C,EAAE8G,QAC7Bq4C,EAASn/C,EAAE8G,MAAQ9G,EAAE4P,QAK3BwvC,oBAAqB,SAASt4C,GAC5B,OAAQ/I,KAAKshD,UAAUv4C,IAA6B,QAApBA,EAAK+O,MAAM,EAAE,IAI/CwpC,WACEv4C,KAAM,EACNw4C,UAAW,EACXzG,YAAa,EACb0G,SAAU,EACVC,UAAW,EACXC,gBAAiB,GAMrBhiB,GAAW4hB,UAAUR,GAAwB,EAI7C1iD,EAAMmwC,IAAIkE,YAAY/S,WAAaA,GAElC1Y,SAWH,SAAU5oB,GAGR,GAAI8K,GAAS9K,EAAMmwC,IAAIkE,YAAYvpC,OAE/BkuC,EAAS,GAAIh1B,oBACb/C,EAAiB+3B,EAAO/3B,cAI5B+3B,GAAO/3B,eAAiB,SAAS4C,EAAYlZ,EAAMlG,GACjD,MAAOqG,GAAO42C,oBAAoB79B,EAAYlZ,EAAMlG,IAC7Cwc,EAAe3X,KAAK0vC,EAAQn1B,EAAYlZ,EAAMlG,GAIvD,IAAI80C,IACFP,OAAQA,EACR2C,cAAe,WACb,MAAO/5C,MAAKK,cAAc,aAE5B49C,gBAAiB,WACf,GAAI73B,GAAWpmB,KAAK+5C,eACpB,OAAO3zB,IAAYA,EAASoY,SAE9BmjB,uBAAwB,SAASv7B,GAC3BA,IACFA,EAAS+f,gBAAkBnmC,KAAKo3C,SAMtCh5C,GAAMmwC,IAAIkE,YAAYkF,IAAMA,GAE3B3wB,SAWH,SAAU5oB,GAsOR,QAASwjD,GAAyB96C,GAChC,IAAKvB,OAAOqhB,UAAW,CACrB,GAAIi7B,GAAWt8C,OAAOuqB,eAAehpB,EACrCA,GAAU8f,UAAYi7B,EAClBtJ,EAAOsJ,KACTA,EAASj7B,UAAYrhB,OAAOuqB,eAAe+xB,KAvOjD,GAAItT,GAAMnwC,EAAMmwC,IACZgK,EAASn6C,EAAMm6C,OACfjK,EAASlwC,EAAMkwC,OAEf3kB,EAAuBzrB,OAAOiG,kBAI9B2C,GAEF0C,SAAU,SAAST,EAAM+4C,GAEvB9hD,KAAK+hD,eAAeh5C,EAAM+4C,GAE1B9hD,KAAKm8C,kBAAkBpzC,EAAM+4C,GAE7B9hD,KAAKgiD,sBAGPD,eAAgB,SAASh5C,EAAM+4C,GAE7B,GAAIG,GAAY7jD,EAAM89C,uBAAuBnzC,GAEzC2e,EAAO1nB,KAAKkiD,sBAAsBJ,EAEtC9hD,MAAKmiD,sBAAsBF,EAAWv6B,GAEtC1nB,KAAK8G,UAAY9G,KAAKoiD,gBAAgBH,EAAWv6B,GAEjD1nB,KAAKqiD,qBAAqBt5C,EAAM+4C,IAGlCK,sBAAuB,SAASr7C,EAAW4gB,GAGzC5gB,EAAUvG,QAAUP,KAEpBA,KAAKkhD,kBAAkBp6C,EAAW4gB,GAElC1nB,KAAKugD,kBAAkBz5C,EAAW4gB,GAElC1nB,KAAKggD,eAAel5C,GAEpB9G,KAAKigD,iBAAiBn5C,IAGxBs7C,gBAAiB,SAASt7C,EAAW4gB,GAEnC1nB,KAAKsiD,gBAAgBx7C,EAAW4gB,EAEhC,IAAI66B,GAAUviD,KAAKwiD,YAAY17C,EAAW4gB,EAG1C,OADAk6B,GAAyBW,GAClBA,GAGTD,gBAAiB,SAASx7C,EAAW4gB,GAEnC1nB,KAAKihD,cAAc,UAAWn6C,EAAW4gB,GAEzC1nB,KAAKihD,cAAc,UAAWn6C,EAAW4gB,GAEzC1nB,KAAKihD,cAAc,UAAWn6C,EAAW4gB,GAEzC1nB,KAAKihD,cAAc,aAAcn6C,EAAW4gB,GAE5C1nB,KAAKihD,cAAc,sBAAuBn6C,EAAW4gB,GAErD1nB,KAAKihD,cAAc,iBAAkBn6C,EAAW4gB,IAIlD26B,qBAAsB,SAASt5C,EAAM05C,GAEnCziD,KAAKqgD,qBAAqBrgD,KAAK8G,WAC/B9G,KAAK6gD,wBAAwB7gD,KAAK8G,WAElC9G,KAAK2hD,uBAAuB3hD,KAAK+5C,iBAEjC/5C,KAAKw+C,gBAELx+C,KAAK88C,oBAAoB98C,MAEzBA,KAAKmhD,+BAELnhD,KAAKs/C,kBAKLt/C,KAAK+8C,oBAEDpzB,GACFzC,SAASg0B,UAAUwH,YAAY1iD,KAAKi+C,kBAAmBl1C,EAAM05C,GAG3DziD,KAAK8G,UAAU67C,kBACjB3iD,KAAK8G,UAAU67C,iBAAiB3iD,OAMpCgiD,mBAAoB,WAClB,GAAIY,GAAS5iD,KAAK8B,aAAa,cAC3B8gD,KACF1kD,OAAO0kD,GAAU5iD,KAAK28C,OAK1BuF,sBAAuB,SAASW,GAC9B,GAAI/7C,GAAY9G,KAAK8iD,kBAAkBD,EACvC,KAAK/7C,EAAW,CAEd,GAAIA,GAAYm2B,YAAYmT,mBAAmByS,EAE/C/7C,GAAY9G,KAAK+iD,cAAcj8C,GAE/Bk8C,EAAcH,GAAU/7C,EAE1B,MAAOA,IAGTg8C,kBAAmB,SAAS/5C,GAC1B,MAAOi6C,GAAcj6C,IAIvBg6C,cAAe,SAASj8C,GACtB,GAAIA,EAAU0xC,YACZ,MAAO1xC,EAET,IAAIm8C,GAAW19C,OAAOC,OAAOsB,EAkB7B,OAfAynC,GAAImE,QAAQnE,EAAI/H,SAAUyc,GAa1BjjD,KAAKkjD,YAAYD,EAAUn8C,EAAWynC,EAAI/H,SAASmR,IAAK,QAEjDsL,GAGTC,YAAa,SAASD,EAAUn8C,EAAWynC,EAAKxlC,GAC9C,GAAIsoC,GAAS,SAASn3B,GACpB,MAAOpT,GAAUiC,GAAMua,MAAMtjB,KAAMka,GAErC+oC,GAASl6C,GAAQ,WAEf,MADA/I,MAAK83C,WAAazG,EACX9C,EAAIxlC,GAAMua,MAAMtjB,KAAMma,aAKjC8mC,cAAe,SAASl4C,EAAMjC,EAAW4gB,GAEvC,GAAI1e,GAASlC,EAAUiC,MAEvBjC,GAAUiC,GAAQ/I,KAAKwiD,YAAYx5C,EAAQ0e,EAAK3e,KAIlDozC,kBAAmB,SAASpzC,EAAM05C,GAChC,GAAIU,IACFr8C,UAAW9G,KAAK8G,WAGds8C,EAAgBpjD,KAAKqjD,kBAAkBZ,EACvCW,KACFD,EAAK5B,QAAU6B,GAGjBnmB,YAAYzzB,SAAST,EAAM/I,KAAK8G,WAEhC9G,KAAK28C,KAAOp+C,SAAS+kD,gBAAgBv6C,EAAMo6C,IAG7CE,kBAAmB,SAASt6C,GAC1B,GAAIA,GAAQA,EAAK7B,QAAQ,KAAO,EAC9B,MAAO6B,EAEP,IAAI1F,GAAIrD,KAAK8iD,kBAAkB/5C,EAC/B,OAAI1F,GAAE9C,QACGP,KAAKqjD,kBAAkBhgD,EAAE9C,QAAQghD,SAD1C,SASFyB,IAIFl8C,GAAU07C,YADRj9C,OAAOqhB,UACe,SAASjG,EAAQ4iC,GAIvC,MAHI5iC,IAAU4iC,GAAa5iC,IAAW4iC,IACpC5iC,EAAOiG,UAAY28B,GAEd5iC,GAGe,SAASA,EAAQ4iC,GACvC,GAAI5iC,GAAU4iC,GAAa5iC,IAAW4iC,EAAW,CAC/C,GAAIhB,GAAUh9C,OAAOC,OAAO+9C,EAC5B5iC,GAAS2tB,EAAOiU,EAAS5hC,GAE3B,MAAOA,IAoBX4tB,EAAIkE,YAAY3rC,UAAYA,GAE3BkgB,SAWH,SAAU5oB,GAoLR,QAASolD,GAAgBjjD,GACvB,MAAOhC,UAAS4D,SAAS5B,GAAWkjD,EAAYC,EAGlD,QAASC,KACP,MAAOD,GAAYpiD,OAASoiD,EAAY,GAAKD,EAAU,GAGzD,QAASj5B,GAAUhjB,GACjBo8C,EAAMC,aAAc,EACpB38B,SAASyhB,eAAe,WACtBhhB,YAAYG,iBAAiB,WAC3B87B,EAAME,iBAAiBt8C,GACvBo8C,EAAMC,aAAc,EACpBD,EAAMG,YAUZ,QAASC,GAAWlR,GAClB,GAAgBp/B,SAAZo/B,EAEF,WADA8Q,GAAMr8B,OAGR,IAAIkoB,GAAS7/B,WAAW,WACtBg0C,EAAMr8B,SACLurB,EACH9rB,SAAQwD,UAAU,WAChB3a,aAAa4/B,KA9LjB,GAAImU,IAGFzW,KAAM,SAAS5sC,GACRA,EAAQ0jD,UACX1jD,EAAQ0jD,WACRppC,EAASpa,KAAKF,KAKlB2jD,QAAS,SAAS3jD,EAASwjD,EAAO3U,GAChC,GAAI+U,GAAY5jD,EAAQ0jD,UAAY1jD,EAAQ0jD,QAAQF,KAMpD,OALII,KACFX,EAAgBjjD,GAASE,KAAKF,GAC9BA,EAAQ0jD,QAAQF,MAAQA,EACxBxjD,EAAQ0jD,QAAQ7U,GAAKA,GAEW,IAA1BpvC,KAAKkH,QAAQ3G,IAGvB2G,QAAS,SAAS3G,GAChB,GAAIoB,GAAI6hD,EAAgBjjD,GAAS2G,QAAQ3G,EAKzC,OAJIoB,IAAK,GAAKpD,SAAS4D,SAAS5B,KAC9BoB,GAAMgmB,YAAYL,WAAaK,YAAYJ,MACzCm8B,EAAYpiD,OAAS,KAElBK,GAITytC,GAAI,SAAS7uC,GACX,GAAI6jD,GAAUpkD,KAAKywC,OAAOlwC,EACtB6jD,KACF7jD,EAAQ0jD,QAAQI,WAAY,EAC5BrkD,KAAKskD,gBAAgBF,GACrBpkD,KAAK+jD,UAITtT,OAAQ,SAASlwC,GACf,GAAIoB,GAAI3B,KAAKkH,QAAQ3G,EACrB,IAAU,IAANoB,EAIJ,MAAO6hD,GAAgBjjD,GAASyoC,SAGlC+a,MAAO,WAEL,GAAIxjD,GAAUP,KAAKukD,aAInB,OAHIhkD,IACFA,EAAQ0jD,QAAQF,MAAMr8C,KAAKnH,GAEzBP,KAAKwkD,YACPxkD,KAAKunB,SACE,GAFT,QAMFg9B,YAAa,WACX,MAAOZ,MAGTa,SAAU,WACR,OAAQxkD,KAAK6jD,aAAe7jD,KAAKykD,WAGnCA,QAAS,WACP,IAAK,GAA4Bv/C,GAAxBvD,EAAE,EAAGgI,EAAEkR,EAASvZ,OAAcqI,EAAFhI,IAChCuD,EAAE2V,EAASlZ,IAAKA,IACnB,GAAIuD,EAAE++C,UAAY/+C,EAAE++C,QAAQI,UAC1B,MAGJ,QAAO,GAGTC,gBAAiB,SAAS/jD,GACxBmkD,EAAWjkD,KAAKF,IAGlB6mB,MAAO,WAEL,IAAIpnB,KAAKopC,SAAT,CAGAppC,KAAKopC,UAAW,CAEhB,KADA,GAAI7oC,GACGmkD,EAAWpjD,QAChBf,EAAUmkD,EAAW1b,QACrBzoC,EAAQ0jD,QAAQ7U,GAAG1nC,KAAKnH,GACxBA,EAAQ0jD,QAAU,IAEpBjkD,MAAKopC,UAAW,IAGlB7hB,MAAO,WAOL,GAAIo9B,GAAmBt9B,eAAeE,KACtCF,gBAAeE,OAAQ,EACvBvnB,KAAKonB,QACAC,eAAeC,WAClBD,eAAeu9B,oBAAoBrmD,UAErC8oB,eAAeE,MAAQo9B,EACvBz9B,SAASE,QACTrb,sBAAsB/L,KAAK6kD,sBAG7Bf,iBAAkB,SAASt8C,GACrBA,GACFs9C,EAAerkD,KAAK+G,IAIxBq9C,oBAAqB,WACnB,GAAIC,EAEF,IADA,GAAIl6C,GACGk6C,EAAexjD,SACpBsJ,EAAKk6C,EAAe9b,YAU1B+b,WAAY,WAEV,IAAK,GAA4B7/C,GAD7B8/C,KACKrjD,EAAE,EAAGgI,EAAEkR,EAASvZ,OAAcqI,EAAFhI,IAChCuD,EAAE2V,EAASlZ,IAAKA,IACfuD,EAAE++C,UAAY/+C,EAAE++C,QAAQI,WAC1BW,EAAGvkD,KAAKyE,EAGZ,OAAO8/C,IAGTnB,aAAa,GAIXhpC,KACA6pC,KACAhB,KACAD,KACAqB,IAwCJ1mD,GAAMyc,SAAWA,EACjBzc,EAAM2mD,WAAanB,EAAMmB,WAAWxhD,KAAKqgD,GACzCxlD,EAAM4lD,WAAaA,EACnB5lD,EAAMwlD,MAAQA,EACdxlD,EAAMosB,UAAYpsB,EAAM6mD,iBAAmBz6B,GAC1CxD,SAWH,SAAU5oB,GA2GR,QAAS8mD,GAAan8C,GACpB,MAAOlJ,SAAQo9B,YAAYmT,mBAAmBrnC,IAGhD,QAASo8C,GAAYp8C,GACnB,MAAQA,IAAQA,EAAK7B,QAAQ,MAAQ,EA5GvC,GAAIonC,GAASlwC,EAAMkwC,OACfC,EAAMnwC,EAAMmwC,IACZqV,EAAQxlD,EAAMwlD,MACdp5B,EAAYpsB,EAAMosB,UAClB0xB,EAAyB99C,EAAM89C,uBAC/BG,EAAsBj+C,EAAMi+C,oBAI5Bv1C,EAAYwnC,EAAO/oC,OAAOC,OAAOy3B,YAAYn2B,YAE/C4xC,gBAAiB,WACX14C,KAAK8B,aAAa,SACpB9B,KAAKolD,QAITA,KAAM,WAEJplD,KAAK+I,KAAO/I,KAAK8B,aAAa,QAC9B9B,KAAKuhD,QAAUvhD,KAAK8B,aAAa,WACjC8hD,EAAMzW,KAAKntC,MAEXA,KAAKqlD,gBAELrlD,KAAKw8C,qBAOPA,kBAAmB,WACdx8C,KAAKslD,YACJtlD,KAAKq8C,oBAAoBr8C,KAAK+I,OAC9B/I,KAAKulD,mBACLvlD,KAAKwlD,uBAGT5B,EAAMxU,GAAGpvC,OAGXylD,UAAW,WAGLN,EAAYnlD,KAAKuhD,WAAa2D,EAAallD,KAAKuhD,UAClD1hC,QAAQ6xB,KAAK,sGACuC1xC,KAAK+I,KACrD/I,KAAKuhD,SAEXvhD,KAAKwJ,SAASxJ,KAAK+I,KAAM/I,KAAKuhD,SAC9BvhD,KAAKslD,YAAa,GAGpBjJ,oBAAqB,SAAStzC,GAC5B,MAAKmzC,GAAuBnzC,GAA5B,QAEEszC,EAAoBtzC,EAAM/I,MAE1BA,KAAK0lD,eAAe38C,IAEb,IAIX28C,eAAgB,SAAS38C,GAEnB/I,KAAK6B,aAAa,cAAgB7B,KAAKwhD,WACzCxhD,KAAKwhD,UAAW,EAEhBx6B,QAAQje,KAIZy8C,oBAAqB,WACnB,MAAOxlD,MAAK2lD,iBAMdJ,gBAAiB,WACf,MAAO3B,GAAMM,QAAQlkD,KAAMA,KAAKw8C,kBAAmBx8C,KAAKylD,YAG1DJ,cAAe,WACbrlD,KAAK2lD,iBAAkB,EACvB3lD,KAAKmuC,WAAW,WACdnuC,KAAK2lD,iBAAkB,EACvB3lD,KAAKw8C,qBACLj5C,KAAKvD,SASXuuC,GAAImE,QAAQnE,EAAIkE,YAAa3rC,GAc7B0jB,EAAU,WACRjsB,SAASqnD,KAAK9qB,gBAAgB,cAC9Bv8B,SAASa,cACP,GAAIH,aAAY,iBAAkBC,SAAS,OAM/CX,SAAS+kD,gBAAgB,mBAAoBx8C,UAAWA,KAEvDkgB,SAWH,SAAU5oB,GAIR,QAASynD,GAAeC,EAAmBt+C,GACrCs+C,GACFvnD,SAASY,KAAKP,YAAYknD,GAC1Bb,EAAiBz9C,IACRA,GACTA,IAIJ,QAASu+C,GAAWC,EAAMx+C,GACxB,GAAIw+C,GAAQA,EAAK1kD,OAAQ,CAErB,IAAK,GAAwB6oC,GAAKlhB,EAD9Bg9B,EAAO1nD,SAASgnC,yBACX5jC,EAAE,EAAGgI,EAAEq8C,EAAK1kD,OAAsBqI,EAAFhI,IAASwoC,EAAI6b,EAAKrkD,IAAKA,IAC9DsnB,EAAO1qB,SAASC,cAAc,QAC9ByqB,EAAKO,IAAM,SACXP,EAAKqW,KAAO6K,EACZ8b,EAAKrnD,YAAYqqB,EAEnB48B,GAAeI,EAAMz+C,OACdA,IACTA,IAtBJ,GAAIy9C,GAAmB7mD,EAAM6mD,gBA2B7B7mD,GAAM8qB,OAAS68B,EACf3nD,EAAMynD,eAAiBA,GAEtB7+B,SAwCH,WAEE,GAAIzmB,GAAUhC,SAASC,cAAc,kBACrC+B,GAAQiM,aAAa,OAAQ,gBAC7BjM,EAAQiM,aAAa,UAAW,YAChCjM,EAAQ6kD,OAERp+B,QAAQ,gBAEN0xB,gBAAiB,WACf14C,KAAKo3C,OAASp3C,KAAKmmC,gBAAkBnmC,KAAKkmD,aAG1Cl/B,QAAQi+B,iBAAiB,WACvBjlD,KAAK8f,MAAQ9f,KACbA,KAAKwM,aAAa,OAAQ,IAG1BxM,KAAK6yC,MAAM,WAIT7yC,KAAKq6C,sBAAsBr6C,KAAKX,YAGhCW,KAAKgzC,KAAK,qBAEZzvC,KAAKvD,QAGTkmD,WAAY,WACV,GAAIh9C,GAAS3D,OAAOC,OAAOwhB,QAAQunB,IAAIkE,YAAYvpC,QAC/C2H,EAAO7Q,IACXkJ,GAAO02C,eAAiB,WAAa,MAAO/uC,GAAKiP,MAEjD,IAAIs3B,GAAS,GAAIh1B,oBACb/C,EAAiB+3B,EAAO/3B,cAK5B,OAJA+3B,GAAO/3B,eAAiB,SAAS4C,EAAYlZ,EAAMlG,GACjD,MAAOqG,GAAO42C,oBAAoB79B,EAAYlZ,EAAMlG,IAC7Cwc,EAAe3X,KAAK0vC,EAAQn1B,EAAYlZ,EAAMlG,IAEhDu0C","sourcesContent":["/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.PolymerGestures = {};\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var HAS_FULL_PATH = false;\n\n  // test for full event path support\n  var pathTest = document.createElement('meta');\n  if (pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findTouchAction: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n        }\n      } else {\n        n = inEvent.target;\n        while(n) {\n          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {\n            return n.getAttribute('touch-action');\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n      // auto is default\n      return \"auto\";\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    },\n    path: function(event) {\n      var p;\n      if (HAS_FULL_PATH && event.path && event.path.length) {\n        p = event.path;\n      } else {\n        p = [];\n        var n = this.findTarget(event);\n        while (n) {\n          p.push(n);\n          n = n.parentNode || n.host;\n        }\n      }\n      return p;\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n\n/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n  function shadowSelector(v) {\n    return 'html /deep/ ' + selector(v);\n  }\n  function selector(v) {\n    return '[touch-action=\"' + v + '\"]';\n  }\n  function rule(v) {\n    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';\n  }\n  var attrib2css = [\n    'none',\n    'auto',\n    'pan-x',\n    'pan-y',\n    {\n      rule: 'pan-x pan-y',\n      selectors: [\n        'pan-x pan-y',\n        'pan-y pan-x'\n      ]\n    },\n    'manipulation'\n  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var hasTouchAction = typeof document.head.style.touchAction === 'string';\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasTouchAction) {\n    attrib2css.forEach(function(r) {\n      if (String(r) === r) {\n        styles += selector(r) + rule(r) + '\\n';\n        if (hasShadowRoot) {\n          styles += shadowSelector(r) + rule(r) + '\\n';\n        }\n      } else {\n        styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n        if (hasShadowRoot) {\n          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n        }\n      }\n    });\n\n    var el = document.createElement('style');\n    el.textContent = styles;\n    document.head.appendChild(el);\n  }\n})();\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This is the constructor for new PointerEvents.\n *\n * New Pointer Events must be given a type, and an optional dictionary of\n * initialization properties.\n *\n * Due to certain platform requirements, events returned from the constructor\n * identify as MouseEvents.\n *\n * @constructor\n * @param {String} inType The type of the event to create.\n * @param {Object} [inDict] An optional dictionary of initial event properties.\n * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.\n */\n(function(scope) {\n\n  var MOUSE_PROPS = [\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    'pageX',\n    'pageY'\n  ];\n\n  var MOUSE_DEFAULTS = [\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    0,\n    0\n  ];\n\n  var NOP_FACTORY = function(){ return function(){}; };\n\n  var eventFactory = {\n    // TODO(dfreedm): this is overridden by tap recognizer, needs review\n    preventTap: NOP_FACTORY,\n    makeBaseEvent: function(inType, inDict) {\n      var e = document.createEvent('Event');\n      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n      e.preventTap = eventFactory.preventTap(e);\n      return e;\n    },\n    makeGestureEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {\n        k = keys[i];\n        e[k] = inDict[k];\n      }\n      return e;\n    },\n    makePointerEvent: function(inType, inDict) {\n      inDict = inDict || Object.create(null);\n\n      var e = this.makeBaseEvent(inType, inDict);\n      // define inherited MouseEvent properties\n      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        e[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n      e.buttons = inDict.buttons || 0;\n\n      // Spec requires that pointers without pressure specified use 0.5 for down\n      // state and 0 for up state.\n      var pressure = 0;\n      if (inDict.pressure) {\n        pressure = inDict.pressure;\n      } else {\n        pressure = e.buttons ? 0.5 : 0;\n      }\n\n      // add x/y properties aliased to clientX/Y\n      e.x = e.clientX;\n      e.y = e.clientY;\n\n      // define the properties of the PointerEvent interface\n      e.pointerId = inDict.pointerId || 0;\n      e.width = inDict.width || 0;\n      e.height = inDict.height || 0;\n      e.pressure = pressure;\n      e.tiltX = inDict.tiltX || 0;\n      e.tiltY = inDict.tiltY || 0;\n      e.pointerType = inDict.pointerType || '';\n      e.hwTimestamp = inDict.hwTimestamp || 0;\n      e.isPrimary = inDict.isPrimary || false;\n      e._source = inDict._source || '';\n      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module implements an map of pointer states\n */\n(function(scope) {\n  var USE_MAP = window.Map && window.Map.prototype.forEach;\n  var POINTERS_FN = function(){ return this.size; };\n  function PointerMap() {\n    if (USE_MAP) {\n      var m = new Map();\n      m.pointers = POINTERS_FN;\n      return m;\n    } else {\n      this.keys = [];\n      this.values = [];\n    }\n  }\n\n  PointerMap.prototype = {\n    set: function(inId, inEvent) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.values[i] = inEvent;\n      } else {\n        this.keys.push(inId);\n        this.values.push(inEvent);\n      }\n    },\n    has: function(inId) {\n      return this.keys.indexOf(inId) > -1;\n    },\n    'delete': function(inId) {\n      var i = this.keys.indexOf(inId);\n      if (i > -1) {\n        this.keys.splice(i, 1);\n        this.values.splice(i, 1);\n      }\n    },\n    get: function(inId) {\n      var i = this.keys.indexOf(inId);\n      return this.values[i];\n    },\n    clear: function() {\n      this.keys.length = 0;\n      this.values.length = 0;\n    },\n    // return value, key, map\n    forEach: function(callback, thisArg) {\n      this.values.forEach(function(v, i) {\n        callback.call(thisArg, v, this.keys[i], this);\n      }, this);\n    },\n    pointers: function() {\n      return this.keys.length;\n    }\n  };\n\n  scope.PointerMap = PointerMap;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var CLONE_PROPS = [\n    // MouseEvent\n    'bubbles',\n    'cancelable',\n    'view',\n    'detail',\n    'screenX',\n    'screenY',\n    'clientX',\n    'clientY',\n    'ctrlKey',\n    'altKey',\n    'shiftKey',\n    'metaKey',\n    'button',\n    'relatedTarget',\n    // DOM Level 3\n    'buttons',\n    // PointerEvent\n    'pointerId',\n    'width',\n    'height',\n    'pressure',\n    'tiltX',\n    'tiltY',\n    'pointerType',\n    'hwTimestamp',\n    'isPrimary',\n    // event instance\n    'type',\n    'target',\n    'currentTarget',\n    'which',\n    'pageX',\n    'pageY',\n    'timeStamp',\n    // gesture addons\n    'preventTap',\n    'tapPrevented',\n    '_source'\n  ];\n\n  var CLONE_DEFAULTS = [\n    // MouseEvent\n    false,\n    false,\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    false,\n    false,\n    false,\n    false,\n    0,\n    null,\n    // DOM Level 3\n    0,\n    // PointerEvent\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    '',\n    0,\n    false,\n    // event instance\n    '',\n    null,\n    null,\n    0,\n    0,\n    0,\n    0,\n    function(){},\n    false\n  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\n\n  var eventFactory = scope.eventFactory;\n\n  // set of recognizers to run for the currently handled event\n  var currentGestures;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    IS_IOS: false,\n    pointermap: new scope.PointerMap(),\n    requiredGestures: new scope.PointerMap(),\n    eventMap: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\n    gestures: [],\n    // map gesture event -> {listeners: int, index: gestures[int]}\n    dependencyMap: {\n      // make sure down and up are in the map to trigger \"register\"\n      down: {listeners: 0, index: -1},\n      up: {listeners: 0, index: -1}\n    },\n    gestureQueue: [],\n    /**\n     * Add a new event source that will generate pointer events.\n     *\n     * `inSource` must contain an array of event names named `events`, and\n     * functions with the names specified in the `events` array.\n     * @param {string} name A name for the event source\n     * @param {Object} source A new source of platform events.\n     */\n    registerSource: function(name, source) {\n      var s = source;\n      var newEvents = s.events;\n      if (newEvents) {\n        newEvents.forEach(function(e) {\n          if (s[e]) {\n            this.eventMap[e] = s[e].bind(s);\n          }\n        }, this);\n        this.eventSources[name] = s;\n        this.eventSourceList.push(s);\n      }\n    },\n    registerGesture: function(name, source) {\n      var obj = Object.create(null);\n      obj.listeners = 0;\n      obj.index = this.gestures.length;\n      for (var i = 0, g; i < source.exposes.length; i++) {\n        g = source.exposes[i].toLowerCase();\n        this.dependencyMap[g] = obj;\n      }\n      this.gestures.push(source);\n    },\n    register: function(element, initial) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.register.call(es, element, initial);\n      }\n    },\n    unregister: function(element) {\n      var l = this.eventSourceList.length;\n      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {\n        // call eventsource register\n        es.unregister.call(es, element);\n      }\n    },\n    // EVENTS\n    down: function(inEvent) {\n      this.requiredGestures.set(inEvent.pointerId, currentGestures);\n      this.fireEvent('down', inEvent);\n    },\n    move: function(inEvent) {\n      // pipe move events into gesture queue directly\n      inEvent.type = 'move';\n      this.fillGestureQueue(inEvent);\n    },\n    up: function(inEvent) {\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\n      this.requiredGestures.delete(inEvent.pointerId);\n    },\n    addGestureDependency: function(node, currentGestures) {\n      var gesturesWanted = node._pgEvents;\n      if (gesturesWanted) {\n        var gk = Object.keys(gesturesWanted);\n        for (var i = 0, r, ri, g; i < gk.length; i++) {\n          // gesture\n          g = gk[i];\n          if (gesturesWanted[g] > 0) {\n            // lookup gesture recognizer\n            r = this.dependencyMap[g];\n            // recognizer index\n            ri = r ? r.index : -1;\n            currentGestures[ri] = true;\n          }\n        }\n      }\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of events from\n      // platform events. This can happen when two elements in different scopes\n      // are set up to create pointer events, which is relevant to Shadow DOM.\n\n      var type = inEvent.type;\n\n      // only generate the list of desired events on \"down\"\n      if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') {\n        if (!inEvent._handledByPG) {\n          currentGestures = {};\n        }\n        // in IOS mode, there is only a listener on the document, so this is not re-entrant\n        if (this.IS_IOS) {\n          var nodes = scope.targetFinding.path(inEvent);\n          for (var i = 0, n; i < nodes.length; i++) {\n            n = nodes[i];\n            this.addGestureDependency(n, currentGestures);\n          }\n        } else {\n          this.addGestureDependency(inEvent.currentTarget, currentGestures);\n        }\n      }\n\n      if (inEvent._handledByPG) {\n        return;\n      }\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      inEvent._handledByPG = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.addEvent(target, e);\n      }\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {\n        this.removeEvent(target, e);\n      }\n    },\n    addEvent: function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\n    },\n    // EVENT CREATION AND TRACKING\n    /**\n     * Creates a new Event of type `inType`, based on the information in\n     * `inEvent`.\n     *\n     * @param {string} inType A string representing the type of event to create\n     * @param {Event} inEvent A platform event with a target\n     * @return {Event} A PointerEvent of type `inType`\n     */\n    makeEvent: function(inType, inEvent) {\n      var e = eventFactory.makePointerEvent(inType, inEvent);\n      e.preventDefault = inEvent.preventDefault;\n      e.tapPrevented = inEvent.tapPrevented;\n      e._target = e._target || inEvent.target;\n      return e;\n    },\n    // make and dispatch an event in one call\n    fireEvent: function(inType, inEvent) {\n      var e = this.makeEvent(inType, inEvent);\n      return this.dispatchEvent(e);\n    },\n    /**\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @param {Event} inEvent An event that contains properties to copy.\n     * @return {Object} An object containing shallow copies of `inEvent`'s\n     *    properties.\n     */\n    cloneEvent: function(inEvent) {\n      var eventCopy = Object.create(null), p;\n      for (var i = 0; i < CLONE_PROPS.length; i++) {\n        p = CLONE_PROPS[i];\n        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];\n        // Work around SVGInstanceElement shadow tree\n        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.\n        // This is the behavior implemented by Firefox.\n        if (p === 'target' || p === 'relatedTarget') {\n          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = function() {\n        inEvent.preventDefault();\n      };\n      return eventCopy;\n    },\n    /**\n     * Dispatches the event to its target.\n     *\n     * @param {Event} inEvent The event to be dispatched.\n     * @return {Boolean} True if an event handler returns true, false otherwise.\n     */\n    dispatchEvent: function(inEvent) {\n      var t = inEvent._target;\n      if (t) {\n        t.dispatchEvent(inEvent);\n        // clone the event for the gesture system to process\n        // clone after dispatch to pick up gesture prevention code\n        var clone = this.cloneEvent(inEvent);\n        clone.target = t;\n        this.fillGestureQueue(clone);\n      }\n    },\n    gestureTrigger: function() {\n      // process the gesture queue\n      for (var i = 0, e, rg; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        rg = e._requiredGestures;\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          // only run recognizer if an element in the source event's path is listening for those gestures\n          if (rg[j]) {\n            g = this.gestures[j];\n            fn = g[e.type];\n            if (fn) {\n              fn.call(g, e);\n            }\n          }\n        }\n      }\n      this.gestureQueue.length = 0;\n    },\n    fillGestureQueue: function(ev) {\n      // only trigger the gesture queue once\n      if (!this.gestureQueue.length) {\n        requestAnimationFrame(this.boundGestureTrigger);\n      }\n      ev._requiredGestures = this.requiredGestures.get(ev.pointerId);\n      this.gestureQueue.push(ev);\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n\n  /**\n   * Listen for `gesture` on `node` with the `handler` function\n   *\n   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.activateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      var recognizer = dispatcher.gestures[dep.index];\n      if (!node._pgListeners) {\n        dispatcher.register(node);\n        node._pgListeners = 0;\n      }\n      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes\n      if (recognizer) {\n        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];\n        var actionNode;\n        switch(node.nodeType) {\n          case Node.ELEMENT_NODE:\n            actionNode = node;\n          break;\n          case Node.DOCUMENT_FRAGMENT_NODE:\n            actionNode = node.host;\n          break;\n          default:\n            actionNode = null;\n          break;\n        }\n        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {\n          actionNode.setAttribute('touch-action', touchAction);\n        }\n      }\n      if (!node._pgEvents) {\n        node._pgEvents = {};\n      }\n      node._pgEvents[g] = (node._pgEvents[g] || 0) + 1;\n      node._pgListeners++;\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   *\n   * Listen for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.addEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.activateGesture(node, gesture);\n      node.addEventListener(gesture, handler, capture);\n    }\n  };\n\n  /**\n   * Tears down the gesture configuration for `node`\n   *\n   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @return Boolean `gesture` is a valid gesture\n   */\n  scope.deactivateGesture = function(node, gesture) {\n    var g = gesture.toLowerCase();\n    var dep = dispatcher.dependencyMap[g];\n    if (dep) {\n      if (node._pgListeners > 0) {\n        node._pgListeners--;\n      }\n      if (node._pgListeners === 0) {\n        dispatcher.unregister(node);\n      }\n      if (node._pgEvents) {\n        if (node._pgEvents[g] > 0) {\n          node._pgEvents[g]--;\n        } else {\n          node._pgEvents[g] = 0;\n        }\n      }\n    }\n    return Boolean(dep);\n  };\n\n  /**\n   * Stop listening for `gesture` from `node` with `handler` function.\n   *\n   * @param {Element} node\n   * @param {string} gesture\n   * @param {Function} handler\n   * @param {Boolean} capture\n   */\n  scope.removeEventListener = function(node, gesture, handler, capture) {\n    if (handler) {\n      scope.deactivateGesture(node, gesture);\n      node.removeEventListener(gesture, handler, capture);\n    }\n  };\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function (scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  // radius around touchend that swallows mouse events\n  var DEDUP_DIST = 25;\n\n  var WHICH_TO_BUTTONS = [0, 1, 4, 2];\n\n  var HAS_BUTTONS = false;\n  try {\n    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;\n  } catch (e) {}\n\n  // handler block for native mouse events\n  var mouseEvents = {\n    POINTER_ID: 1,\n    POINTER_TYPE: 'mouse',\n    events: [\n      'mousedown',\n      'mousemove',\n      'mouseup'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      if (target === document) {\n        return;\n      }\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.findTarget(inEvent);\n        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var target = pointermap.get(this.POINTER_ID);\n        if (target) {\n          var e = this.prepareEvent(inEvent);\n          e.target = target;\n          // handle case where we missed a mouseup\n          if (e.buttons === 0) {\n            dispatcher.cancel(e);\n            this.cleanupMouse();\n          } else {\n            dispatcher.move(e);\n          }\n        }\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.findTarget(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.up(e);\n        this.cleanupMouse();\n      }\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);\n  var pointermap = dispatcher.pointermap;\n  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);\n  // This should be long enough to ignore compat mouse events made by touch\n  var DEDUP_TIMEOUT = 2500;\n  var CLICK_COUNT_TIMEOUT = 200;\n  var HYSTERESIS = 20;\n  var ATTRIB = 'touch-action';\n  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved\n  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;\n  var HAS_TOUCH_ACTION = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    IS_IOS: false,\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    exposes: [\n      'down',\n      'up',\n      'move'\n    ],\n    register: function(target, initial) {\n      if (this.IS_IOS ? initial : !initial) {\n        dispatcher.listen(target, this.events);\n      }\n    },\n    unregister: function(target) {\n      if (!this.IS_IOS) {\n        dispatcher.unlisten(target, this.events);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === st.EMITTER) {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else {\n        return 'XY';\n      }\n    },\n    POINTER_TYPE: 'touch',\n    firstTouch: null,\n    isPrimaryTouch: function(inTouch) {\n      return this.firstTouch === inTouch.identifier;\n    },\n    setPrimaryTouch: function(inTouch) {\n      // set primary touch if there no pointers, or the only pointer is the mouse\n      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {\n        this.firstTouch = inTouch.identifier;\n        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};\n        this.scrolling = null;\n        this.cancelResetClickCount();\n      }\n    },\n    removePrimaryPointer: function(inPointer) {\n      if (inPointer.isPrimary) {\n        this.firstTouch = null;\n        this.firstXY = null;\n        this.resetClickCount();\n      }\n    },\n    clickCount: 0,\n    resetId: null,\n    resetClickCount: function() {\n      var fn = function() {\n        this.clickCount = 0;\n        this.resetId = null;\n      }.bind(this);\n      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);\n    },\n    cancelResetClickCount: function() {\n      if (this.resetId) {\n        clearTimeout(this.resetId);\n      }\n    },\n    typeToButtons: function(type) {\n      var ret = 0;\n      if (type === 'touchstart' || type === 'touchmove') {\n        ret = 1;\n      }\n      return ret;\n    },\n    findTarget: function(touch, id) {\n      if (this.currentTouchEvent.type === 'touchstart') {\n        if (this.isPrimaryTouch(touch)) {\n          var fastPath = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            path: this.currentTouchEvent.path,\n            target: this.currentTouchEvent.target\n          };\n          return scope.findTarget(fastPath);\n        } else {\n          return scope.findTarget(touch);\n        }\n      }\n      // reuse target we found in touchstart\n      return pointermap.get(id);\n    },\n    touchToPointer: function(inTouch) {\n      var cte = this.currentTouchEvent;\n      var e = dispatcher.cloneEvent(inTouch);\n      // Spec specifies that pointerId 1 is reserved for Mouse.\n      // Touch identifiers can start at 0.\n      // Add 2 to the touch identifier for compatibility.\n      var id = e.pointerId = inTouch.identifier + 2;\n      e.target = this.findTarget(inTouch, id);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.buttons = this.typeToButtons(cte.type);\n      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;\n      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;\n      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;\n      e.isPrimary = this.isPrimaryTouch(inTouch);\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'touch';\n      // forward touch preventDefaults\n      var self = this;\n      e.preventDefault = function() {\n        self.scrolling = false;\n        self.firstXY = null;\n        cte.preventDefault();\n      };\n      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent;\n      for (var i = 0, t, p; i < tl.length; i++) {\n        t = tl[i];\n        p = this.touchToPointer(t);\n        if (inEvent.type === 'touchstart') {\n          pointermap.set(p.pointerId, p.target);\n        }\n        if (pointermap.has(p.pointerId)) {\n          inFunction.call(this, p);\n        }\n        if (inEvent.type === 'touchend' || inEvent._cancel) {\n          this.cleanUpPointer(p);\n        }\n      }\n    },\n    // For single axis scrollers, determines whether the element should emit\n    // pointer events or behave as a scroller\n    shouldScroll: function(inEvent) {\n      if (this.firstXY) {\n        var ret;\n        var touchAction = scope.targetFinding.findTouchAction(inEvent);\n        var scrollAxis = this.touchActionToScrollType(touchAction);\n        if (scrollAxis === 'none') {\n          // this element is a touch-action: none, should never scroll\n          ret = false;\n        } else if (scrollAxis === 'XY') {\n          // this element should always scroll\n          ret = true;\n        } else {\n          var t = inEvent.changedTouches[0];\n          // check the intended scroll axis, and other axis\n          var a = scrollAxis;\n          var oa = scrollAxis === 'Y' ? 'X' : 'Y';\n          var da = Math.abs(t['client' + a] - this.firstXY[a]);\n          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);\n          // if delta in the scroll axis > delta other axis, scroll instead of\n          // making events\n          ret = da >= doa;\n        }\n        return ret;\n      }\n    },\n    findTouch: function(inTL, inId) {\n      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {\n        if (t.identifier === inId) {\n          return true;\n        }\n      }\n    },\n    // In some instances, a touchstart can happen without a touchend. This\n    // leaves the pointermap in a broken state.\n    // Therefore, on every touchstart, we remove the touches that did not fire a\n    // touchend event.\n    // To keep state globally consistent, we fire a\n    // pointercancel for this \"abandoned\" touch\n    vacuumTouches: function(inEvent) {\n      var tl = inEvent.touches;\n      // pointermap.pointers() should be < tl.length here, as the touchstart has not\n      // been processed yet.\n      if (pointermap.pointers() >= tl.length) {\n        var d = [];\n        pointermap.forEach(function(value, key) {\n          // Never remove pointerId == 1, which is mouse.\n          // Touch identifiers are 2 smaller than their pointerId, which is the\n          // index in pointermap.\n          if (key !== 1 && !this.findTouch(tl, key - 2)) {\n            var p = value;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(function(p) {\n          this.cancel(p);\n          pointermap.delete(p.pointerId);\n        });\n      }\n    },\n    touchstart: function(inEvent) {\n      this.vacuumTouches(inEvent);\n      this.setPrimaryTouch(inEvent.changedTouches[0]);\n      this.dedupSynthMouse(inEvent);\n      if (!this.scrolling) {\n        this.clickCount++;\n        this.processTouches(inEvent, this.down);\n      }\n    },\n    down: function(inPointer) {\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36\n        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ\n        if (inEvent.cancelable) {\n          this.processTouches(inEvent, this.move);\n        }\n      } else {\n        if (!this.scrolling) {\n          if (this.scrolling === null && this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n          } else {\n            this.scrolling = false;\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        } else if (this.firstXY) {\n          var t = inEvent.changedTouches[0];\n          var dx = t.clientX - this.firstXY.X;\n          var dy = t.clientY - this.firstXY.Y;\n          var dd = Math.sqrt(dx * dx + dy * dy);\n          if (dd >= HYSTERESIS) {\n            this.touchcancel(inEvent);\n            this.scrolling = true;\n            this.firstXY = null;\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      dispatcher.move(inPointer);\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.up);\n    },\n    up: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.up(inPointer);\n    },\n    cancel: function(inPointer) {\n      dispatcher.cancel(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      inEvent._cancel = true;\n      this.processTouches(inEvent, this.cancel);\n    },\n    cleanUpPointer: function(inPointer) {\n      pointermap['delete'](inPointer.pointerId);\n      this.removePrimaryPointer(inPointer);\n    },\n    // prevent synth mouse events from creating pointer events\n    dedupSynthMouse: function(inEvent) {\n      var lts = scope.mouseEvents.lastTouches;\n      var t = inEvent.changedTouches[0];\n      // only the primary finger will synth mouse events\n      if (this.isPrimaryTouch(t)) {\n        // remember x/y of last touch\n        var lt = {x: t.clientX, y: t.clientY};\n        lts.push(lt);\n        var fn = (function(lts, lt){\n          var i = lts.indexOf(lt);\n          if (i > -1) {\n            lts.splice(i, 1);\n          }\n        }).bind(null, lts, lt);\n        setTimeout(fn, DEDUP_TIMEOUT);\n      }\n    }\n  };\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      if (target === document) {\n        return;\n      }\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var pointerEvents = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e._source = 'pointer';\n      return e;\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      if (target === document) {\n        return;\n      }\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.findTarget(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var target = pointermap.get(inEvent.pointerId);\n      if (target) {\n        var e = this.prepareEvent(inEvent);\n        e.target = target;\n        dispatcher.move(e);\n      }\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.findTarget(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n\n  var dispatcher = scope.dispatcher;\n  var nav = window.navigator;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (nav.msPointerEnabled) {\n    dispatcher.registerSource('ms', scope.msEvents);\n  } else {\n    dispatcher.registerSource('mouse', scope.mouseEvents);\n    if (window.ontouchstart !== undefined) {\n      dispatcher.registerSource('touch', scope.touchEvents);\n    }\n  }\n\n  // Work around iOS bugs https://bugs.webkit.org/show_bug.cgi?id=135628 and https://bugs.webkit.org/show_bug.cgi?id=136506\n  var ua = navigator.userAgent;\n  var IS_IOS = ua.match(/iPad|iPhone|iPod/) && 'ontouchstart' in window;\n\n  dispatcher.IS_IOS = IS_IOS;\n  scope.touchEvents.IS_IOS = IS_IOS;\n\n  dispatcher.register(document, true);\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event denotes the beginning of a series of tracking events.\n *\n * @module PointerGestures\n * @submodule Events\n * @class trackstart\n */\n/**\n * Pixels moved in the x direction since trackstart.\n * @type Number\n * @property dx\n */\n/**\n * Pixes moved in the y direction since trackstart.\n * @type Number\n * @property dy\n */\n/**\n * Pixels moved in the x direction since the last track.\n * @type Number\n * @property ddx\n */\n/**\n * Pixles moved in the y direction since the last track.\n * @type Number\n * @property ddy\n */\n/**\n * The clientX position of the track gesture.\n * @type Number\n * @property clientX\n */\n/**\n * The clientY position of the track gesture.\n * @type Number\n * @property clientY\n */\n/**\n * The pageX position of the track gesture.\n * @type Number\n * @property pageX\n */\n/**\n * The pageY position of the track gesture.\n * @type Number\n * @property pageY\n */\n/**\n * The screenX position of the track gesture.\n * @type Number\n * @property screenX\n */\n/**\n * The screenY position of the track gesture.\n * @type Number\n * @property screenY\n */\n/**\n * The last x axis direction of the pointer.\n * @type Number\n * @property xDirection\n */\n/**\n * The last y axis direction of the pointer.\n * @type Number\n * @property yDirection\n */\n/**\n * A shared object between all tracking events.\n * @type Object\n * @property trackInfo\n */\n/**\n * The element currently under the pointer.\n * @type Element\n * @property relatedTarget\n */\n/**\n * The type of pointer that make the track gesture.\n * @type String\n * @property pointerType\n */\n/**\n *\n * This event fires for all pointer movement being tracked.\n *\n * @class track\n * @extends trackstart\n */\n/**\n * This event fires when the pointer is no longer being tracked.\n *\n * @class trackend\n * @extends trackstart\n */\n\n (function(scope) {\n   var dispatcher = scope.dispatcher;\n   var eventFactory = scope.eventFactory;\n   var pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'down',\n       'move',\n       'up',\n     ],\n     exposes: [\n      'trackstart',\n      'track',\n      'trackx',\n      'tracky',\n      'trackend'\n     ],\n     defaultActions: {\n       'track': 'none',\n       'trackx': 'pan-y',\n       'tracky': 'pan-x'\n     },\n     WIGGLE_THRESHOLD: 4,\n     clampDir: function(inDelta) {\n       return inDelta > 0 ? 1 : -1;\n     },\n     calcPositionDelta: function(inA, inB) {\n       var x = 0, y = 0;\n       if (inA && inB) {\n         x = inB.pageX - inA.pageX;\n         y = inB.pageY - inA.pageY;\n       }\n       return {x: x, y: y};\n     },\n     fireTrack: function(inType, inEvent, inTrackingData) {\n       var t = inTrackingData;\n       var d = this.calcPositionDelta(t.downEvent, inEvent);\n       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);\n       if (dd.x) {\n         t.xDirection = this.clampDir(dd.x);\n       } else if (inType === 'trackx') {\n         return;\n       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       } else if (inType === 'tracky') {\n         return;\n       }\n       var gestureProto = {\n         bubbles: true,\n         cancelable: true,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       };\n       if (inType !== 'tracky') {\n         gestureProto.x = inEvent.x;\n         gestureProto.dx = d.x;\n         gestureProto.ddx = dd.x;\n         gestureProto.clientX = inEvent.clientX;\n         gestureProto.pageX = inEvent.pageX;\n         gestureProto.screenX = inEvent.screenX;\n         gestureProto.xDirection = t.xDirection;\n       }\n       if (inType !== 'trackx') {\n         gestureProto.dy = d.y;\n         gestureProto.ddy = dd.y;\n         gestureProto.y = inEvent.y;\n         gestureProto.clientY = inEvent.clientY;\n         gestureProto.pageY = inEvent.pageY;\n         gestureProto.screenY = inEvent.screenY;\n         gestureProto.yDirection = t.yDirection;\n       }\n       var e = eventFactory.makeGestureEvent(inType, gestureProto);\n       t.downTarget.dispatchEvent(e);\n     },\n     down: function(inEvent) {\n       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {\n         var p = {\n           downEvent: inEvent,\n           downTarget: inEvent.target,\n           trackInfo: {},\n           lastMoveEvent: null,\n           xDirection: 0,\n           yDirection: 0,\n           tracking: false\n         };\n         pointermap.set(inEvent.pointerId, p);\n       }\n     },\n     move: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (!p.tracking) {\n           var d = this.calcPositionDelta(p.downEvent, inEvent);\n           var move = d.x * d.x + d.y * d.y;\n           // start tracking only if finger moves more than WIGGLE_THRESHOLD\n           if (move > this.WIGGLE_THRESHOLD) {\n             p.tracking = true;\n             p.lastMoveEvent = p.downEvent;\n             this.fireTrack('trackstart', inEvent, p);\n           }\n         }\n         if (p.tracking) {\n           this.fireTrack('track', inEvent, p);\n           this.fireTrack('trackx', inEvent, p);\n           this.fireTrack('tracky', inEvent, p);\n         }\n         p.lastMoveEvent = inEvent;\n       }\n     },\n     up: function(inEvent) {\n       var p = pointermap.get(inEvent.pointerId);\n       if (p) {\n         if (p.tracking) {\n           this.fireTrack('trackend', inEvent, p);\n         }\n         pointermap.delete(inEvent.pointerId);\n       }\n     }\n   };\n   dispatcher.registerGesture('track', track);\n })(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer is held down for 200ms.\n *\n * @module PointerGestures\n * @submodule Events\n * @class hold\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * Screen X axis position of the held pointer\n * @type Number\n * @property clientX\n */\n/**\n * Screen Y axis position of the held pointer\n * @type Number\n * @property clientY\n */\n/**\n * Type of pointer that made the holding event.\n * @type String\n * @property pointerType\n */\n/**\n * This event is fired every 200ms while a pointer is held down.\n *\n * @class holdpulse\n * @extends hold\n */\n/**\n * Milliseconds pointer has been held down.\n * @type Number\n * @property holdTime\n */\n/**\n * This event is fired when a held pointer is released or moved.\n *\n * @class release\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var hold = {\n    // wait at least HOLD_DELAY ms between hold and pulse events\n    HOLD_DELAY: 200,\n    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold\n    WIGGLE_THRESHOLD: 16,\n    events: [\n      'down',\n      'move',\n      'up',\n    ],\n    exposes: [\n      'hold',\n      'holdpulse',\n      'release'\n    ],\n    heldPointer: null,\n    holdJob: null,\n    pulse: function() {\n      var hold = Date.now() - this.heldPointer.timeStamp;\n      var type = this.held ? 'holdpulse' : 'hold';\n      this.fireHold(type, hold);\n      this.held = true;\n    },\n    cancel: function() {\n      clearInterval(this.holdJob);\n      if (this.held) {\n        this.fireHold('release');\n      }\n      this.held = false;\n      this.heldPointer = null;\n      this.target = null;\n      this.holdJob = null;\n    },\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !this.heldPointer) {\n        this.heldPointer = inEvent;\n        this.target = inEvent.target;\n        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);\n      }\n    },\n    up: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    move: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        var x = inEvent.clientX - this.heldPointer.clientX;\n        var y = inEvent.clientY - this.heldPointer.clientY;\n        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {\n          this.cancel();\n        }\n      }\n    },\n    fireHold: function(inType, inHoldTime) {\n      var p = {\n        bubbles: true,\n        cancelable: true,\n        pointerType: this.heldPointer.pointerType,\n        pointerId: this.heldPointer.pointerId,\n        x: this.heldPointer.clientX,\n        y: this.heldPointer.clientY,\n        _source: 'hold'\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = eventFactory.makeGestureEvent(inType, p);\n      this.target.dispatchEvent(e);\n    }\n  };\n  dispatcher.registerGesture('hold', hold);\n})(window.PolymerGestures);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This event is fired when a pointer quickly goes down and up, and is used to\n * denote activation.\n *\n * Any gesture event can prevent the tap event from being created by calling\n * `event.preventTap`.\n *\n * Any pointer event can prevent the tap by setting the `tapPrevented` property\n * on itself.\n *\n * @module PointerGestures\n * @submodule Events\n * @class tap\n */\n/**\n * X axis position of the tap.\n * @property x\n * @type Number\n */\n/**\n * Y axis position of the tap.\n * @property y\n * @type Number\n */\n/**\n * Type of the pointer that made the tap.\n * @property pointerType\n * @type String\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var eventFactory = scope.eventFactory;\n  var pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'down',\n      'up'\n    ],\n    exposes: [\n      'tap'\n    ],\n    down: function(inEvent) {\n      if (inEvent.isPrimary && !inEvent.tapPrevented) {\n        pointermap.set(inEvent.pointerId, {\n          target: inEvent.target,\n          buttons: inEvent.buttons,\n          x: inEvent.clientX,\n          y: inEvent.clientY\n        });\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (e.pointerType === 'mouse') {\n        // only allow left click to tap for mouse\n        return downState.buttons === 1;\n      }\n      return !e.tapPrevented;\n    },\n    up: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        // up.relatedTarget is target currently under finger\n        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);\n        if (t) {\n          var e = eventFactory.makeGestureEvent('tap', {\n            bubbles: true,\n            cancelable: true,\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType,\n            pointerId: inEvent.pointerId,\n            altKey: inEvent.altKey,\n            ctrlKey: inEvent.ctrlKey,\n            metaKey: inEvent.metaKey,\n            shiftKey: inEvent.shiftKey,\n            _source: 'tap'\n          });\n          t.dispatchEvent(e);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    }\n  };\n  // patch eventFactory to remove id from tap's pointermap for preventTap calls\n  eventFactory.preventTap = function(e) {\n    return function() {\n      e.tapPrevented = true;\n      pointermap.delete(e.pointerId);\n    };\n  };\n  dispatcher.registerGesture('tap', tap);\n})(window.PolymerGestures);\n\n/*\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n(function (global) {\n    'use strict';\n\n    var Token,\n        TokenName,\n        Syntax,\n        Messages,\n        source,\n        index,\n        length,\n        delegate,\n        lookahead,\n        state;\n\n    Token = {\n        BooleanLiteral: 1,\n        EOF: 2,\n        Identifier: 3,\n        Keyword: 4,\n        NullLiteral: 5,\n        NumericLiteral: 6,\n        Punctuator: 7,\n        StringLiteral: 8\n    };\n\n    TokenName = {};\n    TokenName[Token.BooleanLiteral] = 'Boolean';\n    TokenName[Token.EOF] = '<end>';\n    TokenName[Token.Identifier] = 'Identifier';\n    TokenName[Token.Keyword] = 'Keyword';\n    TokenName[Token.NullLiteral] = 'Null';\n    TokenName[Token.NumericLiteral] = 'Numeric';\n    TokenName[Token.Punctuator] = 'Punctuator';\n    TokenName[Token.StringLiteral] = 'String';\n\n    Syntax = {\n        ArrayExpression: 'ArrayExpression',\n        BinaryExpression: 'BinaryExpression',\n        CallExpression: 'CallExpression',\n        ConditionalExpression: 'ConditionalExpression',\n        EmptyStatement: 'EmptyStatement',\n        ExpressionStatement: 'ExpressionStatement',\n        Identifier: 'Identifier',\n        Literal: 'Literal',\n        LabeledStatement: 'LabeledStatement',\n        LogicalExpression: 'LogicalExpression',\n        MemberExpression: 'MemberExpression',\n        ObjectExpression: 'ObjectExpression',\n        Program: 'Program',\n        Property: 'Property',\n        ThisExpression: 'ThisExpression',\n        UnaryExpression: 'UnaryExpression'\n    };\n\n    // Error messages should be identical to V8.\n    Messages = {\n        UnexpectedToken:  'Unexpected token %0',\n        UnknownLabel: 'Undefined label \\'%0\\'',\n        Redeclaration: '%0 \\'%1\\' has already been declared'\n    };\n\n    // Ensure the condition is true, otherwise throw an error.\n    // This is only to have a better contract semantic, i.e. another safety net\n    // to catch a logic error. The condition shall be fulfilled in normal case.\n    // Do NOT use this to enforce a certain condition on any user input.\n\n    function assert(condition, message) {\n        if (!condition) {\n            throw new Error('ASSERT: ' + message);\n        }\n    }\n\n    function isDecimalDigit(ch) {\n        return (ch >= 48 && ch <= 57);   // 0..9\n    }\n\n\n    // 7.2 White Space\n\n    function isWhiteSpace(ch) {\n        return (ch === 32) ||  // space\n            (ch === 9) ||      // tab\n            (ch === 0xB) ||\n            (ch === 0xC) ||\n            (ch === 0xA0) ||\n            (ch >= 0x1680 && '\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);\n    }\n\n    // 7.3 Line Terminators\n\n    function isLineTerminator(ch) {\n        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);\n    }\n\n    // 7.6 Identifier Names and Identifiers\n\n    function isIdentifierStart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122);          // a..z\n    }\n\n    function isIdentifierPart(ch) {\n        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)\n            (ch >= 65 && ch <= 90) ||         // A..Z\n            (ch >= 97 && ch <= 122) ||        // a..z\n            (ch >= 48 && ch <= 57);           // 0..9\n    }\n\n    // 7.6.1.1 Keywords\n\n    function isKeyword(id) {\n        return (id === 'this')\n    }\n\n    // 7.4 Comments\n\n    function skipWhitespace() {\n        while (index < length && isWhiteSpace(source.charCodeAt(index))) {\n           ++index;\n        }\n    }\n\n    function getIdentifier() {\n        var start, ch;\n\n        start = index++;\n        while (index < length) {\n            ch = source.charCodeAt(index);\n            if (isIdentifierPart(ch)) {\n                ++index;\n            } else {\n                break;\n            }\n        }\n\n        return source.slice(start, index);\n    }\n\n    function scanIdentifier() {\n        var start, id, type;\n\n        start = index;\n\n        id = getIdentifier();\n\n        // There is no keyword or literal with only one character.\n        // Thus, it must be an identifier.\n        if (id.length === 1) {\n            type = Token.Identifier;\n        } else if (isKeyword(id)) {\n            type = Token.Keyword;\n        } else if (id === 'null') {\n            type = Token.NullLiteral;\n        } else if (id === 'true' || id === 'false') {\n            type = Token.BooleanLiteral;\n        } else {\n            type = Token.Identifier;\n        }\n\n        return {\n            type: type,\n            value: id,\n            range: [start, index]\n        };\n    }\n\n\n    // 7.7 Punctuators\n\n    function scanPunctuator() {\n        var start = index,\n            code = source.charCodeAt(index),\n            code2,\n            ch1 = source[index],\n            ch2;\n\n        switch (code) {\n\n        // Check for most common single-character punctuators.\n        case 46:   // . dot\n        case 40:   // ( open bracket\n        case 41:   // ) close bracket\n        case 59:   // ; semicolon\n        case 44:   // , comma\n        case 123:  // { open curly brace\n        case 125:  // } close curly brace\n        case 91:   // [\n        case 93:   // ]\n        case 58:   // :\n        case 63:   // ?\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: String.fromCharCode(code),\n                range: [start, index]\n            };\n\n        default:\n            code2 = source.charCodeAt(index + 1);\n\n            // '=' (char #61) marks an assignment or comparison operator.\n            if (code2 === 61) {\n                switch (code) {\n                case 37:  // %\n                case 38:  // &\n                case 42:  // *:\n                case 43:  // +\n                case 45:  // -\n                case 47:  // /\n                case 60:  // <\n                case 62:  // >\n                case 124: // |\n                    index += 2;\n                    return {\n                        type: Token.Punctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        range: [start, index]\n                    };\n\n                case 33: // !\n                case 61: // =\n                    index += 2;\n\n                    // !== and ===\n                    if (source.charCodeAt(index) === 61) {\n                        ++index;\n                    }\n                    return {\n                        type: Token.Punctuator,\n                        value: source.slice(start, index),\n                        range: [start, index]\n                    };\n                default:\n                    break;\n                }\n            }\n            break;\n        }\n\n        // Peek more characters.\n\n        ch2 = source[index + 1];\n\n        // Other 2-character punctuators: && ||\n\n        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {\n            index += 2;\n            return {\n                type: Token.Punctuator,\n                value: ch1 + ch2,\n                range: [start, index]\n            };\n        }\n\n        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n            ++index;\n            return {\n                type: Token.Punctuator,\n                value: ch1,\n                range: [start, index]\n            };\n        }\n\n        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n    }\n\n    // 7.8.3 Numeric Literals\n    function scanNumericLiteral() {\n        var number, start, ch;\n\n        ch = source[index];\n        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),\n            'Numeric literal must start with a decimal digit or a decimal point');\n\n        start = index;\n        number = '';\n        if (ch !== '.') {\n            number = source[index++];\n            ch = source[index];\n\n            // Hex number starts with '0x'.\n            // Octal number starts with '0'.\n            if (number === '0') {\n                // decimal number starts with '0' such as '09' is illegal.\n                if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n                }\n            }\n\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === '.') {\n            number += source[index++];\n            while (isDecimalDigit(source.charCodeAt(index))) {\n                number += source[index++];\n            }\n            ch = source[index];\n        }\n\n        if (ch === 'e' || ch === 'E') {\n            number += source[index++];\n\n            ch = source[index];\n            if (ch === '+' || ch === '-') {\n                number += source[index++];\n            }\n            if (isDecimalDigit(source.charCodeAt(index))) {\n                while (isDecimalDigit(source.charCodeAt(index))) {\n                    number += source[index++];\n                }\n            } else {\n                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n            }\n        }\n\n        if (isIdentifierStart(source.charCodeAt(index))) {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.NumericLiteral,\n            value: parseFloat(number),\n            range: [start, index]\n        };\n    }\n\n    // 7.8.4 String Literals\n\n    function scanStringLiteral() {\n        var str = '', quote, start, ch, octal = false;\n\n        quote = source[index];\n        assert((quote === '\\'' || quote === '\"'),\n            'String literal must starts with a quote');\n\n        start = index;\n        ++index;\n\n        while (index < length) {\n            ch = source[index++];\n\n            if (ch === quote) {\n                quote = '';\n                break;\n            } else if (ch === '\\\\') {\n                ch = source[index++];\n                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n                    switch (ch) {\n                    case 'n':\n                        str += '\\n';\n                        break;\n                    case 'r':\n                        str += '\\r';\n                        break;\n                    case 't':\n                        str += '\\t';\n                        break;\n                    case 'b':\n                        str += '\\b';\n                        break;\n                    case 'f':\n                        str += '\\f';\n                        break;\n                    case 'v':\n                        str += '\\x0B';\n                        break;\n\n                    default:\n                        str += ch;\n                        break;\n                    }\n                } else {\n                    if (ch ===  '\\r' && source[index] === '\\n') {\n                        ++index;\n                    }\n                }\n            } else if (isLineTerminator(ch.charCodeAt(0))) {\n                break;\n            } else {\n                str += ch;\n            }\n        }\n\n        if (quote !== '') {\n            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');\n        }\n\n        return {\n            type: Token.StringLiteral,\n            value: str,\n            octal: octal,\n            range: [start, index]\n        };\n    }\n\n    function isIdentifierName(token) {\n        return token.type === Token.Identifier ||\n            token.type === Token.Keyword ||\n            token.type === Token.BooleanLiteral ||\n            token.type === Token.NullLiteral;\n    }\n\n    function advance() {\n        var ch;\n\n        skipWhitespace();\n\n        if (index >= length) {\n            return {\n                type: Token.EOF,\n                range: [index, index]\n            };\n        }\n\n        ch = source.charCodeAt(index);\n\n        // Very common: ( and ) and ;\n        if (ch === 40 || ch === 41 || ch === 58) {\n            return scanPunctuator();\n        }\n\n        // String literal starts with single quote (#39) or double quote (#34).\n        if (ch === 39 || ch === 34) {\n            return scanStringLiteral();\n        }\n\n        if (isIdentifierStart(ch)) {\n            return scanIdentifier();\n        }\n\n        // Dot (.) char #46 can also start a floating-point number, hence the need\n        // to check the next character.\n        if (ch === 46) {\n            if (isDecimalDigit(source.charCodeAt(index + 1))) {\n                return scanNumericLiteral();\n            }\n            return scanPunctuator();\n        }\n\n        if (isDecimalDigit(ch)) {\n            return scanNumericLiteral();\n        }\n\n        return scanPunctuator();\n    }\n\n    function lex() {\n        var token;\n\n        token = lookahead;\n        index = token.range[1];\n\n        lookahead = advance();\n\n        index = token.range[1];\n\n        return token;\n    }\n\n    function peek() {\n        var pos;\n\n        pos = index;\n        lookahead = advance();\n        index = pos;\n    }\n\n    // Throw an exception\n\n    function throwError(token, messageFormat) {\n        var error,\n            args = Array.prototype.slice.call(arguments, 2),\n            msg = messageFormat.replace(\n                /%(\\d)/g,\n                function (whole, index) {\n                    assert(index < args.length, 'Message reference must be in range');\n                    return args[index];\n                }\n            );\n\n        error = new Error(msg);\n        error.index = index;\n        error.description = msg;\n        throw error;\n    }\n\n    // Throw an exception because of the token.\n\n    function throwUnexpected(token) {\n        throwError(token, Messages.UnexpectedToken, token.value);\n    }\n\n    // Expect the next token to match the specified punctuator.\n    // If not, an exception will be thrown.\n\n    function expect(value) {\n        var token = lex();\n        if (token.type !== Token.Punctuator || token.value !== value) {\n            throwUnexpected(token);\n        }\n    }\n\n    // Return true if the next token matches the specified punctuator.\n\n    function match(value) {\n        return lookahead.type === Token.Punctuator && lookahead.value === value;\n    }\n\n    // Return true if the next token matches the specified keyword\n\n    function matchKeyword(keyword) {\n        return lookahead.type === Token.Keyword && lookahead.value === keyword;\n    }\n\n    function consumeSemicolon() {\n        // Catch the very common case first: immediately a semicolon (char #59).\n        if (source.charCodeAt(index) === 59) {\n            lex();\n            return;\n        }\n\n        skipWhitespace();\n\n        if (match(';')) {\n            lex();\n            return;\n        }\n\n        if (lookahead.type !== Token.EOF && !match('}')) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    // 11.1.4 Array Initialiser\n\n    function parseArrayInitialiser() {\n        var elements = [];\n\n        expect('[');\n\n        while (!match(']')) {\n            if (match(',')) {\n                lex();\n                elements.push(null);\n            } else {\n                elements.push(parseExpression());\n\n                if (!match(']')) {\n                    expect(',');\n                }\n            }\n        }\n\n        expect(']');\n\n        return delegate.createArrayExpression(elements);\n    }\n\n    // 11.1.5 Object Initialiser\n\n    function parseObjectPropertyKey() {\n        var token;\n\n        skipWhitespace();\n        token = lex();\n\n        // Note: This function is called only from parseObjectProperty(), where\n        // EOF and Punctuator tokens are already filtered out.\n        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {\n            return delegate.createLiteral(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseObjectProperty() {\n        var token, key;\n\n        token = lookahead;\n        skipWhitespace();\n\n        if (token.type === Token.EOF || token.type === Token.Punctuator) {\n            throwUnexpected(token);\n        }\n\n        key = parseObjectPropertyKey();\n        expect(':');\n        return delegate.createProperty('init', key, parseExpression());\n    }\n\n    function parseObjectInitialiser() {\n        var properties = [];\n\n        expect('{');\n\n        while (!match('}')) {\n            properties.push(parseObjectProperty());\n\n            if (!match('}')) {\n                expect(',');\n            }\n        }\n\n        expect('}');\n\n        return delegate.createObjectExpression(properties);\n    }\n\n    // 11.1.6 The Grouping Operator\n\n    function parseGroupExpression() {\n        var expr;\n\n        expect('(');\n\n        expr = parseExpression();\n\n        expect(')');\n\n        return expr;\n    }\n\n\n    // 11.1 Primary Expressions\n\n    function parsePrimaryExpression() {\n        var type, token, expr;\n\n        if (match('(')) {\n            return parseGroupExpression();\n        }\n\n        type = lookahead.type;\n\n        if (type === Token.Identifier) {\n            expr = delegate.createIdentifier(lex().value);\n        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {\n            expr = delegate.createLiteral(lex());\n        } else if (type === Token.Keyword) {\n            if (matchKeyword('this')) {\n                lex();\n                expr = delegate.createThisExpression();\n            }\n        } else if (type === Token.BooleanLiteral) {\n            token = lex();\n            token.value = (token.value === 'true');\n            expr = delegate.createLiteral(token);\n        } else if (type === Token.NullLiteral) {\n            token = lex();\n            token.value = null;\n            expr = delegate.createLiteral(token);\n        } else if (match('[')) {\n            expr = parseArrayInitialiser();\n        } else if (match('{')) {\n            expr = parseObjectInitialiser();\n        }\n\n        if (expr) {\n            return expr;\n        }\n\n        throwUnexpected(lex());\n    }\n\n    // 11.2 Left-Hand-Side Expressions\n\n    function parseArguments() {\n        var args = [];\n\n        expect('(');\n\n        if (!match(')')) {\n            while (index < length) {\n                args.push(parseExpression());\n                if (match(')')) {\n                    break;\n                }\n                expect(',');\n            }\n        }\n\n        expect(')');\n\n        return args;\n    }\n\n    function parseNonComputedProperty() {\n        var token;\n\n        token = lex();\n\n        if (!isIdentifierName(token)) {\n            throwUnexpected(token);\n        }\n\n        return delegate.createIdentifier(token.value);\n    }\n\n    function parseNonComputedMember() {\n        expect('.');\n\n        return parseNonComputedProperty();\n    }\n\n    function parseComputedMember() {\n        var expr;\n\n        expect('[');\n\n        expr = parseExpression();\n\n        expect(']');\n\n        return expr;\n    }\n\n    function parseLeftHandSideExpression() {\n        var expr, args, property;\n\n        expr = parsePrimaryExpression();\n\n        while (true) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else if (match('.')) {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\n            } else if (match('(')) {\n                args = parseArguments();\n                expr = delegate.createCallExpression(expr, args);\n            } else {\n                break;\n            }\n        }\n\n        return expr;\n    }\n\n    // 11.3 Postfix Expressions\n\n    var parsePostfixExpression = parseLeftHandSideExpression;\n\n    // 11.4 Unary Operators\n\n    function parseUnaryExpression() {\n        var token, expr;\n\n        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {\n            expr = parsePostfixExpression();\n        } else if (match('+') || match('-') || match('!')) {\n            token = lex();\n            expr = parseUnaryExpression();\n            expr = delegate.createUnaryExpression(token.value, expr);\n        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n            throwError({}, Messages.UnexpectedToken);\n        } else {\n            expr = parsePostfixExpression();\n        }\n\n        return expr;\n    }\n\n    function binaryPrecedence(token) {\n        var prec = 0;\n\n        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {\n            return 0;\n        }\n\n        switch (token.value) {\n        case '||':\n            prec = 1;\n            break;\n\n        case '&&':\n            prec = 2;\n            break;\n\n        case '==':\n        case '!=':\n        case '===':\n        case '!==':\n            prec = 6;\n            break;\n\n        case '<':\n        case '>':\n        case '<=':\n        case '>=':\n        case 'instanceof':\n            prec = 7;\n            break;\n\n        case 'in':\n            prec = 7;\n            break;\n\n        case '+':\n        case '-':\n            prec = 9;\n            break;\n\n        case '*':\n        case '/':\n        case '%':\n            prec = 11;\n            break;\n\n        default:\n            break;\n        }\n\n        return prec;\n    }\n\n    // 11.5 Multiplicative Operators\n    // 11.6 Additive Operators\n    // 11.7 Bitwise Shift Operators\n    // 11.8 Relational Operators\n    // 11.9 Equality Operators\n    // 11.10 Binary Bitwise Operators\n    // 11.11 Binary Logical Operators\n\n    function parseBinaryExpression() {\n        var expr, token, prec, stack, right, operator, left, i;\n\n        left = parseUnaryExpression();\n\n        token = lookahead;\n        prec = binaryPrecedence(token);\n        if (prec === 0) {\n            return left;\n        }\n        token.prec = prec;\n        lex();\n\n        right = parseUnaryExpression();\n\n        stack = [left, token, right];\n\n        while ((prec = binaryPrecedence(lookahead)) > 0) {\n\n            // Reduce: make a binary expression from the three topmost entries.\n            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {\n                right = stack.pop();\n                operator = stack.pop().value;\n                left = stack.pop();\n                expr = delegate.createBinaryExpression(operator, left, right);\n                stack.push(expr);\n            }\n\n            // Shift.\n            token = lex();\n            token.prec = prec;\n            stack.push(token);\n            expr = parseUnaryExpression();\n            stack.push(expr);\n        }\n\n        // Final reduce to clean-up the stack.\n        i = stack.length - 1;\n        expr = stack[i];\n        while (i > 1) {\n            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n            i -= 2;\n        }\n\n        return expr;\n    }\n\n\n    // 11.12 Conditional Operator\n\n    function parseConditionalExpression() {\n        var expr, consequent, alternate;\n\n        expr = parseBinaryExpression();\n\n        if (match('?')) {\n            lex();\n            consequent = parseConditionalExpression();\n            expect(':');\n            alternate = parseConditionalExpression();\n\n            expr = delegate.createConditionalExpression(expr, consequent, alternate);\n        }\n\n        return expr;\n    }\n\n    // Simplification since we do not support AssignmentExpression.\n    var parseExpression = parseConditionalExpression;\n\n    // Polymer Syntax extensions\n\n    // Filter ::\n    //   Identifier\n    //   Identifier \"(\" \")\"\n    //   Identifier \"(\" FilterArguments \")\"\n\n    function parseFilter() {\n        var identifier, args;\n\n        identifier = lex();\n\n        if (identifier.type !== Token.Identifier) {\n            throwUnexpected(identifier);\n        }\n\n        args = match('(') ? parseArguments() : [];\n\n        return delegate.createFilter(identifier.value, args);\n    }\n\n    // Filters ::\n    //   \"|\" Filter\n    //   Filters \"|\" Filter\n\n    function parseFilters() {\n        while (match('|')) {\n            lex();\n            parseFilter();\n        }\n    }\n\n    // TopLevel ::\n    //   LabelledExpressions\n    //   AsExpression\n    //   InExpression\n    //   FilterExpression\n\n    // AsExpression ::\n    //   FilterExpression as Identifier\n\n    // InExpression ::\n    //   Identifier, Identifier in FilterExpression\n    //   Identifier in FilterExpression\n\n    // FilterExpression ::\n    //   Expression\n    //   Expression Filters\n\n    function parseTopLevel() {\n        skipWhitespace();\n        peek();\n\n        var expr = parseExpression();\n        if (expr) {\n            if (lookahead.value === ',' || lookahead.value == 'in' &&\n                       expr.type === Syntax.Identifier) {\n                parseInExpression(expr);\n            } else {\n                parseFilters();\n                if (lookahead.value === 'as') {\n                    parseAsExpression(expr);\n                } else {\n                    delegate.createTopLevel(expr);\n                }\n            }\n        }\n\n        if (lookahead.type !== Token.EOF) {\n            throwUnexpected(lookahead);\n        }\n    }\n\n    function parseAsExpression(expr) {\n        lex();  // as\n        var identifier = lex().value;\n        delegate.createAsExpression(expr, identifier);\n    }\n\n    function parseInExpression(identifier) {\n        var indexName;\n        if (lookahead.value === ',') {\n            lex();\n            if (lookahead.type !== Token.Identifier)\n                throwUnexpected(lookahead);\n            indexName = lex().value;\n        }\n\n        lex();  // in\n        var expr = parseExpression();\n        parseFilters();\n        delegate.createInExpression(identifier.name, indexName, expr);\n    }\n\n    function parse(code, inDelegate) {\n        delegate = inDelegate;\n        source = code;\n        index = 0;\n        length = source.length;\n        lookahead = null;\n        state = {\n            labelSet: {}\n        };\n\n        return parseTopLevel();\n    }\n\n    global.esprima = {\n        parse: parse\n    };\n})(this);\n\n// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function (global) {\n  'use strict';\n\n  function prepareBinding(expressionText, name, node, filterRegistry) {\n    var expression;\n    try {\n      expression = getExpression(expressionText);\n      if (expression.scopeIdent &&\n          (node.nodeType !== Node.ELEMENT_NODE ||\n           node.tagName !== 'TEMPLATE' ||\n           (name !== 'bind' && name !== 'repeat'))) {\n        throw Error('as and in can only be used within <template bind/repeat>');\n      }\n    } catch (ex) {\n      console.error('Invalid expression syntax: ' + expressionText, ex);\n      return;\n    }\n\n    return function(model, node, oneTime) {\n      var binding = expression.getBinding(model, filterRegistry, oneTime);\n      if (expression.scopeIdent && binding) {\n        node.polymerExpressionScopeIdent_ = expression.scopeIdent;\n        if (expression.indexIdent)\n          node.polymerExpressionIndexIdent_ = expression.indexIdent;\n      }\n\n      return binding;\n    }\n  }\n\n  // TODO(rafaelw): Implement simple LRU.\n  var expressionParseCache = Object.create(null);\n\n  function getExpression(expressionText) {\n    var expression = expressionParseCache[expressionText];\n    if (!expression) {\n      var delegate = new ASTDelegate();\n      esprima.parse(expressionText, delegate);\n      expression = new Expression(delegate);\n      expressionParseCache[expressionText] = expression;\n    }\n    return expression;\n  }\n\n  function Literal(value) {\n    this.value = value;\n    this.valueFn_ = undefined;\n  }\n\n  Literal.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var value = this.value;\n        this.valueFn_ = function() {\n          return value;\n        }\n      }\n\n      return this.valueFn_;\n    }\n  }\n\n  function IdentPath(name) {\n    this.name = name;\n    this.path = Path.get(name);\n  }\n\n  IdentPath.prototype = {\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var name = this.name;\n        var path = this.path;\n        this.valueFn_ = function(model, observer) {\n          if (observer)\n            observer.addPath(model, path);\n\n          return path.getValueFrom(model);\n        }\n      }\n\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.path.length == 1);\n        model = findScope(model, this.path[0]);\n\n      return this.path.setValueFrom(model, newValue);\n    }\n  };\n\n  function MemberExpression(object, property, accessor) {\n    this.computed = accessor == '[';\n\n    this.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (this.computed && !(property instanceof Literal));\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        (property instanceof IdentPath || property instanceof Literal) &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = !this.computed || this.simplePath ?\n        property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n\n        var parts = this.object instanceof MemberExpression ?\n            this.object.fullPath.slice() : [this.object.name];\n        parts.push(this.property instanceof IdentPath ?\n            this.property.name : this.property.value);\n        this.fullPath_ = Path.get(parts);\n      }\n\n      return this.fullPath_;\n    },\n\n    valueFn: function() {\n      if (!this.valueFn_) {\n        var object = this.object;\n\n        if (this.simplePath) {\n          var path = this.fullPath;\n\n          this.valueFn_ = function(model, observer) {\n            if (observer)\n              observer.addPath(model, path);\n\n            return path.getValueFrom(model);\n          };\n        } else if (!this.computed) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n\n            if (observer)\n              observer.addPath(context, path);\n\n            return path.getValueFrom(context);\n          }\n        } else {\n          // Computed property.\n          var property = this.property;\n\n          this.valueFn_ = function(model, observer, filterRegistry) {\n            var context = object(model, observer, filterRegistry);\n            var propName = property(model, observer, filterRegistry);\n            if (observer)\n              observer.addPath(context, [propName]);\n\n            return context ? context[propName] : undefined;\n          };\n        }\n      }\n      return this.valueFn_;\n    },\n\n    setValue: function(model, newValue) {\n      if (this.simplePath) {\n        this.fullPath.setValueFrom(model, newValue);\n        return newValue;\n      }\n\n      var object = this.object(model);\n      var propName = this.property instanceof IdentPath ? this.property.name :\n          this.property(model);\n      return object[propName] = newValue;\n    }\n  };\n\n  function Filter(name, args) {\n    this.name = name;\n    this.args = [];\n    for (var i = 0; i < args.length; i++) {\n      this.args[i] = getFn(args[i]);\n    }\n  }\n\n  Filter.prototype = {\n    transform: function(model, observer, filterRegistry, toModelDirection,\n                        initialArgs) {\n      var fn = filterRegistry[this.name];\n      var context = model;\n      if (fn) {\n        context = undefined;\n      } else {\n        fn = context[this.name];\n        if (!fn) {\n          console.error('Cannot find function or filter: ' + this.name);\n          return;\n        }\n      }\n\n      // If toModelDirection is falsey, then the \"normal\" (dom-bound) direction\n      // is used. Otherwise, it looks for a 'toModel' property function on the\n      // object.\n      if (toModelDirection) {\n        fn = fn.toModel;\n      } else if (typeof fn.toDOM == 'function') {\n        fn = fn.toDOM;\n      }\n\n      if (typeof fn != 'function') {\n        console.error('Cannot find function or filter: ' + this.name);\n        return;\n      }\n\n      var args = initialArgs || [];\n      for (var i = 0; i < this.args.length; i++) {\n        args.push(getFn(this.args[i])(model, observer, filterRegistry));\n      }\n\n      return fn.apply(context, args);\n    }\n  };\n\n  function notImplemented() { throw Error('Not Implemented'); }\n\n  var unaryOperators = {\n    '+': function(v) { return +v; },\n    '-': function(v) { return -v; },\n    '!': function(v) { return !v; }\n  };\n\n  var binaryOperators = {\n    '+': function(l, r) { return l+r; },\n    '-': function(l, r) { return l-r; },\n    '*': function(l, r) { return l*r; },\n    '/': function(l, r) { return l/r; },\n    '%': function(l, r) { return l%r; },\n    '<': function(l, r) { return l<r; },\n    '>': function(l, r) { return l>r; },\n    '<=': function(l, r) { return l<=r; },\n    '>=': function(l, r) { return l>=r; },\n    '==': function(l, r) { return l==r; },\n    '!=': function(l, r) { return l!=r; },\n    '===': function(l, r) { return l===r; },\n    '!==': function(l, r) { return l!==r; },\n    '&&': function(l, r) { return l&&r; },\n    '||': function(l, r) { return l||r; },\n  };\n\n  function getFn(arg) {\n    return typeof arg == 'function' ? arg : arg.valueFn();\n  }\n\n  function ASTDelegate() {\n    this.expression = null;\n    this.filters = [];\n    this.deps = {};\n    this.currentPath = undefined;\n    this.scopeIdent = undefined;\n    this.indexIdent = undefined;\n    this.dynamicDeps = false;\n  }\n\n  ASTDelegate.prototype = {\n    createUnaryExpression: function(op, argument) {\n      if (!unaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      argument = getFn(argument);\n\n      return function(model, observer, filterRegistry) {\n        return unaryOperators[op](argument(model, observer, filterRegistry));\n      };\n    },\n\n    createBinaryExpression: function(op, left, right) {\n      if (!binaryOperators[op])\n        throw Error('Disallowed operator: ' + op);\n\n      left = getFn(left);\n      right = getFn(right);\n\n      switch (op) {\n        case '||':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) ||\n                right(model, observer, filterRegistry);\n          };\n        case '&&':\n          this.dynamicDeps = true;\n          return function(model, observer, filterRegistry) {\n            return left(model, observer, filterRegistry) &&\n                right(model, observer, filterRegistry);\n          };\n      }\n\n      return function(model, observer, filterRegistry) {\n        return binaryOperators[op](left(model, observer, filterRegistry),\n                                   right(model, observer, filterRegistry));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      this.dynamicDeps = true;\n\n      return function(model, observer, filterRegistry) {\n        return test(model, observer, filterRegistry) ?\n            consequent(model, observer, filterRegistry) :\n            alternate(model, observer, filterRegistry);\n      }\n    },\n\n    createIdentifier: function(name) {\n      var ident = new IdentPath(name);\n      ident.type = 'Identifier';\n      return ident;\n    },\n\n    createMemberExpression: function(accessor, object, property) {\n      var ex = new MemberExpression(object, property, accessor);\n      if (ex.dynamicDeps)\n        this.dynamicDeps = true;\n      return ex;\n    },\n\n    createCallExpression: function(expression, args) {\n      if (!(expression instanceof IdentPath))\n        throw Error('Only identifier function invocations are allowed');\n\n      var filter = new Filter(expression.name, args);\n\n      return function(model, observer, filterRegistry) {\n        return filter.transform(model, observer, filterRegistry, false);\n      };\n    },\n\n    createLiteral: function(token) {\n      return new Literal(token.value);\n    },\n\n    createArrayExpression: function(elements) {\n      for (var i = 0; i < elements.length; i++)\n        elements[i] = getFn(elements[i]);\n\n      return function(model, observer, filterRegistry) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer, filterRegistry));\n        return arr;\n      }\n    },\n\n    createProperty: function(kind, key, value) {\n      return {\n        key: key instanceof IdentPath ? key.name : key.value,\n        value: value\n      };\n    },\n\n    createObjectExpression: function(properties) {\n      for (var i = 0; i < properties.length; i++)\n        properties[i].value = getFn(properties[i].value);\n\n      return function(model, observer, filterRegistry) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] =\n              properties[i].value(model, observer, filterRegistry);\n        return obj;\n      }\n    },\n\n    createFilter: function(name, args) {\n      this.filters.push(new Filter(name, args));\n    },\n\n    createAsExpression: function(expression, scopeIdent) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n    },\n\n    createInExpression: function(scopeIdent, indexIdent, expression) {\n      this.expression = expression;\n      this.scopeIdent = scopeIdent;\n      this.indexIdent = indexIdent;\n    },\n\n    createTopLevel: function(expression) {\n      this.expression = expression;\n    },\n\n    createThisExpression: notImplemented\n  }\n\n  function ConstantObservable(value) {\n    this.value_ = value;\n  }\n\n  ConstantObservable.prototype = {\n    open: function() { return this.value_; },\n    discardChanges: function() { return this.value_; },\n    deliver: function() {},\n    close: function() {},\n  }\n\n  function Expression(delegate) {\n    this.scopeIdent = delegate.scopeIdent;\n    this.indexIdent = delegate.indexIdent;\n\n    if (!delegate.expression)\n      throw Error('No expression found.');\n\n    this.expression = delegate.expression;\n    getFn(this.expression); // forces enumeration of path dependencies\n\n    this.filters = delegate.filters;\n    this.dynamicDeps = delegate.dynamicDeps;\n  }\n\n  Expression.prototype = {\n    getBinding: function(model, filterRegistry, oneTime) {\n      if (oneTime)\n        return this.getValue(model, undefined, filterRegistry);\n\n      var observer = new CompoundObserver();\n      // captures deps.\n      var firstValue = this.getValue(model, observer, filterRegistry);\n      var firstTime = true;\n      var self = this;\n\n      function valueFn() {\n        // deps cannot have changed on first value retrieval.\n        if (firstTime) {\n          firstTime = false;\n          return firstValue;\n        }\n\n        if (self.dynamicDeps)\n          observer.startReset();\n\n        var value = self.getValue(model,\n                                  self.dynamicDeps ? observer : undefined,\n                                  filterRegistry);\n        if (self.dynamicDeps)\n          observer.finishReset();\n\n        return value;\n      }\n\n      function setValueFn(newValue) {\n        self.setValue(model, newValue, filterRegistry);\n        return newValue;\n      }\n\n      return new ObserverTransform(observer, valueFn, setValueFn, true);\n    },\n\n    getValue: function(model, observer, filterRegistry) {\n      var value = getFn(this.expression)(model, observer, filterRegistry);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(model, observer, filterRegistry,\n            false, [value]);\n      }\n\n      return value;\n    },\n\n    setValue: function(model, newValue, filterRegistry) {\n      var count = this.filters ? this.filters.length : 0;\n      while (count-- > 0) {\n        newValue = this.filters[count].transform(model, undefined,\n            filterRegistry, true, [newValue]);\n      }\n\n      if (this.expression.setValue)\n        return this.expression.setValue(model, newValue);\n    }\n  }\n\n  /**\n   * Converts a style property name to a css property name. For example:\n   * \"WebkitUserSelect\" to \"-webkit-user-select\"\n   */\n  function convertStylePropertyName(name) {\n    return String(name).replace(/[A-Z]/g, function(c) {\n      return '-' + c.toLowerCase();\n    });\n  }\n\n  var parentScopeName = '@' + Math.random().toString(36).slice(2);\n\n  // Single ident paths must bind directly to the appropriate scope object.\n  // I.e. Pushed values in two-bindings need to be assigned to the actual model\n  // object.\n  function findScope(model, prop) {\n    while (model[parentScopeName] &&\n           !Object.prototype.hasOwnProperty.call(model, prop)) {\n      model = model[parentScopeName];\n    }\n\n    return model;\n  }\n\n  function isLiteralExpression(pathString) {\n    switch (pathString) {\n      case '':\n        return false;\n\n      case 'false':\n      case 'null':\n      case 'true':\n        return true;\n    }\n\n    if (!isNaN(Number(pathString)))\n      return true;\n\n    return false;\n  };\n\n  function PolymerExpressions() {}\n\n  PolymerExpressions.prototype = {\n    // \"built-in\" filters\n    styleObject: function(value) {\n      var parts = [];\n      for (var key in value) {\n        parts.push(convertStylePropertyName(key) + ': ' + value[key]);\n      }\n      return parts.join('; ');\n    },\n\n    tokenList: function(value) {\n      var tokens = [];\n      for (var key in value) {\n        if (value[key])\n          tokens.push(key);\n      }\n      return tokens.join(' ');\n    },\n\n    // binding delegate API\n    prepareInstancePositionChanged: function(template) {\n      var indexIdent = template.polymerExpressionIndexIdent_;\n      if (!indexIdent)\n        return;\n\n      return function(templateInstance, index) {\n        templateInstance.model[indexIdent] = index;\n      };\n    },\n\n    prepareBinding: function(pathString, name, node) {\n      var path = Path.get(pathString);\n\n      if (!isLiteralExpression(pathString) && path.valid) {\n        if (path.length == 1) {\n          return function(model, node, oneTime) {\n            if (oneTime)\n              return path.getValueFrom(model);\n\n            var scope = findScope(model, path[0]);\n            return new PathObserver(scope, path);\n          };\n        }\n        return; // bail out early if pathString is simple path.\n      }\n\n      return prepareBinding(pathString, name, node, this);\n    },\n\n    prepareInstanceModel: function(template) {\n      var scopeName = template.polymerExpressionScopeIdent_;\n      if (!scopeName)\n        return;\n\n      var parentScope = template.templateInstance ?\n          template.templateInstance.model :\n          template.model;\n\n      var indexName = template.polymerExpressionIndexIdent_;\n\n      return function(model) {\n        return createScopeObject(parentScope, model, scopeName, indexName);\n      };\n    }\n  };\n\n  var createScopeObject = ('__proto__' in {}) ?\n    function(parentScope, model, scopeName, indexName) {\n      var scope = {};\n      scope[scopeName] = model;\n      scope[indexName] = undefined;\n      scope[parentScopeName] = parentScope;\n      scope.__proto__ = parentScope;\n      return scope;\n    } :\n    function(parentScope, model, scopeName, indexName) {\n      var scope = Object.create(parentScope);\n      Object.defineProperty(scope, scopeName,\n          { value: model, configurable: true, writable: true });\n      Object.defineProperty(scope, indexName,\n          { value: undefined, configurable: true, writable: true });\n      Object.defineProperty(scope, parentScopeName,\n          { value: parentScope, configurable: true, writable: true });\n      return scope;\n    };\n\n  global.PolymerExpressions = PolymerExpressions;\n  PolymerExpressions.getExpression = getExpression;\n})(this);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nPolymer = {\n  version: '0.4.1-d61654b'\n};\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// TODO(sorvell): this ensures Polymer is an object and not a function\n// Platform is currently defining it as a function to allow for async loading\n// of polymer; once we refine the loading process this likely goes away.\nif (typeof window.Polymer === 'function') {\n  Polymer = {};\n}\n\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n /*\n\tOn supported platforms, platform.js is not needed. To retain compatibility\n\twith the polyfills, we stub out minimal functionality.\n */\nif (!window.Platform) {\n  logFlags = window.logFlags || {};\n\n\n  Platform = {\n  \tflush: function() {}\n  };\n\n  CustomElements = {\n  \tuseNative: true,\n    ready: true,\n    takeRecords: function() {},\n    instanceof: function(obj, base) {\n      return obj instanceof base;\n    }\n  };\n  \n  HTMLImports = {\n  \tuseNative: true\n  };\n\n  \n  addEventListener('HTMLImportsLoaded', function() {\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n\n\n  // ShadowDOM\n  ShadowDOMPolyfill = null;\n  wrap = unwrap = function(n){\n    return n;\n  };\n\n}\n\n/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\nvar hasNative = ('import' in document.createElement('link'));\r\nvar useNative = hasNative;\r\n\r\nisIE = /Trident/.test(navigator.userAgent);\r\n\r\n// TODO(sorvell): SD polyfill intrusion\r\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\r\nvar wrap = function(node) {\r\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\r\n};\r\nvar mainDoc = wrap(document);\r\n    \r\n// NOTE: We cannot polyfill document.currentScript because it's not possible\r\n// both to override and maintain the ability to capture the native value;\r\n// therefore we choose to expose _currentScript both when native imports\r\n// and the polyfill are in use.\r\nvar currentScriptDescriptor = {\r\n  get: function() {\r\n    var script = HTMLImports.currentScript || document.currentScript ||\r\n        // NOTE: only works when called in synchronously executing code.\r\n        // readyState should check if `loading` but IE10 is \r\n        // interactive when scripts run so we cheat.\r\n        (document.readyState !== 'complete' ? \r\n        document.scripts[document.scripts.length - 1] : null);\r\n    return wrap(script);\r\n  },\r\n  configurable: true\r\n};\r\n\r\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\r\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\r\n\r\n// call a callback when all HTMLImports in the document at call (or at least\r\n//  document ready) time have loaded.\r\n// 1. ensure the document is in a ready state (has dom), then \r\n// 2. watch for loading of imports and call callback when done\r\nfunction whenImportsReady(callback, doc) {\r\n  doc = doc || mainDoc;\r\n  // if document is loading, wait and try again\r\n  whenDocumentReady(function() {\r\n    watchImportsLoad(callback, doc);\r\n  }, doc);\r\n}\r\n\r\n// call the callback when the document is in a ready state (has dom)\r\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\r\nvar READY_EVENT = 'readystatechange';\r\nfunction isDocumentReady(doc) {\r\n  return (doc.readyState === 'complete' ||\r\n      doc.readyState === requiredReadyState);\r\n}\r\n\r\n// call <callback> when we ensure the document is in a ready state\r\nfunction whenDocumentReady(callback, doc) {\r\n  if (!isDocumentReady(doc)) {\r\n    var checkReady = function() {\r\n      if (doc.readyState === 'complete' || \r\n          doc.readyState === requiredReadyState) {\r\n        doc.removeEventListener(READY_EVENT, checkReady);\r\n        whenDocumentReady(callback, doc);\r\n      }\r\n    };\r\n    doc.addEventListener(READY_EVENT, checkReady);\r\n  } else if (callback) {\r\n    callback();\r\n  }\r\n}\r\n\r\nfunction markTargetLoaded(event) {\r\n  event.target.__loaded = true;\r\n}\r\n\r\n// call <callback> when we ensure all imports have loaded\r\nfunction watchImportsLoad(callback, doc) {\r\n  var imports = doc.querySelectorAll('link[rel=import]');\r\n  var loaded = 0, l = imports.length;\r\n  function checkDone(d) { \r\n    if (loaded == l) {\r\n      callback && callback();\r\n    }\r\n  }\r\n  function loadedImport(e) {\r\n    markTargetLoaded(e);\r\n    loaded++;\r\n    checkDone();\r\n  }\r\n  if (l) {\r\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\r\n      if (isImportLoaded(imp)) {\r\n        loadedImport.call(imp, {target: imp});\r\n      } else {\r\n        imp.addEventListener('load', loadedImport);\r\n        imp.addEventListener('error', loadedImport);\r\n      }\r\n    }\r\n  } else {\r\n    checkDone();\r\n  }\r\n}\r\n\r\n// NOTE: test for native imports loading is based on explicitly watching\r\n// all imports (see below).\r\n// We cannot rely on this entirely without watching the entire document\r\n// for import links. For perf reasons, currently only head is watched.\r\n// Instead, we fallback to checking if the import property is available \r\n// and the document is not itself loading. \r\nfunction isImportLoaded(link) {\r\n  return useNative ? link.__loaded || \r\n      (link.import && link.import.readyState !== 'loading') :\r\n      link.__importParsed;\r\n}\r\n\r\n// TODO(sorvell): Workaround for \r\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\r\n// this bug is addressed.\r\n// (1) Install a mutation observer to see when HTMLImports have loaded\r\n// (2) if this script is run during document load it will watch any existing\r\n// imports for loading.\r\n//\r\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\r\n// with imports that are added to document.head since the mutation observer \r\n// watches only head for perf reasons, (2) it requires this script\r\n// to run before any imports have completed loading.\r\nif (useNative) {\r\n  new MutationObserver(function(mxns) {\r\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\r\n      if (m.addedNodes) {\r\n        handleImports(m.addedNodes);\r\n      }\r\n    }\r\n  }).observe(document.head, {childList: true});\r\n\r\n  function handleImports(nodes) {\r\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\r\n      if (isImport(n)) {\r\n        handleImport(n);  \r\n      }\r\n    }\r\n  }\r\n\r\n  function isImport(element) {\r\n    return element.localName === 'link' && element.rel === 'import';\r\n  }\r\n\r\n  function handleImport(element) {\r\n    var loaded = element.import;\r\n    if (loaded) {\r\n      markTargetLoaded({target: element});\r\n    } else {\r\n      element.addEventListener('load', markTargetLoaded);\r\n      element.addEventListener('error', markTargetLoaded);\r\n    }\r\n  }\r\n\r\n  // make sure to catch any imports that are in the process of loading\r\n  // when this script is run.\r\n  (function() {\r\n    if (document.readyState === 'loading') {\r\n      var imports = document.querySelectorAll('link[rel=import]');\r\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\r\n        handleImport(imp);\r\n      }\r\n    }\r\n  })();\r\n\r\n}\r\n\r\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \r\n// have loaded. This event is required to simulate the script blocking \r\n// behavior of native imports. A main document script that needs to be sure\r\n// imports have loaded should wait for this event.\r\nwhenImportsReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  mainDoc.dispatchEvent(\r\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\r\n  );\r\n});\r\n\r\n// exports\r\nscope.useNative = useNative;\r\nscope.isImportLoaded = isImportLoaded;\r\nscope.whenReady = whenImportsReady;\r\nscope.isIE = isIE;\r\n\r\n// deprecated\r\nscope.whenImportsReady = whenImportsReady;\r\n\r\n})(window.HTMLImports);\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (typeof navigator != 'undefined' && navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0 && s !== '';\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n\n// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n\n  function getTreeScope(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n\n    return typeof node.getElementById === 'function' ? node : null;\n  }\n\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  Node.prototype.bindFinished = function() {};\n\n  function updateBindings(node, name, binding) {\n    var bindings = node.bindings_;\n    if (!bindings)\n      bindings = node.bindings_ = {};\n\n    if (bindings[name])\n      binding[name].close();\n\n    return bindings[name] = binding;\n  }\n\n  function returnBinding(node, name, binding) {\n    return binding;\n  }\n\n  function sanitizeValue(value) {\n    return value == null ? '' : value;\n  }\n\n  function updateText(node, value) {\n    node.data = sanitizeValue(value);\n  }\n\n  function textBinding(node) {\n    return function(value) {\n      return updateText(node, value);\n    };\n  }\n\n  var maybeUpdateBindings = returnBinding;\n\n  Object.defineProperty(Platform, 'enableBindingsReflection', {\n    get: function() {\n      return maybeUpdateBindings === updateBindings;\n    },\n    set: function(enable) {\n      maybeUpdateBindings = enable ? updateBindings : returnBinding;\n      return enable;\n    },\n    configurable: true\n  });\n\n  Text.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'textContent')\n      return Node.prototype.bind.call(this, name, value, oneTime);\n\n    if (oneTime)\n      return updateText(this, value);\n\n    var observable = value;\n    updateText(this, observable.open(textBinding(this)));\n    return maybeUpdateBindings(this, name, observable);\n  }\n\n  function updateAttribute(el, name, conditional, value) {\n    if (conditional) {\n      if (value)\n        el.setAttribute(name, '');\n      else\n        el.removeAttribute(name);\n      return;\n    }\n\n    el.setAttribute(name, sanitizeValue(value));\n  }\n\n  function attributeBinding(el, name, conditional) {\n    return function(value) {\n      updateAttribute(el, name, conditional, value);\n    };\n  }\n\n  Element.prototype.bind = function(name, value, oneTime) {\n    var conditional = name[name.length - 1] == '?';\n    if (conditional) {\n      this.removeAttribute(name);\n      name = name.slice(0, -1);\n    }\n\n    if (oneTime)\n      return updateAttribute(this, name, conditional, value);\n\n\n    var observable = value;\n    updateAttribute(this, name, conditional,\n        observable.open(attributeBinding(this, name, conditional)));\n\n    return maybeUpdateBindings(this, name, observable);\n  };\n\n  var checkboxEventType;\n  (function() {\n    // Attempt to feature-detect which event (change or click) is fired first\n    // for checkboxes.\n    var div = document.createElement('div');\n    var checkbox = div.appendChild(document.createElement('input'));\n    checkbox.setAttribute('type', 'checkbox');\n    var first;\n    var count = 0;\n    checkbox.addEventListener('click', function(e) {\n      count++;\n      first = first || 'click';\n    });\n    checkbox.addEventListener('change', function() {\n      count++;\n      first = first || 'change';\n    });\n\n    var event = document.createEvent('MouseEvent');\n    event.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false,\n        false, false, false, 0, null);\n    checkbox.dispatchEvent(event);\n    // WebKit/Blink don't fire the change event if the element is outside the\n    // document, so assume 'change' for that case.\n    checkboxEventType = count == 1 ? 'change' : first;\n  })();\n\n  function getEventForInputType(element) {\n    switch (element.type) {\n      case 'checkbox':\n        return checkboxEventType;\n      case 'radio':\n      case 'select-multiple':\n      case 'select-one':\n        return 'change';\n      case 'range':\n        if (/Trident|MSIE/.test(navigator.userAgent))\n          return 'change';\n      default:\n        return 'input';\n    }\n  }\n\n  function updateInput(input, property, value, santizeFn) {\n    input[property] = (santizeFn || sanitizeValue)(value);\n  }\n\n  function inputBinding(input, property, santizeFn) {\n    return function(value) {\n      return updateInput(input, property, value, santizeFn);\n    }\n  }\n\n  function noop() {}\n\n  function bindInputEvent(input, property, observable, postEventFn) {\n    var eventType = getEventForInputType(input);\n\n    function eventHandler() {\n      observable.setValue(input[property]);\n      observable.discardChanges();\n      (postEventFn || noop)(input);\n      Platform.performMicrotaskCheckpoint();\n    }\n    input.addEventListener(eventType, eventHandler);\n\n    return {\n      close: function() {\n        input.removeEventListener(eventType, eventHandler);\n        observable.close();\n      },\n\n      observable_: observable\n    }\n  }\n\n  function booleanSanitize(value) {\n    return Boolean(value);\n  }\n\n  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.\n  // Returns an array containing all radio buttons other than |element| that\n  // have the same |name|, either in the form that |element| belongs to or,\n  // if no form, in the document tree to which |element| belongs.\n  //\n  // This implementation is based upon the HTML spec definition of a\n  // \"radio button group\":\n  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group\n  //\n  function getAssociatedRadioButtons(element) {\n    if (element.form) {\n      return filter(element.form.elements, function(el) {\n        return el != element &&\n            el.tagName == 'INPUT' &&\n            el.type == 'radio' &&\n            el.name == element.name;\n      });\n    } else {\n      var treeScope = getTreeScope(element);\n      if (!treeScope)\n        return [];\n      var radios = treeScope.querySelectorAll(\n          'input[type=\"radio\"][name=\"' + element.name + '\"]');\n      return filter(radios, function(el) {\n        return el != element && !el.form;\n      });\n    }\n  }\n\n  function checkedPostEvent(input) {\n    // Only the radio button that is getting checked gets an event. We\n    // therefore find all the associated radio buttons and update their\n    // check binding manually.\n    if (input.tagName === 'INPUT' &&\n        input.type === 'radio') {\n      getAssociatedRadioButtons(input).forEach(function(radio) {\n        var checkedBinding = radio.bindings_.checked;\n        if (checkedBinding) {\n          // Set the value directly to avoid an infinite call stack.\n          checkedBinding.observable_.setValue(false);\n        }\n      });\n    }\n  }\n\n  HTMLInputElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value' && name !== 'checked')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;\n    var postEventFn = name == 'checked' ? checkedPostEvent : noop;\n\n    if (oneTime)\n      return updateInput(this, name, value, sanitizeFn);\n\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable, postEventFn);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    // Checkboxes may need to update bindings of other checkboxes.\n    return updateBindings(this, name, binding);\n  }\n\n  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateInput(this, 'value', value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateInput(this, 'value',\n                observable.open(inputBinding(this, 'value', sanitizeValue)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  function updateOption(option, value) {\n    var parentNode = option.parentNode;;\n    var select;\n    var selectBinding;\n    var oldValue;\n    if (parentNode instanceof HTMLSelectElement &&\n        parentNode.bindings_ &&\n        parentNode.bindings_.value) {\n      select = parentNode;\n      selectBinding = select.bindings_.value;\n      oldValue = select.value;\n    }\n\n    option.value = sanitizeValue(value);\n\n    if (select && select.value != oldValue) {\n      selectBinding.observable_.setValue(select.value);\n      selectBinding.observable_.discardChanges();\n      Platform.performMicrotaskCheckpoint();\n    }\n  }\n\n  function optionBinding(option) {\n    return function(value) {\n      updateOption(option, value);\n    }\n  }\n\n  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {\n    if (name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute('value');\n\n    if (oneTime)\n      return updateOption(this, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, 'value', observable);\n    updateOption(this, observable.open(optionBinding(this)));\n    return maybeUpdateBindings(this, name, binding);\n  }\n\n  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {\n    if (name === 'selectedindex')\n      name = 'selectedIndex';\n\n    if (name !== 'selectedIndex' && name !== 'value')\n      return HTMLElement.prototype.bind.call(this, name, value, oneTime);\n\n    this.removeAttribute(name);\n\n    if (oneTime)\n      return updateInput(this, name, value);\n\n    var observable = value;\n    var binding = bindInputEvent(this, name, observable);\n    updateInput(this, name,\n                observable.open(inputBinding(this, name)));\n\n    // Option update events may need to access select bindings.\n    return updateBindings(this, name, binding);\n  }\n})(this);\n\n// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  function assert(v) {\n    if (!v)\n      throw new Error('Assertion failed');\n  }\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  function getFragmentRoot(node) {\n    var p;\n    while (p = node.parentNode) {\n      node = p;\n    }\n\n    return node;\n  }\n\n  function searchRefId(node, id) {\n    if (!id)\n      return;\n\n    var ref;\n    var selector = '#' + id;\n    while (!ref) {\n      node = getFragmentRoot(node);\n\n      if (node.protoContent_)\n        ref = node.protoContent_.querySelector(selector);\n      else if (node.getElementById)\n        ref = node.getElementById(id);\n\n      if (ref || !node.templateCreator_)\n        break\n\n      node = node.templateCreator_;\n    }\n\n    return ref;\n  }\n\n  function getInstanceRoot(node) {\n    while (node.parentNode) {\n      node = node.parentNode;\n    }\n    return node.templateCreator_ ? node : null;\n  }\n\n  var Map;\n  if (global.Map && typeof global.Map.prototype.forEach === 'function') {\n    Map = global.Map;\n  } else {\n    Map = function() {\n      this.keys = [];\n      this.values = [];\n    };\n\n    Map.prototype = {\n      set: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0) {\n          this.keys.push(key);\n          this.values.push(value);\n        } else {\n          this.values[index] = value;\n        }\n      },\n\n      get: function(key) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return;\n\n        return this.values[index];\n      },\n\n      delete: function(key, value) {\n        var index = this.keys.indexOf(key);\n        if (index < 0)\n          return false;\n\n        this.keys.splice(index, 1);\n        this.values.splice(index, 1);\n        return true;\n      },\n\n      forEach: function(f, opt_this) {\n        for (var i = 0; i < this.keys.length; i++)\n          f.call(opt_this || this, this.values[i], this.keys[i], this);\n      }\n    };\n  }\n\n  // JScript does not have __proto__. We wrap all object literals with\n  // createObject which uses Object.create, Object.defineProperty and\n  // Object.getOwnPropertyDescriptor to create a new object that does the exact\n  // same thing. The main downside to this solution is that we have to extract\n  // all those property descriptors for IE.\n  var createObject = ('__proto__' in {}) ?\n      function(obj) { return obj; } :\n      function(obj) {\n        var proto = obj.__proto__;\n        if (!proto)\n          return obj;\n        var newObject = Object.create(proto);\n        Object.getOwnPropertyNames(obj).forEach(function(name) {\n          Object.defineProperty(newObject, name,\n                               Object.getOwnPropertyDescriptor(obj, name));\n        });\n        return newObject;\n      };\n\n  // IE does not support have Document.prototype.contains.\n  if (typeof document.contains != 'function') {\n    Document.prototype.contains = function(node) {\n      if (node === this || node.parentNode === this)\n        return true;\n      return this.documentElement.contains(node);\n    }\n  }\n\n  var BIND = 'bind';\n  var REPEAT = 'repeat';\n  var IF = 'if';\n\n  var templateAttributeDirectives = {\n    'template': true,\n    'repeat': true,\n    'bind': true,\n    'ref': true\n  };\n\n  var semanticTemplateElements = {\n    'THEAD': true,\n    'TBODY': true,\n    'TFOOT': true,\n    'TH': true,\n    'TR': true,\n    'TD': true,\n    'COLGROUP': true,\n    'COL': true,\n    'CAPTION': true,\n    'OPTION': true,\n    'OPTGROUP': true\n  };\n\n  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';\n  if (hasTemplateElement) {\n    // TODO(rafaelw): Remove when fix for\n    // https://codereview.chromium.org/164803002/\n    // makes it to Chrome release.\n    (function() {\n      var t = document.createElement('template');\n      var d = t.content.ownerDocument;\n      var html = d.appendChild(d.createElement('html'));\n      var head = html.appendChild(d.createElement('head'));\n      var base = d.createElement('base');\n      base.href = document.baseURI;\n      head.appendChild(base);\n    })();\n  }\n\n  var allTemplatesSelectors = 'template, ' +\n      Object.keys(semanticTemplateElements).map(function(tagName) {\n        return tagName.toLowerCase() + '[template]';\n      }).join(', ');\n\n  function isSVGTemplate(el) {\n    return el.tagName == 'template' &&\n           el.namespaceURI == 'http://www.w3.org/2000/svg';\n  }\n\n  function isHTMLTemplate(el) {\n    return el.tagName == 'TEMPLATE' &&\n           el.namespaceURI == 'http://www.w3.org/1999/xhtml';\n  }\n\n  function isAttributeTemplate(el) {\n    return Boolean(semanticTemplateElements[el.tagName] &&\n                   el.hasAttribute('template'));\n  }\n\n  function isTemplate(el) {\n    if (el.isTemplate_ === undefined)\n      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);\n\n    return el.isTemplate_;\n  }\n\n  // FIXME: Observe templates being added/removed from documents\n  // FIXME: Expose imperative API to decorate and observe templates in\n  // \"disconnected tress\" (e.g. ShadowRoot)\n  document.addEventListener('DOMContentLoaded', function(e) {\n    bootstrapTemplatesRecursivelyFrom(document);\n    // FIXME: Is this needed? Seems like it shouldn't be.\n    Platform.performMicrotaskCheckpoint();\n  }, false);\n\n  function forAllTemplatesFrom(node, fn) {\n    var subTemplates = node.querySelectorAll(allTemplatesSelectors);\n\n    if (isTemplate(node))\n      fn(node)\n    forEach(subTemplates, fn);\n  }\n\n  function bootstrapTemplatesRecursivelyFrom(node) {\n    function bootstrap(template) {\n      if (!HTMLTemplateElement.decorate(template))\n        bootstrapTemplatesRecursivelyFrom(template.content);\n    }\n\n    forAllTemplatesFrom(node, bootstrap);\n  }\n\n  if (!hasTemplateElement) {\n    /**\n     * This represents a <template> element.\n     * @constructor\n     * @extends {HTMLElement}\n     */\n    global.HTMLTemplateElement = function() {\n      throw TypeError('Illegal constructor');\n    };\n  }\n\n  var hasProto = '__proto__' in {};\n\n  function mixin(to, from) {\n    Object.getOwnPropertyNames(from).forEach(function(name) {\n      Object.defineProperty(to, name,\n                            Object.getOwnPropertyDescriptor(from, name));\n    });\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getOrCreateTemplateContentsOwner(template) {\n    var doc = template.ownerDocument\n    if (!doc.defaultView)\n      return doc;\n    var d = doc.templateContentsOwner_;\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      doc.templateContentsOwner_ = d;\n    }\n    return d;\n  }\n\n  function getTemplateStagingDocument(template) {\n    if (!template.stagingDocument_) {\n      var owner = template.ownerDocument;\n      if (!owner.stagingDocument_) {\n        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');\n        owner.stagingDocument_.isStagingDocument = true;\n        // TODO(rafaelw): Remove when fix for\n        // https://codereview.chromium.org/164803002/\n        // makes it to Chrome release.\n        var base = owner.stagingDocument_.createElement('base');\n        base.href = document.baseURI;\n        owner.stagingDocument_.head.appendChild(base);\n\n        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;\n      }\n\n      template.stagingDocument_ = owner.stagingDocument_;\n    }\n\n    return template.stagingDocument_;\n  }\n\n  // For non-template browsers, the parser will disallow <template> in certain\n  // locations, so we allow \"attribute templates\" which combine the template\n  // element with the top-level container node of the content, e.g.\n  //\n  //   <tr template repeat=\"{{ foo }}\"\" class=\"bar\"><td>Bar</td></tr>\n  //\n  // becomes\n  //\n  //   <template repeat=\"{{ foo }}\">\n  //   + #document-fragment\n  //     + <tr class=\"bar\">\n  //       + <td>Bar</td>\n  //\n  function extractTemplateFromAttributeTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      if (templateAttributeDirectives[attrib.name]) {\n        if (attrib.name !== 'template')\n          template.setAttribute(attrib.name, attrib.value);\n        el.removeAttribute(attrib.name);\n      }\n    }\n\n    return template;\n  }\n\n  function extractTemplateFromSVGTemplate(el) {\n    var template = el.ownerDocument.createElement('template');\n    el.parentNode.insertBefore(template, el);\n\n    var attribs = el.attributes;\n    var count = attribs.length;\n    while (count-- > 0) {\n      var attrib = attribs[count];\n      template.setAttribute(attrib.name, attrib.value);\n      el.removeAttribute(attrib.name);\n    }\n\n    el.parentNode.removeChild(el);\n    return template;\n  }\n\n  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {\n    var content = template.content;\n    if (useRoot) {\n      content.appendChild(el);\n      return;\n    }\n\n    var child;\n    while (child = el.firstChild) {\n      content.appendChild(child);\n    }\n  }\n\n  var templateObserver;\n  if (typeof MutationObserver == 'function') {\n    templateObserver = new MutationObserver(function(records) {\n      for (var i = 0; i < records.length; i++) {\n        records[i].target.refChanged_();\n      }\n    });\n  }\n\n  /**\n   * Ensures proper API and content model for template elements.\n   * @param {HTMLTemplateElement} opt_instanceRef The template element which\n   *     |el| template element will return as the value of its ref(), and whose\n   *     content will be used as source when createInstance() is invoked.\n   */\n  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {\n    if (el.templateIsDecorated_)\n      return false;\n\n    var templateElement = el;\n    templateElement.templateIsDecorated_ = true;\n\n    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&\n                               hasTemplateElement;\n    var bootstrapContents = isNativeHTMLTemplate;\n    var liftContents = !isNativeHTMLTemplate;\n    var liftRoot = false;\n\n    if (!isNativeHTMLTemplate) {\n      if (isAttributeTemplate(templateElement)) {\n        assert(!opt_instanceRef);\n        templateElement = extractTemplateFromAttributeTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n        liftRoot = true;\n      } else if (isSVGTemplate(templateElement)) {\n        templateElement = extractTemplateFromSVGTemplate(el);\n        templateElement.templateIsDecorated_ = true;\n        isNativeHTMLTemplate = hasTemplateElement;\n      }\n    }\n\n    if (!isNativeHTMLTemplate) {\n      fixTemplateElementPrototype(templateElement);\n      var doc = getOrCreateTemplateContentsOwner(templateElement);\n      templateElement.content_ = doc.createDocumentFragment();\n    }\n\n    if (opt_instanceRef) {\n      // template is contained within an instance, its direct content must be\n      // empty\n      templateElement.instanceRef_ = opt_instanceRef;\n    } else if (liftContents) {\n      liftNonNativeTemplateChildrenIntoContent(templateElement,\n                                               el,\n                                               liftRoot);\n    } else if (bootstrapContents) {\n      bootstrapTemplatesRecursivelyFrom(templateElement.content);\n    }\n\n    return true;\n  };\n\n  // TODO(rafaelw): This used to decorate recursively all templates from a given\n  // node. This happens by default on 'DOMContentLoaded', but may be needed\n  // in subtrees not descendent from document (e.g. ShadowRoot).\n  // Review whether this is the right public API.\n  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;\n\n  var htmlElement = global.HTMLUnknownElement || HTMLElement;\n\n  var contentDescriptor = {\n    get: function() {\n      return this.content_;\n    },\n    enumerable: true,\n    configurable: true\n  };\n\n  if (!hasTemplateElement) {\n    // Gecko is more picky with the prototype than WebKit. Make sure to use the\n    // same prototype as created in the constructor.\n    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);\n\n    Object.defineProperty(HTMLTemplateElement.prototype, 'content',\n                          contentDescriptor);\n  }\n\n  function fixTemplateElementPrototype(el) {\n    if (hasProto)\n      el.__proto__ = HTMLTemplateElement.prototype;\n    else\n      mixin(el, HTMLTemplateElement.prototype);\n  }\n\n  function ensureSetModelScheduled(template) {\n    if (!template.setModelFn_) {\n      template.setModelFn_ = function() {\n        template.setModelFnScheduled_ = false;\n        var map = getBindings(template,\n            template.delegate_ && template.delegate_.prepareBinding);\n        processBindings(template, map, template.model_);\n      };\n    }\n\n    if (!template.setModelFnScheduled_) {\n      template.setModelFnScheduled_ = true;\n      Observer.runEOM_(template.setModelFn_);\n    }\n  }\n\n  mixin(HTMLTemplateElement.prototype, {\n    bind: function(name, value, oneTime) {\n      if (name != 'ref')\n        return Element.prototype.bind.call(this, name, value, oneTime);\n\n      var self = this;\n      var ref = oneTime ? value : value.open(function(ref) {\n        self.setAttribute('ref', ref);\n        self.refChanged_();\n      });\n\n      this.setAttribute('ref', ref);\n      this.refChanged_();\n      if (oneTime)\n        return;\n\n      if (!this.bindings_) {\n        this.bindings_ = { ref: value };\n      } else {\n        this.bindings_.ref = value;\n      }\n\n      return value;\n    },\n\n    processBindingDirectives_: function(directives) {\n      if (this.iterator_)\n        this.iterator_.closeDeps();\n\n      if (!directives.if && !directives.bind && !directives.repeat) {\n        if (this.iterator_) {\n          this.iterator_.close();\n          this.iterator_ = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n      }\n\n      this.iterator_.updateDependencies(directives, this.model_);\n\n      if (templateObserver) {\n        templateObserver.observe(this, { attributes: true,\n                                         attributeFilter: ['ref'] });\n      }\n\n      return this.iterator_;\n    },\n\n    createInstance: function(model, bindingDelegate, delegate_) {\n      if (bindingDelegate)\n        delegate_ = this.newDelegate_(bindingDelegate);\n      else if (!delegate_)\n        delegate_ = this.delegate_;\n\n      if (!this.refContent_)\n        this.refContent_ = this.ref_.content;\n      var content = this.refContent_;\n      if (content.firstChild === null)\n        return emptyInstance;\n\n      var map = getInstanceBindingMap(content, delegate_);\n      var stagingDocument = getTemplateStagingDocument(this);\n      var instance = stagingDocument.createDocumentFragment();\n      instance.templateCreator_ = this;\n      instance.protoContent_ = content;\n      instance.bindings_ = [];\n      instance.terminator_ = null;\n      var instanceRecord = instance.templateInstance_ = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      var collectTerminator = false;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        // The terminator of the instance is the clone of the last child of the\n        // content. If the last child is an active template, it may produce\n        // instances as a result of production, so simply collecting the last\n        // child of the instance after it has finished producing may be wrong.\n        if (child.nextSibling === null)\n          collectTerminator = true;\n\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instance.bindings_);\n        clone.templateInstance_ = instanceRecord;\n        if (collectTerminator)\n          instance.terminator_ = clone;\n      }\n\n      instanceRecord.firstNode = instance.firstChild;\n      instanceRecord.lastNode = instance.lastChild;\n      instance.templateCreator_ = undefined;\n      instance.protoContent_ = undefined;\n      return instance;\n    },\n\n    get model() {\n      return this.model_;\n    },\n\n    set model(model) {\n      this.model_ = model;\n      ensureSetModelScheduled(this);\n    },\n\n    get bindingDelegate() {\n      return this.delegate_ && this.delegate_.raw;\n    },\n\n    refChanged_: function() {\n      if (!this.iterator_ || this.refContent_ === this.ref_.content)\n        return;\n\n      this.refContent_ = undefined;\n      this.iterator_.valueChanged();\n      this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());\n    },\n\n    clear: function() {\n      this.model_ = undefined;\n      this.delegate_ = undefined;\n      if (this.bindings_ && this.bindings_.ref)\n        this.bindings_.ref.close()\n      this.refContent_ = undefined;\n      if (!this.iterator_)\n        return;\n      this.iterator_.valueChanged();\n      this.iterator_.close()\n      this.iterator_ = undefined;\n    },\n\n    setDelegate_: function(delegate) {\n      this.delegate_ = delegate;\n      this.bindingMap_ = undefined;\n      if (this.iterator_) {\n        this.iterator_.instancePositionChangedFn_ = undefined;\n        this.iterator_.instanceModelFn_ = undefined;\n      }\n    },\n\n    newDelegate_: function(bindingDelegate) {\n      if (!bindingDelegate)\n        return;\n\n      function delegateFn(name) {\n        var fn = bindingDelegate && bindingDelegate[name];\n        if (typeof fn != 'function')\n          return;\n\n        return function() {\n          return fn.apply(bindingDelegate, arguments);\n        };\n      }\n\n      return {\n        bindingMaps: {},\n        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    set bindingDelegate(bindingDelegate) {\n      if (this.delegate_) {\n        throw Error('Template must be cleared before a new bindingDelegate ' +\n                    'can be assigned');\n      }\n\n      this.setDelegate_(this.newDelegate_(bindingDelegate));\n    },\n\n    get ref_() {\n      var ref = searchRefId(this, this.getAttribute('ref'));\n      if (!ref)\n        ref = this.instanceRef_;\n\n      if (!ref)\n        return this;\n\n      var nextRef = ref.ref_;\n      return nextRef ? nextRef : ref;\n    }\n  });\n\n  // Returns\n  //   a) undefined if there are no mustaches.\n  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.\n  function parseMustaches(s, name, node, prepareBindingFn) {\n    if (!s || !s.length)\n      return;\n\n    var tokens;\n    var length = s.length;\n    var startIndex = 0, lastIndex = 0, endIndex = 0;\n    var onlyOneTime = true;\n    while (lastIndex < length) {\n      var startIndex = s.indexOf('{{', lastIndex);\n      var oneTimeStart = s.indexOf('[[', lastIndex);\n      var oneTime = false;\n      var terminator = '}}';\n\n      if (oneTimeStart >= 0 &&\n          (startIndex < 0 || oneTimeStart < startIndex)) {\n        startIndex = oneTimeStart;\n        oneTime = true;\n        terminator = ']]';\n      }\n\n      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);\n\n      if (endIndex < 0) {\n        if (!tokens)\n          return;\n\n        tokens.push(s.slice(lastIndex)); // TEXT\n        break;\n      }\n\n      tokens = tokens || [];\n      tokens.push(s.slice(lastIndex, startIndex)); // TEXT\n      var pathString = s.slice(startIndex + 2, endIndex).trim();\n      tokens.push(oneTime); // ONE_TIME?\n      onlyOneTime = onlyOneTime && oneTime;\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\n      // Don't try to parse the expression if there's a prepareBinding function\n      if (delegateFn == null) {\n        tokens.push(Path.get(pathString)); // PATH\n      } else {\n        tokens.push(null);\n      }\n      tokens.push(delegateFn); // DELEGATE_FN\n      lastIndex = endIndex + 2;\n    }\n\n    if (lastIndex === length)\n      tokens.push(''); // TEXT\n\n    tokens.hasOnePath = tokens.length === 5;\n    tokens.isSimplePath = tokens.hasOnePath &&\n                          tokens[0] == '' &&\n                          tokens[4] == '';\n    tokens.onlyOneTime = onlyOneTime;\n\n    tokens.combinator = function(values) {\n      var newValue = tokens[0];\n\n      for (var i = 1; i < tokens.length; i += 4) {\n        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];\n        if (value !== undefined)\n          newValue += value;\n        newValue += tokens[i + 3];\n      }\n\n      return newValue;\n    }\n\n    return tokens;\n  };\n\n  function processOneTimeBinding(name, tokens, node, model) {\n    if (tokens.hasOnePath) {\n      var delegateFn = tokens[3];\n      var value = delegateFn ? delegateFn(model, node, true) :\n                               tokens[2].getValueFrom(model);\n      return tokens.isSimplePath ? value : tokens.combinator(value);\n    }\n\n    var values = [];\n    for (var i = 1; i < tokens.length; i += 4) {\n      var delegateFn = tokens[i + 2];\n      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :\n          tokens[i + 1].getValueFrom(model);\n    }\n\n    return tokens.combinator(values);\n  }\n\n  function processSinglePathBinding(name, tokens, node, model) {\n    var delegateFn = tokens[3];\n    var observer = delegateFn ? delegateFn(model, node, false) :\n        new PathObserver(model, tokens[2]);\n\n    return tokens.isSimplePath ? observer :\n        new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBinding(name, tokens, node, model) {\n    if (tokens.onlyOneTime)\n      return processOneTimeBinding(name, tokens, node, model);\n\n    if (tokens.hasOnePath)\n      return processSinglePathBinding(name, tokens, node, model);\n\n    var observer = new CompoundObserver();\n\n    for (var i = 1; i < tokens.length; i += 4) {\n      var oneTime = tokens[i];\n      var delegateFn = tokens[i + 2];\n\n      if (delegateFn) {\n        var value = delegateFn(model, node, oneTime);\n        if (oneTime)\n          observer.addPath(value)\n        else\n          observer.addObserver(value);\n        continue;\n      }\n\n      var path = tokens[i + 1];\n      if (oneTime)\n        observer.addPath(path.getValueFrom(model))\n      else\n        observer.addPath(model, path);\n    }\n\n    return new ObserverTransform(observer, tokens.combinator);\n  }\n\n  function processBindings(node, bindings, model, instanceBindings) {\n    for (var i = 0; i < bindings.length; i += 2) {\n      var name = bindings[i]\n      var tokens = bindings[i + 1];\n      var value = processBinding(name, tokens, node, model);\n      var binding = node.bind(name, value, tokens.onlyOneTime);\n      if (binding && instanceBindings)\n        instanceBindings.push(binding);\n    }\n\n    node.bindFinished();\n    if (!bindings.isTemplate)\n      return;\n\n    node.model_ = model;\n    var iter = node.processBindingDirectives_(bindings);\n    if (instanceBindings && iter)\n      instanceBindings.push(iter);\n  }\n\n  function parseWithDefault(el, name, prepareBindingFn) {\n    var v = el.getAttribute(name);\n    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);\n  }\n\n  function parseAttributeBindings(element, prepareBindingFn) {\n    assert(element);\n\n    var bindings = [];\n    var ifFound = false;\n    var bindFound = false;\n\n    for (var i = 0; i < element.attributes.length; i++) {\n      var attr = element.attributes[i];\n      var name = attr.name;\n      var value = attr.value;\n\n      // Allow bindings expressed in attributes to be prefixed with underbars.\n      // We do this to allow correct semantics for browsers that don't implement\n      // <template> where certain attributes might trigger side-effects -- and\n      // for IE which sanitizes certain attributes, disallowing mustache\n      // replacements in their text.\n      while (name[0] === '_') {\n        name = name.substring(1);\n      }\n\n      if (isTemplate(element) &&\n          (name === IF || name === BIND || name === REPEAT)) {\n        continue;\n      }\n\n      var tokens = parseMustaches(value, name, element,\n                                  prepareBindingFn);\n      if (!tokens)\n        continue;\n\n      bindings.push(name, tokens);\n    }\n\n    if (isTemplate(element)) {\n      bindings.isTemplate = true;\n      bindings.if = parseWithDefault(element, IF, prepareBindingFn);\n      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);\n      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);\n\n      if (bindings.if && !bindings.bind && !bindings.repeat)\n        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);\n    }\n\n    return bindings;\n  }\n\n  function getBindings(node, prepareBindingFn) {\n    if (node.nodeType === Node.ELEMENT_NODE)\n      return parseAttributeBindings(node, prepareBindingFn);\n\n    if (node.nodeType === Node.TEXT_NODE) {\n      var tokens = parseMustaches(node.data, 'textContent', node,\n                                  prepareBindingFn);\n      if (tokens)\n        return ['textContent', tokens];\n    }\n\n    return [];\n  }\n\n  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,\n                                delegate,\n                                instanceBindings,\n                                instanceRecord) {\n    var clone = parent.appendChild(stagingDocument.importNode(node, false));\n\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      cloneAndBindInstance(child, clone, stagingDocument,\n                            bindings.children[i++],\n                            model,\n                            delegate,\n                            instanceBindings);\n    }\n\n    if (bindings.isTemplate) {\n      HTMLTemplateElement.decorate(clone, node);\n      if (delegate)\n        clone.setDelegate_(delegate);\n    }\n\n    processBindings(clone, bindings, model, instanceBindings);\n    return clone;\n  }\n\n  function createInstanceBindingMap(node, prepareBindingFn) {\n    var map = getBindings(node, prepareBindingFn);\n    map.children = {};\n    var index = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);\n    }\n\n    return map;\n  }\n\n  var contentUidCounter = 1;\n\n  // TODO(rafaelw): Setup a MutationObserver on content which clears the id\n  // so that bindingMaps regenerate when the template.content changes.\n  function getContentUid(content) {\n    var id = content.id_;\n    if (!id)\n      id = content.id_ = contentUidCounter++;\n    return id;\n  }\n\n  // Each delegate is associated with a set of bindingMaps, one for each\n  // content which may be used by a template. The intent is that each binding\n  // delegate gets the opportunity to prepare the instance (via the prepare*\n  // delegate calls) once across all uses.\n  // TODO(rafaelw): Separate out the parse map from the binding map. In the\n  // current implementation, if two delegates need a binding map for the same\n  // content, the second will have to reparse.\n  function getInstanceBindingMap(content, delegate_) {\n    var contentId = getContentUid(content);\n    if (delegate_) {\n      var map = delegate_.bindingMaps[contentId];\n      if (!map) {\n        map = delegate_.bindingMaps[contentId] =\n            createInstanceBindingMap(content, delegate_.prepareBinding) || [];\n      }\n      return map;\n    }\n\n    var map = content.bindingMap_;\n    if (!map) {\n      map = content.bindingMap_ =\n          createInstanceBindingMap(content, undefined) || [];\n    }\n    return map;\n  }\n\n  Object.defineProperty(Node.prototype, 'templateInstance', {\n    get: function() {\n      var instance = this.templateInstance_;\n      return instance ? instance :\n          (this.parentNode ? this.parentNode.templateInstance : undefined);\n    }\n  });\n\n  var emptyInstance = document.createDocumentFragment();\n  emptyInstance.bindings_ = [];\n  emptyInstance.terminator_ = null;\n\n  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n    this.instances = [];\n    this.deps = undefined;\n    this.iteratedValue = [];\n    this.presentValue = undefined;\n    this.arrayObserver = undefined;\n  }\n\n  TemplateIterator.prototype = {\n    closeDeps: function() {\n      var deps = this.deps;\n      if (deps) {\n        if (deps.ifOneTime === false)\n          deps.ifValue.close();\n        if (deps.oneTime === false)\n          deps.value.close();\n      }\n    },\n\n    updateDependencies: function(directives, model) {\n      this.closeDeps();\n\n      var deps = this.deps = {};\n      var template = this.templateElement_;\n\n      var ifValue = true;\n      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        ifValue = deps.ifValue;\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !ifValue) {\n          this.valueChanged();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          ifValue = ifValue.open(this.updateIfValue, this);\n      }\n\n      if (directives.repeat) {\n        deps.repeat = true;\n        deps.oneTime = directives.repeat.onlyOneTime;\n        deps.value = processBinding(REPEAT, directives.repeat, template, model);\n      } else {\n        deps.repeat = false;\n        deps.oneTime = directives.bind.onlyOneTime;\n        deps.value = processBinding(BIND, directives.bind, template, model);\n      }\n\n      var value = deps.value;\n      if (!deps.oneTime)\n        value = value.open(this.updateIteratedValue, this);\n\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(value);\n    },\n\n    /**\n     * Gets the updated value of the bind/repeat. This can potentially call\n     * user code (if a bindingDelegate is set up) so we try to avoid it if we\n     * already have the value in hand (from Observer.open).\n     */\n    getUpdatedValue: function() {\n      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\n      return value;\n    },\n\n    updateIfValue: function(ifValue) {\n      if (!ifValue) {\n        this.valueChanged();\n        return;\n      }\n\n      this.updateValue(this.getUpdatedValue());\n    },\n\n    updateIteratedValue: function(value) {\n      if (this.deps.hasIf) {\n        var ifValue = this.deps.ifValue;\n        if (!this.deps.ifOneTime)\n          ifValue = ifValue.discardChanges();\n        if (!ifValue) {\n          this.valueChanged();\n          return;\n        }\n      }\n\n      this.updateValue(value);\n    },\n\n    updateValue: function(value) {\n      if (!this.deps.repeat)\n        value = [value];\n      var observe = this.deps.repeat &&\n                    !this.deps.oneTime &&\n                    Array.isArray(value);\n      this.valueChanged(value, observe);\n    },\n\n    valueChanged: function(value, observeValue) {\n      if (!Array.isArray(value))\n        value = [];\n\n      if (value === this.iteratedValue)\n        return;\n\n      this.unobserve();\n      this.presentValue = value;\n      if (observeValue) {\n        this.arrayObserver = new ArrayObserver(this.presentValue);\n        this.arrayObserver.open(this.handleSplices, this);\n      }\n\n      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,\n                                                        this.iteratedValue));\n    },\n\n    getLastInstanceNode: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var instance = this.instances[index];\n      var terminator = instance.terminator_;\n      if (!terminator)\n        return this.getLastInstanceNode(index - 1);\n\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subtemplateIterator = terminator.iterator_;\n      if (!subtemplateIterator)\n        return terminator;\n\n      return subtemplateIterator.getLastTemplateNode();\n    },\n\n    getLastTemplateNode: function() {\n      return this.getLastInstanceNode(this.instances.length - 1);\n    },\n\n    insertInstanceAt: function(index, fragment) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var parent = this.templateElement_.parentNode;\n      this.instances.splice(index, 0, fragment);\n\n      parent.insertBefore(fragment, previousInstanceLast.nextSibling);\n    },\n\n    extractInstanceAt: function(index) {\n      var previousInstanceLast = this.getLastInstanceNode(index - 1);\n      var lastNode = this.getLastInstanceNode(index);\n      var parent = this.templateElement_.parentNode;\n      var instance = this.instances.splice(index, 1)[0];\n\n      while (lastNode !== previousInstanceLast) {\n        var node = previousInstanceLast.nextSibling;\n        if (node == lastNode)\n          lastNode = previousInstanceLast;\n\n        instance.appendChild(parent.removeChild(node));\n      }\n\n      return instance;\n    },\n\n    getDelegateFn: function(fn) {\n      fn = fn && fn(this.templateElement_);\n      return typeof fn === 'function' ? fn : null;\n    },\n\n    handleSplices: function(splices) {\n      if (this.closed || !splices.length)\n        return;\n\n      var template = this.templateElement_;\n\n      if (!template.parentNode) {\n        this.close();\n        return;\n      }\n\n      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,\n                                 splices);\n\n      var delegate = template.delegate_;\n      if (this.instanceModelFn_ === undefined) {\n        this.instanceModelFn_ =\n            this.getDelegateFn(delegate && delegate.prepareInstanceModel);\n      }\n\n      if (this.instancePositionChangedFn_ === undefined) {\n        this.instancePositionChangedFn_ =\n            this.getDelegateFn(delegate &&\n                               delegate.prepareInstancePositionChanged);\n      }\n\n      // Instance Removals\n      var instanceCache = new Map;\n      var removeDelta = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var removed = splice.removed;\n        for (var j = 0; j < removed.length; j++) {\n          var model = removed[j];\n          var instance = this.extractInstanceAt(splice.index + removeDelta);\n          if (instance !== emptyInstance) {\n            instanceCache.set(model, instance);\n          }\n        }\n\n        removeDelta -= splice.addedCount;\n      }\n\n      // Instance Insertions\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var instance = instanceCache.get(model);\n          if (instance) {\n            instanceCache.delete(model);\n          } else {\n            if (this.instanceModelFn_) {\n              model = this.instanceModelFn_(model);\n            }\n\n            if (model === undefined) {\n              instance = emptyInstance;\n            } else {\n              instance = template.createInstance(model, undefined, delegate);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, instance);\n        }\n      }\n\n      instanceCache.forEach(function(instance) {\n        this.closeInstanceBindings(instance);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var instance = this.instances[index];\n      if (instance === emptyInstance)\n        return;\n\n      this.instancePositionChangedFn_(instance.templateInstance_, index);\n    },\n\n    reportInstancesMoved: function(splices) {\n      var index = 0;\n      var offset = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        if (offset != 0) {\n          while (index < splice.index) {\n            this.reportInstanceMoved(index);\n            index++;\n          }\n        } else {\n          index = splice.index;\n        }\n\n        while (index < splice.index + splice.addedCount) {\n          this.reportInstanceMoved(index);\n          index++;\n        }\n\n        offset += splice.addedCount - splice.removed.length;\n      }\n\n      if (offset == 0)\n        return;\n\n      var length = this.instances.length;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instance) {\n      var bindings = instance.bindings_;\n      for (var i = 0; i < bindings.length; i++) {\n        bindings[i].close();\n      }\n    },\n\n    unobserve: function() {\n      if (!this.arrayObserver)\n        return;\n\n      this.arrayObserver.close();\n      this.arrayObserver = undefined;\n    },\n\n    close: function() {\n      if (this.closed)\n        return;\n      this.unobserve();\n      for (var i = 0; i < this.instances.length; i++) {\n        this.closeInstanceBindings(this.instances[i]);\n      }\n\n      this.instances.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = {\n  resolveDom: function(root, url) {\n    url = url || root.ownerDocument.baseURI;\n    this.resolveAttributes(root, url);\n    this.resolveStyles(root, url);\n    // handle template.content\n    var templates = root.querySelectorAll('template');\n    if (templates) {\n      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {\n        if (t.content) {\n          this.resolveDom(t.content, url);\n        }\n      }\n    }\n  },\n  resolveTemplate: function(template) {\n    this.resolveDom(template.content, template.ownerDocument.baseURI);\n  },\n  resolveStyles: function(root, url) {\n    var styles = root.querySelectorAll('style');\n    if (styles) {\n      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {\n        this.resolveStyle(s, url);\n      }\n    }\n  },\n  resolveStyle: function(style, url) {\n    url = url || style.ownerDocument.baseURI;\n    style.textContent = this.resolveCssText(style.textContent, url);\n  },\n  resolveCssText: function(cssText, baseUrl, keepAbsolute) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);\n  },\n  resolveAttributes: function(root, url) {\n    if (root.hasAttributes && root.hasAttributes()) {\n      this.resolveElementAttributes(root, url);\n    }\n    // search for attributes that host urls\n    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);\n    if (nodes) {\n      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {\n        this.resolveElementAttributes(n, url);\n      }\n    }\n  },\n  resolveElementAttributes: function(node, url) {\n    url = url || node.ownerDocument.baseURI;\n    URL_ATTRS.forEach(function(v) {\n      var attr = node.attributes[v];\n      var value = attr && attr.value;\n      var replacement;\n      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {\n        if (v === 'style') {\n          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);\n        } else {\n          replacement = resolveRelativeUrl(url, value);\n        }\n        attr.value = replacement;\n      }\n    });\n  }\n};\n\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\nvar URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url, keepAbsolute) {\n  // do not resolve '/' absolute urls\n  if (url && url[0] === '/') {\n    return url;\n  }\n  var u = new URL(url, baseUrl);\n  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = new URL(document.baseURI);\n  var u = new URL(url, root);\n  if (u.host === root.host && u.port === root.port &&\n      u.protocol === root.protocol) {\n    return makeRelPath(root, u);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(sourceUrl, targetUrl) {\n  var source = sourceUrl.pathname;\n  var target = targetUrl.pathname;\n  var s = source.split('/');\n  var t = target.split('/');\n  while (s.length && s[0] === t[0]){\n    s.shift();\n    t.shift();\n  }\n  for (var i = 0, l = s.length - 1; i < l; i++) {\n    t.unshift('..');\n  }\n  return t.join('/') + targetUrl.search + targetUrl.hash;\n}\n\n// exports\nscope.urlResolver = urlResolver;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var endOfMicrotask = Platform.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.cache = Object.create(null);\n    this.map = Object.create(null);\n    this.requests = 0;\n    this.regex = regex;\n  }\n  Loader.prototype = {\n\n    // TODO(dfreedm): there may be a better factoring here\n    // extract absolute urls from the text (full of relative urls)\n    extractUrls: function(text, base) {\n      var matches = [];\n      var matched, u;\n      while ((matched = this.regex.exec(text))) {\n        u = new URL(matched[1], base);\n        matches.push({matched: matched[0], url: u.href});\n      }\n      return matches;\n    },\n    // take a text blob, a root url, and a callback and load all the urls found within the text\n    // returns a map of absolute url to text\n    process: function(text, root, callback) {\n      var matches = this.extractUrls(text, root);\n\n      // every call to process returns all the text this loader has ever received\n      var done = callback.bind(null, this.map);\n      this.fetch(matches, done);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback();\n      }\n\n      // wait for all subrequests to return\n      var done = function() {\n        if (--inflight === 0) {\n          callback();\n        }\n      };\n\n      // start fetching all subrequests\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        req = this.cache[url];\n        // if this url has already been requested, skip requesting it again\n        if (!req) {\n          req = this.xhr(url);\n          req.match = m;\n          this.cache[url] = req;\n        }\n        // wait for the request to process its subrequests\n        req.wait(done);\n      }\n    },\n    handleXhr: function(request) {\n      var match = request.match;\n      var url = match.url;\n\n      // handle errors with an empty string\n      var response = request.response || request.responseText || '';\n      this.map[url] = response;\n      this.fetch(this.extractUrls(response, url), request.resolve);\n    },\n    xhr: function(url) {\n      this.requests++;\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onerror = request.onload = this.handleXhr.bind(this, request);\n\n      // queue of tasks to run after XHR returns\n      request.pending = [];\n      request.resolve = function() {\n        var pending = request.pending;\n        for(var i = 0; i < pending.length; i++) {\n          pending[i]();\n        }\n        request.pending = null;\n      };\n\n      // if we have already resolved, pending is null, async call the callback\n      request.wait = function(fn) {\n        if (request.pending) {\n          request.pending.push(fn);\n        } else {\n          endOfMicrotask(fn);\n        }\n      };\n\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar urlResolver = scope.urlResolver;\nvar Loader = scope.Loader;\n\nfunction StyleResolver() {\n  this.loader = new Loader(this.regex);\n}\nStyleResolver.prototype = {\n  regex: /@import\\s+(?:url)?[\"'\\(]*([^'\"\\)]*)['\"\\)]*;/g,\n  // Recursively replace @imports with the text at that url\n  resolve: function(text, url, callback) {\n    var done = function(map) {\n      callback(this.flatten(text, url, map));\n    }.bind(this);\n    this.loader.process(text, url, done);\n  },\n  // resolve the textContent of a style node\n  resolveNode: function(style, url, callback) {\n    var text = style.textContent;\n    var done = function(text) {\n      style.textContent = text;\n      callback(style);\n    };\n    this.resolve(text, url, done);\n  },\n  // flatten all the @imports to text\n  flatten: function(text, base, map) {\n    var matches = this.loader.extractUrls(text, base);\n    var match, url, intermediate;\n    for (var i = 0; i < matches.length; i++) {\n      match = matches[i];\n      url = match.url;\n      // resolve any css text to be relative to the importer, keep absolute url\n      intermediate = urlResolver.resolveCssText(map[url], url, true);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, base, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, base, callback) {\n    var loaded=0, l = styles.length;\n    // called in the context of the style\n    function loadedStyle(style) {\n      loaded++;\n      if (loaded === l && callback) {\n        callback();\n      }\n    }\n    for (var i=0, s; (i<l) && (s=styles[i]); i++) {\n      this.resolveNode(s, base, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // copy own properties from 'api' to 'prototype, with name hinting for 'super'\n  function extend(prototype, api) {\n    if (prototype && api) {\n      // use only own properties of 'api'\n      Object.getOwnPropertyNames(api).forEach(function(n) {\n        // acquire property descriptor\n        var pd = Object.getOwnPropertyDescriptor(api, n);\n        if (pd) {\n          // clone property via descriptor\n          Object.defineProperty(prototype, n, pd);\n          // cache name-of-method for 'super' engine\n          if (typeof pd.value == 'function') {\n            // hint the 'super' engine\n            pd.value.nom = n;\n          }\n        }\n      });\n    }\n    return prototype;\n  }\n\n\n  // mixin\n\n  // copy all properties from inProps (et al) to inObj\n  function mixin(inObj/*, inProps, inMoreProps, ...*/) {\n    var obj = inObj || {};\n    for (var i = 1; i < arguments.length; i++) {\n      var p = arguments[i];\n      try {\n        for (var n in p) {\n          copyProperty(n, p, obj);\n        }\n      } catch(x) {\n      }\n    }\n    return obj;\n  }\n\n  // copy property inName from inSource object to inTarget object\n  function copyProperty(inName, inSource, inTarget) {\n    var pd = getPropertyDescriptor(inSource, inName);\n    Object.defineProperty(inTarget, inName, pd);\n  }\n\n  // get property descriptor for inName on inObject, even if\n  // inName exists on some link in inObject's prototype chain\n  function getPropertyDescriptor(inObject, inName) {\n    if (inObject) {\n      var pd = Object.getOwnPropertyDescriptor(inObject, inName);\n      return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);\n    }\n  }\n\n  // exports\n\n  scope.extend = extend;\n  scope.mixin = mixin;\n\n  // for bc\n  Platform.mixin = mixin;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  \n  // usage\n  \n  // invoke cb.call(this) in 100ms, unless the job is re-registered,\n  // which resets the timer\n  // \n  // this.myJob = this.job(this.myJob, cb, 100)\n  //\n  // returns a job handle which can be used to re-register a job\n\n  var Job = function(inContext) {\n    this.context = inContext;\n    this.boundComplete = this.complete.bind(this)\n  };\n  Job.prototype = {\n    go: function(callback, wait) {\n      this.callback = callback;\n      var h;\n      if (!wait) {\n        h = requestAnimationFrame(this.boundComplete);\n        this.handle = function() {\n          cancelAnimationFrame(h);\n        }\n      } else {\n        h = setTimeout(this.boundComplete, wait);\n        this.handle = function() {\n          clearTimeout(h);\n        }\n      }\n    },\n    stop: function() {\n      if (this.handle) {\n        this.handle();\n        this.handle = null;\n      }\n    },\n    complete: function() {\n      if (this.handle) {\n        this.stop();\n        this.callback.call(this.context);\n      }\n    }\n  };\n  \n  function job(job, callback, wait) {\n    if (job) {\n      job.stop();\n    } else {\n      job = new Job(this);\n    }\n    job.go(callback, wait);\n    return job;\n  }\n  \n  // exports \n\n  scope.job = job;\n  \n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var registry = {};\n\n  HTMLElement.register = function(tag, prototype) {\n    registry[tag] = prototype;\n  }\n\n  // get prototype mapped to node <tag>\n  HTMLElement.getPrototypeForTag = function(tag) {\n    var prototype = !tag ? HTMLElement.prototype : registry[tag];\n    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects\n    return prototype || Object.getPrototypeOf(document.createElement(tag));\n  };\n\n  // we have to flag propagation stoppage for the event dispatcher\n  var originalStopPropagation = Event.prototype.stopPropagation;\n  Event.prototype.stopPropagation = function() {\n    this.cancelBubble = true;\n    originalStopPropagation.apply(this, arguments);\n  };\n  \n  \n  // polyfill DOMTokenList\n  // * add/remove: allow these methods to take multiple classNames\n  // * toggle: add a 2nd argument which forces the given state rather\n  //  than toggling.\n\n  var add = DOMTokenList.prototype.add;\n  var remove = DOMTokenList.prototype.remove;\n  DOMTokenList.prototype.add = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      add.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.remove = function() {\n    for (var i = 0; i < arguments.length; i++) {\n      remove.call(this, arguments[i]);\n    }\n  };\n  DOMTokenList.prototype.toggle = function(name, bool) {\n    if (arguments.length == 1) {\n      bool = !this.contains(name);\n    }\n    bool ? this.add(name) : this.remove(name);\n  };\n  DOMTokenList.prototype.switch = function(oldName, newName) {\n    oldName && this.remove(oldName);\n    newName && this.add(newName);\n  };\n\n  // add array() to NodeList, NamedNodeMap, HTMLCollection\n\n  var ArraySlice = function() {\n    return Array.prototype.slice.call(this);\n  };\n\n  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});\n\n  NodeList.prototype.array = ArraySlice;\n  namedNodeMap.prototype.array = ArraySlice;\n  HTMLCollection.prototype.array = ArraySlice;\n\n  // utility\n\n  function createDOM(inTagOrNode, inHTML, inAttrs) {\n    var dom = typeof inTagOrNode == 'string' ?\n        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);\n    dom.innerHTML = inHTML;\n    if (inAttrs) {\n      for (var n in inAttrs) {\n        dom.setAttribute(n, inAttrs[n]);\n      }\n    }\n    return dom;\n  }\n\n  // exports\n\n  scope.createDOM = createDOM;\n\n})(Polymer);\n\n/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n (function(scope) {\r\n    // super\r\n\r\n    // `arrayOfArgs` is an optional array of args like one might pass\r\n    // to `Function.apply`\r\n\r\n    // TODO(sjmiles):\r\n    //    $super must be installed on an instance or prototype chain\r\n    //    as `super`, and invoked via `this`, e.g.\r\n    //      `this.super();`\r\n\r\n    //    will not work if function objects are not unique, for example,\r\n    //    when using mixins.\r\n    //    The memoization strategy assumes each function exists on only one \r\n    //    prototype chain i.e. we use the function object for memoizing)\r\n    //    perhaps we can bookkeep on the prototype itself instead\r\n    function $super(arrayOfArgs) {\r\n      // since we are thunking a method call, performance is important here: \r\n      // memoize all lookups, once memoized the fast path calls no other \r\n      // functions\r\n      //\r\n      // find the caller (cannot be `strict` because of 'caller')\r\n      var caller = $super.caller;\r\n      // memoized 'name of method' \r\n      var nom = caller.nom;\r\n      // memoized next implementation prototype\r\n      var _super = caller._super;\r\n      if (!_super) {\r\n        if (!nom) {\r\n          nom = caller.nom = nameInThis.call(this, caller);\r\n        }\r\n        if (!nom) {\r\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\r\n        }\r\n        // super prototype is either cached or we have to find it\r\n        // by searching __proto__ (at the 'top')\r\n        // invariant: because we cache _super on fn below, we never reach \r\n        // here from inside a series of calls to super(), so it's ok to \r\n        // start searching from the prototype of 'this' (at the 'top')\r\n        // we must never memoize a null super for this reason\r\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\r\n      }\r\n      // our super function\r\n      var fn = _super[nom];\r\n      if (fn) {\r\n        // memoize information so 'fn' can call 'super'\r\n        if (!fn._super) {\r\n          // must not memoize null, or we lose our invariant above\r\n          memoizeSuper(fn, nom, _super);\r\n        }\r\n        // invoke the inherited method\r\n        // if 'fn' is not function valued, this will throw\r\n        return fn.apply(this, arrayOfArgs || []);\r\n      }\r\n    }\r\n\r\n    function nameInThis(value) {\r\n      var p = this.__proto__;\r\n      while (p && p !== HTMLElement.prototype) {\r\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\r\n        var n$ = Object.getOwnPropertyNames(p);\r\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\r\n          var d = Object.getOwnPropertyDescriptor(p, n);\r\n          if (typeof d.value === 'function' && d.value === value) {\r\n            return n;\r\n          }\r\n        }\r\n        p = p.__proto__;\r\n      }\r\n    }\r\n\r\n    function memoizeSuper(method, name, proto) {\r\n      // find and cache next prototype containing `name`\r\n      // we need the prototype so we can do another lookup\r\n      // from here\r\n      var s = nextSuper(proto, name, method);\r\n      if (s[name]) {\r\n        // `s` is a prototype, the actual method is `s[name]`\r\n        // tag super method with it's name for quicker lookups\r\n        s[name].nom = name;\r\n      }\r\n      return method._super = s;\r\n    }\r\n\r\n    function nextSuper(proto, name, caller) {\r\n      // look for an inherited prototype that implements name\r\n      while (proto) {\r\n        if ((proto[name] !== caller) && proto[name]) {\r\n          return proto;\r\n        }\r\n        proto = getPrototypeOf(proto);\r\n      }\r\n      // must not return null, or we lose our invariant above\r\n      // in this case, a super() call was invoked where no superclass\r\n      // method exists\r\n      // TODO(sjmiles): thow an exception?\r\n      return Object;\r\n    }\r\n\r\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \r\n    // __proto__. Therefore, always get prototype via __proto__ instead of\r\n    // the more standard Object.getPrototypeOf.\r\n    function getPrototypeOf(prototype) {\r\n      return prototype.__proto__;\r\n    }\r\n\r\n    // utility function to precompute name tags for functions\r\n    // in a (unchained) prototype\r\n    function hintSuper(prototype) {\r\n      // tag functions with their prototype name to optimize\r\n      // super call invocations\r\n      for (var n in prototype) {\r\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\r\n        if (pd && typeof pd.value === 'function') {\r\n          pd.value.nom = n;\r\n        }\r\n      }\r\n    }\r\n\r\n    // exports\r\n\r\n    scope.super = $super;\r\n\r\n})(Polymer);\r\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function noopHandler(value) {\n    return value;\n  }\n\n  var typeHandlers = {\n    string: noopHandler,\n    'undefined': noopHandler,\n    date: function(value) {\n      return new Date(Date.parse(value) || Date.now());\n    },\n    boolean: function(value) {\n      if (value === '') {\n        return true;\n      }\n      return value === 'false' ? false : !!value;\n    },\n    number: function(value) {\n      var n = parseFloat(value);\n      // hex values like \"0xFFFF\" parseFloat as 0\n      if (n === 0) {\n        n = parseInt(value);\n      }\n      return isNaN(n) ? value : n;\n      // this code disabled because encoded values (like \"0xFFFF\")\n      // do not round trip to their original format\n      //return (String(floatVal) === value) ? floatVal : value;\n    },\n    object: function(value, currentValue) {\n      if (currentValue === null) {\n        return value;\n      }\n      try {\n        // If the string is an object, we can parse is with the JSON library.\n        // include convenience replace for single-quotes. If the author omits\n        // quotes altogether, parse will fail.\n        return JSON.parse(value.replace(/'/g, '\"'));\n      } catch(e) {\n        // The object isn't valid JSON, return the raw value\n        return value;\n      }\n    },\n    // avoid deserialization of functions\n    'function': function(value, currentValue) {\n      return currentValue;\n    }\n  };\n\n  function deserializeValue(value, currentValue) {\n    // attempt to infer type from default value\n    var inferredType = typeof currentValue;\n    // invent 'date' type value for Date\n    if (currentValue instanceof Date) {\n      inferredType = 'date';\n    }\n    // delegate deserialization via type string\n    return typeHandlers[inferredType](value, currentValue);\n  }\n\n  // exports\n\n  scope.deserializeValue = deserializeValue;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n\n  // module\n\n  var api = {};\n\n  api.declaration = {};\n  api.instance = {};\n\n  api.publish = function(apis, prototype) {\n    for (var n in apis) {\n      extend(prototype, apis[n]);\n    }\n  };\n\n  // exports\n\n  scope.api = api;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var utils = {\n    /**\n      * Invokes a function asynchronously. The context of the callback\n      * function is bound to 'this' automatically.\n      * @method async\n      * @param {Function|String} method\n      * @param {any|Array} args\n      * @param {number} timeout\n      */\n    async: function(method, args, timeout) {\n      // when polyfilling Object.observe, ensure changes \n      // propagate before executing the async method\n      Platform.flush();\n      // second argument to `apply` must be an array\n      args = (args && args.length) ? args : [args];\n      // function to invoke\n      var fn = function() {\n        (this[method] || method).apply(this, args);\n      }.bind(this);\n      // execute `fn` sooner or later\n      var handle = timeout ? setTimeout(fn, timeout) :\n          requestAnimationFrame(fn);\n      // NOTE: switch on inverting handle to determine which time is used.\n      return timeout ? handle : ~handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 0) {\n        cancelAnimationFrame(~handle);\n      } else {\n        clearTimeout(handle);\n      }\n    },\n    /**\n      * Fire an event.\n      * @method fire\n      * @returns {Object} event\n      * @param {string} type An event name.\n      * @param {any} detail\n      * @param {Node} onNode Target node.\n      * @param {Boolean} bubbles Set false to prevent bubbling, defaults to true\n      * @param {Boolean} cancelable Set false to prevent cancellation, defaults to true\n      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = detail === null || detail === undefined ? {} : detail;\n      var event = new CustomEvent(type, {\n        bubbles: bubbles !== undefined ? bubbles : true,\n        cancelable: cancelable !== undefined ? cancelable : true,\n        detail: detail\n      });\n      node.dispatchEvent(event);\n      return event;\n    },\n    /**\n      * Fire an event asynchronously.\n      * @method asyncFire\n      * @param {string} type An event name.\n      * @param detail\n      * @param {Node} toNode Target node.\n      */\n    asyncFire: function(/*inType, inDetail*/) {\n      this.async(\"fire\", arguments);\n    },\n    /**\n      * Remove class from old, add class to anew, if they exist.\n      * @param classFollows\n      * @param anew A node.\n      * @param old A node\n      * @param className\n      */\n    classFollows: function(anew, old, className) {\n      if (old) {\n        old.classList.remove(className);\n      }\n      if (anew) {\n        anew.classList.add(className);\n      }\n    },\n    /**\n      * Inject HTML which contains markup bound to this element into\n      * a target element (replacing target element content).\n      * @param String html to inject\n      * @param Element target element\n      */\n    injectBoundHTML: function(html, element) {\n      var template = document.createElement('template');\n      template.innerHTML = html;\n      var fragment = this.instanceTemplate(template);\n      if (element) {\n        element.textContent = '';\n        element.appendChild(fragment);\n      }\n      return fragment;\n    }\n  };\n\n  // no-operation function for handy stubs\n  var nop = function() {};\n\n  // null-object for handy stubs\n  var nob = {};\n\n  // deprecated\n\n  utils.asyncMethod = utils.async;\n\n  // exports\n\n  scope.api.instance.utils = utils;\n  scope.nop = nop;\n  scope.nob = nob;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var EVENT_PREFIX = 'on-';\n\n  // instance events api\n  var events = {\n    // read-only\n    EVENT_PREFIX: EVENT_PREFIX,\n    // event listeners on host\n    addHostListeners: function() {\n      var events = this.eventDelegates;\n      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);\n      // NOTE: host events look like bindings but really are not;\n      // (1) we don't want the attribute to be set and (2) we want to support\n      // multiple event listeners ('host' and 'instance') and Node.bind\n      // by default supports 1 thing being bound.\n      for (var type in events) {\n        var methodName = events[type];\n        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));\n      }\n    },\n    // call 'method' or function method on 'obj' with 'args', if the method exists\n    dispatchMethod: function(obj, method, args) {\n      if (obj) {\n        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);\n        var fn = typeof method === 'function' ? method : obj[method];\n        if (fn) {\n          fn[args ? 'apply' : 'call'](obj, args);\n        }\n        log.events && console.groupEnd();\n        Platform.flush();\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.instance.events = events;\n\n  // alias PolymerGestures event listener logic\n  scope.addEventListener = function(node, eventType, handlerFn, capture) {\n    PolymerGestures.addEventListener(wrap(node), eventType, handlerFn, capture);\n  };\n  scope.removeEventListener = function(node, eventType, handlerFn, capture) {\n    PolymerGestures.removeEventListener(wrap(node), eventType, handlerFn, capture);\n  };\n\n})(Polymer);\n\n/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\n  // instance api for attributes\r\n\r\n  var attributes = {\r\n    copyInstanceAttributes: function () {\r\n      var a$ = this._instanceAttributes;\r\n      for (var k in a$) {\r\n        if (!this.hasAttribute(k)) {\r\n          this.setAttribute(k, a$[k]);\r\n        }\r\n      }\r\n    },\r\n    // for each attribute on this, deserialize value to property as needed\r\n    takeAttributes: function() {\r\n      // if we have no publish lookup table, we have no attributes to take\r\n      // TODO(sjmiles): ad hoc\r\n      if (this._publishLC) {\r\n        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\r\n          this.attributeToProperty(a.name, a.value);\r\n        }\r\n      }\r\n    },\r\n    // if attribute 'name' is mapped to a property, deserialize\r\n    // 'value' into that property\r\n    attributeToProperty: function(name, value) {\r\n      // try to match this attribute to a property (attributes are\r\n      // all lower-case, so this is case-insensitive search)\r\n      var name = this.propertyForAttribute(name);\r\n      if (name) {\r\n        // filter out 'mustached' values, these are to be\r\n        // replaced with bound-data and are not yet values\r\n        // themselves\r\n        if (value && value.search(scope.bindPattern) >= 0) {\r\n          return;\r\n        }\r\n        // get original value\r\n        var currentValue = this[name];\r\n        // deserialize Boolean or Number values from attribute\r\n        var value = this.deserializeValue(value, currentValue);\r\n        // only act if the value has changed\r\n        if (value !== currentValue) {\r\n          // install new value (has side-effects)\r\n          this[name] = value;\r\n        }\r\n      }\r\n    },\r\n    // return the published property matching name, or undefined\r\n    propertyForAttribute: function(name) {\r\n      var match = this._publishLC && this._publishLC[name];\r\n      //console.log('propertyForAttribute:', name, 'matches', match);\r\n      return match;\r\n    },\r\n    // convert representation of 'stringValue' based on type of 'currentValue'\r\n    deserializeValue: function(stringValue, currentValue) {\r\n      return scope.deserializeValue(stringValue, currentValue);\r\n    },\r\n    serializeValue: function(value, inferredType) {\r\n      if (inferredType === 'boolean') {\r\n        return value ? '' : undefined;\r\n      } else if (inferredType !== 'object' && inferredType !== 'function'\r\n          && value !== undefined) {\r\n        return value;\r\n      }\r\n    },\r\n    reflectPropertyToAttribute: function(name) {\r\n      var inferredType = typeof this[name];\r\n      // try to intelligently serialize property value\r\n      var serializedValue = this.serializeValue(this[name], inferredType);\r\n      // boolean properties must reflect as boolean attributes\r\n      if (serializedValue !== undefined) {\r\n        this.setAttribute(name, serializedValue);\r\n        // TODO(sorvell): we should remove attr for all properties\r\n        // that have undefined serialization; however, we will need to\r\n        // refine the attr reflection system to achieve this; pica, for example,\r\n        // relies on having inferredType object properties not removed as\r\n        // attrs.\r\n      } else if (inferredType === 'boolean') {\r\n        this.removeAttribute(name);\r\n      }\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.instance.attributes = attributes;\r\n\r\n})(Polymer);\r\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n\n  // magic words\n\n  var OBSERVE_SUFFIX = 'Changed';\n\n  // element api\n\n  var empty = [];\n\n  var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  var numberIsNaN = Number.isNaN || function(value) {\n    return typeof value === 'number' && isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  // capture A's value if B's value is null or undefined,\n  // otherwise use B's value\n  function resolveBindingValue(oldValue, value) {\n    if (value === undefined && oldValue === null) {\n      return value;\n    }\n    return (value === null || value === undefined) ? oldValue : value;\n  }\n\n  var properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObserver(o);\n        // TODO(sorvell): may not be kosher to access the value here (this[n]);\n        // previously we looked at the descriptor on the prototype\n        // this doesn't work for inheritance and not for accessors without\n        // a value property\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          this.observeArrayValue(n, this[n], null);\n        }\n      }\n    },\n    openPropertyObserver: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.open(this.notifyPropertyChanges, this);\n      }\n    },\n    notifyPropertyChanges: function(newValues, oldValues, paths) {\n      var name, method, called = {};\n      for (var i in oldValues) {\n        // note: paths is of form [object, path, object, path]\n        name = paths[2 * i + 1];\n        method = this.observe[name];\n        if (method) {\n          var ov = oldValues[i], nv = newValues[i];\n          // observes the value if it is an array\n          this.observeArrayValue(name, nv, ov);\n          if (!called[method]) {\n            // only invoke change method if one of ov or nv is not (undefined | null)\n            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {\n              called[method] = true;\n              // TODO(sorvell): call method with the set of values it's expecting;\n              // e.g. 'foo bar': 'invalidate' expects the new and old values for\n              // foo and bar. Currently we give only one of these and then\n              // deliver all the arguments.\n              this.invokeMethod(method, [ov, nv, arguments]);\n            }\n          }\n        }\n      }\n    },\n    deliverChanges: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.deliver();\n      }\n    },\n    propertyChanged_: function(name, value, oldValue) {\n      if (this.reflect[name]) {\n        this.reflectPropertyToAttribute(name);\n      }\n    },\n    observeArrayValue: function(name, value, old) {\n      // we only care if there are registered side-effects\n      var callbackName = this.observe[name];\n      if (callbackName) {\n        // if we are observing the previous value, stop\n        if (Array.isArray(old)) {\n          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);\n          this.closeNamedObserver(name + '__array');\n        }\n        // if the new value is an array, being observing it\n        if (Array.isArray(value)) {\n          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);\n          var observer = new ArrayObserver(value);\n          observer.open(function(splices) {\n            this.invokeMethod(callbackName, [splices]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      // Present for properties which are computed and published and have a\n      // bound value.\n      var privateComputedBoundValue = name + 'ComputedBoundObservable_';\n\n      this[privateObservable] = observable;\n\n      var oldValue = this[privateName];\n\n      var self = this;\n      function updateValue(value, oldValue) {\n        self[privateName] = value;\n\n        var setObserveable = self[privateComputedBoundValue];\n        if (setObserveable && typeof setObserveable.setValue == 'function') {\n          setObserveable.setValue(value);\n        }\n \n        self.emitPropertyChangeRecord(name, value, oldValue);\n      }\n \n      var value = observable.open(updateValue);\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      updateValue(value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n          self[privateComputedBoundValue] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      var computed = this.element.prototype.computed;\n\n      // Binding an \"out-only\" value to a computed property. Note that\n      // since this observer isn't opened, it doesn't need to be closed on\n      // cleanup.\n      if (computed && computed[property]) {\n        var privateComputedBoundValue = property + 'ComputedBoundObservable_';\n        this[privateComputedBoundValue] = observable;\n        return;\n      }\n\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(template) {\n      // ensure template is decorated (lets' things like <tr template ...> work)\n      HTMLTemplateElement.decorate(template);\n      // ensure a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      var observers = dom.bindings_;\n      for (var i = 0; i < observers.length; i++) {\n        this.registerObserver(observers[i]);\n      }\n      return dom;\n    },\n    bind: function(name, observable, oneTime) {\n      var property = this.propertyForAttribute(name);\n      if (!property) {\n        // TODO(sjmiles): this mixin method must use the special form\n        // of `super` installed by `mixinMethod` in declaration/prototype.js\n        return this.mixinSuper(arguments);\n      } else {\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable, oneTime);\n        // NOTE: reflecting binding information is typically required only for\n        // tooling. It has a performance cost so it's opt-in in Node.bind.\n        if (Platform.enableBindingsReflection && observer) {\n          observer.path = observable.path_;\n          this._recordBinding(property, observer);\n        }\n        if (this.reflect[property]) {\n          this.reflectPropertyToAttribute(property);\n        }\n        return observer;\n      }\n    },\n    bindFinished: function() {\n      this.makeElementReady();\n    },\n    _recordBinding: function(name, observer) {\n      this.bindings_ = this.bindings_ || {};\n      this.bindings_[name] = observer;\n    },\n    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from\n    // TemplateBinding. We still need to close/dispose of observers but perhaps\n    // we should choose a more explicit name.\n    asyncUnbindAll: function() {\n      if (!this._unbound) {\n        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);\n        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);\n      }\n    },\n    unbindAll: function() {\n      if (!this._unbound) {\n        this.closeObservers();\n        this.closeNamedObservers();\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function() {\n      if (this._unbound) {\n        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);\n        return;\n      }\n      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);\n      if (this._unbindAllJob) {\n        this._unbindAllJob = this._unbindAllJob.stop();\n      }\n    }\n  };\n\n  function unbindNodeTree(node) {\n    forNodeTree(node, _nodeUnbindAll);\n  }\n\n  function _nodeUnbindAll(node) {\n    node.unbindAll();\n  }\n\n  function forNodeTree(node, callback) {\n    if (node) {\n      callback(node);\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        forNodeTree(child, callback);\n      }\n    }\n  }\n\n  var mustachePattern = /\\{\\{([^{}]*)}}/;\n\n  // exports\n\n  scope.bindPattern = mustachePattern;\n  scope.api.instance.mdv = mdv;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var base = {\n    PolymerBase: true,\n    job: function(job, callback, wait) {\n      if (typeof job === 'string') {\n        var n = '___' + job;\n        this[n] = Polymer.job.call(this, this[n], callback, wait);\n      } else {\n        return Polymer.job.call(this, job, callback, wait);\n      }\n    },\n    super: Polymer.super,\n    // user entry point for element has had its createdCallback called\n    created: function() {\n    },\n    // user entry point for element has shadowRoot and is ready for\n    // api interaction\n    ready: function() {\n    },\n    createdCallback: function() {\n      if (this.templateInstance && this.templateInstance.model) {\n        console.warn('Attributes on ' + this.localName + ' were data bound ' +\n            'prior to Polymer upgrading the element. This may result in ' +\n            'incorrect binding types.');\n      }\n      this.created();\n      this.prepareElement();\n      if (!this.ownerDocument.isStagingDocument) {\n        this.makeElementReady();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      if (this._elementPrepared) {\n        console.warn('Element already prepared', this.localName);\n        return;\n      }\n      this._elementPrepared = true;\n      // storage for shadowRoots info\n      this.shadowRoots = {};\n      // install property observers\n      this.createPropertyObserver();\n      this.openPropertyObserver();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\n    },\n    makeElementReady: function() {\n      if (this._readied) {\n        return;\n      }\n      this._readied = true;\n      this.createComputedProperties();\n      // TODO(sorvell): We could create an entry point here\n      // for the user to compute property values.\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate\n      // :unresolved; remove this attribute to be compatible with native\n      // CE.\n      this.removeAttribute('unresolved');\n      // user entry point\n      this.ready();\n    },\n    attachedCallback: function() {\n      this.cancelUnbindAll();\n      // invoke user action\n      if (this.attached) {\n        this.attached();\n      }\n      // TODO(sorvell): bc\n      if (this.enteredView) {\n        this.enteredView();\n      }\n      // NOTE: domReady can be used to access elements in dom (descendants,\n      // ancestors, siblings) such that the developer is enured to upgrade\n      // ordering. If the element definitions have loaded, domReady\n      // can be used to access upgraded elements.\n      if (!this.hasBeenAttached) {\n        this.hasBeenAttached = true;\n        if (this.domReady) {\n          this.async('domReady');\n        }\n      }\n    },\n    detachedCallback: function() {\n      if (!this.preventDispose) {\n        this.asyncUnbindAll();\n      }\n      // invoke user action\n      if (this.detached) {\n        this.detached();\n      }\n      // TODO(sorvell): bc\n      if (this.leftView) {\n        this.leftView();\n      }\n    },\n    // TODO(sorvell): bc\n    enteredViewCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftViewCallback: function() {\n      this.detachedCallback();\n    },\n    // TODO(sorvell): bc\n    enteredDocumentCallback: function() {\n      this.attachedCallback();\n    },\n    // TODO(sorvell): bc\n    leftDocumentCallback: function() {\n      this.detachedCallback();\n    },\n    // recursive ancestral <element> initialization, oldest first\n    parseDeclarations: function(p) {\n      if (p && p.element) {\n        this.parseDeclarations(p.__proto__);\n        p.parseDeclaration.call(this, p.element);\n      }\n    },\n    // parse input <element> as needed, override for custom behavior\n    parseDeclaration: function(elementElement) {\n      var template = this.fetchTemplate(elementElement);\n      if (template) {\n        var root = this.shadowFromTemplate(template);\n        this.shadowRoots[elementElement.name] = root;\n      }\n    },\n    // return a shadow-root template (if desired), override for custom behavior\n    fetchTemplate: function(elementElement) {\n      return elementElement.querySelector('template');\n    },\n    // utility function that creates a shadow root from a <template>\n    shadowFromTemplate: function(template) {\n      if (template) {\n        // make a shadow root\n        var root = this.createShadowRoot();\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        root.appendChild(dom);\n        // perform post-construction initialization tasks on shadow root\n        this.shadowRootReady(root, template);\n        // return the created shadow root\n        return root;\n      }\n    },\n    // utility function that stamps a <template> into light-dom\n    lightFromTemplate: function(template, refNode) {\n      if (template) {\n        // TODO(sorvell): mark this element as an eventController so that\n        // event listeners on bound nodes inside it will be called on it.\n        // Note, the expectation here is that events on all descendants\n        // should be handled by this element.\n        this.eventController = this;\n        // stamp template\n        // which includes parsing and applying MDV bindings before being\n        // inserted (to avoid {{}} in attribute values)\n        // e.g. to prevent <img src=\"images/{{icon}}\"> from generating a 404.\n        var dom = this.instanceTemplate(template);\n        // append to shadow dom\n        if (refNode) {\n          this.insertBefore(dom, refNode);\n        } else {\n          this.appendChild(dom);\n        }\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root) {\n      // locate nodes with id and store references to them in this.$ hash\n      this.marshalNodeReferences(root);\n    },\n    // locate nodes with id and store references to them in this.$ hash\n    marshalNodeReferences: function(root) {\n      // establish $ instance variable\n      var $ = this.$ = this.$ || {};\n      // populate $ from nodes with ID from the LOCAL tree\n      if (root) {\n        var n$ = root.querySelectorAll(\"[id]\");\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          $[n.id] = n;\n        };\n      }\n    },\n    attributeChangedCallback: function(name, oldValue) {\n      // TODO(sjmiles): adhoc filter\n      if (name !== 'class' && name !== 'style') {\n        this.attributeToProperty(name, this.getAttribute(name));\n      }\n      if (this.attributeChanged) {\n        this.attributeChanged.apply(this, arguments);\n      }\n    },\n    onMutation: function(node, listener) {\n      var observer = new MutationObserver(function(mutations) {\n        listener.call(this, observer, mutations);\n        observer.disconnect();\n      }.bind(this));\n      observer.observe(node, {childList: true, subtree: true});\n    }\n  };\n\n  // true if object has own PolymerBase api\n  function isBase(object) {\n    return object.hasOwnProperty('PolymerBase')\n  }\n\n  // name a base constructor for dev tools\n\n  function PolymerBase() {};\n  PolymerBase.prototype = base;\n  base.constructor = PolymerBase;\n\n  // exports\n\n  scope.Base = PolymerBase;\n  scope.isBase = isBase;\n  scope.api.instance.base = base;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n  \n  var STYLE_SCOPE_ATTRIBUTE = 'element';\n  var STYLE_CONTROLLER_SCOPE = 'controller';\n  \n  var styles = {\n    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,\n    /**\n     * Installs external stylesheets and <style> elements with the attribute \n     * polymer-scope='controller' into the scope of element. This is intended\n     * to be a called during custom element construction.\n    */\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleScope();\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {\n        // allow inherited controller styles\n        var proto = getPrototypeOf(this), cssText = '';\n        while (proto && proto.element) {\n          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);\n          proto = getPrototypeOf(proto);\n        }\n        if (cssText) {\n          this.installScopeCssText(cssText, scope);\n        }\n      }\n    },\n    installScopeStyle: function(style, name, scope) {\n      var scope = scope || this.findStyleScope(), name = name || '';\n      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {\n        var cssText = '';\n        if (style instanceof Array) {\n          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {\n            cssText += s.textContent + '\\n\\n';\n          }\n        } else {\n          cssText = style.textContent;\n        }\n        this.installScopeCssText(cssText, scope, name);\n      }\n    },\n    installScopeCssText: function(cssText, scope, name) {\n      scope = scope || this.findStyleScope();\n      name = name || '';\n      if (!scope) {\n        return;\n      }\n      if (hasShadowDOMPolyfill) {\n        cssText = shimCssText(cssText, scope.host);\n      }\n      var style = this.element.cssTextToScopeStyle(cssText,\n          STYLE_CONTROLLER_SCOPE);\n      Polymer.applyStyleToScope(style, scope);\n      // cache that this style has been applied\n      this.styleCacheForScope(scope)[this.localName + name] = true;\n    },\n    findStyleScope: function(node) {\n      // find the shadow root that contains this element\n      var n = node || this;\n      while (n.parentNode) {\n        n = n.parentNode;\n      }\n      return n;\n    },\n    scopeHasNamedStyle: function(scope, name) {\n      var cache = this.styleCacheForScope(scope);\n      return cache[name];\n    },\n    styleCacheForScope: function(scope) {\n      if (hasShadowDOMPolyfill) {\n        var scopeName = scope.host ? scope.host.localName : scope.localName;\n        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});\n      } else {\n        return scope._scopeStyles = (scope._scopeStyles || {});\n      }\n    }\n  };\n\n  var polyfillScopeStyleCache = {};\n  \n  // NOTE: use raw prototype traversal so that we ensure correct traversal\n  // on platforms where the protoype chain is simulated via __proto__ (IE10)\n  function getPrototypeOf(prototype) {\n    return prototype.__proto__;\n  }\n\n  function shimCssText(cssText, host) {\n    var name = '', is = false;\n    if (host) {\n      name = host.localName;\n      is = host.hasAttribute('is');\n    }\n    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);\n    return Platform.ShadowCSS.shimCssText(cssText, selector);\n  }\n\n  // exports\n\n  scope.api.instance.styles = styles;\n  \n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n\n  // imperative implementation: Polymer()\n\n  // specify an 'own' prototype for tag `name`\n  function element(name, prototype) {\n    if (typeof name !== 'string') {\n      var script = prototype || document._currentScript;\n      prototype = name;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  function instanceOfType(element, type) {\n    if (typeof type !== 'string') {\n      return false;\n    }\n    var proto = HTMLElement.getPrototypeForTag(type);\n    var ctor = proto && proto.constructor;\n    if (!ctor) {\n      return false;\n    }\n    if (CustomElements.instanceof) {\n      return CustomElements.instanceof(element, ctor);\n    }\n    return element instanceof ctor;\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n  scope.instanceOfType = instanceOfType;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  if (Platform.consumeDeclarations) {\n    Platform.consumeDeclarations(function(declarations) {;\n      if (declarations) {\n        for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {\n          element.apply(null, d);\n        }\n      }\n    });\n  }\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\nvar path = {\n  resolveElementPaths: function(node) {\n    Polymer.urlResolver.resolveDom(node);\n  },\n  addResolvePathApi: function() {\n    // let assetpath attribute modify the resolve path\n    var assetPath = this.getAttribute('assetpath') || '';\n    var root = new URL(assetPath, this.ownerDocument.baseURI);\n    this.prototype.resolvePath = function(urlPath, base) {\n      var u = new URL(urlPath, base || root);\n      return u.href;\n    };\n  }\n};\n\n// exports\nscope.api.declaration.path = path;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.styles;\n  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // magic words\n\n  var STYLE_SELECTOR = 'style';\n  var STYLE_LOADABLE_MATCH = '@import';\n  var SHEET_SELECTOR = 'link[rel=stylesheet]';\n  var STYLE_GLOBAL_SCOPE = 'global';\n  var SCOPE_ATTR = 'polymer-scope';\n\n  var styles = {\n    // returns true if resources are loading\n    loadStyles: function(callback) {\n      var template = this.fetchTemplate();\n      var content = template && this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n        var styles = this.findLoadableStyles(content);\n        if (styles.length) {\n          var templateUrl = template.ownerDocument.baseURI;\n          return Polymer.styleResolver.loadStyles(styles, templateUrl, callback);\n        }\n      }\n      if (callback) {\n        callback();\n      }\n    },\n    convertSheetsToStyles: function(root) {\n      var s$ = root.querySelectorAll(SHEET_SELECTOR);\n      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {\n        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),\n            this.ownerDocument);\n        this.copySheetAttributes(c, s);\n        s.parentNode.replaceChild(c, s);\n      }\n    },\n    copySheetAttributes: function(style, link) {\n      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {\n        if (a.name !== 'rel' && a.name !== 'href') {\n          style.setAttribute(a.name, a.value);\n        }\n      }\n    },\n    findLoadableStyles: function(root) {\n      var loadables = [];\n      if (root) {\n        var s$ = root.querySelectorAll(STYLE_SELECTOR);\n        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {\n          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {\n            loadables.push(s);\n          }\n        }\n      }\n      return loadables;\n    },\n    /**\n     * Install external stylesheets loaded in <polymer-element> elements into the \n     * element's template.\n     * @param elementElement The <element> element to style.\n     */\n    installSheets: function() {\n      this.cacheSheets();\n      this.cacheStyles();\n      this.installLocalSheets();\n      this.installGlobalStyles();\n    },\n    /**\n     * Remove all sheets from element and store for later use.\n     */\n    cacheSheets: function() {\n      this.sheets = this.findNodes(SHEET_SELECTOR);\n      this.sheets.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    cacheStyles: function() {\n      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');\n      this.styles.forEach(function(s) {\n        if (s.parentNode) {\n          s.parentNode.removeChild(s);\n        }\n      });\n    },\n    /**\n     * Takes external stylesheets loaded in an <element> element and moves\n     * their content into a <style> element inside the <element>'s template.\n     * The sheet is then removed from the <element>. This is done only so \n     * that if the element is loaded in the main document, the sheet does\n     * not become active.\n     * Note, ignores sheets with the attribute 'polymer-scope'.\n     * @param elementElement The <element> element to style.\n     */\n    installLocalSheets: function () {\n      var sheets = this.sheets.filter(function(s) {\n        return !s.hasAttribute(SCOPE_ATTR);\n      });\n      var content = this.templateContent();\n      if (content) {\n        var cssText = '';\n        sheets.forEach(function(sheet) {\n          cssText += cssTextFromSheet(sheet) + '\\n';\n        });\n        if (cssText) {\n          var style = createStyleElement(cssText, this.ownerDocument);\n          content.insertBefore(style, content.firstChild);\n        }\n      }\n    },\n    findNodes: function(selector, matcher) {\n      var nodes = this.querySelectorAll(selector).array();\n      var content = this.templateContent();\n      if (content) {\n        var templateNodes = content.querySelectorAll(selector).array();\n        nodes = nodes.concat(templateNodes);\n      }\n      return matcher ? nodes.filter(matcher) : nodes;\n    },\n    /**\n     * Promotes external stylesheets and <style> elements with the attribute \n     * polymer-scope='global' into global scope.\n     * This is particularly useful for defining @keyframe rules which \n     * currently do not function in scoped or shadow style elements.\n     * (See wkb.ug/72462)\n     * @param elementElement The <element> element to style.\n    */\n    // TODO(sorvell): remove when wkb.ug/72462 is addressed.\n    installGlobalStyles: function() {\n      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);\n      applyStyleToScope(style, document.head);\n    },\n    cssTextForScope: function(scopeDescriptor) {\n      var cssText = '';\n      // handle stylesheets\n      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';\n      var matcher = function(s) {\n        return matchesSelector(s, selector);\n      };\n      var sheets = this.sheets.filter(matcher);\n      sheets.forEach(function(sheet) {\n        cssText += cssTextFromSheet(sheet) + '\\n\\n';\n      });\n      // handle cached style elements\n      var styles = this.styles.filter(matcher);\n      styles.forEach(function(style) {\n        cssText += style.textContent + '\\n\\n';\n      });\n      return cssText;\n    },\n    styleForScope: function(scopeDescriptor) {\n      var cssText = this.cssTextForScope(scopeDescriptor);\n      return this.cssTextToScopeStyle(cssText, scopeDescriptor);\n    },\n    cssTextToScopeStyle: function(cssText, scopeDescriptor) {\n      if (cssText) {\n        var style = createStyleElement(cssText);\n        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +\n            '-' + scopeDescriptor);\n        return style;\n      }\n    }\n  };\n\n  function importRuleForSheet(sheet, baseUrl) {\n    var href = new URL(sheet.getAttribute('href'), baseUrl).href;\n    return '@import \\'' + href + '\\';';\n  }\n\n  function applyStyleToScope(style, scope) {\n    if (style) {\n      if (scope === document) {\n        scope = document.head;\n      }\n      if (hasShadowDOMPolyfill) {\n        scope = document.head;\n      }\n      // TODO(sorvell): necessary for IE\n      // see https://connect.microsoft.com/IE/feedback/details/790212/\n      // cloning-a-style-element-and-adding-to-document-produces\n      // -unexpected-result#details\n      // var clone = style.cloneNode(true);\n      var clone = createStyleElement(style.textContent);\n      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);\n      if (attr) {\n        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);\n      }\n      // TODO(sorvell): probably too brittle; try to figure out \n      // where to put the element.\n      var refNode = scope.firstElementChild;\n      if (scope === document.head) {\n        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';\n        var s$ = document.head.querySelectorAll(selector);\n        if (s$.length) {\n          refNode = s$[s$.length-1].nextElementSibling;\n        }\n      }\n      scope.insertBefore(clone, refNode);\n    }\n  }\n\n  function createStyleElement(cssText, scope) {\n    scope = scope || document;\n    scope = scope.createElement ? scope : scope.ownerDocument;\n    var style = scope.createElement('style');\n    style.textContent = cssText;\n    return style;\n  }\n\n  function cssTextFromSheet(sheet) {\n    return (sheet && sheet.__resource) || '';\n  }\n\n  function matchesSelector(node, inSelector) {\n    if (matches) {\n      return matches.call(node, inSelector);\n    }\n  }\n  var p = HTMLElement.prototype;\n  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector \n      || p.mozMatchesSelector;\n  \n  // exports\n\n  scope.api.declaration.styles = styles;\n  scope.applyStyleToScope = applyStyleToScope;\n  \n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || {};\n  var api = scope.api.instance.events;\n  var EVENT_PREFIX = api.EVENT_PREFIX;\n  // polymer-element declarative api: events feature\n\n  var mixedCaseEventTypes = {};\n  [\n    'webkitAnimationStart',\n    'webkitAnimationEnd',\n    'webkitTransitionEnd',\n    'DOMFocusOut',\n    'DOMFocusIn',\n    'DOMMouseScroll'\n  ].forEach(function(e) {\n    mixedCaseEventTypes[e.toLowerCase()] = e;\n  });\n\n  var events = {\n    parseHostEvents: function() {\n      // our delegates map\n      var delegates = this.prototype.eventDelegates;\n      // extract data from attributes into delegates\n      this.addAttributeDelegates(delegates);\n    },\n    addAttributeDelegates: function(delegates) {\n      // for each attribute\n      for (var i=0, a; a=this.attributes[i]; i++) {\n        // does it have magic marker identifying it as an event delegate?\n        if (this.hasEventPrefix(a.name)) {\n          // if so, add the info to delegates\n          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')\n              .replace('}}', '').trim();\n        }\n      }\n    },\n    // starts with 'on-'\n    hasEventPrefix: function (n) {\n      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');\n    },\n    removeEventPrefix: function(n) {\n      return n.slice(prefixLength);\n    },\n    findController: function(node) {\n      while (node.parentNode) {\n        if (node.eventController) {\n          return node.eventController;\n        }\n        node = node.parentNode;\n      }\n      return node.host;\n    },\n    getEventHandler: function(controller, target, method) {\n      var events = this;\n      return function(e) {\n        if (!controller || !controller.PolymerBase) {\n          controller = events.findController(target);\n        }\n\n        var args = [e, e.detail, e.currentTarget];\n        controller.dispatchMethod(controller, method, args);\n      };\n    },\n    prepareEventBinding: function(pathString, name, node) {\n      if (!this.hasEventPrefix(name))\n        return;\n\n      var eventType = this.removeEventPrefix(name);\n      eventType = mixedCaseEventTypes[eventType] || eventType;\n\n      var events = this;\n\n      return function(model, node, oneTime) {\n        var handler = events.getEventHandler(undefined, node, pathString);\n        PolymerGestures.addEventListener(node, eventType, handler);\n\n        if (oneTime)\n          return;\n\n        // TODO(rafaelw): This is really pointless work. Aside from the cost\n        // of these allocations, NodeBind is going to setAttribute back to its\n        // current value. Fixing this would mean changing the TemplateBinding\n        // binding delegate API.\n        function bindingValue() {\n          return '{{ ' + pathString + ' }}';\n        }\n\n        return {\n          open: bindingValue,\n          discardChanges: bindingValue,\n          close: function() {\n            PolymerGestures.removeEventListener(node, eventType, handler);\n          }\n        };\n      };\n    }\n  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // element api\n\n  var properties = {\n    inferObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var observe = prototype.observe, property;\n      for (var n in prototype) {\n        if (n.slice(-7) === 'Changed') {\n          if (!observe) {\n            observe  = (prototype.observe = {});\n          }\n          property = n.slice(0, -7)\n          observe[property] = observe[property] || n;\n        }\n      }\n    },\n    explodeObservers: function(prototype) {\n      // called before prototype.observe is chained to inherited object\n      var o = prototype.observe;\n      if (o) {\n        var exploded = {};\n        for (var n in o) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            exploded[ni] = o[n];\n          }\n        }\n        prototype.observe = exploded;\n      }\n    },\n    optimizePropertyMaps: function(prototype) {\n      if (prototype.observe) {\n        // construct name list\n        var a = prototype._observeNames = [];\n        for (var n in prototype.observe) {\n          var names = n.split(' ');\n          for (var i=0, ni; ni=names[i]; i++) {\n            a.push(ni);\n          }\n        }\n      }\n      if (prototype.publish) {\n        // construct name list\n        var a = prototype._publishNames = [];\n        for (var n in prototype.publish) {\n          a.push(n);\n        }\n      }\n      if (prototype.computed) {\n        // construct name list\n        var a = prototype._computedNames = [];\n        for (var n in prototype.computed) {\n          a.push(n);\n        }\n      }\n    },\n    publishProperties: function(prototype, base) {\n      // if we have any properties to publish\n      var publish = prototype.publish;\n      if (publish) {\n        // transcribe `publish` entries onto own prototype\n        this.requireProperties(publish, prototype, base);\n        // construct map of lower-cased property names\n        prototype._publishLC = this.lowerCaseMap(publish);\n      }\n    },\n    //\n    // `name: value` entries in the `publish` object may need to generate \n    // matching properties on the prototype.\n    //\n    // Values that are objects may have a `reflect` property, which\n    // signals that the value describes property control metadata.\n    // In metadata objects, the prototype default value (if any)\n    // is encoded in the `value` property.\n    //\n    // publish: {\n    //   foo: 5, \n    //   bar: {value: true, reflect: true},\n    //   zot: {}\n    // }\n    //\n    // `reflect` metadata property controls whether changes to the property\n    // are reflected back to the attribute (default false). \n    //\n    // A value is stored on the prototype unless it's === `undefined`,\n    // in which case the base chain is checked for a value.\n    // If the basal value is also undefined, `null` is stored on the prototype.\n    //\n    // The reflection data is stored on another prototype object, `reflect`\n    // which also can be specified directly.\n    //\n    // reflect: {\n    //   foo: true\n    // }\n    //\n    requireProperties: function(propertyInfos, prototype, base) {\n      // per-prototype storage for reflected properties\n      prototype.reflect = prototype.reflect || {};\n      // ensure a prototype value for each property\n      // and update the property's reflect to attribute status\n      for (var n in propertyInfos) {\n        var value = propertyInfos[n];\n        // value has metadata if it has a `reflect` property\n        if (value && value.reflect !== undefined) {\n          prototype.reflect[n] = Boolean(value.reflect);\n          value = value.value;\n        }\n        // only set a value if one is specified\n        if (value !== undefined) {\n          prototype[n] = value;\n        }\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name, ignoreWrites) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          if (ignoreWrites) {\n            return this[privateName];\n          }\n\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n, true);\n        }\n      }\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          // If the property is computed and published, the accessor is created\n          // above.\n          if (!prototype.computed || !prototype.computed[n]) {\n            this.createPropertyAccessor(n);\n          }\n        }\n      }\n    }\n  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // magic words\n\n  var ATTRIBUTES_ATTRIBUTE = 'attributes';\n  var ATTRIBUTES_REGEX = /\\s|,/;\n\n  // attributes api\n\n  var attributes = {\n    \n    inheritAttributesObjects: function(prototype) {\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject(prototype, 'publishLC');\n      // chain our instance attributes map to the inherited version\n      this.inheritObject(prototype, '_instanceAttributes');\n    },\n\n    publishAttributes: function(prototype, base) {\n      // merge names from 'attributes' attribute into the 'publish' object\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // create a `publish` object if needed.\n        // the `publish` object is only relevant to this prototype, the \n        // publishing logic in `declaration/properties.js` is responsible for\n        // managing property values on the prototype chain.\n        // TODO(sjmiles): the `publish` object is later chained to it's \n        //                ancestor object, presumably this is only for \n        //                reflection or other non-library uses. \n        var publish = prototype.publish || (prototype.publish = {}); \n        // names='a b c' or names='a,b,c'\n        var names = attributes.split(ATTRIBUTES_REGEX);\n        // record each name for publishing\n        for (var i=0, l=names.length, n; i<l; i++) {\n          // remove excess ws\n          n = names[i].trim();\n          // looks weird, but causes n to exist on `publish` if it does not;\n          // a more careful test would need expensive `in` operator\n          if (n && publish[n] === undefined) {\n            publish[n] = undefined;\n          }\n        }\n      }\n    },\n\n    // record clonable attributes from <element>\n    accumulateInstanceAttributes: function() {\n      // inherit instance attributes\n      var clonable = this.prototype._instanceAttributes;\n      // merge attributes from element\n      var a$ = this.attributes;\n      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  \n        if (this.isInstanceAttribute(a.name)) {\n          clonable[a.name] = a.value;\n        }\n      }\n    },\n\n    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\n    },\n\n    // do not clone these attributes onto instances\n    blackList: {\n      name: 1,\n      'extends': 1,\n      constructor: 1,\n      noscript: 1,\n      assetpath: 1,\n      'cache-csstext': 1\n    }\n    \n  };\n\n  // add ATTRIBUTES_ATTRIBUTE to the blacklist\n  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;\n\n  // exports\n\n  scope.api.declaration.attributes = attributes;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  var events = scope.api.declaration.events;\n\n  var syntax = new PolymerExpressions();\n  var prepareBinding = syntax.prepareBinding;\n\n  // Polymer takes a first crack at the binding to see if it's a declarative\n  // event handler.\n  syntax.prepareBinding = function(pathString, name, node) {\n    return events.prepareEventBinding(pathString, name, node) ||\n           prepareBinding.call(syntax, pathString, name, node);\n  };\n\n  // declaration api supporting mdv\n  var mdv = {\n    syntax: syntax,\n    fetchTemplate: function() {\n      return this.querySelector('template');\n    },\n    templateContent: function() {\n      var template = this.fetchTemplate();\n      return template && template.content;\n    },\n    installBindingDelegate: function(template) {\n      if (template) {\n        template.bindingDelegate = this.syntax;\n      }\n    }\n  };\n\n  // exports\n  scope.api.declaration.mdv = mdv;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n  \n  var api = scope.api;\n  var isBase = scope.isBase;\n  var extend = scope.extend;\n\n  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;\n\n  // prototype api\n\n  var prototype = {\n\n    register: function(name, extendeeName) {\n      // build prototype combining extendee, Polymer base, and named api\n      this.buildPrototype(name, extendeeName);\n      // register our custom element with the platform\n      this.registerPrototype(name, extendeeName);\n      // reference constructor in a global named by 'constructor' attribute\n      this.publishConstructor();\n    },\n\n    buildPrototype: function(name, extendeeName) {\n      // get our custom prototype (before chaining)\n      var extension = scope.getRegisteredPrototype(name);\n      // get basal prototype\n      var base = this.generateBasePrototype(extendeeName);\n      // implement declarative features\n      this.desugarBeforeChaining(extension, base);\n      // join prototypes\n      this.prototype = this.chainPrototypes(extension, base);\n      // more declarative features\n      this.desugarAfterChaining(name, extendeeName);\n    },\n\n    desugarBeforeChaining: function(prototype, base) {\n      // back reference declaration element\n      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`\n      prototype.element = this;\n      // transcribe `attributes` declarations onto own prototype's `publish`\n      this.publishAttributes(prototype, base);\n      // `publish` properties to the prototype and to attribute watch\n      this.publishProperties(prototype, base);\n      // infer observers for `observe` list based on method names\n      this.inferObservers(prototype);\n      // desugar compound observer syntax, e.g. 'a b c' \n      this.explodeObservers(prototype);\n    },\n\n    chainPrototypes: function(prototype, base) {\n      // chain various meta-data objects to inherited versions\n      this.inheritMetaData(prototype, base);\n      // chain custom api to inherited\n      var chained = this.chainObject(prototype, base);\n      // x-platform fixup\n      ensurePrototypeTraversal(chained);\n      return chained;\n    },\n\n    inheritMetaData: function(prototype, base) {\n      // chain observe object to inherited\n      this.inheritObject('observe', prototype, base);\n      // chain publish object to inherited\n      this.inheritObject('publish', prototype, base);\n      // chain reflect object to inherited\n      this.inheritObject('reflect', prototype, base);\n      // chain our lower-cased publish map to the inherited version\n      this.inheritObject('_publishLC', prototype, base);\n      // chain our instance attributes map to the inherited version\n      this.inheritObject('_instanceAttributes', prototype, base);\n      // chain our event delegates map to the inherited version\n      this.inheritObject('eventDelegates', prototype, base);\n    },\n\n    // implement various declarative features\n    desugarAfterChaining: function(name, extendee) {\n      // build side-chained lists to optimize iterations\n      this.optimizePropertyMaps(this.prototype);\n      this.createPropertyAccessors(this.prototype);\n      // install mdv delegate on template\n      this.installBindingDelegate(this.fetchTemplate());\n      // install external stylesheets as if they are inline\n      this.installSheets();\n      // adjust any paths in dom from imports\n      this.resolveElementPaths(this);\n      // compile list of attributes to copy to instances\n      this.accumulateInstanceAttributes();\n      // parse on-* delegates declared on `this` element\n      this.parseHostEvents();\n      //\n      // install a helper method this.resolvePath to aid in \n      // setting resource urls. e.g.\n      // this.$.image.src = this.resolvePath('images/foo.png')\n      this.addResolvePathApi();\n      // under ShadowDOMPolyfill, transforms to approximate missing CSS features\n      if (hasShadowDOMPolyfill) {\n        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);\n      }\n      // allow custom element access to the declarative context\n      if (this.prototype.registerCallback) {\n        this.prototype.registerCallback(this);\n      }\n    },\n\n    // if a named constructor is requested in element, map a reference\n    // to the constructor to the given symbol\n    publishConstructor: function() {\n      var symbol = this.getAttribute('constructor');\n      if (symbol) {\n        window[symbol] = this.ctor;\n      }\n    },\n\n    // build prototype combining extendee, Polymer base, and named api\n    generateBasePrototype: function(extnds) {\n      var prototype = this.findBasePrototype(extnds);\n      if (!prototype) {\n        // create a prototype based on tag-name extension\n        var prototype = HTMLElement.getPrototypeForTag(extnds);\n        // insert base api in inheritance chain (if needed)\n        prototype = this.ensureBaseApi(prototype);\n        // memoize this base\n        memoizedBases[extnds] = prototype;\n      }\n      return prototype;\n    },\n\n    findBasePrototype: function(name) {\n      return memoizedBases[name];\n    },\n\n    // install Polymer instance api into prototype chain, as needed \n    ensureBaseApi: function(prototype) {\n      if (prototype.PolymerBase) {\n        return prototype;\n      }\n      var extended = Object.create(prototype);\n      // we need a unique copy of base api for each base prototype\n      // therefore we 'extend' here instead of simply chaining\n      api.publish(api.instance, extended);\n      // TODO(sjmiles): sharing methods across prototype chains is\n      // not supported by 'super' implementation which optimizes\n      // by memoizing prototype relationships.\n      // Probably we should have a version of 'extend' that is \n      // share-aware: it could study the text of each function,\n      // look for usage of 'super', and wrap those functions in\n      // closures.\n      // As of now, there is only one problematic method, so \n      // we just patch it manually.\n      // To avoid re-entrancy problems, the special super method\n      // installed is called `mixinSuper` and the mixin method\n      // must use this method instead of the default `super`.\n      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');\n      // return buffed-up prototype\n      return extended;\n    },\n\n    mixinMethod: function(extended, prototype, api, name) {\n      var $super = function(args) {\n        return prototype[name].apply(this, args);\n      };\n      extended[name] = function() {\n        this.mixinSuper = $super;\n        return api[name].apply(this, arguments);\n      }\n    },\n\n    // ensure prototype[name] inherits from a prototype.prototype[name]\n    inheritObject: function(name, prototype, base) {\n      // require an object\n      var source = prototype[name] || {};\n      // chain inherited properties onto a new object\n      prototype[name] = this.chainObject(source, base[name]);\n    },\n\n    // register 'prototype' to custom element 'name', store constructor \n    registerPrototype: function(name, extendee) { \n      var info = {\n        prototype: this.prototype\n      }\n      // native element must be specified in extends\n      var typeExtension = this.findTypeExtension(extendee);\n      if (typeExtension) {\n        info.extends = typeExtension;\n      }\n      // register the prototype with HTMLElement for name lookup\n      HTMLElement.register(name, this.prototype);\n      // register the custom type\n      this.ctor = document.registerElement(name, info);\n    },\n\n    findTypeExtension: function(name) {\n      if (name && name.indexOf('-') < 0) {\n        return name;\n      } else {\n        var p = this.findBasePrototype(name);\n        if (p.element) {\n          return this.findTypeExtension(p.element.extends);\n        }\n      }\n    }\n\n  };\n\n  // memoize base prototypes\n  var memoizedBases = {};\n\n  // implementation of 'chainObject' depends on support for __proto__\n  if (Object.__proto__) {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        object.__proto__ = inherited;\n      }\n      return object;\n    }\n  } else {\n    prototype.chainObject = function(object, inherited) {\n      if (object && inherited && object !== inherited) {\n        var chained = Object.create(inherited);\n        object = extend(chained, object);\n      }\n      return object;\n    }\n  }\n\n  // On platforms that do not support __proto__ (versions of IE), the prototype\n  // chain of a custom element is simulated via installation of __proto__.\n  // Although custom elements manages this, we install it here so it's\n  // available during desugaring.\n  function ensurePrototypeTraversal(prototype) {\n    if (!Object.__proto__) {\n      var ancestor = Object.getPrototypeOf(prototype);\n      prototype.__proto__ = ancestor;\n      if (isBase(ancestor)) {\n        ancestor.__proto__ = Object.getPrototypeOf(ancestor);\n      }\n    }\n  }\n\n  // exports\n\n  api.declaration.prototype = prototype;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  /*\n\n    Elements are added to a registration queue so that they register in \n    the proper order at the appropriate time. We do this for a few reasons:\n\n    * to enable elements to load resources (like stylesheets) \n    asynchronously. We need to do this until the platform provides an efficient\n    alternative. One issue is that remote @import stylesheets are \n    re-fetched whenever stamped into a shadowRoot.\n\n    * to ensure elements loaded 'at the same time' (e.g. via some set of\n    imports) are registered as a batch. This allows elements to be enured from\n    upgrade ordering as long as they query the dom tree 1 task after\n    upgrade (aka domReady). This is a performance tradeoff. On the one hand,\n    elements that could register while imports are loading are prevented from \n    doing so. On the other, grouping upgrades into a single task means less\n    incremental work (for example style recalcs),  Also, we can ensure the \n    document is in a known state at the single quantum of time when \n    elements upgrade.\n\n  */\n  var queue = {\n\n    // tell the queue to wait for an element to be ready\n    wait: function(element) {\n      if (!element.__queue) {\n        element.__queue = {};\n        elements.push(element);\n      }\n    },\n\n    // enqueue an element to the next spot in the queue.\n    enqueue: function(element, check, go) {\n      var shouldAdd = element.__queue && !element.__queue.check;\n      if (shouldAdd) {\n        queueForElement(element).push(element);\n        element.__queue.check = check;\n        element.__queue.go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n\n    indexOf: function(element) {\n      var i = queueForElement(element).indexOf(element);\n      if (i >= 0 && document.contains(element)) {\n        i += (HTMLImports.useNative || HTMLImports.ready) ? \n          importQueue.length : 1e9;\n      }\n      return i;  \n    },\n\n    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        element.__queue.flushable = true;\n        this.addToFlushQueue(readied);\n        this.check();\n      }\n    },\n\n    remove: function(element) {\n      var i = this.indexOf(element);\n      if (i !== 0) {\n        //console.warn('queue order wrong', i);\n        return;\n      }\n      return queueForElement(element).shift();\n    },\n\n    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__queue.check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n\n    nextElement: function() {\n      return nextQueued();\n    },\n\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n\n    isEmpty: function() {\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          return;\n        }\n      }\n      return true;\n    },\n\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n\n    flush: function() {\n      // prevent re-entrance\n      if (this.flushing) {\n        return;\n      }\n      this.flushing = true;\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__queue.go.call(element);\n        element.__queue = null;\n      }\n      this.flushing = false;\n    },\n\n    ready: function() {\n      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading\n      // while registering. This way we avoid having to upgrade each document\n      // piecemeal per registration and can instead register all elements\n      // and upgrade once in a batch. Without this optimization, upgrade time\n      // degrades significantly when SD polyfill is used. This is mainly because\n      // querying the document tree for elements is slow under the SD polyfill.\n      var polyfillWasReady = CustomElements.ready;\n      CustomElements.ready = false;\n      this.flush();\n      if (!CustomElements.useNative) {\n        CustomElements.upgradeDocumentTree(document);\n      }\n      CustomElements.ready = polyfillWasReady;\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n\n    flushReadyCallbacks: function() {\n      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n  \n    /**\n    Returns a list of elements that have had polymer-elements created but \n    are not yet ready to register. The list is an array of element definitions.\n    */\n    waitingFor: function() {\n      var e$ = [];\n      for (var i=0, l=elements.length, e; (i<l) && \n          (e=elements[i]); i++) {\n        if (e.__queue && !e.__queue.flushable) {\n          e$.push(e);\n        }\n      }\n      return e$;\n    },\n\n    waitToReady: true\n\n  };\n\n  var elements = [];\n  var flushQueue = [];\n  var importQueue = [];\n  var mainQueue = [];\n  var readyCallbacks = [];\n\n  function queueForElement(element) {\n    return document.contains(element) ? mainQueue : importQueue;\n  }\n\n  function nextQueued() {\n    return importQueue.length ? importQueue[0] : mainQueue[0];\n  }\n\n  function whenReady(callback) {\n    queue.waitToReady = true;\n    Platform.endOfMicrotask(function() {\n      HTMLImports.whenImportsReady(function() {\n        queue.addReadyCallback(callback);\n        queue.waitToReady = false;\n        queue.check();\n    });\n    });\n  }\n\n  /**\n    Forces polymer to register any pending elements. Can be used to abort\n    waiting for elements that are partially defined.\n    @param timeout {Integer} Optional timeout in milliseconds\n  */\n  function forceReady(timeout) {\n    if (timeout === undefined) {\n      queue.ready();\n      return;\n    }\n    var handle = setTimeout(function() {\n      queue.ready();\n    }, timeout);\n    Polymer.whenReady(function() {\n      clearTimeout(handle);\n    });\n  }\n\n  // exports\n  scope.elements = elements;\n  scope.waitingFor = queue.waitingFor.bind(queue);\n  scope.forceReady = forceReady;\n  scope.queue = queue;\n  scope.whenReady = scope.whenPolymerReady = whenReady;\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenReady = scope.whenReady;\n  var getRegisteredPrototype = scope.getRegisteredPrototype;\n  var waitingForPrototype = scope.waitingForPrototype;\n\n  // declarative implementation: <polymer-element>\n\n  var prototype = extend(Object.create(HTMLElement.prototype), {\n\n    createdCallback: function() {\n      if (this.getAttribute('name')) {\n        this.init();\n      }\n    },\n\n    init: function() {\n      // fetch declared values\n      this.name = this.getAttribute('name');\n      this.extends = this.getAttribute('extends');\n      queue.wait(this);\n      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    // TODO(sorvell): we currently queue in the order the prototypes are \n    // registered, but we should queue in the order that polymer-elements\n    // are registered. We are currently blocked from doing this based on \n    // crbug.com/395686.\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      queue.go(this);\n    },\n\n    _register: function() {\n      //console.log('registering', this.name);\n      // warn if extending from a custom element not registered via Polymer\n      if (isCustomTag(this.extends) && !isRegistered(this.extends)) {\n        console.warn('%s is attempting to extend %s, an unregistered element ' +\n            'or one that was not registered with Polymer.', this.name,\n            this.extends);\n      }\n      this.register(this.name, this.extends);\n      this.registered = true;\n    },\n\n    waitingForPrototype: function(name) {\n      if (!getRegisteredPrototype(name)) {\n        // then wait for a prototype\n        waitingForPrototype(name, this);\n        // emulate script if user is not supplying one\n        this.handleNoScript(name);\n        // prototype not ready yet\n        return true;\n      }\n    },\n\n    handleNoScript: function(name) {\n      // if explicitly marked as 'noscript'\n      if (this.hasAttribute('noscript') && !this.noscript) {\n        this.noscript = true;\n        // imperative element registration\n        Polymer(name);\n      }\n    },\n\n    waitingForResources: function() {\n      return this._needsResources;\n    },\n\n    // NOTE: Elements must be queued in proper order for inheritance/composition\n    // dependency resolution. Previously this was enforced for inheritance,\n    // and by rule for composition. It's now entirely by rule.\n    waitingForQueue: function() {\n      return queue.enqueue(this, this.registerWhenReady, this._register);\n    },\n\n    loadResources: function() {\n      this._needsResources = true;\n      this.loadStyles(function() {\n        this._needsResources = false;\n        this.registerWhenReady();\n      }.bind(this));\n    }\n\n  });\n\n  // semi-pluggable APIs \n\n  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently\n  // the various plugins are allowed to depend on each other directly)\n  api.publish(api.declaration, prototype);\n\n  // utility and bookkeeping\n\n  function isRegistered(name) {\n    return Boolean(HTMLElement.getPrototypeForTag(name));\n  }\n\n  function isCustomTag(name) {\n    return (name && name.indexOf('-') >= 0);\n  }\n\n  // boot tasks\n\n  whenReady(function() {\n    document.body.removeAttribute('unresolved');\n    document.dispatchEvent(\n      new CustomEvent('polymer-ready', {bubbles: true})\n    );\n  });\n\n  // register polymer-element with document\n\n  document.registerElement('polymer-element', {prototype: prototype});\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  var whenPolymerReady = scope.whenPolymerReady;\n\n  function importElements(elementOrFragment, callback) {\n    if (elementOrFragment) {\n      document.head.appendChild(elementOrFragment);\n      whenPolymerReady(callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  function importUrls(urls, callback) {\n    if (urls && urls.length) {\n        var frag = document.createDocumentFragment();\n        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {\n          link = document.createElement('link');\n          link.rel = 'import';\n          link.href = url;\n          frag.appendChild(link);\n        }\n        importElements(frag, callback);\n    } else if (callback) {\n      callback();\n    }\n  }\n\n  // exports\n  scope.import = importUrls;\n  scope.importElements = importElements;\n\n})(Polymer);\n\n/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The `auto-binding` element extends the template element. It provides a quick \n * and easy way to do data binding without the need to setup a model. \n * The `auto-binding` element itself serves as the model and controller for the \n * elements it contains. Both data and event handlers can be bound. \n *\n * The `auto-binding` element acts just like a template that is bound to \n * a model. It stamps its content in the dom adjacent to itself. When the \n * content is stamped, the `template-bound` event is fired.\n *\n * Example:\n *\n *     <template is=\"auto-binding\">\n *       <div>Say something: <input value=\"{{value}}\"></div>\n *       <div>You said: {{value}}</div>\n *       <button on-tap=\"{{buttonTap}}\">Tap me!</button>\n *     </template>\n *     <script>\n *       var template = document.querySelector('template');\n *       template.value = 'something';\n *       template.buttonTap = function() {\n *         console.log('tap!');\n *       };\n *     </script>\n *\n * @module Polymer\n * @status stable\n*/\n\n(function() {\n\n  var element = document.createElement('polymer-element');\n  element.setAttribute('name', 'auto-binding');\n  element.setAttribute('extends', 'template');\n  element.init();\n\n  Polymer('auto-binding', {\n\n    createdCallback: function() {\n      this.syntax = this.bindingDelegate = this.makeSyntax();\n      // delay stamping until polymer-ready so that auto-binding is not\n      // required to load last.\n      Polymer.whenPolymerReady(function() {\n        this.model = this;\n        this.setAttribute('bind', '');\n        // we don't bother with an explicit signal here, we could ust a MO\n        // if necessary\n        this.async(function() {\n          // note: this will marshall *all* the elements in the parentNode\n          // rather than just stamped ones. We'd need to use createInstance\n          // to fix this or something else fancier.\n          this.marshalNodeReferences(this.parentNode);\n          // template stamping is asynchronous so stamping isn't complete\n          // by polymer-ready; fire an event so users can use stamped elements\n          this.fire('template-bound');\n        });\n      }.bind(this));\n    },\n\n    makeSyntax: function() {\n      var events = Object.create(Polymer.api.declaration.events);\n      var self = this;\n      events.findController = function() { return self.model; };\n\n      var syntax = new PolymerExpressions();\n      var prepareBinding = syntax.prepareBinding;  \n      syntax.prepareBinding = function(pathString, name, node) {\n        return events.prepareEventBinding(pathString, name, node) ||\n               prepareBinding.call(syntax, pathString, name, node);\n      };\n      return syntax;\n    }\n\n  });\n\n})();\n\n//# sourceMappingURL=polymer.concat.js.map"]}
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index 772d54d..ff597ad 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -68,6 +68,8 @@
   for (var initializer in initializers) {
     initializer();
   }
+
+  _watchWaitingFor();
 }
 
 /// Configures [initPolymer] making it optimized for deployment to the internet.
@@ -160,3 +162,31 @@
   // Listen to the polymer logs and print them to the console.
   polymerLogger.onRecord.listen((rec) {print(rec);});
 }
+
+/// Watches the waitingFor queue and if it fails to make progress then prints
+/// a message to the console.
+void _watchWaitingFor() {
+  int lastWaiting = Polymer.waitingFor.length;
+  int lastAlert;
+  new Timer.periodic(new Duration(seconds: 1), (Timer timer) {
+    var waiting = Polymer.waitingFor;
+    // Done, cancel timer.
+    if (waiting.isEmpty) {
+      timer.cancel();
+      return;
+    }
+    // Made progress, don't alert.
+    if (waiting.length != lastWaiting) {
+      lastWaiting = waiting.length;
+      return;
+    }
+    // Only alert once per waiting state.
+    if (lastAlert == lastWaiting) return;
+    lastAlert = lastWaiting;
+
+    print('No elements registered in a while, but still waiting on '
+        '${waiting.length} elements to be registered. Check that you have a '
+        'class with an @CustomTag annotation for each of the following tags: '
+        '${waiting.map((e) => "'${e.attributes['name']}'").join(', ')}');
+  });
+}
diff --git a/pkg/polymer/lib/src/property_accessor.dart b/pkg/polymer/lib/src/property_accessor.dart
index b639b47..9903d55 100644
--- a/pkg/polymer/lib/src/property_accessor.dart
+++ b/pkg/polymer/lib/src/property_accessor.dart
@@ -51,6 +51,9 @@
   }
 
   set value(T newValue) {
+    // Dart Note: The js side makes computed properties read only, and bails
+    // out right here for them (ignoreWrites). For us they are automatically
+    // read only unless you define a setter for them, so we left that out.
     if (bindable != null) {
       bindable.value = newValue;
     } else {
diff --git a/pkg/polymer/lib/transformer.dart b/pkg/polymer/lib/transformer.dart
index c367716..cdc13b9 100644
--- a/pkg/polymer/lib/transformer.dart
+++ b/pkg/polymer/lib/transformer.dart
@@ -11,6 +11,7 @@
 
 import 'src/build/build_filter.dart';
 import 'src/build/common.dart';
+import 'src/build/index_page_builder.dart';
 import 'src/build/import_inliner.dart';
 import 'src/build/linter.dart';
 import 'src/build/build_log_combiner.dart';
@@ -44,6 +45,7 @@
   bool lint = args['lint'] != false; // defaults to true
   bool injectBuildLogs =
       !releaseMode && args['inject_build_logs_in_output'] != false;
+  bool injectPlatformJs = args['inject_platform_js'] != false;
   return new TransformOptions(
       entryPoints: readEntrypoints(args['entry_points']),
       inlineStylesheets: _readInlineStylesheets(args['inline_stylesheets']),
@@ -51,7 +53,8 @@
       contentSecurityPolicy: csp,
       releaseMode: releaseMode,
       lint: lint,
-      injectBuildLogsInOutput: injectBuildLogs);
+      injectBuildLogsInOutput: injectBuildLogs,
+      injectPlatformJs: injectPlatformJs);
 }
 
 readEntrypoints(value) {
@@ -118,7 +121,7 @@
   // that is reachable and have the option to lint the rest (similar to how
   // dart2js can analyze reachable code or entire libraries).
   var phases = options.lint ? [[new Linter(options)]] : [];
-  return phases..addAll([
+  phases.addAll([
     [new ImportInliner(options)],
     [new ObservableTransformer()],
     [new ScriptCompactor(options, sdkDir: sdkDir)],
@@ -126,6 +129,10 @@
     [new BuildFilter(options)],
     [new BuildLogCombiner(options)],
   ]);
+  if (!options.releaseMode) {
+    phases.add([new IndexPageBuilder(options)]);
+  }
+  return phases;
 }
 
 final RegExp _PACKAGE_PATH_REGEX = new RegExp(r'packages\/([^\/]+)\/(.*)');
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 790d2a3..46b4b05 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.14.0+1
+version: 0.15.0-dev
 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
diff --git a/pkg/polymer/test/build/all_phases_test.dart b/pkg/polymer/test/build/all_phases_test.dart
index 150913c..029b9a38 100644
--- a/pkg/polymer/test/build/all_phases_test.dart
+++ b/pkg/polymer/test/build/all_phases_test.dart
@@ -201,7 +201,10 @@
       'a|web/index.html':
           '<!DOCTYPE html><html><head>'
           '$WEB_COMPONENTS_TAG'
-          '</head><body><polymer-element name="x-a">1</polymer-element>'
+          '</head><body>'
+          '<div hidden="">'
+          '<polymer-element name="x-a">1</polymer-element>'
+          '</div>'
           '<script src="index.html_bootstrap.dart.js" async=""></script>'
           '</body></html>',
       'a|web/index.html_bootstrap.dart':
@@ -260,7 +263,10 @@
       'a|web/index.html':
           '<!DOCTYPE html><html><head>'
           '$WEB_COMPONENTS_TAG'
-          '</head><body><polymer-element name="x-a">1</polymer-element>'
+          '</head><body>'
+          '<div hidden="">'
+          '<polymer-element name="x-a">1</polymer-element>'
+          '</div>'
           '<script src="index.html_bootstrap.dart.js" async=""></script>'
           '</body></html>',
       'a|web/index.html_bootstrap.dart':
diff --git a/pkg/polymer/test/build/common.dart b/pkg/polymer/test/build/common.dart
index c50efa6..eed4c20 100644
--- a/pkg/polymer/test/build/common.dart
+++ b/pkg/polymer/test/build/common.dart
@@ -202,6 +202,8 @@
 const WEB_COMPONENTS_TAG =
     '<script src="packages/web_components/platform.js"></script>\n'
     '<script src="packages/web_components/dart_support.js"></script>\n';
+const DART_SUPPORT_TAG =
+    '<script src="packages/web_components/dart_support.js"></script>\n';
 
 const INTEROP_TAG = '<script src="packages/browser/interop.js"></script>\n';
 const DART_JS_TAG = '<script src="packages/browser/dart.js"></script>';
diff --git a/pkg/polymer/test/build/import_inliner_test.dart b/pkg/polymer/test/build/import_inliner_test.dart
index 0602b53..a891a12 100644
--- a/pkg/polymer/test/build/import_inliner_test.dart
+++ b/pkg/polymer/test/build/import_inliner_test.dart
@@ -85,7 +85,9 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>2</polymer-element>'
+          '</div>'
           '</body></html>',
       'a|web/test.html._data': EMPTY_DATA,
       'a|web/test2.html':
@@ -110,12 +112,14 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '</head><body>'
           '<script type="text/javascript">/*first*/</script>'
           '<script src="second.js"></script>'
+          '</head><body>'
+          '<div hidden="">'
           '<script>/*third*/</script>'
           '<polymer-element>2</polymer-element>'
           '<script>/*forth*/</script>'
+          '</div>'
           '</body></html>',
       'a|web/test.html._data': EMPTY_DATA,
       'a|web/test2.html':
@@ -142,19 +146,24 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '</head><body>'
           '<script type="text/javascript">/*first*/</script>'
           '<script src="second.js"></script>'
+          '</head><body>'
+          '<div hidden="">'
           '<script>/*third*/</script>'
           '<polymer-element>2</polymer-element>'
+          '</div>'
           '</body></html>',
       'a|web/test.html._data': expectedData([
           'web/test.html.1.dart','web/test.html.0.dart']),
       'a|web/test.html.1.dart': 'library a.web.test2_html_0;\n/*forth*/',
       'a|web/test.html.0.dart': 'library a.web.test_html_0;\n/*fifth*/',
       'a|web/test2.html':
-          '<!DOCTYPE html><html><head></head><body><script>/*third*/</script>'
-          '<polymer-element>2</polymer-element></body></html>',
+          '<!DOCTYPE html><html><head>'
+          '<script>/*third*/</script>'
+          '</head><body>'
+          '<polymer-element>2</polymer-element>'
+          '</body></html>',
       'a|web/test2.html._data': expectedData(['web/test2.html.0.dart']),
       'a|web/test2.html.0.dart': 'library a.web.test2_html_0;\n/*forth*/',
       'a|web/second.js': '/*second*/'
@@ -179,11 +188,13 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '</head><body>'
           '<script type="text/javascript" src="test.html.0.js"></script>'
           '<script src="second.js"></script>'
+          '</head><body>'
+          '<div hidden="">'
           '<script src="test.html.2.js"></script>'
           '<polymer-element>2</polymer-element>'
+          '</div>'
           '</body></html>',
       'a|web/test.html._data': expectedData([
           'web/test.html.3.dart','web/test.html.1.dart']),
@@ -192,8 +203,9 @@
       'a|web/test.html.0.js': '/*first*/',
       'a|web/test.html.2.js': '/*third*/',
       'a|web/test2.html':
-          '<!DOCTYPE html><html><head></head><body>'
+          '<!DOCTYPE html><html><head>'
           '<script src="test2.html.0.js"></script>'
+          '</head><body>'
           '<polymer-element>2</polymer-element></body></html>',
       'a|web/test2.html._data': expectedData(['web/test2.html.1.dart']),
       'a|web/test2.html.0.js': '/*third*/',
@@ -272,8 +284,10 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>2</polymer-element>'
           '<polymer-element>3</polymer-element>'
+          '</div>'
           '</body></html>',
       'a|web/test2.html':
           '<!DOCTYPE html><html><head>'
@@ -303,15 +317,21 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>4</polymer-element>'
           '<polymer-element>3</polymer-element>'
-          '<polymer-element>2</polymer-element></body></html>',
+          '<polymer-element>2</polymer-element>'
+          '</div>'
+          '</body></html>',
       'a|web/test2.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>4</polymer-element>'
           '<polymer-element>3</polymer-element>'
-          '<polymer-element>2</polymer-element></body></html>',
+          '</div>'
+          '<polymer-element>2</polymer-element>'
+          '</body></html>',
       'b|asset/test3.html':
           '<!DOCTYPE html><html><head>'
           '<link rel="import" href="../../packages/c/test4.html">'
@@ -353,25 +373,31 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>3a</polymer-element>'
           '<polymer-element>3b</polymer-element>'
           '<polymer-element>2a</polymer-element>'
           '<polymer-element>4a</polymer-element>'
           '<polymer-element>4b</polymer-element>'
           '<polymer-element>2b</polymer-element>'
+          '</div>'
           '</body></html>',
       'a|web/test2a.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>3a</polymer-element>'
           '<polymer-element>3b</polymer-element>'
+          '</div>'
           '<polymer-element>2a</polymer-element>'
           '</body></html>',
       'a|web/test2b.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>4a</polymer-element>'
           '<polymer-element>4b</polymer-element>'
+          '</div>'
           '<polymer-element>2b</polymer-element>'
           '</body></html>',
       'a|web/test3a.html':
@@ -413,17 +439,24 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>2</polymer-element>'
-          '<polymer-element>1</polymer-element></body></html>',
+          '<polymer-element>1</polymer-element>'
+          '</div>'
+          '</body></html>',
       'a|web/test_1.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>2</polymer-element>'
+          '</div>'
           '<polymer-element>1</polymer-element></body></html>',
       'a|web/test_2.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>1</polymer-element>'
+          '</div>'
           '<polymer-element>2</polymer-element></body></html>',
     });
 
@@ -446,24 +479,31 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>2</polymer-element>'
           '<script src="s2"></script>'
           '<polymer-element>1</polymer-element>'
-          '<script src="s1"></script></body></html>',
+          '<script src="s1"></script>'
+          '</div>'
+          '</body></html>',
       'a|web/test.html._data': EMPTY_DATA,
       'a|web/test_1.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>2</polymer-element>'
           '<script src="s2"></script>'
+          '</div>'
           '<polymer-element>1</polymer-element>'
           '<script src="s1"></script></body></html>',
       'a|web/test_1.html._data': EMPTY_DATA,
       'a|web/test_2.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>1</polymer-element>'
           '<script src="s1"></script>'
+          '</div>'
           '<polymer-element>2</polymer-element>'
           '<script src="s2"></script></body></html>',
       'a|web/test_2.html._data': EMPTY_DATA,
@@ -493,21 +533,27 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>2</polymer-element>'
           '<polymer-element>1</polymer-element>'
+          '</div>'
           '</body></html>',
       'a|web/test.html._data': expectedData(['web/s2.dart', 'web/s1.dart']),
       'a|web/test_1.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>2</polymer-element>'
+          '</div>'
           '<polymer-element>1</polymer-element>'
           '</body></html>',
       'a|web/test_1.html._data': expectedData(['web/s2.dart', 'web/s1.dart']),
       'a|web/test_2.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>1</polymer-element>'
+          '</div>'
           '<polymer-element>2'
           '</polymer-element>'
           '</body></html>',
@@ -534,11 +580,14 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<foo>42</foo><bar-baz></bar-baz>'
           '<polymer-element>1'
           '<script src="s1.js"></script>'
           '</polymer-element>'
-          'FOO</body></html>',
+          'FOO'
+          '</div>'
+          '</body></html>',
       'a|web/test.html._data': expectedData(['web/s1.dart']),
       'a|web/test_1.html':
           '<!DOCTYPE html><html><head>'
@@ -572,26 +621,35 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>3</polymer-element>'
           '<polymer-element>2</polymer-element>'
-          '<polymer-element>1</polymer-element></body></html>',
+          '<polymer-element>1</polymer-element>'
+          '</div>'
+          '</body></html>',
       'a|web/test_1.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>3</polymer-element>'
           '<polymer-element>2</polymer-element>'
+          '</div>'
           '<polymer-element>1</polymer-element></body></html>',
       'a|web/test_2.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>1</polymer-element>'
           '<polymer-element>3</polymer-element>'
+          '</div>'
           '<polymer-element>2</polymer-element></body></html>',
       'a|web/test_3.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>2</polymer-element>'
           '<polymer-element>1</polymer-element>'
+          '</div>'
           '<polymer-element>3</polymer-element></body></html>',
     });
 
@@ -608,7 +666,10 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
-          '<polymer-element>1</polymer-element></body></html>',
+          '<div hidden="">'
+          '<polymer-element>1</polymer-element>'
+          '</div>'
+          '</body></html>',
       'a|web/test_1.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
@@ -636,18 +697,25 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>3</polymer-element>'
           '<polymer-element>1</polymer-element>'
-          '<polymer-element>2</polymer-element></body></html>',
+          '<polymer-element>2</polymer-element>'
+          '</div>'
+          '</body></html>',
       'a|web/test_1.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>3</polymer-element>'
+          '</div>'
           '<polymer-element>1</polymer-element></body></html>',
       'a|web/test_2.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
+          '<div hidden="">'
           '<polymer-element>3</polymer-element>'
+          '</div>'
           '<polymer-element>2</polymer-element></body></html>',
       'a|web/test_3.html':
           '<!DOCTYPE html><html><head>'
@@ -664,8 +732,9 @@
             '</head></html>',
       }, {
         'a|web/test.html':
-            '<!DOCTYPE html><html><head></head><body>'
+            '<!DOCTYPE html><html><head>'
             '<link rel="stylesheet" href="foo.css">'
+            '</head><body>'
             '</body></html>',
       }, [
         'warning: Failed to inline stylesheet: '
@@ -766,8 +835,9 @@
           'h1 { font-size: 70px; }',
     }, {
       'a|web/test.html':
-          '<!DOCTYPE html><html><head></head><body>'
+          '<!DOCTYPE html><html><head>'
           '<style>h1 { font-size: 70px; }</style>'
+          '</head><body>'
           '</body></html>',
       'a|web/test.html._data': EMPTY_DATA,
       'a|web/test2.css':
@@ -791,12 +861,14 @@
     }, {
       'a|web/test.html':
         '<!DOCTYPE html><html><head></head><body>'
+        '<div hidden="">'
         '<polymer-element>2'
         '<style>'
         'body {\n  background: #eaeaea url(assets/b/test4.png);\n}\n'
         '.foo {\n  background: url(packages/c/test5.png);\n}'
         '</style>'
         '</polymer-element>'
+        '</div>'
         '</body></html>',
       'a|web/test2.html':
           '<html><head></head><body>'
@@ -820,7 +892,9 @@
           '<link rel="import" href="foo/test2.html">'
           '</head></html>',
       'a|web/foo/test2.html':
+          // When parsed, this is in the <head>.
           '<link rel="import" href="bar/test3.html">'
+          // This is where the parsed <body> starts.
           '<polymer-element>2'
           '<link rel="stylesheet" href="test.css">'
           '</polymer-element>',
@@ -832,20 +906,26 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body>'
+          '<div hidden="">'
           '<img src="foo/bar/qux.png">'
           '<polymer-element>2'
           '<style>'
           'body {\n  background: #eaeaea url(foo/test4.png);\n}\n'
           '.foo {\n  background: url(foo/test5.png);\n}'
-          '</style></polymer-element></body></html>',
+          '</style></polymer-element>'
+          '</div>'
+          '</body></html>',
       'a|web/foo/test2.html':
           '<html><head></head><body>'
+          '<div hidden="">'
           '<img src="bar/qux.png">'
+          '</div>'
           '<polymer-element>2'
           '<style>'
           'body {\n  background: #eaeaea url(test4.png);\n}\n'
           '.foo {\n  background: url(test5.png);\n}'
-          '</style></polymer-element></body></html>',
+          '</style></polymer-element>'
+          '</body></html>',
       'a|web/foo/bar/test3.html':
           '<img src="qux.png">',
       'a|web/foo/test.css':
@@ -864,10 +944,11 @@
           'h1 { font-size: 70px; }',
     }, {
       'a|web/test.html':
-          '<!DOCTYPE html><html><head></head><body>'
+          '<!DOCTYPE html><html><head>'
           '<style>.first { color: black }</style>'
           '<style>h1 { font-size: 70px; }</style>'
           '<style>.second { color: black }</style>'
+          '</head><body>'
           '</body></html>',
       'a|web/test.html._data': EMPTY_DATA,
       'a|web/test2.css':
@@ -886,9 +967,10 @@
            'h2 { font-size: 35px; }',
      }, {
        'a|web/test.html':
-           '<!DOCTYPE html><html><head></head><body>'
+           '<!DOCTYPE html><html><head>'
            '<style no-shim="">h1 { font-size: 70px; }</style>'
            '<style shim-shadow="" foo="">h2 { font-size: 35px; }</style>'
+           '</head><body>'
            '</body></html>',
        'a|web/foo.css':
            'h1 { font-size: 70px; }',
@@ -946,6 +1028,69 @@
             '<link rel="stylesheet" href="packages/c/buz.css">'
             '</body></html>',
       });
+
+  testLogOutput(
+      (options) => new ImportInliner(options),
+      'warns about multiple inlinings of the same css', {
+        'a|web/test.html':
+            '<!DOCTYPE html><html><head>'
+            '<link rel="stylesheet" href="packages/a/foo.css">'
+            '<link rel="stylesheet" href="packages/a/foo.css">'
+            '</head><body></body></html>',
+        'a|web/test1.html':
+            '<!DOCTYPE html><html><head>'
+            '<link rel="stylesheet" href="packages/a/foo.css">'
+            '<link rel="import" href="packages/a/import1.html">'
+            '</head><body></body></html>',
+        'a|web/test2.html':
+            '<!DOCTYPE html><html><head>'
+            '<link rel="import" href="packages/a/import1.html">'
+            '<link rel="import" href="packages/a/import2.html">'
+            '</head><body></body></html>',
+        'a|lib/import1.html':
+            '<link rel="stylesheet" href="foo.css">',
+        'a|lib/import2.html':
+            '<link rel="stylesheet" href="foo.css">',
+        'a|lib/foo.css':
+            'body {position: relative;}',
+      }, {}, [
+          'warning: ${CSS_FILE_INLINED_MULTIPLE_TIMES.create(
+              {'url': 'lib/foo.css'}).snippet}'
+              ' (web/test.html 0 76)',
+          'warning: ${CSS_FILE_INLINED_MULTIPLE_TIMES.create(
+              {'url': 'lib/foo.css'}).snippet}'
+              ' (lib/import1.html 0 0)',
+          'warning: ${CSS_FILE_INLINED_MULTIPLE_TIMES.create(
+              {'url': 'lib/foo.css'}).snippet}'
+              ' (lib/import2.html 0 0)',
+      ]);
+
+  testPhases(
+        'doesn\'t warn about multiple css inlinings if overriden',
+        [[new ImportInliner(new TransformOptions(
+            inlineStylesheets: {'lib/foo.css': true}))]], {
+            'a|web/test.html':
+                '<!DOCTYPE html><html><head>'
+                '<link rel="stylesheet" href="packages/a/foo.css">'
+                '<link rel="stylesheet" href="packages/a/foo.css">'
+                '</head><body></body></html>',
+            'a|web/test1.html':
+                '<!DOCTYPE html><html><head>'
+                '<link rel="stylesheet" href="packages/a/foo.css">'
+                '<link rel="import" href="packages/a/import1.html">'
+                '</head><body></body></html>',
+            'a|web/test2.html':
+                '<!DOCTYPE html><html><head>'
+                '<link rel="import" href="packages/a/import1.html">'
+                '<link rel="import" href="packages/a/import2.html">'
+                '</head><body></body></html>',
+            'a|lib/import1.html':
+                '<link rel="stylesheet" href="foo.css">',
+            'a|lib/import2.html':
+                '<link rel="stylesheet" href="foo.css">',
+            'a|lib/foo.css':
+                'body {position: relative;}',
+          }, {}, []);
 }
 
 void urlAttributeTests() {
@@ -963,8 +1108,10 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body>'
+          '<div hidden="">'
           '<script src="foo/baz.jpg"></script>'        // normalized
           '<foo-element src="baz.jpg"></foo-element>'  // left alone (custom)
+          '</div>'
           '</body></html>',
       'a|web/foo/test_1.html':
           '<script src="baz.jpg"></script>',
@@ -983,8 +1130,10 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body>'
+          '<div hidden="">'
           '<img src="{{bar}}">'
           '<img src="[[bar]]">'
+          '</div>'
           '</body></html>',
       'a|web/foo/test.html':
           '<img src="{{bar}}">'
@@ -1002,8 +1151,10 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body>'
+          '<div hidden="">'
           '<img src="foo/baz/{{bar}}">'
           '<img src="foo/{{bar}}">'
+          '</div>'
           '</body></html>',
     });
 
@@ -1018,8 +1169,10 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body>'
+          '<div hidden="">'
           '<img _src="foo/{{bar}}">'
           '<a _href="foo/{{bar}}">test</a>'
+          '</div>'
           '</body></html>',
     });
 
@@ -1083,7 +1236,9 @@
     }, {
       'a|web/test/test.html':
           '<!DOCTYPE html><html><head></head><body>'
+          '<div hidden="">'
           '<script rel="import" href="../packages/b/bar/bar.js"></script>'
+          '</div>'
           '</body></html>',
     });
 
@@ -1096,8 +1251,9 @@
           'console.log("here");',
     }, {
       'a|web/test/test.html':
-          '<!DOCTYPE html><html><head></head><body>'
+          '<!DOCTYPE html><html><head>'
           '<script src="../packages/a/foo/bar.js"></script>'
+          '</head><body>'
           '</body></html>',
     });
 
@@ -1113,7 +1269,9 @@
   }, {
     'a|web/test/well/test.html':
         '<!DOCTYPE html><html><head></head><body>'
+        '<div hidden="">'
         '<script rel="import" href="../../packages/b/bar/bar.js"></script>'
+        '</div>'
         '</body></html>',
   });
 }
diff --git a/pkg/polymer/test/build/index_page_builder_test.dart b/pkg/polymer/test/build/index_page_builder_test.dart
new file mode 100644
index 0000000..d051199
--- /dev/null
+++ b/pkg/polymer/test/build/index_page_builder_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library polymer.test.build.index_page_builder_test;
+
+import 'dart:async';
+import 'package:unittest/compact_vm_config.dart';
+import 'package:unittest/unittest.dart';
+import 'package:polymer/src/build/common.dart';
+import 'package:polymer/src/build/index_page_builder.dart';
+
+import 'common.dart';
+
+final phases = [[new IndexPageBuilder(new TransformOptions())]];
+
+void main() {
+  useCompactVMConfiguration();
+
+  testPhases('outputs index pages', phases, {
+      'a|web/test.html': '<!DOCTYPE html><html></html>',
+      'a|web/test2.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/test3.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/bar/test4.html': '<!DOCTYPE html><html></html>',
+      'a|web/foobar/test5.html': '<!DOCTYPE html><html></html>',
+    }, {
+      'a|web/index.html': '<!DOCTYPE html><html><body>'
+          '<h1>Entry points</h1><ul>'
+          '<li><a href="test.html">test.html</a></li>'
+          '<li><a href="test2.html">test2.html</a></li>'
+          '<li><a href="foo/test3.html">foo/test3.html</a></li>'
+          '<li><a href="foo/bar/test4.html">foo/bar/test4.html</a></li>'
+          '<li><a href="foobar/test5.html">foobar/test5.html</a></li>'
+          '</ul></body></html>',
+      'a|web/foo/index.html': '<!DOCTYPE html><html><body>'
+          '<h1>Entry points</h1><ul>'
+          '<li><a href="test3.html">test3.html</a></li>'
+          '<li><a href="bar/test4.html">bar/test4.html</a></li>'
+          '</ul></body></html>',
+      'a|web/foo/bar/index.html': '<!DOCTYPE html><html><body>'
+          '<h1>Entry points</h1><ul>'
+          '<li><a href="test4.html">test4.html</a></li>'
+          '</ul></body></html>',
+      'a|web/foobar/index.html': '<!DOCTYPE html><html><body>'
+          '<h1>Entry points</h1><ul>'
+          '<li><a href="test5.html">test5.html</a></li>'
+          '</ul></body></html>',
+    });
+
+  testPhases('doesn\'t overwrite existing pages', phases, {
+      'a|web/index.html': '<!DOCTYPE html><html></html>',
+      'a|web/test.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/index.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/test.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/bar/index.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/bar/test.html': '<!DOCTYPE html><html></html>',
+    }, {
+      'a|web/index.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/index.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/bar/index.html': '<!DOCTYPE html><html></html>',
+    });
+
+  testPhases('can output pages while not overwriting existing ones', phases, {
+      'a|web/test.html': '<!DOCTYPE html><html></html>',
+      'a|web/test2.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/index.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/test3.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/bar/index.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/bar/test4.html': '<!DOCTYPE html><html></html>',
+      'a|web/foobar/test5.html': '<!DOCTYPE html><html></html>',
+    }, {
+      'a|web/index.html': '<!DOCTYPE html><html><body>'
+          '<h1>Entry points</h1><ul>'
+          '<li><a href="test.html">test.html</a></li>'
+          '<li><a href="test2.html">test2.html</a></li>'
+          '<li><a href="foo/index.html">foo/index.html</a></li>'
+          '<li><a href="foo/test3.html">foo/test3.html</a></li>'
+          '<li><a href="foo/bar/index.html">foo/bar/index.html</a></li>'
+          '<li><a href="foo/bar/test4.html">foo/bar/test4.html</a></li>'
+          '<li><a href="foobar/test5.html">foobar/test5.html</a></li>'
+          '</ul></body></html>',
+      'a|web/foo/index.html': '<!DOCTYPE html><html></html>',
+      'a|web/foo/bar/index.html': '<!DOCTYPE html><html></html>',
+      'a|web/foobar/index.html': '<!DOCTYPE html><html><body>'
+          '<h1>Entry points</h1><ul>'
+          '<li><a href="test5.html">test5.html</a></li>'
+          '</ul></body></html>',
+    });
+
+  final entryPointPhases = [[new IndexPageBuilder(
+      new TransformOptions(entryPoints: [
+          'web/test1.html', 'test/test2.html', 'example/test3.html']))]];
+  
+  testPhases('can output files for any entry points', entryPointPhases, {
+      'a|web/test1.html': '<!DOCTYPE html><html></html>',
+      'a|test/test2.html': '<!DOCTYPE html><html></html>',
+      'a|example/test3.html': '<!DOCTYPE html><html></html>',
+    }, {
+      'a|web/index.html': '<!DOCTYPE html><html><body>'
+          '<h1>Entry points</h1><ul>'
+          '<li><a href="test1.html">test1.html</a></li>'
+          '</ul></body></html>',
+      'a|test/index.html': '<!DOCTYPE html><html><body>'
+          '<h1>Entry points</h1><ul>'
+          '<li><a href="test2.html">test2.html</a></li>'
+          '</ul></body></html>',
+      'a|example/index.html': '<!DOCTYPE html><html><body>'
+          '<h1>Entry points</h1><ul>'
+          '<li><a href="test3.html">test3.html</a></li>'
+          '</ul></body></html>',
+    });
+}
+
diff --git a/pkg/polymer/test/build/linter_test.dart b/pkg/polymer/test/build/linter_test.dart
index 116b9a6..71e0b41 100644
--- a/pkg/polymer/test/build/linter_test.dart
+++ b/pkg/polymer/test/build/linter_test.dart
@@ -623,64 +623,104 @@
       ]);
 
     _testLinter('FOUC warning works', {
-        'a|lib/a.html': '''
+        'a|web/a.html': '''
+            <!DOCTYPE html>
             <html><body>
               <link rel="import" href="../../packages/polymer/polymer.html">
               <polymer-element name="my-element" noscript></polymer-element>
               <my-element>hello!</my-element>
+              <script type="application/dart">
+                export "package:polymer/init.dart";
+              </script>
             </body></html>
             ''',
-        'a|lib/b.html': '''
+        'a|web/b.html': '''
+            <!DOCTYPE html>
             <html><body>
               <link rel="import" href="../../packages/polymer/polymer.html">
               <polymer-element name="my-element" noscript></polymer-element>
               <div><my-element>hello!</my-element></div>
+              <script type="application/dart">
+                export "package:polymer/init.dart";
+              </script>
             </body></html>
             ''',
-        'a|lib/c.html': '''
+        'a|web/c.html': '''
+            <!DOCTYPE html>
             <html unresolved><body>
               <link rel="import" href="../../packages/polymer/polymer.html">
               <polymer-element name="my-element" noscript></polymer-element>
               <my-element>hello!</my-element>
+              <script type="application/dart">
+                export "package:polymer/init.dart";
+              </script>
             </body></html>
             '''
       }, [
-        'warning: ${POSSIBLE_FUOC.snippet} (lib/a.html 3 14)',
-        'warning: ${POSSIBLE_FUOC.snippet} (lib/b.html 3 19)',
-        'warning: ${POSSIBLE_FUOC.snippet} (lib/c.html 3 14)',
+        'warning: ${POSSIBLE_FUOC.snippet} (web/a.html 4 14)',
+        'warning: ${POSSIBLE_FUOC.snippet} (web/b.html 4 19)',
+        'warning: ${POSSIBLE_FUOC.snippet} (web/c.html 4 14)',
       ]);
 
     _testLinter('FOUC, no false positives.', {
-        'a|lib/a.html': '''
-            <html><body><div unresolved>
-              <link rel="import" href="../../packages/polymer/polymer.html">
-              <polymer-element name="my-element" noscript></polymer-element>
-              <my-element>hello!</my-element>
-            </div></body></html>
+        // Parent has unresolved attribute.
+        'a|web/a.html': '''
+            <!DOCTYPE html>
+            <html><body>
+              <div unresolved>
+                <link rel="import" href="../../packages/polymer/polymer.html">
+                <polymer-element name="my-element" noscript></polymer-element>
+                <my-element>hello!</my-element>
+              </div>
+              <script type="application/dart">
+                export "package:polymer/init.dart";
+              </script>
+            </body></html>
             ''',
-        'a|lib/b.html': '''
+        // Body has unresolved attribute.
+        'a|web/b.html': '''
+            <!DOCTYPE html>
             <html><body unresolved>
               <link rel="import" href="../../packages/polymer/polymer.html">
               <polymer-element name="my-element" noscript></polymer-element>
               <my-element>hello!</my-element>
+              <script type="application/dart">
+                export "package:polymer/init.dart";
+              </script>
             </body></html>
             ''',
-        'a|lib/c.html': '''
+        // Inside polymer-element tags its fine.
+        'a|web/c.html': '''
+            <!DOCTYPE html>
             <html><body>
               <link rel="import" href="../../packages/polymer/polymer.html">
               <polymer-element name="my-element" noscript></polymer-element>
               <polymer-element name="foo-element">
                 <template><my-element>hello!</my-element></template>
               </polymer-element>
+              <script type="application/dart">
+                export "package:polymer/init.dart";
+              </script>
             </body></html>
             ''',
-        'a|lib/d.html': '''
+        // Empty custom elements are fine.
+        'a|web/d.html': '''
+            <!DOCTYPE html>
             <html><body>
               <link rel="import" href="../../packages/polymer/polymer.html">
               <polymer-element name="my-element" noscript></polymer-element>
               <my-element></my-element>
+              <script type="application/dart">
+                export "package:polymer/init.dart";
+              </script>
             </body></html>
             ''',
+        // Entry points only!
+        'a|lib/a.html': '''
+            <link rel="import" href="../../packages/polymer/polymer.html">
+            <polymer-element name="my-element" noscript></polymer-element>
+            <my-element>hello!</my-element>
+            ''',
       }, []);
   });
 
diff --git a/pkg/polymer/test/build/polyfill_injector_test.dart b/pkg/polymer/test/build/polyfill_injector_test.dart
index 43a5ad2..84af1c7 100644
--- a/pkg/polymer/test/build/polyfill_injector_test.dart
+++ b/pkg/polymer/test/build/polyfill_injector_test.dart
@@ -73,4 +73,21 @@
           '$dartJsTag'
           '</body></html>',
     });
+
+  var noPlatformPhases = [[new PolyfillInjector(new TransformOptions(
+        directlyIncludeJS: js, injectPlatformJs: false))]];
+
+  testPhases('with no platform.js', noPlatformPhases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '<script type="application/dart" src="a.dart"></script>',
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '$DART_SUPPORT_TAG'
+          '</head><body>'
+          '<script ${type}src="a.dart$ext"$async></script>'
+          '$dartJsTag'
+          '</body></html>',
+    });
 }
diff --git a/pkg/polymer/test/computed_properties_test.html b/pkg/polymer/test/computed_properties_test.html
index cdca3fa..2dd7256 100644
--- a/pkg/polymer/test/computed_properties_test.html
+++ b/pkg/polymer/test/computed_properties_test.html
@@ -10,7 +10,7 @@
   </head>
 
   <body>
-  <x-foo foo="mee" bar="too" count=3></x-foo>
+    <x-foo foo="mee" bar="too" count=3></x-foo>
 
     <polymer-element name="x-foo" attributes="foo bar count">
       <template>{{ fooBar }}:{{ fooBarCounted }}</template>
diff --git a/pkg/polymer/test/event_controller_test.dart b/pkg/polymer/test/event_controller_test.dart
new file mode 100644
index 0000000..e738f33
--- /dev/null
+++ b/pkg/polymer/test/event_controller_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library polymer.test.event_controller_test;
+
+import 'dart:async';
+import 'dart:js';
+import 'dart:html';
+import 'package:polymer/polymer.dart';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+
+var clickButtonCount = 0;
+var clickXDartCount = 0;
+var clickXJsCount = 0;
+
+@CustomTag('x-dart')
+class XDart extends PolymerElement {
+  XDart.created() : super.created();
+}
+
+@CustomTag('x-controller')
+class XController extends PolymerElement {
+  XController.created() : super.created();
+  clickButton() {++clickButtonCount;}
+  clickXDart() {++clickXDartCount;}
+  clickXJs() {++clickXJsCount;}
+}
+
+main() => initPolymer().run(() {
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('native element eventController is used properly', () {
+    var controller = querySelector('x-controller');
+    var button = controller.shadowRoot.querySelector('button');
+    new JsObject.fromBrowserObject(button)['eventController'] = controller;
+    button.remove();
+    querySelector('body').append(button);
+
+    button.click();
+    expect(clickButtonCount, 1);
+  });
+
+  test('dart polymer element eventController is used properly', () {
+    var controller = querySelector('x-controller');
+    XDart xDart = controller.shadowRoot.querySelector('x-dart');
+    xDart.eventController = controller;
+    xDart.remove();
+    querySelector('body').append(xDart);
+
+    xDart.click();
+    expect(clickXDartCount, 1);
+  });
+
+  test('js polymer elements eventController is used properly', () {
+    var controller = querySelector('x-controller');
+    var xJs = controller.shadowRoot.querySelector('x-js');
+    new JsObject.fromBrowserObject(xJs)['eventController'] = controller;
+    xJs.remove();
+    querySelector('body').append(xJs);
+
+    xJs.click();
+    expect(clickXJsCount, 1);
+  });
+});
diff --git a/pkg/polymer/test/event_controller_test.html b/pkg/polymer/test/event_controller_test.html
new file mode 100644
index 0000000..b623a3d
--- /dev/null
+++ b/pkg/polymer/test/event_controller_test.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<!--
+Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+-->
+<html>
+  <!--polymer-test: this comment is needed for test_suite.dart-->
+  <head>
+    <title>attached binding test</title>
+    <script src="packages/web_components/dart_support.js"></script>
+    <link rel="import" href="packages/polymer/polymer.html">
+    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  </head>
+  <body>
+    This tests that eventController can properly be detected from dart,
+    javascript, and native elements.
+    <br>
+
+    <polymer-element name="x-js" noscript>
+      <template>click x-js!</template>
+    </polymer-element>
+
+    <polymer-element name="x-dart">
+      <template>click x-dart!</template>
+    </polymer-element>
+
+    <polymer-element name="x-controller">
+      <template>
+         <button on-click="{{clickButton}}">Click me</button>
+         <x-js on-click="{{clickXJs}}"></x-js>
+         <x-dart on-click="{{clickXDart}}"></x-dart>
+      </template>
+    </polymer-element>
+
+    <x-controller></x-controller>
+
+    <script type="application/dart" src="event_controller_test.dart"></script>
+  </body>
+</html>
diff --git a/pkg/polymer/test/force_ready_test.dart b/pkg/polymer/test/force_ready_test.dart
new file mode 100644
index 0000000..3314f1b
--- /dev/null
+++ b/pkg/polymer/test/force_ready_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:html';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:polymer/polymer.dart';
+
+main() => initPolymer().run(() {
+  useHtmlConfiguration();
+
+  setUp(() => window.on['HTMLImportsLoaded']);
+
+  /// We do not port the full test, since this just proxies through to the
+  /// polymer js implementation.
+  test('can force ready', () {
+    return new Future(() {}).then((_) {
+      expect(Polymer.waitingFor.length, 1);
+      expect(Polymer.waitingFor[0], querySelector('polymer-element'));
+      Polymer.forceReady();
+      return Polymer.onReady;
+    });
+  });
+});
diff --git a/pkg/polymer/test/force_ready_test.html b/pkg/polymer/test/force_ready_test.html
new file mode 100644
index 0000000..36aa5f1
--- /dev/null
+++ b/pkg/polymer/test/force_ready_test.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+  <!--polymer-test: this comment is needed for test_suite.dart-->
+  <head>
+    <title>force ready</title>
+    <script src="packages/web_components/platform.js"></script>
+    <script src="packages/web_components/dart_support.js"></script>
+    <link rel="import" href="packages/polymer/polymer.html">
+    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  </head>
+
+  <body>
+    <polymer-element name="x-foo"></polymer-element>
+
+    <script type="application/dart" src="force_ready_test.dart"></script>
+  </body>
+</html>
diff --git a/pkg/polymer/test/inject_bound_html_test.dart b/pkg/polymer/test/inject_bound_html_test.dart
new file mode 100644
index 0000000..ecd394b
--- /dev/null
+++ b/pkg/polymer/test/inject_bound_html_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.
+
+import 'dart:async';
+import 'dart:html';
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('x-foo')
+class XFoo extends PolymerElement {
+  @observable String bar = "baz";
+
+  XFoo.created() : super.created();
+
+  @ComputedProperty('bar')
+  String get ignore => readValue(#bar);
+}
+
+main() => initPolymer().run(() {
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('can inject bound html fragments', () {
+    XFoo xFoo = querySelector('x-foo');
+    DivElement injectDiv = xFoo.$['inject'];
+    xFoo.injectBoundHTML('<span>{{bar}}</span>', injectDiv);
+    expect(injectDiv.innerHtml, '<span>baz</span>');
+
+    xFoo.bar = 'bat';
+    return new Future(() {}).then((_) {
+      expect(injectDiv.innerHtml, '<span>bat</span>');
+    });
+  });
+});
diff --git a/pkg/polymer/test/inject_bound_html_test.html b/pkg/polymer/test/inject_bound_html_test.html
new file mode 100644
index 0000000..450bc41
--- /dev/null
+++ b/pkg/polymer/test/inject_bound_html_test.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+  <!--polymer-test: this comment is needed for test_suite.dart-->
+  <head>
+    <title>force ready</title>
+    <script src="packages/web_components/platform.js"></script>
+    <script src="packages/web_components/dart_support.js"></script>
+    <link rel="import" href="packages/polymer/polymer.html">
+    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  </head>
+
+  <body>
+    <polymer-element name="x-foo">
+      <template>
+        <div id="inject"></div>
+      </template>
+    </polymer-element>
+    <x-foo></x-foo>
+    <script type="application/dart" src="inject_bound_html_test.dart"></script>
+  </body>
+</html>
diff --git a/pkg/polymer/test/unbind_test.dart b/pkg/polymer/test/unbind_test.dart
index 13d80ef..9c7c9ee 100644
--- a/pkg/polymer/test/unbind_test.dart
+++ b/pkg/polymer/test/unbind_test.dart
@@ -19,7 +19,6 @@
   @observable var foo = '';
   @observable var bar;
 
-  bool forceReady = true;
   bool fooWasChanged = false;
   var validBar;
 
diff --git a/pkg/scheduled_test/CHANGELOG.md b/pkg/scheduled_test/CHANGELOG.md
index a4617fc..cd251ee 100644
--- a/pkg/scheduled_test/CHANGELOG.md
+++ b/pkg/scheduled_test/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.11.2+2
+
+* Moved shared test utilities to `metatest` package.
+
 ## 0.11.2+1
 
 * Fix a case where a `ScheduledProcess` could fail to log its output.
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index f0630d4..91ec1e4 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: scheduled_test
-version: 0.11.2+1
+version: 0.11.2+2
 author: Dart Team <misc@dartlang.org>
 description: >
   A package for writing readable tests of asynchronous behavior.
@@ -18,3 +18,5 @@
   shelf: '>=0.4.0 <0.6.0'
   stack_trace: '>=0.9.1 <2.0.0'
   unittest: '>=0.9.0 <0.12.0'
+dev_dependencies:
+  metatest: '>=0.1.0 <0.2.0'
diff --git a/pkg/scheduled_test/test/descriptor/async_test.dart b/pkg/scheduled_test/test/descriptor/async_test.dart
index 8c1f80c..8f15910 100644
--- a/pkg/scheduled_test/test/descriptor/async_test.dart
+++ b/pkg/scheduled_test/test/descriptor/async_test.dart
@@ -2,13 +2,15 @@
 // for 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:metatest/metatest.dart';
 import 'package:scheduled_test/descriptor.dart' as d;
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
 import 'utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/descriptor/directory_test.dart b/pkg/scheduled_test/test/descriptor/directory_test.dart
index 60fa44c..d6e029b 100644
--- a/pkg/scheduled_test/test/descriptor/directory_test.dart
+++ b/pkg/scheduled_test/test/descriptor/directory_test.dart
@@ -9,10 +9,12 @@
 import 'package:scheduled_test/descriptor.dart' as d;
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import 'utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/descriptor/file_test.dart b/pkg/scheduled_test/test/descriptor/file_test.dart
index f319819..e1fb47e 100644
--- a/pkg/scheduled_test/test/descriptor/file_test.dart
+++ b/pkg/scheduled_test/test/descriptor/file_test.dart
@@ -8,10 +8,12 @@
 import 'package:scheduled_test/descriptor.dart' as d;
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import 'utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/descriptor/nothing_test.dart b/pkg/scheduled_test/test/descriptor/nothing_test.dart
index 68acccb..d31ffaf 100644
--- a/pkg/scheduled_test/test/descriptor/nothing_test.dart
+++ b/pkg/scheduled_test/test/descriptor/nothing_test.dart
@@ -8,10 +8,12 @@
 import 'package:scheduled_test/descriptor.dart' as d;
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import 'utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/descriptor/pattern_test.dart b/pkg/scheduled_test/test/descriptor/pattern_test.dart
index 9b92ad2..bf55e2a 100644
--- a/pkg/scheduled_test/test/descriptor/pattern_test.dart
+++ b/pkg/scheduled_test/test/descriptor/pattern_test.dart
@@ -5,12 +5,14 @@
 import 'package:scheduled_test/descriptor.dart' as d;
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import 'utils.dart';
 
 String sandbox;
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_future_matchers_test.dart b/pkg/scheduled_test/test/scheduled_future_matchers_test.dart
index c1cf2d6..b2fdeed 100644
--- a/pkg/scheduled_test/test/scheduled_future_matchers_test.dart
+++ b/pkg/scheduled_test/test/scheduled_future_matchers_test.dart
@@ -4,10 +4,12 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import 'metatest.dart';
+import 'package:metatest/metatest.dart';
 import 'utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_process_test.dart b/pkg/scheduled_test/test/scheduled_process_test.dart
index f7493d0..2cdb9ae 100644
--- a/pkg/scheduled_test/test/scheduled_process_test.dart
+++ b/pkg/scheduled_test/test/scheduled_process_test.dart
@@ -12,10 +12,12 @@
 import 'package:scheduled_test/scheduled_stream.dart';
 import 'package:scheduled_test/scheduled_test.dart';
 
-import 'metatest.dart';
+import 'package:metatest/metatest.dart';
 import 'utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_server_test.dart b/pkg/scheduled_test/test/scheduled_server_test.dart
index 53e4ac1..f948f2d 100644
--- a/pkg/scheduled_test/test/scheduled_server_test.dart
+++ b/pkg/scheduled_test/test/scheduled_server_test.dart
@@ -13,10 +13,12 @@
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
 import 'package:shelf/shelf.dart' as shelf;
 
-import 'metatest.dart';
+import 'package:metatest/metatest.dart';
 import 'utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
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 d712744..b34e075 100644
--- a/pkg/scheduled_test/test/scheduled_stream/stream_matcher_test.dart
+++ b/pkg/scheduled_test/test/scheduled_stream/stream_matcher_test.dart
@@ -10,7 +10,7 @@
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/utils.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
 /// Returns a [ScheduledStream] that asynchronously emits the numbers 1 through
@@ -31,7 +31,9 @@
   return stream;
 }
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/abort_test.dart b/pkg/scheduled_test/test/scheduled_test/abort_test.dart
index aeaf19a..f0c87b8 100644
--- a/pkg/scheduled_test/test/scheduled_test/abort_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/abort_test.dart
@@ -4,10 +4,12 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart b/pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart
index ab45c2c..c5f13c4 100644
--- a/pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart
@@ -4,10 +4,12 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart b/pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart
index d5c7370..cb1d3854 100644
--- a/pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart
@@ -5,15 +5,18 @@
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
 
-  expectTests('a scheduled test with an out-of-band error should fail', () {
+  expectTestResults('a scheduled test with an out-of-band error should fail',
+      () {
     mock_clock.mock().run();
     test('test 1', () {
       sleep(1).then((_) => throw 'error');
@@ -22,7 +25,13 @@
     test('test 2', () {
       return sleep(2);
     });
-  }, {'test 1': ERROR, 'test 2': PASS});
+  }, [{
+    'description': 'test 1',
+    'result': 'error'
+  }, {
+    'description': 'test 2',
+    'result': 'pass'
+  }]);
 
   expectTestsPass('currentSchedule.errors contains the error in the onComplete '
       'queue', () {
diff --git a/pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart b/pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart
index 676e5e1..b4ff2a0 100644
--- a/pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart
@@ -4,10 +4,12 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart b/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart
index 7612db1..1e8efd0 100644
--- a/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/nested_task_test.dart
@@ -5,10 +5,12 @@
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/on_complete_test.dart b/pkg/scheduled_test/test/scheduled_test/on_complete_test.dart
index 4715010..6e6b782 100644
--- a/pkg/scheduled_test/test/scheduled_test/on_complete_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/on_complete_test.dart
@@ -4,10 +4,12 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/on_exception_test.dart b/pkg/scheduled_test/test/scheduled_test/on_exception_test.dart
index 5e45613..6f1d148 100644
--- a/pkg/scheduled_test/test/scheduled_test/on_exception_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/on_exception_test.dart
@@ -4,10 +4,12 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart b/pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart
index ad443e4..a0309a3 100644
--- a/pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart
@@ -5,10 +5,12 @@
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/set_up_test.dart b/pkg/scheduled_test/test/scheduled_test/set_up_test.dart
index 2ebf35c..d940a21 100644
--- a/pkg/scheduled_test/test/scheduled_test/set_up_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/set_up_test.dart
@@ -4,10 +4,12 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/signal_error_test.dart b/pkg/scheduled_test/test/scheduled_test/signal_error_test.dart
index 25bf0e7..05a2cca 100644
--- a/pkg/scheduled_test/test/scheduled_test/signal_error_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/signal_error_test.dart
@@ -5,10 +5,12 @@
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/simple_test.dart b/pkg/scheduled_test/test/scheduled_test/simple_test.dart
index 6626526..3042b5e 100644
--- a/pkg/scheduled_test/test/scheduled_test/simple_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/simple_test.dart
@@ -6,10 +6,12 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart b/pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart
index d5130a4..4fcc24a 100644
--- a/pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart
@@ -5,10 +5,12 @@
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/tear_down_test.dart b/pkg/scheduled_test/test/scheduled_test/tear_down_test.dart
index e8d99f6..5ddbaa6 100644
--- a/pkg/scheduled_test/test/scheduled_test/tear_down_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/tear_down_test.dart
@@ -4,10 +4,12 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/timeout_test.dart b/pkg/scheduled_test/test/scheduled_test/timeout_test.dart
index ac9faac..d71eb67 100644
--- a/pkg/scheduled_test/test/scheduled_test/timeout_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/timeout_test.dart
@@ -5,10 +5,12 @@
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/unhandled_error_test.dart b/pkg/scheduled_test/test/scheduled_test/unhandled_error_test.dart
index 171edb2..66197bf 100644
--- a/pkg/scheduled_test/test/scheduled_test/unhandled_error_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/unhandled_error_test.dart
@@ -6,10 +6,12 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart b/pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart
index f873109..9ad2b86 100644
--- a/pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart
@@ -5,10 +5,12 @@
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart b/pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart
index b6b5ca0..8166807 100644
--- a/pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart
@@ -5,10 +5,12 @@
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
 
-import '../metatest.dart';
+import 'package:metatest/metatest.dart';
 import '../utils.dart';
 
-void main(_, message) {
+void main() => initTests(_test);
+
+void _test(message) {
   initMetatest(message);
 
   setUpTimeout();
diff --git a/pkg/scheduled_test/test/utils.dart b/pkg/scheduled_test/test/utils.dart
index 11d04fe..bb056f9 100644
--- a/pkg/scheduled_test/test/utils.dart
+++ b/pkg/scheduled_test/test/utils.dart
@@ -10,7 +10,7 @@
 import 'package:scheduled_test/src/utils.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
 
-import 'metatest.dart';
+import 'package:metatest/metatest.dart';
 
 export 'package:scheduled_test/src/utils.dart';
 
diff --git a/pkg/serialization/README.md b/pkg/serialization/README.md
deleted file mode 100644
index aaa7165..0000000
--- a/pkg/serialization/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-A general-purpose serialization facility for Dart Objects.
-
-This provides the ability to save and restore objects to pluggable
-Formats using pluggable Rules.
-These rules can use mirrors or be hard-coded. The main principle
-is using only public APIs on the serialized objects, so changes to the
-internal representation do not break previous serializations. It also handles
-cycles, different representations, filling in known objects on the 
-receiving side, and other issues. It is not as much intended for
-APIs using JSON to pass acyclic structures without class information,
-and is fairly heavweight and expensive for doing that compared to simpler
-approaches.
diff --git a/pkg/serialization/lib/serialization.dart b/pkg/serialization/lib/serialization.dart
deleted file mode 100644
index b2d3dce..0000000
--- a/pkg/serialization/lib/serialization.dart
+++ /dev/null
@@ -1,495 +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.
-
-/**
- * A general-purpose serialization facility for Dart objects.
- *
- * A [Serialization] is defined in terms of [SerializationRule]s and supports
- * reading and writing to different formats.
- *
- * For information on installing and importing this library, see the
- * [serialization package on pub.dartlang.org]
- * (http://pub.dartlang.org/packages/serialization).
- *
- * ## Setup
- *
- * A simple example of usage is
- *
- *      var address = new Address();
- *      address.street = 'N 34th';
- *      address.city = 'Seattle';
- *      var serialization = new Serialization()
- *          ..addRuleFor(Address);
- *      Map output = serialization.write(address);
- *
- * This creates a new serialization and adds a rule for address objects.
- * Then we ask the [Serialization] to write the address
- * and we get back a Map which is a [json]able representation of the state of
- * the address and related objects. Note that while the output in this case
- * is a [Map], the type will vary depending on which output format we've told
- * the [Serialization] to use.
- *
- * The version above used reflection to automatically identify the public
- * fields of the address object. We can also specify those fields explicitly.
- *
- *      var serialization = new Serialization()
- *        ..addRuleFor(Address,
- *            constructor: "create",
- *            constructorFields: ["number", "street"],
- *            fields: ["city"]);
- *
- * This rule still uses reflection to access the fields, but does not try to
- * identify which fields to use, but instead uses only the "number" and "street"
- * fields that we specified. We may also want to tell it to identify the
- * fields, but to specifically omit certain fields that we don't want
- * serialized.
- *
- *      var serialization = new Serialization()
- *        ..addRuleFor(Address,
- *            constructor: "",
- *            excludeFields: ["other", "stuff"]);
- *
- * ## Writing rules
- *
- * We can also use a completely non-reflective rule to serialize and
- * de-serialize objects. This can be more work, but it does work in
- * dart2js, where mirrors are not yet implemented. We can specify this in two
- * ways. First, we can write our own SerializationRule class that has methods
- * for our Address class.
- *
- *      class AddressRule extends CustomRule {
- *        bool appliesTo(instance, Writer w) => instance.runtimeType == Address;
- *        getState(instance) => [instance.street, instance.city];
- *        create(state) => new Address();
- *        setState(Address a, List state) {
- *          a.street = state[0];
- *          a.city = state[1];
- *        }
- *      }
- *
- * The class needs four different methods. The [CustomRule.appliesTo]
- * method tells us if
- * the rule should be used to write an object. In this example we use a test
- * based on runtimeType. We could also use an "is Address" test, but if Address
- * has subclasses that would find those as well, and we want a separate rule
- * for each. The [CustomRule.getState] method should
- * return all the state of the object that we want to recreate,
- * and should be either a Map or a List. If you want to write to human-readable
- * formats where it's useful to be able to look at the data as a map from
- * field names to values, then it's better to return it as a map. Otherwise it's
- * more efficient to return it as a list. You just need to be sure that the
- * [CustomRule.create] and [CustomRule.setState] methods interpret the data the
- * same way as [CustomRule.getState] does.
- *
- * The [CustomRule.create] method will create the new object and return it. While it's
- * possible to create the object and set all its state in this one method, that
- * increases the likelihood of problems with cycles. So it's better to use the
- * minimum necessary information in [CustomRule.create] and do more of the work
- * in [CustomRule.setState].
- *
- * The other way to do this is not creating a subclass, but by using a
- * [ClosureRule] and giving it functions for how to create
- * the address.
- *
- *      addressToMap(a) => {"number" : a.number, "street" : a.street,
- *          "city" : a.city};
- *      createAddress(Map m) => new Address.create(m["number"], m["street"]);
- *      fillInAddress(Address a, Map m) => a.city = m["city"];
- *      var serialization = new Serialization()
- *        ..addRule(
- *            new ClosureRule(anAddress.runtimeType,
- *                addressToMap, createAddress, fillInAddress);
- *
- * In this case we have created standalone functions rather than
- * methods in a subclass and we pass them to the constructor of
- * [ClosureRule]. In this case we've also had them use maps rather than
- * lists for the state, but either would work as long as the rule is
- * consistent with the representation it uses. We pass it the runtimeType
- * of the object, and functions equivalent to the methods on [CustomRule]
- *
- * ## Constant values
- *
- * There are cases where the constructor needs values that we can't easily get
- * from the serialized object. For example, we may just want to pass null, or a
- * constant value. To support this, we can specify as constructor fields
- * values that aren't field names. If any value isn't a String, or is a string
- * that doesn't correspond to a field name, it will be
- * treated as a constant and passed unaltered to the constructor.
- *
- * In some cases a non-constructor field should not be set using field
- * access or a setter, but should be done by calling a method. For example, it
- * may not be possible to set a List field "foo", and you need to call an
- * addFoo() method for each entry in the list. In these cases, if you are using
- * a BasicRule for the object you can call the setFieldWith() method.
- *
- *       s..addRuleFor(FooHolder).setFieldWith("foo",
- *           (parent, value) => for (var each in value) parent.addFoo(value));
- *
- * ## Writing
- *
- * To write objects, we use the write() method.
- *
- *       var output = serialization.write(someObject);
- *
- * By default this uses a representation in which objects are represented as
- * maps keyed by field name, but in which references between objects have been
- * converted into Reference objects. This is then typically encoded as
- * a [json] string, but can also be used in other ways, e.g. sent to another
- * isolate.
- *
- * We can write objects in different formats by passing a [Format] object to
- * the [Serialization.write] method or by getting a [Writer] object.
- * The available formats
- * include the default, a simple "flat" format that doesn't include field names,
- * and a simple JSON format that produces output more suitable for talking to
- * services that expect JSON in a predefined format. Examples of these are
- *
- *      Map output = serialization.write(address, new SimpleMapFormat());
- *      List output = serialization.write(address, new SimpleFlatFormat());
- *      var output = serialization.write(address, new SimpleJsonFormat());
- * Or, using a [Writer] explicitly
- *      var writer = serialization.newWriter(new SimpleFlatFormat());
- *      List output = writer.write(address);
- *
- * These representations are not yet considered stable.
- *
- * ## Reading
- *
- * To read objects, the corresponding [Serialization.read] method can be used.
- *
- *       Address input = serialization.read(input);
- *
- * When reading, the serialization instance doing the reading must be configured
- * with compatible rules to the one doing the writing. It's possible for the
- * rules to be different, but they need to be able to read the same
- * representation. For most practical purposes right now they should be the
- * same. The simplest way to achieve this is by having the serialization
- * variable [Serialization.selfDescribing] be true. In that case the rules
- * themselves are also
- * stored along with the serialized data, and can be read back on the receiving
- * end. Note that this may not work for all rules or all formats. The
- * [Serialization.selfDescribing] variable is true by default, but the
- * [SimpleJsonFormat] does not support it, since the point is to provide a
- * representation in a form
- * other services might expect. Using CustomRule or ClosureRule also does not
- * yet work with the [Serialization.selfDescribing] variable.
- *
- * ## Named objects
- *
- * When reading, some object references should not be serialized, but should be
- * connected up to other instances on the receiving side. A notable example of
- * this is when serialization rules have been stored. Instances of BasicRule
- * take a [ClassMirror] in their constructor, and we cannot serialize those. So
- * when we read the rules, we must provide a Map<String, Object> which maps from
- * the simple name of classes we are interested in to a [ClassMirror]. This can
- * be provided either in the [Serialization.namedObjects],
- * or as an additional parameter to the reading and writing methods on the
- * [Reader] or [Writer] respectively.
- *
- *     new Serialization()
- *       ..addRuleFor(Person, constructorFields: ["name"])
- *       ..namedObjects['Person'] = reflect(new Person()).type;
- */
-library serialization;
-
-import 'src/mirrors_helpers.dart';
-import 'src/serialization_helpers.dart';
-import 'dart:collection';
-
-part 'src/reader_writer.dart';
-part 'src/serialization_rule.dart';
-part 'src/basic_rule.dart';
-part 'src/format.dart';
-
-/**
- * This class defines a particular serialization scheme, in terms of
- * [SerializationRule] instances, and supports reading and writing them.
- * See library comment for examples of usage.
- */
-class Serialization {
-  final List<SerializationRule> _rules;
-
-  /**
-   * The serialization is controlled by the list of Serialization rules. These
-   * are most commonly added via [addRuleFor].
-   */
-  final UnmodifiableListView<SerializationRule> rules;
-
-  /**
-   * When reading, we may need to resolve references to existing objects in
-   * the system. The right action may not be to create a new instance of
-   * something, but rather to find an existing instance and connect to it.
-   * For example, if we have are serializing an Email message and it has a
-   * link to the owning account, it may not be appropriate to try and serialize
-   * the account. Instead we should just connect the de-serialized message
-   * object to the account object that already exists there.
-   */
-  Map<String, dynamic> namedObjects = {};
-
-  /**
-   * When we write out data using this serialization, should we also write
-   * out a description of the rules. This is on by default unless using
-   * CustomRule subclasses, in which case it requires additional setup and
-   * is off by default.
-   */
-  bool _selfDescribing;
-
-  /**
-   * When we write out data using this serialization, should we also write
-   * out a description of the rules. This is on by default unless using
-   * CustomRule subclasses, in which case it requires additional setup and
-   * is off by default.
-   */
-  bool get selfDescribing {
-    // TODO(alanknight): Should this be moved to the format?
-    // TODO(alanknight): Allow self-describing in the presence of CustomRule.
-    // TODO(alanknight): Don't do duplicate work creating a writer and
-    // serialization here and then re-creating when we actually serialize.
-    if (_selfDescribing != null) return _selfDescribing;
-    var meta = ruleSerialization();
-    var w = meta.newWriter();
-    _selfDescribing = !rules.any((rule) =>
-        meta.rulesFor(rule, w, create: false).isEmpty);
-    return _selfDescribing;
-  }
-
-  /**
-   * When we write out data using this serialization, should we also write
-   * out a description of the rules. This is on by default unless using
-   * CustomRule subclasses, in which case it requires additional setup and
-   * is off by default.
-   */
-  void set selfDescribing(bool value) {
-    _selfDescribing = value;
-  }
-
-  /**
-   * Creates a new serialization with a default set of rules for primitives
-   * and lists.
-   */
-  factory Serialization() =>
-    new Serialization.blank()
-      ..addDefaultRules();
-
-  /**
-   * Creates a new serialization with no default rules at all. The most common
-   * use for this is if we are reading self-describing serialized data and
-   * will populate the rules from that data.
-   */
-  factory Serialization.blank()
-    => new Serialization._(new List<SerializationRule>());
-
-  Serialization._(List<SerializationRule> rules) :
-    this._rules = rules,
-    this.rules = new UnmodifiableListView(rules);
-
-  /**
-   * Create a [BasicRule] rule for [instanceOrType]. Normally this will be
-   * a type, but for backward compatibilty we also allow you to pass an
-   * instance (except an instance of Type), and the rule will be created
-   * for its runtimeType. Optionally
-   * allows specifying a [constructor] name, the list of [constructorFields],
-   * and the list of [fields] not used in the constructor. Returns the new
-   * rule. Note that [BasicRule] uses reflection, and so will not work with the
-   * current state of dartj2s. If you need to run there, consider using
-   * [CustomRule] instead.
-   *
-   * If the optional parameters aren't specified, the default constructor will
-   * be used, and the list of fields will be computed. Alternatively, you can
-   * omit [fields] and provide [excludeFields], which will then compute the
-   * list of fields specifically excluding those listed.
-   *
-   * The fields can be actual public fields, but can also be getter/setter
-   * pairs or getters whose value is provided in the constructor. For the
-   * [constructorFields] they can also be arbitrary objects. Anything that is
-   * not a String will be treated as a constant value to be used in any
-   * construction of these objects.
-   *
-   * If the list of fields is computed, fields from the superclass will be
-   * included. However, each subclass needs its own rule, since the constructors
-   * are not inherited, and so may need to be specified separately for each
-   * subclass.
-   */
-  BasicRule addRuleFor(
-      instanceOrType,
-      {String constructor,
-        List constructorFields,
-        List<String> fields,
-        List<String> excludeFields}) {
-
-    var rule = new BasicRule(
-        turnInstanceIntoSomethingWeCanUse(
-            instanceOrType),
-        constructor, constructorFields, fields, excludeFields);
-    addRule(rule);
-    return rule;
-  }
-
-  /** Set up the default rules, for lists and primitives. */
-  void addDefaultRules() {
-    addRule(new PrimitiveRule());
-    addRule(new ListRule());
-    // Both these rules apply to lists, so unless otherwise indicated,
-    // it will always find the first one.
-    addRule(new ListRuleEssential());
-    addRule(new MapRule());
-    addRule(new SymbolRule());
-    addRule(new DateTimeRule());
-  }
-
-  /**
-   * Add a new SerializationRule [rule]. The addRuleFor method will probably
-   * handle most simple cases, but for adding an arbitrary rule, including
-   * a SerializationRule subclass which you have created, you can use this
-   * method.
-   */
-  void addRule(SerializationRule rule) {
-    rule.number = _rules.length;
-    _rules.add(rule);
-  }
-
-  /**
-   * This writes out an object graph rooted at [object] and returns the result.
-   * The [format] parameter determines the form of the result. The default
-   * format is [SimpleMapFormat] and returns a Map.
-   */
-  write(Object object, {Format format}) {
-    return newWriter(format).write(object);
-  }
-
-  /**
-   * Return a new [Writer] object for this serialization. This is useful if you
-   * want to do something more complex with the writer than just returning
-   * the final result.
-   */
-  Writer newWriter([Format format]) => new Writer(this, format);
-
-  /**
-   * Read the serialized data from [input] and return the root object
-   * from the result. The [input] can be of any type that the [Format]
-   * reads/writes, but normally will be a [List], [Map], or a simple type.
-   * The [format] parameter determines the form of the result. The default
-   * format is [SimpleMapFormat] and expects a Map as input.
-   * If there are objects that need to be resolved
-   * in the current context, they should be provided in [externals] as a
-   * Map from names to values. In particular, in the current implementation
-   * any class mirrors needed should be provided in [externals] using the
-   * class name as a key. In addition to the [externals] map provided here,
-   * values will be looked up in the [namedObjects] map.
-   */
-  read(input, {Format format, Map externals: const {}}) {
-    return newReader(format).read(input, externals);
-  }
-
-  /**
-   * Return a new [Reader] object for this serialization. This is useful if
-   * you want to do something more complex with the reader than just returning
-   * the final result.
-   */
-  Reader newReader([Format format]) => new Reader(this, format);
-
-  /**
-   * Return the list of SerializationRule that apply to [object]. For
-   * internal use, but public because it's used in testing.
-   */
-  Iterable<SerializationRule> rulesFor(object, Writer w, {create : true}) {
-    // This has a couple of edge cases.
-    // 1) The owning object may have indicated we should use a different
-    // rule than the default.
-    // 2) We may not have a rule, in which case we lazily create a BasicRule.
-    // 3) Rules are allowed to say mustBePrimary, meaning that they can be used
-    // iff no other rule was chosen first.
-    // TODO(alanknight): Can the mustBePrimary mechanism be removed or changed.
-    // It adds an order dependency to the rules, and is messy. Reconsider in the
-    // light of a more general mechanism for multiple rules per object.
-    // TODO(alanknight): Finding which rules apply seems likely to be a
-    // bottleneck, particularly with the current reflective implementation.
-    // Consider how to improve it. e.g. cache the list of rules by class. But
-    // be careful of issues like rules which have arbitrary predicates. Or
-    // consider having the arbitrary predicates be secondary to an initial
-    // class-based lookup mechanism.
-    var target, candidateRules;
-    if (object is DesignatedRuleForObject) {
-      target = object.target;
-      candidateRules = object.possibleRules(rules);
-    } else {
-      target = object;
-      candidateRules = rules;
-    }
-    Iterable applicable = candidateRules.where(
-        (each) => each.appliesTo(target, w));
-
-    if (applicable.isEmpty) {
-      return create ? [addRuleFor(target)] : applicable;
-    }
-
-    if (applicable.length == 1) return applicable;
-    var first = applicable.first;
-    var finalRules = applicable.where(
-        (x) => !x.mustBePrimary || (x == first));
-
-    if (finalRules.isEmpty) throw new SerializationException(
-        'No valid rule found for object $object');
-    return finalRules;
-  }
-
-  /**
-   * Create a Serialization for serializing SerializationRules. This is used
-   * to save the rules in a self-describing format along with the data.
-   * If there are new rule classes created, they will need to be described
-   * here.
-   */
-  Serialization ruleSerialization() {
-    // TODO(alanknight): There's an extensibility issue here with new rules.
-    // TODO(alanknight): How to handle rules with closures? They have to
-    // exist on the other side, but we might be able to hook them up by name,
-    // or we might just be able to validate that they're correctly set up
-    // on the other side.
-
-    var meta = new Serialization()
-      ..selfDescribing = false
-      ..addRuleFor(ListRule)
-      ..addRuleFor(MapRule)
-      ..addRuleFor(PrimitiveRule)
-      ..addRuleFor(ListRuleEssential)
-      ..addRuleFor(BasicRule,
-          constructorFields: ['type',
-            'constructorName',
-            'constructorFields', 'regularFields', []],
-          fields: [])
-      ..addRule(new NamedObjectRule())
-      ..addRule(new MirrorRule())
-      ..addRuleFor(MirrorRule)
-      ..addRuleFor(SymbolRule)
-      ..addRuleFor(DateTimeRule);
-    meta.namedObjects = namedObjects;
-    return meta;
-  }
-
-  /** Return true if our [namedObjects] collection has an entry for [object].*/
-  bool _hasNameFor(object) {
-    var sentinel = const _Sentinel();
-    return _nameFor(object, () => sentinel) != sentinel;
-  }
-
-  /**
-   * Return the name we have for [object] in our [namedObjects] collection or
-   * the result of evaluating [ifAbsent] if there is no entry.
-   */
-  _nameFor(object, [ifAbsent]) {
-    for (var key in namedObjects.keys) {
-      if (identical(namedObjects[key], object)) return key;
-    }
-    return ifAbsent == null ? null : ifAbsent();
-  }
-}
-
-/**
- * An exception class for errors during serialization.
- */
-class SerializationException implements Exception {
-  final String message;
-  const SerializationException(this.message);
-  String toString() => "SerializationException($message)";
-}
diff --git a/pkg/serialization/lib/src/basic_rule.dart b/pkg/serialization/lib/src/basic_rule.dart
deleted file mode 100644
index 36d9aa7..0000000
--- a/pkg/serialization/lib/src/basic_rule.dart
+++ /dev/null
@@ -1,671 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of serialization;
-
-// TODO(alanknight): Figure out how to reasonably separate out the things
-// that require reflection without making the API more awkward. Or if that is
-// in fact necessary. Maybe the tree-shaking will just remove it if unused.
-
-/**
- * This is the basic rule for handling "normal" objects, which have a list of
- * fields and a constructor, as opposed to simple types or collections. It uses
- * mirrors to access the state, and can also use them to figure out the list
- * of fields and the constructor if it's not provided.
- *
- * If you call [Serialization.addRule], this is what you get.
- *
- */
-class BasicRule extends SerializationRule {
-  /**
-   * The [type] is used both to find fields and to verify if the object is one
-   * that we handle.
-   */
-  final ClassMirror type;
-
-  /** Used to create new objects when reading. */
-  final Constructor constructor;
-
-  /** This holds onto our list of fields, and can also calculate them. */
-  final _FieldList _fields;
-
-  /**
-   * Instances can either use maps or lists to hold the object's state. The list
-   * representation is much more compact and used by default. The map
-   * representation is more human-readable. The default is to use lists.
-   */
-  bool useMaps = false;
-
-  // TODO(alanknight) Change the type parameter once we have class literals.
-  // Issue 6282.
-  // TODO(alanknight) Does the comment for this format properly?
-  /**
-   * Create this rule. Right now the user is obliged to pass a ClassMirror,
-   * but once we allow class literals (Issue 6282) it will support that. The
-   * other parameters can all be left as null, and are optional on the
-   * [Serialization.addRule] method which is the normal caller for this.
-   * [constructorName] is the constructor, if not the default.
-   * [constructorFields] are the fields required to call the constructor, which
-   *   is the essential state. They don't have to be actual fields,
-   *   getter/setter pairs or getter/constructor pairs are fine. Note that
-   *   the constructorFields do not need to be strings, they can be arbitrary
-   *   values. For non-strings, these will be treated as constant values to be
-   *   used instead of data read from the objects.
-   * [regularFields] are the non-essential fields. They don't have to be actual
-   *   fields, getter/setter pairs are fine. If this is null, it's assumed
-   *   that we should figure them out.
-   * [excludeFields] lets you tell it to find the fields automatically, but
-   *   omit some that would otherwise be included.
-   */
-  factory BasicRule(ClassMirror type, String constructorName,
-      List constructorFields, List regularFields, List excludeFields) {
-
-    var fields = new _FieldList(type);
-    fields.constructorFields = constructorFields;
-    fields.regular = regularFields;
-    // TODO(alanknight): The order of this matters. It shouldn't.
-    fields.exclude = excludeFields;
-    fields.figureOutFields();
-
-    var constructor = new Constructor(type, constructorName,
-        fields.constructorFieldIndices());
-
-    return new BasicRule._(type, constructor, fields);
-  }
-
-  BasicRule._(this.type, this.constructor, this._fields) {
-    configureForLists();
-  }
-
-  /**
-   * Sometimes it's necessary to treat fields of an object differently, based
-   * on the containing object. For example, by default a list treats its
-   * contents as non-essential state, so it will be populated only after all
-   * objects have been created. An object may have a list which is used in its
-   * constructor and must be fully created before the owning object can be
-   * created. Alternatively, it may not be possible to set a field directly,
-   * and some other method must be called to set it, perhaps calling a method
-   * on the owning object to add each individual element.
-   *
-   * This method lets you designate a function to use to set the value of a
-   * field. It also makes the contents of that field be treated as essential,
-   * which currently only has meaning if the field is a list. This is done
-   * because you might set a list field's special treatment function to add
-   * each item individually and that will only work if those objects already
-   * exist.
-   *
-   * For example, to serialize a Serialization, we need its rules to be
-   * individually added rather than just setting the rules field.
-   *      ..addRuleFor(Serialization).setFieldWith('rules',
-   *          (InstanceMirror s, List rules) {
-   *            rules.forEach((x) => s.reflectee.addRule(x));
-   * Note that the function is passed the owning object as well as the field
-   * value, but that it is passed as a mirror.
-   */
-  void setFieldWith(String fieldName, SetWithFunction setWith) {
-    _fields.addAllByName([fieldName]);
-    _NamedField field = _fields.named(_asSymbol(fieldName));
-    Function setter = (setWith == null) ? field.defaultSetter : setWith;
-    field.customSetter = setter;
-  }
-
-  /** Return the name of the constructor used to create new instances on read.*/
-  String get constructorName => constructor.name;
-
-  /** Return the list of field names to be passed to the constructor.*/
-  List<String> get constructorFields => _fields.constructorFieldNames();
-
-  /** Return the list of field names not used in the constructor. */
-  List<String> get regularFields => _fields.regularFieldNames();
-
-  String toString() => "Basic Rule for ${type.simpleName}";
-
-  /**
-   * Configure this instance to use maps by field name as its output.
-   * Instances can either produce maps or lists. The list representation
-   * is much more compact and used by default. The map representation is
-   * much easier to debug. The default is to use lists.
-   */
-  void configureForMaps() {
-    useMaps = true;
-  }
-
-  /**
-   * Configure this instance to use lists accessing fields by index as its
-   * output. Instances can either produce maps or lists. The list representation
-   * is much more compact and used by default. The map representation is
-   * much easier to debug. The default is to use lists.
-   */
-  void configureForLists() {
-    useMaps = false;
-  }
-
-  /**
-   * Create either a list or a map to hold the object's state, depending
-   * on the [useMaps] variable. If using a Map, we wrap it in order to keep
-   * the protocol compatible. See [configureForLists]/[configureForMaps].
-   *
-   * If a list is returned, it is growable.
-   */
-   createStateHolder() {
-     if (useMaps) return new _MapWrapper(_fields.contents);
-     List list = [];
-     list.length = _fields.length;
-     return list;
-   }
-
-  /**
-   * Wrap the state if it's passed in as a map, and if the keys are references,
-   * resolve them to the strings we expect. We leave the previous keys in there
-   * as well, as they shouldn't be harmful, and it costs more to remove them.
-   */
-   makeIndexableByNumber(state) {
-     if (!(state is Map)) return state;
-     // TODO(alanknight): This is quite inefficient, and we do it twice per
-     // instance. If the keys are references, we need to turn them into strings
-     // before we can look at indexing them by field position. It's also eager,
-     // but we know our keys are always primitives, so we don't have to worry
-     // about their instances not having been created yet.
-     var newState = new Map();
-     for (var each in state.keys) {
-       var newKey = (each is Reference) ? each.inflated() : each;
-       newState[newKey] = state[each];
-     }
-     return new _MapWrapper.fromMap(newState, _fields.contents);
-   }
-
-  /**
-   * Extract the state from [object] using an instanceMirror and the field
-   * names in [_fields]. Call the function [callback] on each value.
-   */
-  extractState(object, Function callback, Writer w) {
-    var result = createStateHolder();
-    var mirror = reflect(object);
-
-    keysAndValues(_fields).forEach(
-        (index, field) {
-          var value = _value(mirror, field);
-          callback(field.name);
-          callback(checkForEssentialLists(index, value));
-          result[index] = value;
-        });
-    return _unwrap(result);
-  }
-
-  flatten(state, Writer writer) {
-    if (state is List) {
-      keysAndValues(state).forEach((index, value) {
-        state[index] = writer._referenceFor(value);
-      });
-    } else {
-      var newState = new Map();
-      keysAndValues(state).forEach((key, value) {
-        newState[writer._referenceFor(key)] = writer._referenceFor(value);
-      });
-      return newState;
-    }
-  }
-
-  /**
-   * If the value is a List, and the field is a constructor field or
-   * otherwise specially designated, we wrap it in something that indicates
-   * a restriction on the rules that can be used. Which in this case amounts
-   * to designating the rule, since we so far only have one rule per object.
-   */
-  checkForEssentialLists(index, value) {
-    if (value is List && _fields.contents[index].isEssential) {
-      return new DesignatedRuleForObject(value,
-          (SerializationRule rule) => rule is ListRuleEssential);
-    } else {
-      return value;
-    }
-  }
-
-  /** Remove any MapWrapper from the extracted state. */
-  _unwrap(result) => (result is _MapWrapper) ? result.asMap() : result;
-
-  /**
-   * Call the designated constructor with the appropriate fields from [state],
-   * first resolving references in the context of [reader].
-   */
-  inflateEssential(state, Reader reader) {
-    InstanceMirror mirror = constructor.constructFrom(
-        makeIndexableByNumber(state), reader);
-    return mirror.reflectee;
-  }
-
-  /** For all [rawState] not required in the constructor, set it in the
-   * [object], resolving references in the context of [reader].
-   */
-  inflateNonEssential(rawState, object, Reader reader) {
-    InstanceMirror mirror = reflect(object);
-    var state = makeIndexableByNumber(rawState);
-    _fields.forEachRegularField( (_Field field) {
-      var value = reader.inflateReference(state[field.index]);
-      field.setValue(mirror, value);
-    });
-  }
-
-  /**
-   * Determine if this rule applies to the object in question. In our case
-   * this is true if the type mirrors are the same.
-   */
-  // TODO(alanknight): This seems likely to be slow. Verify. Other options?
-  bool appliesTo(object, Writer w) => reflect(object).type == type;
-
-  bool get hasVariableLengthEntries => false;
-
-  int get dataLength => _fields.length;
-
-  /**
-   * Extract the value of [field] from the object reflected
-   * by [mirror].
-   */
-  // TODO(alanknight): The framework should be resilient if there are fields
-  // it expects that are missing, either for the case of de-serializing to a
-  // different definition, or for the case that tree-shaking has removed state.
-  // TODO(alanknight): This, and other places, rely on synchronous access to
-  // mirrors. Should be changed to use a synchronous API once one is available,
-  // or to be async, but that would be extremely ugly.
-  _value(InstanceMirror mirror, _Field field) => field.valueIn(mirror);
-}
-
-/**
- * This represents a field in an object. It is intended to be used as part of
- * a [_FieldList].
- */
-abstract class _Field implements Comparable<_Field> {
-
-  /** The FieldList that contains us. */
-  final _FieldList fieldList;
-
-  /**
-   * Our position in the [fieldList._contents] collection. This is used
-   * to index into the state, so it's extremely important.
-   */
-  int index;
-
-  /** Is this field used in the constructor? */
-  bool usedInConstructor = false;
-
-  /**
-   * Create a new [_Field] instance. This will be either a [_NamedField] or a
-   * [_ConstantField] depending on whether or not [value] corresponds to a
-   * field in the class which [fieldList] models.
-   */
-  factory _Field(value, _FieldList fieldList) {
-    if (_isReallyAField(value, fieldList)) {
-      return new _NamedField._internal(value, fieldList);
-    } else {
-      return new _ConstantField._internal(value, fieldList);
-    }
-  }
-
-  /**
-   * Determine if [value] represents a field or getter in the class that
-   * [fieldList] models.
-   */
-  static bool _isReallyAField(value, _FieldList fieldList) {
-    var symbol = _asSymbol(value);
-    return hasField(symbol, fieldList.mirror) ||
-        hasGetter(symbol, fieldList.mirror);
-  }
-
-  /** Private constructor. */
-  _Field._internal(this.fieldList);
-
-  /**
-   * Extracts the value for the field that this represents from the instance
-   * mirrored by [mirror] and return it.
-   */
-  valueIn(InstanceMirror mirror);
-
-  // TODO(alanknight): Is this the right name, or is it confusing that essential
-  // is not the inverse of regular.
-  /** Return true if this is field is not used in the constructor. */
-  bool get isRegular => !usedInConstructor;
-
-  /**
-   * Return true if this field is treated as essential state, either because
-   * it is used in the constructor, or because it's been designated
-   * using [BasicRule.setFieldWith].
-   */
-  bool get isEssential => usedInConstructor;
-
-  /** Set the [value] of our field in the given mirrored [object]. */
-  void setValue(InstanceMirror object, value);
-
-  // Because [x] may not be a named field, we compare the toString. We don't
-  // care that much where constants come in the sort order as long as it's
-  // consistent.
-  int compareTo(_Field x) => toString().compareTo(x.toString());
-}
-
-/**
- * This represents a field in the object, either stored as a field or
- * accessed via getter/setter/constructor parameter. It has a name and
- * will attempt to access the state for that name using an [InstanceMirror].
- */
-class _NamedField extends _Field {
-  /** The name of the field (or getter) */
-  String _name;
-  Symbol nameSymbol;
-
-  /**
-   * If this is set, then it is used as a way to set the value rather than
-   * using the default mechanism.
-   */
-  Function customSetter;
-
-  _NamedField._internal(fieldName, fieldList) : super._internal(fieldList) {
-    nameSymbol = _asSymbol(fieldName);
-    if (nameSymbol == null) {
-      throw new SerializationException("Invalid field name $fieldName");
-    }
-  }
-
-  String get name =>
-      _name == null ? _name = MirrorSystem.getName(nameSymbol) : _name;
-
-  operator ==(x) => x is _NamedField && (nameSymbol == x.nameSymbol);
-  int get hashCode => name.hashCode;
-
-  /**
-   * Return true if this field is treated as essential state, either because
-   * it is used in the constructor, or because it's been designated
-   * using [BasicRule.setFieldWith].
-   */
-  bool get isEssential => super.isEssential || customSetter != null;
-
-  /** Set the [value] of our field in the given mirrored [object]. */
-  void setValue(InstanceMirror object, value) {
-    setter(object, value);
-  }
-
-  valueIn(InstanceMirror mirror) => mirror.getField(nameSymbol).reflectee;
-
-  /** Return the function to use to set our value. */
-  Function get setter =>
-      (customSetter != null) ? customSetter : defaultSetter;
-
-  /** The default setter function. */
-  void defaultSetter(InstanceMirror object, value) {
-    object.setField(nameSymbol, value);
-  }
-
-  String toString() => 'Field($name)';
-}
-
-/**
- * This represents a constant value that will be passed as a constructor
- * parameter. Rather than having a name it has a constant value.
- */
-class _ConstantField extends _Field {
-
-  /** The value we always return.*/
-  final value;
-
-  _ConstantField._internal(this.value, fieldList) : super._internal(fieldList);
-
-  operator ==(x) => x is _ConstantField && (value == x.value);
-  int get hashCode => value.hashCode;
-  String toString() => 'ConstantField($value)';
-  valueIn(InstanceMirror mirror) => value;
-
-  /** We cannot be set, so setValue is a no-op. */
-  void setValue(InstanceMirror object, value) {}
-
-  /** There are places where the code expects us to have an identifier, so
-   * use the value for that.
-   */
-  get name => value;
-}
-
-/**
- * The organization of fields in an object can be reasonably complex, so they
- * are kept in a separate object, which also has the ability to compute the
- * default fields to use reflectively.
- */
-class _FieldList extends IterableBase<_Field> {
-  /**
-   * All of our fields, indexed by name. Note that the names are
-   * typically Symbols, but can also be arbitrary constants.
-   */
-  Map<dynamic, _Field> allFields = new Map<dynamic, _Field>();
-
-  /**
-   * The fields which are used in the constructor. The fields themselves also
-   * know if they are constructor fields or not, but we need to keep this
-   * information here because the order matters.
-   */
-  List _constructorFields = const [];
-
-  /** The list of fields to exclude if we are computing the list ourselves. */
-  List<Symbol> _excludedFieldNames = const [];
-
-  /** The mirror we will use to compute the fields. */
-  final ClassMirror mirror;
-
-  /** Cached, sorted list of fields. */
-  List<_Field> _contents;
-
-  /** Should we compute the fields or just use whatever we were given. */
-  bool _shouldFigureOutFields = true;
-
-  _FieldList(this.mirror);
-
-  /** Look up a field by [name]. */
-  _Field named(name) => allFields[name];
-
-  /** Set the fields to be used in the constructor. */
-  set constructorFields(List fieldNames) {
-    if (fieldNames == null || fieldNames.isEmpty) return;
-    _constructorFields = [];
-    for (var each in fieldNames) {
-      var symbol = _asSymbol(each);
-      var name = _Field._isReallyAField(symbol, this) ? symbol : each;
-      var field = new _Field(name, this)..usedInConstructor = true;
-      allFields[name] = field;
-      _constructorFields.add(field);
-    }
-    invalidate();
-  }
-
-  /** Set the fields that aren't used in the constructor. */
-  set regular(List<String> fields) {
-    if (fields == null) return;
-    _shouldFigureOutFields = false;
-    addAllByName(fields);
-  }
-
-  /** Set the fields to be excluded. This is mutually exclusive with setting
-   * the regular fields.
-   */
-  set exclude(List<String> fields) {
-    // TODO(alanknight): This isn't well tested.
-    if (fields == null || fields.isEmpty) return;
-    if (allFields.length > _constructorFields.length) {
-      throw "You can't specify both excludeFields and regular fields";
-    }
-    _excludedFieldNames = fields.map((x) => new Symbol(x)).toList();
-  }
-
-  int get length => allFields.length;
-
-  /** Add all the fields which aren't on the exclude list. */
-  void addAllNotExplicitlyExcluded(Iterable<String> aCollection) {
-    if (aCollection == null) return;
-    var names = aCollection;
-    names = names.where((x) => !_excludedFieldNames.contains(x));
-    addAllByName(names);
-  }
-
-  /** Add all the fields with the given names without any special properties. */
-  void addAllByName(Iterable<String> names) {
-    for (var each in names) {
-      var symbol = _asSymbol(each);
-      var field = new _Field(symbol, this);
-      allFields.putIfAbsent(symbol, () => new _Field(symbol, this));
-    }
-    invalidate();
-  }
-
-  /**
-   * Fields have been added. In case we had already forced calculation of the
-   * list of contents, re-set it.
-   */
-  void invalidate() {
-    _contents = null;
-    contents;
-  }
-
-  Iterator<_Field> get iterator => contents.iterator;
-
-  /** Return a cached, sorted list of all the fields. */
-  List<_Field> get contents {
-    if (_contents == null) {
-      _contents = allFields.values.toList()..sort();
-      for (var i = 0; i < _contents.length; i++)
-        _contents[i].index = i;
-    }
-    return _contents;
-  }
-
-  /** Iterate over the regular fields, i.e. those not used in the constructor.*/
-  void forEachRegularField(Function f) {
-    for (var each in contents) {
-      if (each.isRegular) {
-        f(each);
-      }
-    }
-  }
-
-  /** Iterate over the fields used in the constructor. */
-  void forEachConstructorField(Function f) {
-    for (var each in contents) {
-      if (each.usedInConstructor) {
-        f(each);
-      }
-    }
-  }
-
-  List get constructorFields => _constructorFields;
-  List constructorFieldNames() =>
-      constructorFields.map((x) => x.name).toList();
-  List constructorFieldIndices() =>
-      constructorFields.map((x) => x.index).toList();
-  List regularFields() => contents.where((x) => !x.usedInConstructor).toList();
-  List regularFieldNames() => regularFields().map((x) => x.name).toList();
-  List regularFieldIndices() =>
-      regularFields().map((x) => x.index).toList();
-
-  /**
-   * If we weren't given any non-constructor fields to use, figure out what
-   * we think they ought to be, based on the class definition.
-   * We find public fields, getters that have corresponding setters, and getters
-   * that are listed in the constructor fields.
-   */
-  void figureOutFields() {
-    Iterable names(Iterable<DeclarationMirror> mirrors) =>
-        mirrors.map((each) => each.simpleName).toList();
-
-    if (!_shouldFigureOutFields || !regularFields().isEmpty) return;
-    var fields = publicFields(mirror);
-    var getters = publicGetters(mirror);
-    var gettersWithSetters = getters.where( (each)
-        => mirror.declarations[
-            new Symbol("${MirrorSystem.getName(each.simpleName)}=")] != null);
-    var gettersThatMatchConstructor = getters.where((each)
-        => (named(each.simpleName) != null) &&
-            (named(each.simpleName).usedInConstructor)).toList();
-    addAllNotExplicitlyExcluded(names(fields));
-    addAllNotExplicitlyExcluded(names(gettersWithSetters));
-    addAllNotExplicitlyExcluded(names(gettersThatMatchConstructor));
-  }
-
-  toString() => "FieldList($contents)";
-}
-
-/**
- *  Provide a typedef for the setWith argument to setFieldWith. It would
- * be nice if we could put this closer to the definition.
- */
-typedef SetWithFunction(InstanceMirror m, object);
-
-/**
- * This represents a constructor that is to be used when re-creating a
- * serialized object.
- */
-class Constructor {
-  /** The mirror of the class we construct. */
-  final ClassMirror type;
-
-  /** The name of the constructor to use, if not the default constructor.*/
-  String name;
-  Symbol nameSymbol;
-
-  /**
-   * The indices of the fields used as constructor arguments. We will look
-   * these up in the state by number. The index is according to a list of the
-   * fields in alphabetical order by name.
-   */
-  List<int> fieldNumbers;
-
-  /**
-   * Creates a new constructor for the [type] with the constructor named [name]
-   * and the [fieldNumbers] of the constructor fields.
-   */
-  Constructor(this.type, this.name, this.fieldNumbers) {
-    if (name == null) name = '';
-    nameSymbol = new Symbol(name);
-    if (fieldNumbers == null) fieldNumbers = const [];
-  }
-
-  /**
-   * Find the field values in [state] and pass them to the constructor.
-   * If any of [fieldNumbers] is not an int, then use it as a literal value.
-   */
-  constructFrom(state, Reader r) {
-    // TODO(alanknight): Handle named parameters
-    Iterable inflated = fieldNumbers.map(
-        (x) => (x is int) ? r.inflateReference(state[x]) : x);
-    return type.newInstance(nameSymbol, inflated.toList());
-  }
-}
-
-/**
- * This wraps a map to make it indexable by integer field numbers. It translates
- * from the index into a field name and then looks it up in the map.
- */
-class _MapWrapper {
-  final Map _map;
-  final List fieldList;
-  _MapWrapper(this.fieldList) : _map = new Map();
-  _MapWrapper.fromMap(this._map, this.fieldList);
-
-  operator [](key) => _map[fieldList[key].name];
-
-  operator []=(key, value) { _map[fieldList[key].name] = value; }
-  get length => _map.length;
-
-  Map asMap() => _map;
-}
-
-/**
- * Return a symbol corresponding to [value], which may be a String or a
- * Symbol. If it is any other type, or if the string is an
- * invalid symbol, return null;
- */
-Symbol _asSymbol(value) {
-  if (value is Symbol) return value;
-  if (value is String) {
-    try {
-      return new Symbol(value);
-    } on ArgumentError {
-      return null;
-    };
-  } else {
-    return null;
-  }
-}
\ No newline at end of file
diff --git a/pkg/serialization/lib/src/format.dart b/pkg/serialization/lib/src/format.dart
deleted file mode 100644
index 791cc83..0000000
--- a/pkg/serialization/lib/src/format.dart
+++ /dev/null
@@ -1,561 +0,0 @@
-part of serialization;
-
-/**
- * An abstract class for serialization formats. Subclasses define how data
- * is read or written to a particular output mechanism.
- */
-abstract class Format {
-
-  const Format();
-
-  /**
-   * Return true if this format stores primitives in their own area and uses
-   * references to them (e.g. [SimpleFlatFormat]) and false if primitives
-   * are stored directly (e.g. [SimpleJsonFormat], [SimpleMapFormat]).
-   */
-  bool get shouldUseReferencesForPrimitives => false;
-
-  /**
-   * Generate output for [w] and return it. The particular form of the output
-   * will depend on the format. The format can assume that [w] has data
-   * generated by rules in a series of lists, and that each list will contain
-   * either primitives (null, bool, num, String), Lists or Maps. The Lists or
-   * Maps may contain any of the same things recursively, or may contain
-   * Reference objects. For lists and maps the rule will tell us if they can
-   * be of variable length or not. The format is allowed to operate
-   * destructively on the rule data.
-   */
-  generateOutput(Writer w);
-
-  /**
-   * Read the data from [input] in the context of [reader] and return it as a
-   * Map with entries for "roots", "data" and "rules", which the reader knows
-   * how to interpret. The type of [input] will depend on the particular format.
-   */
-  Map<String, dynamic> read(input, Reader reader);
-}
-
-/**
- * This is the most basic format, which provides the internal representation
- * of the serialization, exposing the Reference objects.
- */
-class InternalMapFormat extends Format {
-  const InternalMapFormat();
-
-  /**
-   * Generate output for this format from [w] and return it as a nested Map
-   * structure. The top level has
-   * 3 fields, "rules" which may hold a definition of the rules used,
-   * "data" which holds the serialized data, and "roots", which holds
-   * [Reference] objects indicating the root objects. Note that roots are
-   * necessary because the data is not organized in the same way as the object
-   * structure, it's a list of lists holding self-contained maps which only
-   * refer to other parts via [Reference] objects.
-   */
-  Map<String, dynamic> generateOutput(Writer w) {
-    var result = {
-      "rules" : w.serializedRules(),
-      "data" : w.states,
-      "roots" : w._rootReferences()
-    };
-    return result;
-  }
-
-  /**
-   * Read serialized data written from this format
-   * and return the nested Map representation described in [generateOutput]. If
-   * the data also includes rule definitions, then these will replace the rules
-   * in the [Serialization] for [reader].
-   */
-  Map<String, dynamic> read(Map<String, dynamic> topLevel, Reader reader) {
-    var ruleString = topLevel["rules"];
-    reader.readRules(ruleString);
-    reader._data = topLevel["data"];
-    topLevel["roots"] = topLevel["roots"];
-    return topLevel;
-  }
-}
-
-/**
- * A format that stores the data in maps which can be converted into a JSON
- * string or passed through an isolate. Note that this consists of maps, but
- * that they don't follow the original object structure or look like the nested
- * maps of a [json] representation. They are flat, and [Reference] objects
- * are converted into a map form that will not make sense to
- * anything but this format. For simple acyclic JSON that other programs
- * can read, use [SimpleJsonFormat]. This is the default format, and is
- * easier to read than the more efficient [SimpleFlatFormat].
- */
-class SimpleMapFormat extends InternalMapFormat {
-
-  const SimpleMapFormat();
-
-  /**
-   * Generate output for this format from [w] and return it as a String which
-   * is the [json] representation of a nested Map structure. The top level has
-   * 3 fields, "rules" which may hold a definition of the rules used,
-   * "data" which holds the serialized data, and "roots", which holds
-   * [Reference] objects indicating the root objects. Note that roots are
-   * necessary because the data is not organized in the same way as the object
-   * structure, it's a list of lists holding self-contained maps which only
-   * refer to other parts via [Reference] objects.
-   * This effectively defines a custom JSON serialization format, although
-   * the details of the format vary depending which rules were used.
-   */
-  Map<String, dynamic> generateOutput(Writer w) {
-    forAllStates(w, (x) => x is Reference, referenceToMap);
-    var result = super.generateOutput(w);
-    result["roots"] = result["roots"].map(
-        (x) => x is Reference ? referenceToMap(x) : x).toList();
-    return result;
-  }
-
-  /**
-   * Convert the data generated by the rules to have maps with the fields
-   * of [Reference] objects instead of the [Reference] so that the structure
-   * can be serialized between isolates and json easily.
-   */
-  void forAllStates(ReaderOrWriter w, bool predicate(value),
-               void transform(value)) {
-    for (var eachRule in w.rules) {
-      var ruleData = w.states[eachRule.number];
-      for (var data in ruleData) {
-        keysAndValues(data).forEach((key, value) {
-          if (predicate(value)) {
-            data[key] = transform(value);
-          }
-        });
-      }
-    }
-  }
-
-  /** Convert the reference to a [json] serializable form. */
-  Map<String, int> referenceToMap(Reference ref) => ref == null ? null :
-    {
-      "__Ref" : 0,
-      "rule" : ref.ruleNumber,
-      "object" : ref.objectNumber
-    };
-
-  /**
-   * Convert the [referenceToMap] form for a reference back to a [Reference]
-   * object.
-   */
-  Reference mapToReference(ReaderOrWriter parent, Map<String, int> ref) =>
-      ref == null ? null : new Reference(parent, ref["rule"], ref["object"]);
-
-  /**
-   * Read serialized data written in this format
-   * and return the nested Map representation described in [generateOutput]. If
-   * the data also includes rule definitions, then these will replace the rules
-   * in the [Serialization] for [reader].
-   */
-  Map<String, dynamic> read(Map<String, dynamic> topLevel, Reader reader) {
-    super.read(topLevel, reader);
-    forAllStates(reader,
-        (ref) => ref is Map && ref["__Ref"] != null,
-        (ref) => mapToReference(reader, ref));
-    topLevel["roots"] = topLevel["roots"]
-        .map((x) => x is Map<String, int> ? mapToReference(reader, x) : x)
-        .toList();
-    return topLevel;
-  }
-}
-
-/**
- * A format for "normal" [json] representation of objects. It stores
- * the fields of the objects as nested maps, and doesn't allow cycles. This can
- * be useful in talking to existing APIs that expect [json] format data. The
- * output will be either a simple object (string, num, bool), a List, or a Map,
- * with nesting of those.
- * Note that since the classes of objects aren't normally stored, this isn't
- * enough information to read back the objects. However, if the
- * If the [storeRoundTripInfo] field of the format is set to true, then this
- * will store the rule number along with the data, allowing reconstruction.
- */
-class SimpleJsonFormat extends SimpleMapFormat {
-
-  /**
-   * Indicate if we should store rule numbers with map/list data so that we
-   * will know how to reconstruct it with a read operation. If we don't, this
-   * will be more compliant with things that expect known format JSON as input,
-   * but we won't be able to read back the objects.
-   */
-  final bool storeRoundTripInfo;
-
-  /**
-   * If we store the rule numbers, what key should we use to store them.
-   */
-  static const String RULE = "_rule";
-  static const String RULES = "_rules";
-  static const String DATA = "_data";
-  static const String ROOTS = "_root";
-
-  const SimpleJsonFormat({this.storeRoundTripInfo : false});
-
-  /**
-   * Generate output for this format from [w] and return it as
-   * the [json] representation of a nested Map structure.
-   */
-  generateOutput(Writer w) {
-    jsonify(w);
-    var root = w._rootReferences().first;
-    if (root is Reference) root = w.stateForReference(root);
-    if (w.selfDescribing && storeRoundTripInfo) {
-      root = new Map()
-          ..[RULES] = w.serializedRules()
-          ..[DATA] = root;
-    }
-    return root;
-  }
-
-  /**
-   * Convert the data generated by the rules to have nested maps instead
-   * of Reference objects and to add rule numbers if [storeRoundTripInfo]
-   * is true.
-   */
-  void jsonify(Writer w) {
-    for (var eachRule in w.rules) {
-      var ruleData = w.states[eachRule.number];
-      jsonifyForRule(ruleData, w, eachRule);
-    }
-  }
-
-  /**
-   * For a particular [rule] modify the [ruleData] to conform to this format.
-   */
-  void jsonifyForRule(List ruleData, Writer w, SerializationRule rule) {
-    for (var i = 0; i < ruleData.length; i++) {
-      var each = ruleData[i];
-      if (each is List) {
-        jsonifyEntry(each, w);
-        if (storeRoundTripInfo) ruleData[i].add(rule.number);
-      } else if (each is Map) {
-        jsonifyEntry(each, w);
-        if (storeRoundTripInfo) each[RULE] = rule.number;
-      }
-    }
-  }
-
-  /**
-   * For one particular entry, which is either a Map or a List, update it
-   * to turn References into a nested List/Map.
-   */
-  void jsonifyEntry(map, Writer w) {
-    // Note, if this is a Map, and the key might be a reference, we need to
-    // bend over backwards to avoid concurrent modifications. Non-string keys
-    // won't actually work if we try to write this to json, but might happen
-    // if e.g. sending between isolates.
-    var updates = new Map();
-    keysAndValues(map).forEach((key, value) {
-      if (value is Reference) updates[key] = w.stateForReference(value);
-    });
-    updates.forEach((k, v) => map[k] = v);
-  }
-
-  /**
-   * Read serialized data saved in this format, which should look like
-   * either a simple type, a List or a Map and return the Map
-   * representation that the reader expects, with top-level
-   * entries for "rules", "data", and "roots". Nested lists/maps will be
-   * converted into Reference objects. Note that if the data was not written
-   * with [storeRoundTripInfo] true this will fail.
-   */
-  Map<String, dynamic> read(data, Reader reader) {
-    var result = new Map();
-    // Check the case of having been written without additional data and
-    // read as if it had been written with storeRoundTripData set.
-    if (reader.selfDescribing && !(data.containsKey(DATA))) {
-      throw new SerializationException("Missing $DATA entry, "
-          "may mean this was written and read with different values "
-          "of selfDescribing.");
-    }
-    // If we are self-describing, we should have separate rule and data
-    // sections. If not, we assume that we have just the data at the top level.
-    var rules = reader.selfDescribing ? data[RULES] : null;
-    var actualData = reader.selfDescribing ? data[DATA] : data;
-    reader.readRules(rules);
-    var ruleData = new List.generate(reader.rules.length, (_) => []);
-    var top = recursivelyFixUp(actualData, reader, ruleData);
-    result["data"] = ruleData;
-    result["roots"] = [top];
-    return result;
-  }
-
-  /**
-   * Convert nested references in [input] into [Reference] objects.
-   */
-  recursivelyFixUp(input, Reader r, List result) {
-    var data = input;
-    if (isPrimitive(data)) {
-      result[r._primitiveRule().number].add(data);
-      return data;
-    }
-    var ruleNumber;
-    // If we've added the rule number on as the last item in a list we have
-    // to get rid of it or it will be interpreted as extra data. For a map
-    // the library will be ok, but we need to get rid of the extra key before
-    // the data is shown to the user, so we destructively modify.
-    if (data is List) {
-      ruleNumber = data.last;
-      data = data.take(data.length - 1).toList();
-    } else if (data is Map) {
-      ruleNumber = data.remove(RULE);
-    } else {
-      throw new SerializationException("Invalid data format");
-    }
-    // Do not use map or other lazy operations for this. They do not play
-    // well with a function that destructively modifies its arguments.
-    var newData = mapValues(data, (each) => recursivelyFixUp(each, r, result));
-    result[ruleNumber].add(newData);
-    return new Reference(r, ruleNumber, result[ruleNumber].length - 1);
-  }
-}
-
-/**
- * Writes to a simple mostly-flat format. Details are subject to change.
- * Right now this produces a List containing null, num, and String. This is
- * more space-efficient than the map formats, but much less human-readable.
- * Simple usage is to turn this into JSON for transmission.
- */
-class SimpleFlatFormat extends Format {
-  bool get shouldUseReferencesForPrimitives => true;
-
-  /**
-   * For each rule we store data to indicate whether it will be reconstructed
-   * as a primitive, a list or a map.
-   */
-  static const int STORED_AS_LIST = 1;
-  static const int STORED_AS_MAP = 2;
-  static const int STORED_AS_PRIMITIVE = 3;
-
-  const SimpleFlatFormat();
-
-  /**
-   * Generate output for this format from [w]. This will return a List with
-   * three entries, corresponding to the "rules", "data", and "roots" from
-   * [SimpleMapFormat]. The data is stored as a single List containing
-   * primitives.
-   */
-  List generateOutput(Writer w) {
-    var result = new List(3);
-    var flatData = [];
-    for (var eachRule in w.rules) {
-      var ruleData = w.states[eachRule.number];
-      flatData.add(ruleData.length);
-      writeStateInto(eachRule, ruleData, flatData);
-    }
-    result[0] = w.serializedRules();
-    result[1] = flatData;
-    result[2] = [];
-    w._rootReferences().forEach((x) => x.writeToList(result[2]));
-    return result;
-  }
-
-  /**
-   * Writes the data from [rule] into the [target] list.
-   */
-  void writeStateInto(SerializationRule rule, List ruleData, List target) {
-    if (!ruleData.isEmpty) {
-      var sample = ruleData.first;
-      if (rule.storesStateAsLists || sample is List) {
-        writeLists(rule, ruleData, target);
-      } else if (rule.storesStateAsMaps || sample is Map) {
-        writeMaps(rule, ruleData, target);
-      } else if (rule.storesStateAsPrimitives || isPrimitive(sample)) {
-        writeObjects(ruleData, target);
-      } else {
-        throw new SerializationException("Invalid data format");
-      }
-    } else {
-      // If there is no data, write a zero for the length.
-      target.add(0);
-    }
-  }
-
-  /**
-   * Write [entries], which contains Lists. Either the lists are variable
-   * length, in which case we add a length field, or they are fixed length, in
-   * which case we don't, and assume the [rule] will know how to read the
-   * right length when we read it back. We expect everything in the list to be
-   * a reference, which is stored as two numbers.
-   */
-  void writeLists(SerializationRule rule, List<List> entries, List target) {
-    target.add(STORED_AS_LIST);
-    for (var eachEntry in entries) {
-      if (rule.hasVariableLengthEntries) {
-        target.add(eachEntry.length);
-      }
-      for (var eachReference in eachEntry) {
-        writeReference(eachReference, target);
-      }
-    }
-  }
-
-  /**
-   * Write [entries], which contains Maps. Either the Maps are variable
-   * length, in which case we add a length field, or they are fixed length, in
-   * which case we don't, and assume the [rule] will know how to read the
-   * right length when we read it back. Then we write alternating keys and
-   * values. We expect the values to be references, which we store as
-   * two numbers.
-   */
-  void writeMaps(SerializationRule rule, List<Map> entries, List target) {
-    target.add(STORED_AS_MAP);
-    for (var eachEntry in entries) {
-      if (rule.hasVariableLengthEntries) {
-        target.add(eachEntry.length);
-      }
-      eachEntry.forEach((key, value) {
-        writeReference(key, target);
-        writeReference(value, target);
-      });
-    }
-  }
-
-  /**
-   * Write [entries], which contains simple objects which we can put directly
-   * into [target].
-   */
-  void writeObjects(List entries, List target) {
-    target.add(STORED_AS_PRIMITIVE);
-    for (var each in entries) {
-      if (!isPrimitive(each)) throw new SerializationException("Invalid data");
-    }
-    target.addAll(entries);
-  }
-
-  /**
-   * Write [eachRef] to [target]. It will be written as two ints. If [eachRef]
-   * is null it will be written as two nulls.
-   */
-  void writeReference(Reference eachRef, List target) {
-    // TODO(alanknight): Writing nulls is problematic in a real flat format.
-    if (eachRef == null) {
-      target..add(null)..add(null);
-    } else {
-      eachRef.writeToList(target);
-    }
-  }
-
-  /**
-   * Read the data from [rawInput] in the context of [r] and return it as a
-   * Map with entries for "roots", "data" and "rules", which the reader knows
-   * how to interpret. We expect [rawInput] to have been generated from this
-   * format.
-   */
-  Map<String, dynamic> read(List rawInput, Reader r) {
-    // TODO(alanknight): It's annoying to have to pass the reader around so
-    // much, consider having the format be specific to a particular
-    // serialization operation along with the reader and having it as a field.
-    var input = {};
-    input["rules"] = rawInput[0];
-    r.readRules(input["rules"]);
-
-    var flatData = rawInput[1];
-    var stream = flatData.iterator;
-    var tempData = new List(r.rules.length);
-    for (var eachRule in r.rules) {
-       tempData[eachRule.number] = readRuleDataFrom(stream, eachRule, r);
-    }
-    input["data"] = tempData;
-
-    var roots = [];
-    var rootsAsInts = rawInput[2].iterator;
-    do {
-      roots.add(nextReferenceFrom(rootsAsInts, r));
-    } while (rootsAsInts.current != null);
-
-    input["roots"] = roots;
-    return input;
-  }
-
-  /**
-   * Read the data for [rule] from [input] and return it.
-   */
-  readRuleDataFrom(Iterator input, SerializationRule rule, Reader r) {
-    var numberOfEntries = _next(input);
-    var entryType = _next(input);
-    if (entryType == STORED_AS_LIST) {
-      return readLists(input, rule, numberOfEntries, r);
-    }
-    if (entryType == STORED_AS_MAP) {
-      return readMaps(input, rule, numberOfEntries, r);
-    }
-    if (entryType == STORED_AS_PRIMITIVE) {
-      return readPrimitives(input, rule, numberOfEntries);
-    }
-    if (numberOfEntries == 0) {
-      return [];
-    } else {
-      throw new SerializationException("Invalid data in serialization");
-    }
-  }
-
-  /**
-   * Read data for [rule] from [input] with [length] number of entries,
-   * creating lists from the results.
-   */
-  List readLists(Iterator input, SerializationRule rule, int length, Reader r) {
-    var ruleData = [];
-    for (var i = 0; i < length; i++) {
-      var subLength =
-          rule.hasVariableLengthEntries ? _next(input) : rule.dataLength;
-      var subList = [];
-      ruleData.add(subList);
-      for (var j = 0; j < subLength; j++) {
-        subList.add(nextReferenceFrom(input, r));
-      }
-    }
-    return ruleData;
-  }
-
-  /**
-   * Read data for [rule] from [input] with [length] number of entries,
-   * creating maps from the results.
-   */
-  List readMaps(Iterator input, SerializationRule rule, int length, Reader r) {
-    var ruleData = [];
-    for (var i = 0; i < length; i++) {
-      var subLength =
-          rule.hasVariableLengthEntries ? _next(input) : rule.dataLength;
-      var map = new Map();
-      ruleData.add(map);
-      for (var j = 0; j < subLength; j++) {
-        var key = nextReferenceFrom(input, r);
-        var value = nextReferenceFrom(input, r);
-        map[key] = value;
-      }
-    }
-    return ruleData;
-  }
-
-  /**
-   * Read data for [rule] from [input] with [length] number of entries,
-   * treating the data as primitives that can be returned directly.
-   */
-  List readPrimitives(Iterator input, SerializationRule rule, int length) {
-    var ruleData = [];
-    for (var i = 0; i < length; i++) {
-      ruleData.add(_next(input));
-    }
-    return ruleData;
-  }
-
-  /** Read the next Reference from the input. */
-  Reference nextReferenceFrom(Iterator input, Reader r) {
-    var a = _next(input);
-    var b = _next(input);
-    if (a == null) {
-      return null;
-    } else {
-      return new Reference(r, a, b);
-    }
-  }
-
-  /** Return the next element from the input. */
-  _next(Iterator input) {
-    input.moveNext();
-    return input.current;
-  }
-}
diff --git a/pkg/serialization/lib/src/mirrors_helpers.dart b/pkg/serialization/lib/src/mirrors_helpers.dart
deleted file mode 100644
index b36a1a9..0000000
--- a/pkg/serialization/lib/src/mirrors_helpers.dart
+++ /dev/null
@@ -1,96 +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.
-
-/**
- * Provides some additional convenience methods on top of the basic mirrors
- */
-library mirrors_helpers;
-
-// Import and re-export mirrors here to minimize both dependence on mirrors
-// and the number of times we have to be told that mirrors aren't finished yet.
-import 'dart:mirrors';
-export 'dart:mirrors';
-import 'serialization_helpers.dart';
-
-// TODO(alanknight): Remove this method.  It is working around a bug
-// in the Dart VM which incorrectly returns Object as the superclass
-// of Object.
-_getSuperclass(ClassMirror mirror) {
-  var superclass = mirror.superclass;
-  return (superclass == mirror) ? null : superclass;
-}
-
-/**
- * Return a list of all the public fields of a class, including inherited
- * fields.
- */
-Iterable<VariableMirror> publicFields(ClassMirror mirror) {
-  var mine = mirror.declarations.values.where(
-      (x) => x is VariableMirror && !(x.isPrivate || x.isStatic));
-  var mySuperclass = _getSuperclass(mirror);
-  if (mySuperclass != null) {
-    return append(publicFields(mySuperclass), mine);
-  } else {
-    return new List<VariableMirror>.from(mine);
-  }
-}
-
-/** Return true if the class has a field named [name]. Note that this
- * includes private fields, but excludes statics. */
-bool hasField(Symbol name, ClassMirror mirror) {
-  if (name == null) return false;
-  var field = mirror.declarations[name];
-  if (field is VariableMirror && !field.isStatic) return true;
-  var superclass = _getSuperclass(mirror);
-  if (superclass == null) return false;
-  return hasField(name, superclass);
-}
-
-/**
- * Return a list of all the getters of a class, including inherited
- * getters. Note that this allows private getters, but excludes statics.
- */
-Iterable<MethodMirror> publicGetters(ClassMirror mirror) {
-  var mine = mirror.declarations.values.where(
-      (x) => x is MethodMirror && x.isGetter && !(x.isPrivate || x.isStatic));
-  var mySuperclass = _getSuperclass(mirror);
-  if (mySuperclass != null) {
-    return append(publicGetters(mySuperclass), mine);
-  } else {
-    return new List<MethodMirror>.from(mine);
-  }
-}
-
-/** Return true if the class has a getter named [name] */
-bool hasGetter(Symbol name, ClassMirror mirror) {
-  if (name == null) return false;
-  var getter = mirror.declarations[name];
-  if (getter is MethodMirror && getter.isGetter && !getter.isStatic) {
-    return true;
-  }
-  var superclass = _getSuperclass(mirror);
-  if (superclass == null) return false;
-  return hasField(name, superclass);
-}
-
-/**
- * Return a list of all the public getters of a class which have corresponding
- * setters.
- */
-Iterable<MethodMirror> publicGettersWithMatchingSetters(ClassMirror mirror) {
-  var declarations = mirror.declarations;
-  return publicGetters(mirror).where((each) =>
-    // TODO(alanknight): Use new Symbol here?
-    declarations["${each.simpleName}="] != null);
-}
-
-/**
- * Given either an instance or a type, returns the type. Instances of Type
- * will be treated as types. Passing in an instance is really just backward
- * compatibility.
- */
-ClassMirror turnInstanceIntoSomethingWeCanUse(x) {
-  if (x is Type) return reflectClass(x);
-  return reflect(x).type;
-}
diff --git a/pkg/serialization/lib/src/reader_writer.dart b/pkg/serialization/lib/src/reader_writer.dart
deleted file mode 100644
index 3ee95a9..0000000
--- a/pkg/serialization/lib/src/reader_writer.dart
+++ /dev/null
@@ -1,623 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of serialization;
-
-/**
- * This writes out the state of the objects to an external format. It holds
- * all of the intermediate state needed. The primary API for it is the
- * [write] method.
- */
-// TODO(alanknight): For simple serialization formats this does a lot of work
-// that isn't necessary, e.g. detecting cycles and maintaining references.
-// Consider having an abstract superclass with the basic functionality and
-// simple serialization subclasses where we know there aren't cycles.
-class Writer implements ReaderOrWriter {
-  /**
-   * The [serialization] holds onto the rules that define how objects
-   * are serialized.
-   */
-  final Serialization serialization;
-
-  /** The [trace] object keeps track of the objects to be visited while finding
-   * the full set of objects to be written.*/
-  Trace trace;
-
-  /**
-   * When we write out objects, should we also write out a description
-   * of the rules for the serialization. This defaults to the corresponding
-   * value on the Serialization.
-   */
-  bool selfDescribing;
-
-  final Format format;
-
-  /**
-   * Objects that cannot be represented in-place in the serialized form need
-   * to have references to them stored. The [Reference] objects are computed
-   * once and stored here for each object. This provides some space-saving,
-   * but also serves to record which objects we have already seen.
-   */
-  final Map<dynamic, Reference> references =
-      new HashMap<Object, Reference>.identity();
-
-  /**
-   * The state of objects that need to be serialized is stored here.
-   * Each rule has a number, and rules keep track of the objects that they
-   * serialize, in order. So the state of any object can be found by indexing
-   * from the rule number and the object number within the rule.
-   * The actual representation of the state is determined by the rule. Lists
-   * and Maps are common, but it is arbitrary.
-   */
-  final List<List> states = new List<List>();
-
-  /** Return the list of rules we use. */
-  List<SerializationRule> get rules => serialization.rules;
-
-  /**
-   * Creates a new [Writer] that uses the rules from its parent
-   * [Serialization]. Serializations do not keep any state
-   * related to a particular read/write, so the same one can be used
-   * for multiple different Readers/Writers.
-   */
-  Writer(this.serialization, [Format newFormat]) :
-    format = (newFormat == null) ? const SimpleMapFormat() : newFormat {
-    trace = new Trace(this);
-    selfDescribing = serialization.selfDescribing;
-  }
-
-  /**
-   * This is the main API for a [Writer]. It writes the objects and returns
-   * the serialized representation, as determined by [format].
-   */
-  write(anObject) {
-    trace.addRoot(anObject);
-    trace.traceAll();
-    _flatten();
-    return format.generateOutput(this);
-  }
-
-  /**
-   * Given that we have fully populated the list of [states], and more
-   * importantly, the list of [references], go through each state and turn
-   * anything that requires a [Reference] into one. Since only the rules
-   * know the representation they use for state, delegate to them.
-   */
-  void _flatten() {
-    for (var eachRule in rules) {
-      _growStates(eachRule);
-      var index = eachRule.number;
-      var statesForThisRule = states[index];
-      for (var i = 0; i < statesForThisRule.length; i++) {
-        var eachState = statesForThisRule[i];
-        var newState = eachRule.flatten(eachState, this);
-        if (newState != null) {
-          statesForThisRule[i] = newState;
-        }
-      }
-    }
-  }
-
-  /**
-   * As the [trace] processes each object, it will call this method on us.
-   * We find the rules for this object, and record the state of the object
-   * as determined by each rule.
-   */
-  void _process(object, Trace trace) {
-    var real = (object is DesignatedRuleForObject) ? object.target : object;
-    for (var eachRule in serialization.rulesFor(object, this)) {
-      _record(real, eachRule);
-    }
-  }
-
-  /**
-   * Record the state of [object] as determined by [rule] and keep
-   * track of it. Generate a [Reference] for this object if required.
-   * When it's required is up to the particular rule, but generally everything
-   * gets a reference except a primitive.
-   * Note that at this point the states are just the same as the fields of the
-   * object, and haven't been flattened.
-   */
-  void _record(object, SerializationRule rule) {
-    if (rule.shouldUseReferenceFor(object, this)) {
-      references.putIfAbsent(object, () =>
-          new Reference(this, rule.number, _nextObjectNumberFor(rule)));
-      var state = rule.extractState(object, trace.note, this);
-      _addStateForRule(rule, state);
-    }
-  }
-
-  /**
-   * Should we store primitive objects directly or create references for them.
-   * That depends on which format we're using, so a flat format will want
-   * references, but the Map format can store them directly.
-   */
-  bool get shouldUseReferencesForPrimitives
-      => format.shouldUseReferencesForPrimitives;
-
-  /**
-   * Returns a serialized version of the [SerializationRule]s used to write
-   * the data, if [selfDescribing] is true, otherwise returns null.
-   */
-  serializedRules() {
-    if (!selfDescribing) return null;
-    var meta = serialization.ruleSerialization();
-    var writer = new Writer(meta, format);
-    writer.selfDescribing = false;
-    return writer.write(serialization.rules);
-  }
-
-  /** Record a [state] entry for a particular rule. */
-  void _addStateForRule(eachRule, state) {
-    _growStates(eachRule);
-    states[eachRule.number].add(state);
-  }
-
-  /** Find what the object number for the thing we're about to add will be.*/
-  int _nextObjectNumberFor(SerializationRule rule) {
-    _growStates(rule);
-    return states[rule.number].length;
-  }
-
-  /**
-   * We store the states in a List, indexed by rule number. But rules can be
-   * dynamically added, so we may have to grow the list.
-   */
-  void _growStates(eachRule) {
-    while (states.length <= eachRule.number) states.add(new List());
-  }
-
-  /**
-   * Return true if we have an object number for this object. This is used to
-   * tell if we have processed the object or not. This relies on checking if we
-   * have a reference or not. That saves some space by not having to keep track
-   * of simple objects, but means that if someone refers to the identical string
-   * from several places, we will process it several times, and store it
-   * several times. That seems an acceptable tradeoff, and in cases where it
-   * isn't, it's possible to apply a rule for String, or even for Strings larger
-   * than x, which gives them references.
-   */
-  bool _hasIndexFor(object) {
-    return _objectNumberFor(object) != -1;
-  }
-
-  /**
-   * Given an object, find what number it has. The number is valid only in
-   * the context of a particular rule, and if the rule has more than one,
-   * this will return the one for the primary rule, defined as the one that
-   * is listed in its canonical reference.
-   */
-  int _objectNumberFor(object) {
-    var reference = references[object];
-    return (reference == null) ? -1 : reference.objectNumber;
-  }
-
-  /**
-   * Return a list of [Reference] objects pointing to our roots. This will be
-   * stored in the output under "roots" in the default format.
-   */
-  List _rootReferences() => trace.roots.map(_referenceFor).toList();
-
-  /**
-   * Given an object, return a reference for it if one exists. If there's
-   * no reference, return the object itself. Once we have finished the tracing
-   * step, all objects that should have a reference (roughly speaking,
-   * non-primitives) can be relied on to have a reference.
-   */
-  _referenceFor(object) {
-    var result = references[object];
-    return (result == null) ? object : result;
-  }
-
-  /**
-   * Return true if the [Serialization.namedObjects] collection has a
-   * reference to [object].
-   */
-  // TODO(alanknight): Should the writer also have its own namedObjects
-  // collection specific to the particular write, or is that just adding
-  // complexity for little value?
-  bool hasNameFor(object) => serialization._hasNameFor(object);
-
-  /**
-   * Return the name we have for this object in the [Serialization.namedObjects]
-   * collection.
-   */
-  String nameFor(object) => serialization._nameFor(object);
-
-  // For debugging/testing purposes. Find what state a reference points to.
-  stateForReference(Reference r) => states[r.ruleNumber][r.objectNumber];
-
-  /** Return the state pointed to by [reference]. */
-  resolveReference(reference) => stateForReference(reference);
-}
-
-/**
- * An abstract class for Reader and Writer, which primarily exists so we can
- * type things that will refer to one or the other, depending on which
- * operation we're doing.
- */
-abstract class ReaderOrWriter {
-  /** Return the list of serialization rules we are using.*/
-  List<SerializationRule> get rules;
-
-  /** Return the internal collection of object state and [Reference] objects. */
-  List<List> get states;
-
-  /**
-   * Return the object, or state, that ref points to, depending on which
-   * we're generating.
-   */
-  resolveReference(Reference ref);
-}
-
-/**
- * The main class responsible for reading. It holds
- * onto the necessary state and to the objects that have been inflated.
- */
-class Reader implements ReaderOrWriter {
-
-  /**
-   * The serialization that specifies how we read. Note that in contrast
-   * to the Writer, this is not final. This is because we may be created
-   * with an empty [Serialization] and then read the rules from the data,
-   * if [selfDescribing] is true.
-   */
-  Serialization serialization;
-
-  /**
-   * When we read objects, should we read a description of the rules if
-   * present. This defaults to the corresponding value on the Serialization.
-   */
-  bool selfDescribing;
-
-  /**
-   * The state of objects that have been serialized is stored here.
-   * Each rule has a number, and rules keep track of the objects that they
-   * serialize, in order. So the state of any object can be found by indexing
-   * from the rule number and the object number within the rule.
-   * The actual representation of the state is determined by the rule. Lists
-   * and Maps are common, but it is arbitrary. See [Writer.states].
-   */
-  List<List> _data;
-
-  /** Return the internal collection of object state and [Reference] objects. */
-  get states => _data;
-
-  /**
-   * The resulting objects, indexed according to the same scheme as
-   * _data, where each rule has a number, and rules keep track of the objects
-   * that they serialize, in order.
-   */
-  List<List> objects;
-
-  final Format format;
-
-  /**
-   * Creates a new [Reader] that uses the rules from its parent
-   * [Serialization]. Serializations do not keep any state related to
-   * a particular read or write operation, so the same one can be used
-   * for multiple different Writers/Readers.
-   */
-  Reader(this.serialization, [Format newFormat]) :
-    format = (newFormat == null) ? const SimpleMapFormat() : newFormat  {
-    selfDescribing = serialization.selfDescribing;
-  }
-
-  /**
-   * When we read, we may need to look up objects by name in order to link to
-   * them. This is particularly true if we have references to classes,
-   * functions, mirrors, or other non-portable entities. The map in which we
-   * look things up can be provided as an argument to read, but we can also
-   * provide a map here, and objects will be looked up in both places.
-   */
-  Map namedObjects;
-
-  /**
-   * Look up the reference to an external object. This can be held either in
-   * the reader-specific list of externals or in the serializer's
-   */
-  objectNamed(key, [Function ifAbsent]) {
-    var map = (namedObjects.containsKey(key))
-        ? namedObjects : serialization.namedObjects;
-    if (!map.containsKey(key)) {
-      (ifAbsent == null ? keyNotFound : ifAbsent)(key);
-    }
-    return map[key];
-  }
-
-  void keyNotFound(key) {
-    throw new SerializationException(
-        'Cannot find named object to link to: $key');
-  }
-
-  /**
-   * Return the list of rules to be used when writing. These come from the
-   * [serialization].
-   */
-  List<SerializationRule> get rules => serialization.rules;
-
-  /**
-   * Internal use only, for testing purposes. Set the data for this reader
-   * to a List of Lists whose size must match the number of rules.
-   */
-  // When we set the data, initialize the object storage to a matching size.
-  void set data(List<List> newData) {
-    _data = newData;
-    objects = _data.map((x) => new List(x.length)).toList();
-  }
-
-  /**
-   * This is the primary method for a [Reader]. It takes the input data,
-   * decodes it according to [format] and returns the root object.
-   */
-  read(rawInput, [Map externals = const {}]) {
-    namedObjects = externals;
-    var input = format.read(rawInput, this);
-    data = input["data"];
-    rules.forEach(inflateForRule);
-    return inflateReference(input["roots"].first);
-  }
-
-  /**
-   * If the data we are reading from has rules written to it, read them back
-   * and set them as the rules we will use.
-   */
-  void readRules(newRules) {
-    // TODO(alanknight): Replacing the serialization is kind of confusing.
-    if (newRules == null) return;
-    var reader = serialization.ruleSerialization().newReader(format);
-    List rulesWeRead = reader.read(newRules, namedObjects);
-    if (rulesWeRead != null && !rulesWeRead.isEmpty) {
-      serialization = new Serialization.blank();
-      rulesWeRead.forEach(serialization.addRule);
-    }
-  }
-
-  /**
-   * Inflate all of the objects for [rule]. Does the essential state for all
-   * objects first, then the non-essential state. This avoids cycles in
-   * non-essential state, because all the objects will have already been
-   * created.
-   */
-  void inflateForRule(rule) {
-    var dataForThisRule = _data[rule.number];
-    keysAndValues(dataForThisRule).forEach((position, state) {
-      inflateOne(rule, position, state);
-    });
-    keysAndValues(dataForThisRule).forEach((position, state) {
-      rule.inflateNonEssential(state, allObjectsForRule(rule)[position], this);
-    });
-  }
-
-  /**
-   * Create a new object, based on [rule] and [state], which will
-   * be stored in [position] in the storage for [rule]. This will
-   * follow references and recursively inflate them, leaving Sentinel objects
-   * to detect cycles.
-   */
-  inflateOne(SerializationRule rule, position, state) {
-    var existing = allObjectsForRule(rule)[position];
-    // We may already be in progress and hitting this in a cycle.
-    if (existing is _Sentinel) {
-      throw new SerializationException('Cycle in essential state');
-    }
-    // We may have already inflated this object, at least its essential state.
-    if (existing != null) return existing;
-
-    // Put a sentinel there to mark this in case of recursion.
-    allObjectsForRule(rule)[position] = const _Sentinel();
-    var newObject = rule.inflateEssential(state, this);
-    allObjectsForRule(rule)[position] = newObject;
-    return newObject;
-  }
-
-  /**
-   * The parameter [possibleReference] might be a reference. If it isn't, just
-   * return it. If it is, then inflate the target of the reference and return
-   * the resulting object.
-   */
-  inflateReference(possibleReference) {
-    // If this is a primitive, return it directly.
-    // TODO This seems too complicated.
-    return asReference(possibleReference,
-        ifReference: (reference) {
-          var rule = ruleFor(reference);
-          var state = _stateFor(reference);
-          inflateOne(rule, reference.objectNumber, state);
-          return _objectFor(reference);
-        });
-  }
-
-  /** Return the object pointed to by [reference]. */
-  resolveReference(reference) => inflateReference(reference);
-
-  /**
-   * Given [reference], return what we have stored as an object for it. Note
-   * that, depending on the current state, this might be null or a Sentinel.
-   */
-  _objectFor(Reference reference) =>
-      objects[reference.ruleNumber][reference.objectNumber];
-
-  /** Given [rule], return the storage for its objects. */
-  allObjectsForRule(SerializationRule rule) => objects[rule.number];
-
-  /** Given [reference], return the the state we have stored for it. */
-  _stateFor(Reference reference) =>
-      _data[reference.ruleNumber][reference.objectNumber];
-
-  /** Given a reference, return the rule it references. */
-  SerializationRule ruleFor(Reference reference) =>
-      serialization.rules[reference.ruleNumber];
-
-  /**
-   * Return the primitive rule we are using. This is an ugly mechanism to
-   * support the extra information to reconstruct objects in the
-   * [SimpleJsonFormat].
-   */
-  SerializationRule _primitiveRule() {
-    for (var each in rules) {
-      if (each.runtimeType == PrimitiveRule) {
-        return each;
-      }
-    }
-    throw new SerializationException("No PrimitiveRule found");
-  }
-
-  /**
-   * Given a possible reference [anObject], call either [ifReference] or
-   * [ifNotReference], depending if it's a reference or not. This is the
-   * primary place that knows about the serialized representation of a
-   * reference.
-   */
-  asReference(anObject, {Function ifReference: doNothing,
-      Function ifNotReference : doNothing}) {
-    if (anObject is Reference) return ifReference(anObject);
-    if (anObject is Map && anObject["__Ref"] != null) {
-      var ref =
-          new Reference(this, anObject["rule"], anObject["object"]);
-      return ifReference(ref);
-    } else {
-      return ifNotReference(anObject);
-    }
-  }
-}
-
-/**
- * This serves as a marker to indicate a object that is in the process of
- * being de-serialized. So if we look for an object slot and find one of these,
- * we know we've hit a cycle.
- */
-class _Sentinel {
-  const _Sentinel();
-}
-
-/**
- * This represents the transitive closure of the referenced objects to be
- * used for serialization. It works closely in conjunction with the Writer,
- * and is kept as a separate object primarily for the possibility of wanting
- * to plug in different sorts of tracing rules.
- */
-class Trace {
-  // TODO(alanknight): It seems likely that the mechanism for cutting off
-  // tracings is by specifying rules. So is there any reason any more to have
-  // this as a separate class?
-  final Writer writer;
-
-  /**
-   * This class works by doing a breadth-first traversal of the objects,
-   * with the traversal order maintained in [queue].
-   */
-  final Queue queue = new Queue();
-
-  /** The root objects from which we will be tracing. */
-  final List roots = [];
-
-  Trace(this.writer);
-
-  void addRoot(object) {
-    roots.add(object);
-  }
-
-  /** A convenience method to add a single root and trace it in one step. */
-  void trace(object) {
-    addRoot(object);
-    traceAll();
-  }
-
-  /**
-   * Process all of the objects reachable from our roots via state that the
-   * serialization rules access.
-   */
-  void traceAll() {
-    queue.addAll(roots);
-    while (!queue.isEmpty) {
-      var next = queue.removeFirst();
-      if (!hasProcessed(next)) writer._process(next, this);
-    }
-  }
-
-  /**
-   * Has this object been seen yet? We test for this by checking if the
-   * writer has a reference for it. See comment for _hasIndexFor.
-   */
-  bool hasProcessed(object) {
-   return writer._hasIndexFor(object);
-  }
-
-  /** Note that we've seen [value], and add it to the queue to be processed. */
-  note(value) {
-    if (value != null) {
-      queue.add(value);
-    }
-    return value;
-  }
-}
-
-/**
- * Any pointers to objects that can't be represented directly in the
- * serialization format has to be stored as a reference. A reference encodes
- * the rule number of the rule that saved it in the Serialization that was used
- * for writing, and the object number within that rule.
- */
-class Reference {
-  /** The [Reader] or [Writer] that owns this reference. */
-  final ReaderOrWriter parent;
-  /** The position of the rule that controls this reference in [parent]. */
-  final int ruleNumber;
-  /** The index of the referred-to object in the storage of [parent] */
-  final int objectNumber;
-
-  Reference(this.parent, this.ruleNumber, this.objectNumber) {
-    if (ruleNumber == null || objectNumber == null) {
-      throw new SerializationException("Invalid Reference");
-    }
-    if (parent.rules.length < ruleNumber) {
-      throw new SerializationException("Invalid Reference");
-    }
-  }
-
-  /**
-   * Return the thing this reference points to. Assumes that we have a valid
-   * parent and that it is a Reader, as inflating is not meaningful when
-   * writing.
-   */
-  inflated() => parent.resolveReference(this);
-
-  /**
-   * Convert the reference to a map in JSON format. This is specific to the
-   * custom JSON format we define, and must be consistent with the
-   * [Reader.asReference] method.
-   */
-  // TODO(alanknight): This is a hack both in defining a toJson specific to a
-  // particular representation, and the use of a bogus sentinel "__Ref"
-  Map<String, int> toJson() => {
-    "__Ref" : 0,
-    "rule" : ruleNumber,
-    "object" : objectNumber
-  };
-
-  /** Write our information to [list]. Useful in writing to flat formats.*/
-  void writeToList(List list) {
-    list.add(ruleNumber);
-    list.add(objectNumber);
-  }
-
-  String toString() => "Reference($ruleNumber, $objectNumber)";
-}
-
-/**
- * This is used during tracing to indicate that an object should be processed
- * using a particular rule, rather than the one that might ordinarily be
- * found for it. This normally only makes sense if the object is uniquely
- * referenced, and is a more or less internal collection. See ListRuleEssential
- * for an example. It knows how to return its object and how to filter.
- */
-class DesignatedRuleForObject {
-  final Function rulePredicate;
-  final target;
-
-  DesignatedRuleForObject(this.target, this.rulePredicate);
-
-  List possibleRules(List rules) => rules.where(rulePredicate).toList();
-}
diff --git a/pkg/serialization/lib/src/serialization_helpers.dart b/pkg/serialization/lib/src/serialization_helpers.dart
deleted file mode 100644
index 5207267..0000000
--- a/pkg/serialization/lib/src/serialization_helpers.dart
+++ /dev/null
@@ -1,92 +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.
-
-/**
- * This contains extra functions and classes useful for implementing
- * serialiation. Some or all of these will be removed once the functionality is
- * available in the core library.
- */
-library serialization_helpers;
-
-import 'dart:collection';
-
-/**
- * A named function of one argument that just returns it. Useful for using
- * as a default value for a function parameter or other places where you want
- * to concisely provide a function that just returns its argument.
- */
-doNothing(x) => x;
-
-/** Concatenate two lists. Handle the case where one or both might be null. */
-// TODO(alanknight): Remove once issue 5342 is resolved.
-Iterable append(Iterable a, Iterable b) {
-  if (a == null) {
-    return (b == null) ? [] : new List.from(b);
-  }
-  if (b == null) return new List.from(a);
-  var result = new List.from(a);
-  result.addAll(b);
-  return result;
-}
-
-/** Helper function for PrimitiveRule to tell which objects it applies to. */
-bool isPrimitive(object) {
-  return identical(object, null) || object is num || object is String ||
-      identical(object, true) || identical(object, false);
-}
-
-/**
- * Given either an Iterable or a Map, return a map. For a Map just return it.
- * For an iterable, return a Map from the index to the value at that index.
- *
- * Used to iterate polymorphically between List-like and Map-like things.
- * For example, keysAndValues(["a", "b", "c"]).forEach((key, value) => ...);
- * will loop over the key/value pairs 1/"a", 2/"b", 3/"c", as if the argument
- * was a Map from integer keys to string values.
- */
-Map keysAndValues(x) {
-  if (x is Map) return x;
-  if (x is List) return x.asMap();
-  if (x is Iterable) return x.toList().asMap();
-  throw new ArgumentError("Invalid argument, expected Map or Iterable, got $x");
-}
-
-/**
- * Lets you iterate polymorphically between
- * List-like and Map-like things, but making them behave like Lists, instead
- * of behaving like Maps.
- * So values(["a", "b", "c"]).forEach((value) => ...);
- * will loop over the values "a", "b", "c", as if it were a List of values.
- * Only supports forEach() and map() operations because that was all I needed
- * for the moment.
- */
-Iterable values(x) {
-  if (x is Iterable) return x;
-  if (x is Map) return x.values;
-  throw new ArgumentError("Invalid argument, expected Map or Iterable, got $x");
-}
-
-/**
- * Iterate over [collection] and return a new collection of the same type
- * where each value has been transformed by [f]. For iterables and sets, this
- * is equivalent to [map]. For a Map, it returns a new Map with the same keys
- * and the corresponding values transformed by [f].
- */
-mapValues(collection, Function f) {
-  if (collection is Set) return collection.map(f).toSet();
-  if (collection is Iterable) return collection.map(f).toList();
-  if (collection is Map) return new Map.fromIterables(collection.keys,
-      collection.values.map(f));
-  throw new ArgumentError("Invalid argument, expected Map or Iterable, "
-      "got $collection");
-}
-
-/**
- * This acts as a stand-in for some value that cannot be hashed. We can't
- * just use const Object() because the compiler will fold them together.
- */
-class _Sentinel {
-  final _wrappedObject;
-  const _Sentinel(this._wrappedObject);
-}
diff --git a/pkg/serialization/lib/src/serialization_rule.dart b/pkg/serialization/lib/src/serialization_rule.dart
deleted file mode 100644
index 38fafca..0000000
--- a/pkg/serialization/lib/src/serialization_rule.dart
+++ /dev/null
@@ -1,581 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of serialization;
-
-// TODO(alanknight): We should have an example and tests for subclassing
-// serialization rule rather than using the hard-coded ClosureToMap rule. And
-// possibly an abstract superclass that's designed to be subclassed that way.
-/**
- * The abstract superclass for serialization rules.
- */
-abstract class SerializationRule {
-  /**
-   * Rules belong uniquely to a particular Serialization instance, and can
-   * be identified within it by number.
-   */
-  int _number;
-
-  /**
-   * Rules belong uniquely to a particular Serialization instance, and can
-   * be identified within it by number.
-   */
-  int get number => _number;
-
-  /**
-   * Rules belong uniquely to a particular Serialization instance, and can
-   * be identified within it by number.
-   */
-  void set number(int value) {
-    if (_number != null && _number != value) throw
-        new SerializationException("Rule numbers cannot be changed, once set");
-    _number = value;
-  }
-
-  /**
-   * Return true if this rule applies to this object, in the context
-   * where we're writing it, false otherwise.
-   */
-  bool appliesTo(object, Writer writer);
-
-  /**
-   * This extracts the state from the object, calling [f] for each value
-   * as it is extracted, and returning an object representing the whole
-   * state at the end. The state that results will still have direct
-   * pointers to objects, rather than references.
-   */
-  extractState(object, void f(value), Writer w);
-
-  /**
-   * Allows rules to tell us how they expect to store their state. If this
-   * isn't specified we can also just look at the data to tell.
-   */
-  bool get storesStateAsLists => false;
-  bool get storesStateAsMaps => false;
-  bool get storesStateAsPrimitives => false;
-
-  /**
-   * Given the variables representing the state of an object, flatten it
-   * by turning object pointers into Reference objects where needed. This
-   * destructively modifies the state object.
-   *
-   * This has a default implementation which assumes that object is indexable,
-   * so either conforms to Map or List. Subclasses may override to do something
-   * different, including returning a new state object to be used in place
-   * of the original.
-   */
-  // This has to be a separate operation from extracting, because we extract
-  // as we are traversing the objects, so we don't yet have the objects to
-  // generate references for them. It might be possible to avoid that by
-  // doing a depth-first rather than breadth-first traversal, but I'm not
-  // sure it's worth it.
-  flatten(state, Writer writer) {
-    keysAndValues(state).forEach((key, value) {
-      var reference = writer._referenceFor(value);
-      state[key] = reference;
-    });
-  }
-
-  /** Return true if this rule should only be applied when we are the first
-   * rule found that applies to this object. This may or may not be a hack
-   * that will disappear once we have better support for multiple rules.
-   * We want to have multiple different rules that apply to the same object. We
-   * also want to have multiple different rules that might exclusively apply
-   * to the same object. So, we want either ListRule or ListRuleEssential, and
-   * only one of them can be there. But on the other hand, we may want both
-   * ListRule and BasicRule. So we identify the kinds of rules that can share.
-   * If mustBePrimary returns true, then this rule will only be chosen if no
-   * other rule has been found yet. This means that the ordering of rules in
-   * the serialization is significant, which is unpleasant, but we'll have
-   * to see how bad it is.
-   */
-  // TODO(alanknight): Reconsider whether this should be handled differently.
-  bool get mustBePrimary => false;
-
-  /**
-   * Create the new object corresponding to [state] using the rules
-   * from [reader]. This may involve recursively inflating "essential"
-   * references in the state, which are those that are required for the
-   * object's constructor. It is up to the rule what state is considered
-   * essential.
-   */
-  inflateEssential(state, Reader reader);
-
-  /**
-   * The [object] has already been created. Set any of its non-essential
-   * variables from the representation in [state]. Where there are references
-   * to other objects they are resolved in the context of [reader].
-   */
-  void inflateNonEssential(state, object, Reader reader);
-
-  /**
-   * If we have [object] as part of our state, should we represent that
-   * directly, or should we make a reference for it. By default, true.
-   * This may also delegate to [writer].
-   */
-  bool shouldUseReferenceFor(object, Writer writer) => true;
-
-  /**
-   * Return true if the data this rule returns is variable length, so a
-   * length needs to be written for it if the format requires that. Return
-   * false if the results are always the same length.
-   */
-  bool get hasVariableLengthEntries => true;
-
-  /**
-   * If the data is fixed length, return it here. The format may or may not
-   * make use of this, depending on whether it already has enough information
-   * to determine the length on its own. If [hasVariableLengthEntries] is true
-   * this is ignored.
-   */
-  int get dataLength => 0;
-}
-
-/**
- * This rule handles things that implement List. It will recreate them as
- * whatever the default implemenation of List is on the target platform.
- */
-class ListRule extends SerializationRule {
-
-  bool appliesTo(object, Writer w) => object is List;
-
-  bool get storesStateAsLists => true;
-
-  List extractState(List list, f, Writer w) {
-    var result = new List();
-    for (var each in list) {
-      result.add(each);
-      f(each);
-    }
-    return result;
-  }
-
-  inflateEssential(List state, Reader r) => new List();
-
-  // For a list, we consider all of its state non-essential and add it
-  // after creation.
-  void inflateNonEssential(List state, List newList, Reader r) {
-    populateContents(state, newList, r);
-  }
-
-  void populateContents(List state, List newList, Reader r) {
-    for(var each in state) {
-      newList.add(r.inflateReference(each));
-    }
-  }
-
-  bool get hasVariableLengthEntries => true;
-}
-
-/**
- * This is a subclass of ListRule where all of the list's contents are
- * considered essential state. This is needed if an object X contains a List L,
- * but it expects L's contents to be fixed when X's constructor is called.
- */
-class ListRuleEssential extends ListRule {
-
-  /** Create the new List and also inflate all of its contents. */
-  inflateEssential(List state, Reader r) {
-    var object = super.inflateEssential(state, r);
-    populateContents(state, object, r);
-    return object;
-  }
-
-  /** Does nothing, because all the work has been done in inflateEssential. */
-  void inflateNonEssential(state, newList, reader) {}
-
-  bool get mustBePrimary => true;
-}
-
-/**
- * This rule handles things that implement Map. It will recreate them as
- * whatever the default implemenation of Map is on the target platform. If a
- * map has string keys it will attempt to retain it as a map for JSON formats,
- * otherwise it will store it as a list of references to keys and values.
- */
-class MapRule extends SerializationRule {
-
-  bool appliesTo(object, Writer w) => object is Map;
-
-  bool get storesStateAsMaps => true;
-
-  extractState(Map map, f, Writer w) {
-    // Note that we make a copy here because flattening may be destructive.
-    var newMap = new Map.from(map);
-    newMap.forEach((key, value) {
-      f(key);
-      f(value);
-    });
-    return newMap;
-  }
-
-  /**
-   * Change the keys and values of [state] into references in [writer].
-   * If [state] is a map whose keys are all strings then we leave the keys
-   * as is so that JSON formats will be more readable. If the keys are
-   * arbitrary then we need to turn them into references and replace the
-   * state with a new Map whose keys are the references.
-   */
-  flatten(Map state, Writer writer) {
-    bool keysAreAllStrings = state.keys.every((x) => x is String);
-    if (keysAreAllStrings && !writer.shouldUseReferencesForPrimitives) {
-      keysAndValues(state).forEach(
-          (key, value) => state[key] = writer._referenceFor(value));
-      return state;
-    } else {
-      var newState = [];
-      keysAndValues(state).forEach((key, value) {
-        newState.add(writer._referenceFor(key));
-        newState.add(writer._referenceFor(value));
-      });
-      return newState;
-    }
-  }
-
-  inflateEssential(state, Reader r) => new Map();
-
-  // For a map, we consider all of its state non-essential and add it
-  // after creation.
-  void inflateNonEssential(state, Map newMap, Reader r) {
-    if (state is List) {
-      inflateNonEssentialFromList(state, newMap, r);
-    } else {
-      inflateNonEssentialFromMap(state, newMap, r);
-    }
-  }
-
-  void inflateNonEssentialFromList(List state, Map newMap, Reader r) {
-    var key;
-    for (var each in state) {
-      if (key == null) {
-        key = each;
-      } else {
-        newMap[r.inflateReference(key)] = r.inflateReference(each);
-        key = null;
-      }
-    }
-  }
-
-  void inflateNonEssentialFromMap(Map state, Map newMap, Reader r) {
-    state.forEach((key, value) {
-      newMap[r.inflateReference(key)] = r.inflateReference(value);
-    });
-  }
-
-  bool get hasVariableLengthEntries => true;
-}
-
-/**
- * This rule handles primitive types, defined as those that we can normally
- * represent directly in the output format. We hard-code that to mean
- * num, String, and bool.
- */
-class PrimitiveRule extends SerializationRule {
-  bool appliesTo(object, Writer w) => isPrimitive(object);
-  extractState(object, Function f, Writer w) => object;
-  flatten(object, Writer writer) {}
-  inflateEssential(state, Reader r) => state;
-  void inflateNonEssential(object, _, Reader r) {}
-
-  bool get storesStateAsPrimitives => true;
-
-  /**
-   * Indicate whether we should save pointers to this object as references
-   * or store the object directly. For primitives this depends on the format,
-   * so we delegate to the writer.
-   */
-  bool shouldUseReferenceFor(object, Writer w) =>
-      w.shouldUseReferencesForPrimitives;
-
-  bool get hasVariableLengthEntries => false;
-}
-
-/** Typedef for the object construction closure used in ClosureRule. */
-typedef ConstructType(Map m);
-
-/** Typedef for the state-getting closure used in ClosureToMapRule. */
-typedef Map<String, dynamic> GetStateType(object);
-
-/** Typedef for the state-setting closure used in ClosureToMapRule. */
-typedef void NonEssentialStateType(object, Map m);
-
-/**
- * This is a rule where the extraction and creation are hard-coded as
- * closures. The result is expected to be a map indexed by field name.
- */
-class ClosureRule extends CustomRule {
-
-  /** The runtimeType of objects that this rule applies to. Used in appliesTo.*/
-  final Type type;
-
-  /** The function for constructing new objects when reading. */
-  final ConstructType construct;
-
-  /** The function for returning an object's state as a Map. */
-  final GetStateType getStateFunction;
-
-  /** The function for setting an object's state from a Map. */
-  final NonEssentialStateType setNonEssentialState;
-
-  /**
-   * Create a ClosureToMapRule for the given [type] which gets an object's
-   * state by calling [getState], creates a new object by calling [construct]
-   * and sets the new object's state by calling [setNonEssentialState].
-   */
-  ClosureRule(this.type, this.getStateFunction, this.construct,
-      this.setNonEssentialState);
-
-  bool appliesTo(object, Writer w) => object.runtimeType == type;
-
-  getState(object) => getStateFunction(object);
-
-  create(state) => construct(state);
-
-  void setState(object, state) {
-    if (setNonEssentialState == null) return;
-    setNonEssentialState(object, state);
-  }
-}
-
-/**
- * This rule handles things we can't pass directly, but only by reference.
- * If objects are listed in the namedObjects in the writer or serialization,
- * it will save the name rather than saving the state.
- */
-class NamedObjectRule extends SerializationRule {
-  /**
-   * Return true if this rule applies to the object. Checked by looking up
-   * in the namedObjects collection.
-   */
-  bool appliesTo(object, Writer writer) {
-    return writer.hasNameFor(object);
-  }
-
-  /** Extract the state of the named objects as just the object itself. */
-  extractState(object, Function f, Writer writer) {
-    var result = [nameFor(object, writer)];
-    f(result.first);
-    return result;
-  }
-
-  /** When we flatten the state we save it as the name. */
-  // TODO(alanknight): This seems questionable. In a truly flat format we may
-  // want to have extracted the name as a string first and flatten it into a
-  // reference to that. But that requires adding the Writer as a parameter to
-  // extractState, and I'm reluctant to add yet another parameter until
-  // proven necessary.
-  flatten(state, Writer writer) {
-    state[0] = writer._referenceFor(state[0]);
-  }
-
-  /** Look up the named object and return it. */
-  inflateEssential(state, Reader r) =>
-      r.objectNamed(r.resolveReference(state.first));
-
-  /** Set any non-essential state on the object. For this rule, a no-op. */
-  void inflateNonEssential(state, object, Reader r) {}
-
-  /** Return the name for this object in the Writer. */
-  String nameFor(object, Writer writer) => writer.nameFor(object);
-}
-
-/**
- * This rule handles the special case of Mirrors. It stores the mirror by its
- * qualifiedName and attempts to look it up in both the namedObjects
- * collection, or if it's not found there, by looking it up in the mirror
- * system. When reading, the user is responsible for supplying the appropriate
- * values in [Serialization.namedObjects] or in the [externals] paramter to
- * [Serialization.read].
- */
-class MirrorRule extends NamedObjectRule {
-  bool appliesTo(object, Writer writer) => object is DeclarationMirror;
-
-  String nameFor(DeclarationMirror object, Writer writer) =>
-      MirrorSystem.getName(object.qualifiedName);
-
-  inflateEssential(state, Reader r) {
-    var qualifiedName = r.resolveReference(state.first);
-    var lookupFull = r.objectNamed(qualifiedName, (x) => null);
-    if (lookupFull != null) return lookupFull;
-    var separatorIndex = qualifiedName.lastIndexOf(".");
-    var type = qualifiedName.substring(separatorIndex + 1);
-    var lookup = r.objectNamed(type, (x) => null);
-    if (lookup != null) return lookup;
-    var name = qualifiedName.substring(0, separatorIndex);
-    // This is very ugly. The library name for an unnamed library is its URI.
-    // That can't be constructed as a Symbol, so we can't use findLibrary.
-    // So follow one or the other path depending if it has a colon, which we
-    // assume is in any URI and can't be in a Symbol.
-    if (name.contains(":")) {
-      var uri = Uri.parse(name);
-      var libMirror = currentMirrorSystem().libraries[uri];
-      var candidate = libMirror.declarations[new Symbol(type)];
-      return candidate is ClassMirror ? candidate : null;
-    } else {
-      var symbol = new Symbol(name);
-      var typeSymbol = new Symbol(type);
-      for (var libMirror in currentMirrorSystem().libraries.values) {
-        if (libMirror.simpleName != symbol) continue;
-        var candidate = libMirror.declarations[typeSymbol];
-        if (candidate != null && candidate is ClassMirror) return candidate;
-      }
-      return null;
-    }
-  }
-}
-
-/**
- * This provides an abstract superclass for writing your own rules specific to
- * a class. It makes some assumptions about behaviour, and so can have a
- * simpler set of methods that need to be implemented in order to subclass it.
- *
- */
-abstract class CustomRule extends SerializationRule {
-  // TODO(alanknight): It would be nice if we could provide an implementation
-  // of appliesTo() here. If we add a type parameter to these classes
-  // we can "is" test against it, but we need to be able to rule out subclasses.
-  // => instance.runtimeType == T
-  // should work.
-  /**
-   * Return true if this rule applies to this object, in the context
-   * where we're writing it, false otherwise.
-   */
-  bool appliesTo(instance, Writer w);
-
-  /**
-   * Subclasses should implement this to return a list of the important fields
-   * in the object. The order of the fields doesn't matter, except that the
-   * create and setState methods need to know how to use it.
-   */
-  List getState(instance);
-
-  /**
-   * Given a [List] of the object's [state], re-create the object. This should
-   * do the minimum needed to create the object, just calling the constructor.
-   * Setting the remaining state of the object should be done in the [setState]
-   * method, which will be called only once all the objects are created, so
-   * it won't cause problems with cycles.
-   */
-  create(List state);
-
-  /**
-   * Set any state in [object] which wasn't set in the constructor. Between
-   * this method and [create] all of the information in [state] should be set
-   * in the new object.
-   */
-  void setState(object, List state);
-
-  extractState(instance, Function f, Writer w) {
-    var state = getState(instance);
-    for (var each in values(state)) {
-      f(each);
-    }
-    return state;
-  }
-
-  inflateEssential(state, Reader r) => create(_lazy(state, r));
-
-  void inflateNonEssential(state, object, Reader r) {
-    setState(object, _lazy(state, r));
-  }
-
-  // We don't want to have to make the end user tell us how long the list is
-  // separately, so write it out for each object, even though they're all
-  // expected to be the same length.
-  bool get hasVariableLengthEntries => true;
-}
-
-/** A hard-coded rule for serializing Symbols. */
-class SymbolRule extends CustomRule {
-  bool appliesTo(instance, _) => instance is Symbol;
-  getState(instance) => [MirrorSystem.getName(instance)];
-  create(state) => new Symbol(state[0]);
-  void setState(symbol, state) {}
-  int get dataLength => 1;
-  bool get hasVariableLengthEntries => false;
-}
-
-/** A hard-coded rule for DateTime. */
-class DateTimeRule extends CustomRule {
-  bool appliesTo(instance, _) => instance is DateTime;
-  List getState(DateTime date) => [date.millisecondsSinceEpoch, date.isUtc];
-  DateTime create(List state) =>
-      new DateTime.fromMillisecondsSinceEpoch(state[0], isUtc: state[1]);
-  void setState(date, state) {}
-  // Let the system know we don't have to store a length for these.
-  int get dataLength => 2;
-  bool get hasVariableLengthEntries => false;
-}
-
-/** Create a lazy list/map that will inflate its items on demand in [r]. */
-_lazy(l, Reader r) {
-  if (l is List) return new _LazyList(l, r);
-  if (l is Map) return new _LazyMap(l, r);
-  throw new SerializationException("Invalid type: must be Map or List - $l");
-}
-
-/**
- * This provides an implementation of Map that wraps a list which may
- * contain references to (potentially) non-inflated objects. If these
- * are accessed it will inflate them. This allows us to pass something that
- * looks like it's just a list of objects to a [CustomRule] without needing
- * to inflate all the references in advance.
- */
-class _LazyMap implements Map {
-  _LazyMap(this._raw, this._reader);
-
-  final Map _raw;
-  final Reader _reader;
-
-  // This is the only operation that really matters.
-  operator [](x) => _reader.inflateReference(_raw[x]);
-
-  int get length => _raw.length;
-  bool get isEmpty => _raw.isEmpty;
-  bool get isNotEmpty => _raw.isNotEmpty;
-  Iterable get keys => _raw.keys;
-  bool containsKey(x) => _raw.containsKey(x);
-
-  // These operations will work, but may be expensive, and are probably
-  // best avoided.
-  get _inflated => mapValues(_raw, _reader.inflateReference);
-  bool containsValue(x) => _inflated.containsValue(x);
-  Iterable get values => _inflated.values;
-  void forEach(f) => _inflated.forEach(f);
-
-  // These operations are all invalid
-  _throw() {
-    throw new UnsupportedError("Not modifiable");
-  }
-  operator []=(x, y) => _throw();
-  putIfAbsent(x, y) => _throw();
-  bool remove(x) => _throw();
-  void clear() => _throw();
-  void addAll(Map other) => _throw();
-}
-
-/**
- * This provides an implementation of List that wraps a list which may
- * contain references to (potentially) non-inflated objects. If these
- * are accessed it will inflate them. This allows us to pass something that
- * looks like it's just a list of objects to a [CustomRule] without needing
- * to inflate all the references in advance.
- */
-class _LazyList extends ListBase {
-  _LazyList(this._raw, this._reader);
-
-  final List _raw;
-  final Reader _reader;
-
-  operator [](int x) => _reader.inflateReference(_raw[x]);
-  int get length => _raw.length;
-
-  void set length(int value) => _throw();
-
-  void operator []=(int index, value) => _throw();
-
-  void _throw() {
-    throw new UnsupportedError("Not modifiable");
-  }
-}
diff --git a/pkg/serialization/pubspec.yaml b/pkg/serialization/pubspec.yaml
deleted file mode 100644
index 3e11f26..0000000
--- a/pkg/serialization/pubspec.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-name: serialization
-version: 0.9.1+1
-author: Dart Team <misc@dartlang.org>
-description: Provide a serialization facility for Dart objects.
-homepage: https://pub.dartlang.org/packages/serialization
-environment:
-  sdk: '>=1.0.0 <2.0.0'
-dev_dependencies:
-  unittest: '>=0.9.0 <0.12.0'
diff --git a/pkg/serialization/test/no_library_test.dart b/pkg/serialization/test/no_library_test.dart
deleted file mode 100644
index 33eeda1..0000000
--- a/pkg/serialization/test/no_library_test.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:serialization/serialization.dart';
-import 'package:unittest/unittest.dart';
-
-class Thing {
-  var name;
-}
-
-void main() {
-
-  test("Serializing something without a library directive", () {
-    var thing = new Thing()..name = 'testThing';
-    var s = new Serialization()
-      ..addRuleFor(Thing);
-    var serialized = s.write(thing);
-    var newThing = s.read(serialized);
-    expect(thing.name, newThing.name);
-  });
-}
\ No newline at end of file
diff --git a/pkg/serialization/test/serialization_test.dart b/pkg/serialization/test/serialization_test.dart
deleted file mode 100644
index 99b96c4..0000000
--- a/pkg/serialization/test/serialization_test.dart
+++ /dev/null
@@ -1,816 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library serialization_test;
-
-import 'dart:convert';
-import 'package:unittest/unittest.dart';
-import 'package:serialization/serialization.dart';
-import 'package:serialization/src/serialization_helpers.dart';
-import 'package:serialization/src/mirrors_helpers.dart';
-import 'dart:isolate';
-
-part 'test_models.dart';
-
-void main() {
-  var p1 = new Person();
-  var a1 = new Address();
-  a1.street = 'N 34th';
-  a1.city = 'Seattle';
-
-  var formats = [const InternalMapFormat(),
-                 const SimpleFlatFormat(), const SimpleMapFormat(),
-                 const SimpleJsonFormat(storeRoundTripInfo: true)];
-
-  test('Basic extraction of a simple object', () {
-    // TODO(alanknight): Switch these to use literal types. Issue
-    var s = new Serialization()
-        ..addRuleFor(Address).configureForMaps();
-    Map extracted = states(a1, s).first;
-    expect(extracted.length, 4);
-    expect(extracted['street'], 'N 34th');
-    expect(extracted['city'], 'Seattle');
-    expect(extracted['state'], null);
-    expect(extracted['zip'], null);
-    Reader reader = setUpReader(s, extracted);
-    Address a2 = readBackSimple(s, a1, reader);
-    expect(a2.street, 'N 34th');
-    expect(a2.city, 'Seattle');
-    expect(a2.state,null);
-    expect(a2.zip, null);
-  });
-
-  test('Slightly further with a simple object', () {
-    var p1 = new Person()..name = 'Alice'..address = a1;
-    var s = new Serialization()
-        ..addRuleFor(Person).configureForMaps()
-        ..addRuleFor(Address).configureForMaps();
-    // TODO(alanknight): Need a better API for getting to flat state without
-    // actually writing.
-    var w = new Writer(s, const InternalMapFormat());
-    w.write(p1);
-    var personRule = s.rules.firstWhere(
-        (x) => x is BasicRule && x.type == reflect(p1).type);
-    var flatPerson = w.states[personRule.number].first;
-    var primStates = w.states.first;
-    expect(primStates.isEmpty, true);
-    expect(flatPerson["name"], "Alice");
-    var ref = flatPerson["address"];
-    expect(ref is Reference, true);
-    var addressRule = s.rules.firstWhere(
-        (x) => x is BasicRule && x.type == reflect(a1).type);
-    expect(ref.ruleNumber, addressRule.number);
-    expect(ref.objectNumber, 0);
-    expect(w.states[addressRule.number].first['street'], 'N 34th');
-  });
-
-  test('exclude fields', () {
-    var s = new Serialization()
-        ..addRuleFor(Address,
-            excludeFields: ['state', 'zip']).configureForMaps();
-    var extracted = states(a1, s).first;
-    expect(extracted.length, 2);
-    expect(extracted['street'], 'N 34th');
-    expect(extracted['city'], 'Seattle');
-    Reader reader = setUpReader(s, extracted);
-    Address a2 = readBackSimple(s, a1, reader);
-    expect(a2.state, null);
-    expect(a2.city, 'Seattle');
-  });
-
-  test('list', () {
-    var list = [5, 4, 3, 2, 1];
-    var s = new Serialization();
-    var extracted = states(list, s).first;
-    expect(extracted.length, 5);
-    for (var i = 0; i < 5; i++) {
-      expect(extracted[i], (5 - i));
-    }
-    Reader reader = setUpReader(s, extracted);
-    var list2 = readBackSimple(s, list, reader);
-    expect(list, list2);
-  });
-
-  test('different kinds of fields', () {
-    var x = new Various.Foo("d", "e");
-    x.a = "a";
-    x.b = "b";
-    x._c = "c";
-    var s = new Serialization()
-      ..addRuleFor(Various,
-          constructor: "Foo",
-          constructorFields: ["d", "e"]);
-    var state = states(x, s).first;
-    expect(state.length, 4);
-    var expected = "abde";
-    for (var i in [0,1,2,3]) {
-      expect(state[i], expected[i]);
-    }
-    Reader reader = setUpReader(s, state);
-    Various y = readBackSimple(s, x, reader);
-    expect(x.a, y.a);
-    expect(x.b, y.b);
-    expect(x.d, y.d);
-    expect(x.e, y.e);
-    expect(y._c, 'default value');
-  });
-
-  test('Stream', () {
-    // This is an interesting case. The Stream doesn't expose its internal
-    // collection at all, and sets it in the constructor. So to get it we
-    // read a private field and then set that via the constructor. That works
-    // but should we have some kind of large red flag that you're using private
-    // state.
-    var stream = new Stream([3,4,5]);
-    expect((stream..next()).next(), 4);
-    expect(stream.position, 2);
-    // The Symbol class does not allow us to create symbols for private
-    // variables. However, the mirror system uses them. So we get the symbol
-    // we want from the mirror.
-    // TODO(alanknight): Either delete this test and decide we shouldn't
-    // attempt to access private variables or fix this properly.
-    var _collectionSym = reflect(stream).type.declarations.keys.firstWhere(
-        (x) => MirrorSystem.getName(x) == "_collection");
-    var s = new Serialization()
-      ..addRuleFor(Stream,
-          constructorFields: [_collectionSym]);
-    var state = states(stream, s).first;
-    // Define names for the variable offsets to make this more readable.
-    var _collection = 0, position = 1;
-    expect(state[_collection],[3,4,5]);
-    expect(state[position], 2);
-  });
-
-  test('date', () {
-    var date = new DateTime.now();
-    var utcDate = new DateTime.utc(date.year, date.month, date.day,
-        date.hour, date.minute, date.second, date.millisecond);
-    var s = new Serialization();
-    var out = s.write([date, utcDate]);
-    expect(s.selfDescribing, isTrue);
-    var input = s.read(out);
-    expect(input.first, date);
-    expect(input.last, utcDate);
-  });
-
-  test('Iteration helpers', () {
-    var map = {"a" : 1, "b" : 2, "c" : 3};
-    var list = [1, 2, 3];
-    var set = new Set.from(list);
-    var m = keysAndValues(map);
-    var l = keysAndValues(list);
-    var s = keysAndValues(set);
-
-    m.forEach((key, value) {expect(key.codeUnits[0], value + 96);});
-    l.forEach((key, value) {expect(key + 1, value);});
-    var index = 0;
-    var seen = new Set();
-    s.forEach((key, value) {
-      expect(key, index++);
-      expect(seen.contains(value), isFalse);
-      seen.add(value);
-    });
-    expect(seen.length, 3);
-
-    var i = 0;
-    m = values(map);
-    l = values(list);
-    s = values(set);
-    m.forEach((each) {expect(each, ++i);});
-    i = 0;
-    l.forEach((each) {expect(each, ++i);});
-    i = 0;
-    s.forEach((each) {expect(each, ++i);});
-    i = 0;
-
-    seen = new Set();
-    for (var each in m) {
-      expect(seen.contains(each), isFalse);
-      seen.add(each);
-    }
-    expect(seen.length, 3);
-    i = 0;
-    for (var each in l) {
-      expect(each, ++i);
-    }
-  });
-
-  Node n1 = new Node("1"), n2 = new Node("2"), n3 = new Node("3");
-  n1.children = [n2, n3];
-  n2.parent = n1;
-  n3.parent = n1;
-
-  test('Trace a cyclical structure', () {
-    var s = new Serialization();
-    var trace = new Trace(new Writer(s));
-    trace.writer.trace = trace;
-    trace.trace(n1);
-    var all = trace.writer.references.keys.toSet();
-    expect(all.length, 4);
-    expect(all.contains(n1), isTrue);
-    expect(all.contains(n2), isTrue);
-    expect(all.contains(n3), isTrue);
-    expect(all.contains(n1.children), isTrue);
-  });
-
-  test('Flatten references in a cyclical structure', () {
-    var s = new Serialization();
-    var w = new Writer(s, const InternalMapFormat());
-    w.trace = new Trace(w);
-    w.write(n1);
-    expect(w.states.length, 7); // prims, lists * 2, basic, symbol, date
-    var children = 0, name = 1, parent = 2;
-    var nodeRule = s.rules.firstWhere((x) => x is BasicRule);
-    List rootNode = w.states[nodeRule.number].where(
-        (x) => x[name] == "1").toList();
-    rootNode = rootNode.first;
-    expect(rootNode[parent], isNull);
-    var list = w.states[1].first;
-    expect(w.stateForReference(rootNode[children]), list);
-    var parentNode = w.stateForReference(list[0])[parent];
-    expect(w.stateForReference(parentNode), rootNode);
-  });
-
-  test('round-trip', () {
-    runRoundTripTest(nodeSerializerReflective);
-  });
-
-  test('round-trip with explicit self-description', () {
-    // We provide a setup function which, when run the second time,
-    // returns a blank serialization, to make sure it will fail
-    // the second time.
-    var s;
-    oneShotSetup(node) {
-      if (s == null) {
-        s = nodeSerializerReflective(node)..selfDescribing = true;
-        return s;
-      } else {
-        s = null;
-        return new Serialization.blank()
-            ..namedObjects['Node'] = reflect(new Node('')).type;
-      }
-    }
-
-    runRoundTripTest(oneShotSetup);
-  });
-
-  test('round-trip ClosureRule', () {
-    runRoundTripTest(nodeSerializerNonReflective);
-  });
-
-  test('round-trip with essential parent', () {
-    runRoundTripTest(nodeSerializerWithEssentialParent);
-  });
-
-  test('round-trip, flat format', () {
-    runRoundTripTestFlat(nodeSerializerReflective);
-  });
-
-  test('round-trip using Maps', () {
-    runRoundTripTest(nodeSerializerUsingMaps);
-  });
-
-  test('round-trip, flat format, using maps', () {
-    runRoundTripTestFlat(nodeSerializerUsingMaps);
-  });
-
-  test('round-trip with Node CustomRule', () {
-    runRoundTripTestFlat(nodeSerializerCustom);
-  });
-
-  test('round-trip with Node CustomRule, to maps', () {
-    runRoundTripTest(nodeSerializerCustom);
-  });
-
-  test('eating your own tail', () {
-    // Create a meta-serializer, that serializes serializations, then
-    // use it to serialize a basic serialization, then run a test on the
-    // the result.
-    var s = new Serialization.blank()
-      // Add the rules in a deliberately unusual order.
-      ..addRuleFor(Node, constructorFields: ['name'])
-      ..addRule(new ListRule())
-      ..addRule(new PrimitiveRule())
-      ..selfDescribing = false;
-    var meta = metaSerialization();
-    var metaWithMaps = metaSerializationUsingMaps();
-    for (var eachFormat in formats) {
-      for (var eachMeta in [meta, metaWithMaps]) {
-        var serialized = eachMeta.write(s, format: eachFormat);
-        var newSerialization = eachMeta.read(serialized, format: eachFormat,
-            externals: {"serialization_test.Node" : reflect(new Node('')).type}
-        );
-        runRoundTripTest((x) => newSerialization);
-      }
-    }
-  });
-
-  test("Verify we're not serializing lists twice if they're essential", () {
-    Node n1 = new Node("1"), n2 = new Node("2"), n3 = new Node("3");
-    n1.children = [n2, n3];
-    n2.parent = n1;
-    n3.parent = n1;
-    var s = new Serialization()
-      ..addRuleFor(Node, constructorFields: ["name"]).
-          setFieldWith("children", (parent, child) =>
-              parent.reflectee.children = child);
-    var w = new Writer(s);
-    w.write(n1);
-    expect(w.rules[2] is ListRuleEssential, isTrue);
-    expect(w.rules[1] is ListRule, isTrue);
-    expect(w.states[1].length, 0);
-    expect(w.states[2].length, 1);
-    s = new Serialization()
-      ..addRuleFor(Node, constructorFields: ["name"]);
-    w = new Writer(s);
-    w.write(n1);
-    expect(w.states[1].length, 1);
-    expect(w.states[2].length, 0);
-  });
-
-  test('Identity of equal objects preserved', () {
-    Node n1 = new NodeEqualByName("foo"),
-         n2 = new NodeEqualByName("foo"),
-         n3 = new NodeEqualByName("3");
-    n1.children = [n2, n3];
-    n2.parent = n1;
-    n3.parent = n1;
-    var s = new Serialization()
-      ..selfDescribing = false
-      ..addRuleFor(NodeEqualByName, constructorFields: ["name"]);
-    var m1 = writeAndReadBack(s, null, n1);
-    var m2 = m1.children.first;
-    var m3 = m1.children.last;
-    expect(m1, m2);
-    expect(identical(m1, m2), isFalse);
-    expect(m1 == m3, isFalse);
-    expect(identical(m2.parent, m3.parent), isTrue);
-  });
-
-  test("Constant values as fields", () {
-    var s = new Serialization()
-      ..selfDescribing = false
-      ..addRuleFor(Address,
-          constructor: 'withData',
-          constructorFields: ["street", "Kirkland", "WA", "98103"],
-          fields: []);
-    var out = s.write(a1);
-    var newAddress = s.read(out);
-    expect(newAddress.street, a1.street);
-    expect(newAddress.city, "Kirkland");
-    expect(newAddress.state, "WA");
-    expect(newAddress.zip, "98103");
-  });
-
-  test("Straight JSON format", () {
-    var s = new Serialization();
-    var writer = s.newWriter(const SimpleJsonFormat());
-    var out = JSON.encode(writer.write(a1));
-    var reconstituted = JSON.decode(out);
-    expect(reconstituted.length, 4);
-    expect(reconstituted[0], "Seattle");
-  });
-
-  test("Straight JSON format, nested objects", () {
-    var p1 = new Person()..name = 'Alice'..address = a1;
-    var s = new Serialization()..selfDescribing = false;
-    var addressRule = s.addRuleFor(Address)..configureForMaps();
-    var personRule = s.addRuleFor(Person)..configureForMaps();
-    var writer = s.newWriter(const SimpleJsonFormat(storeRoundTripInfo: true));
-    var out = JSON.encode(writer.write(p1));
-    var reconstituted = JSON.decode(out);
-    var expected = {
-      "name" : "Alice",
-      "rank" : null,
-      "serialNumber" : null,
-      "_rule" : personRule.number,
-      "address" : {
-        "street" : "N 34th",
-        "city" : "Seattle",
-        "state" : null,
-        "zip" : null,
-        "_rule" : addressRule.number
-      }
-    };
-    expect(expected, reconstituted);
-  });
-
-  test("Straight JSON format, round-trip", () {
-    // Note that we can't use the usual round-trip test because it has cycles.
-    var p1 = new Person()..name = 'Alice'..address = a1;
-    // Use maps for one rule, lists for the other.
-    var s = new Serialization()
-      ..addRuleFor(Address)
-      ..addRuleFor(Person).configureForMaps();
-    var p2 = writeAndReadBack(s,
-        const SimpleJsonFormat(storeRoundTripInfo: true), p1);
-    expect(p2.name, "Alice");
-    var a2 = p2.address;
-    expect(a2.street, "N 34th");
-    expect(a2.city, "Seattle");
-  });
-
-  test("Straight JSON format, non-string key", () {
-    // This tests what happens if we have a key that's not a string. That's
-    // not allowed by json, so we don't actually turn it into a json string,
-    // but someone might reasonably convert to a json-able structure without
-    // going through the string representation.
-    var p1 = new Person()..name = 'Alice'..address = a1;
-    var s = new Serialization()
-        ..addRule(new PersonRuleReturningMapWithNonStringKey());
-    var p2 = writeAndReadBack(s,
-        const SimpleJsonFormat(storeRoundTripInfo: true), p1);
-    expect(p2.name, "Alice");
-    expect(p2.address.street, "N 34th");
-  });
-
-  test("Root is a Map", () {
-    // Note that we can't use the usual round-trip test because it has cycles.
-    var p1 = new Person()..name = 'Alice'..address = a1;
-    // Use maps for one rule, lists for the other.
-    var s = new Serialization()
-      // Deliberately left as passing instances to test backward-compatibility.
-      ..addRuleFor(a1)
-      ..addRuleFor(p1).configureForMaps();
-    for (var eachFormat in formats) {
-      var w = s.newWriter(eachFormat);
-      var output = w.write({"stuff" : p1});
-      var result = s.read(output, format: w.format);
-      var p2 = result["stuff"];
-      expect(p2.name, "Alice");
-      var a2 = p2.address;
-      expect(a2.street, "N 34th");
-      expect(a2.city, "Seattle");
-    }
-  });
-
-  test("Root is a List", () {
-    var s = new Serialization();
-    for (var eachFormat in formats) {
-      var result = writeAndReadBack(s, eachFormat, [a1]);
-    var a2 = result.first;
-    expect(a2.street, "N 34th");
-    expect(a2.city, "Seattle");
-    }
-  });
-
-  test("Root is a simple object", () {
-    var s = new Serialization();
-    for (var eachFormat in formats) {
-      expect(writeAndReadBack(s, eachFormat, null), null);
-      expect(writeAndReadBack(s, eachFormat, [null]), [null]);
-      expect(writeAndReadBack(s, eachFormat, 3), 3);
-      expect(writeAndReadBack(s, eachFormat, [3]), [3]);
-      expect(writeAndReadBack(s, eachFormat, "hello"), "hello");
-      expect(writeAndReadBack(s, eachFormat, [3]), [3]);
-      expect(writeAndReadBack(s, eachFormat, {"hello" : "world"}),
-          {"hello" : "world"});
-      expect(writeAndReadBack(s, eachFormat, true), true);
-    }
-  });
-
-  test("Simple JSON format, round-trip with named objects", () {
-    // Note that we can't use the usual round-trip test because it has cycles.
-    var p1 = new Person()..name = 'Alice'..address = a1;
-    // Use maps for one rule, lists for the other.
-    var s = new Serialization()
-      ..selfDescribing = false
-      ..addRule(new NamedObjectRule())
-      ..addRuleFor(Address)
-      ..addRuleFor(Person).configureForMaps()
-      ..namedObjects["foo"] = a1;
-    var format = const SimpleJsonFormat(storeRoundTripInfo: true);
-    var out = s.write(p1, format: format);
-    var p2 = s.read(out, format: format, externals: {"foo" : 12});
-    expect(p2.name, "Alice");
-    var a2 = p2.address;
-    expect(a2, 12);
-  });
-
-  test("More complicated Maps", () {
-    var s = new Serialization()..selfDescribing = false;
-    var p1 = new Person()..name = 'Alice'..address = a1;
-    var data = new Map();
-    data["simple data"] = 1;
-    data[p1] = a1;
-    data[a1] = p1;
-    for (var eachFormat in formats) {
-      var output = s.write(data, format: eachFormat);
-      var input = s.read(output, format: eachFormat);
-      expect(input["simple data"], data["simple data"]);
-      var p2 = input.keys.firstWhere((x) => x is Person);
-      var a2 = input.keys.firstWhere((x) => x is Address);
-      if (eachFormat is SimpleJsonFormat) {
-        // JSON doesn't handle cycles, so these won't be identical.
-        expect(input[p2] is Address, isTrue);
-        expect(input[a2] is Person, isTrue);
-        var a3 = input[p2];
-        expect(a3.city, a2.city);
-        expect(a3.state, a2.state);
-        expect(a3.state, a2.state);
-        var p3 = input[a2];
-        expect(p3.name, p2.name);
-        expect(p3.rank, p2.rank);
-        expect(p3.address.city, a2.city);
-      } else {
-        expect(input[p2], same(a2));
-        expect(input[a2], same(p2));
-      }
-    }
-  });
-
-  test("Map with string keys stays that way", () {
-    var s = new Serialization()..addRuleFor(Person);
-    var data = {"abc" : 1, "def" : "ghi"};
-    data["person"] = new Person()..name = "Foo";
-    var output = s.write(data, format: const InternalMapFormat());
-    var mapRule = s.rules.firstWhere((x) => x is MapRule);
-    var map = output["data"][mapRule.number][0];
-    expect(map is Map, isTrue);
-    expect(map["abc"], 1);
-    expect(map["def"], "ghi");
-    expect(map["person"] is Reference, isTrue);
-  });
-
-  test("MirrorRule with lookup by qualified name rather than named object", () {
-    var s = new Serialization()..addRule(new MirrorRule());
-    var m = reflectClass(Address);
-    var output = s.write(m);
-    var input = s.read(output);
-    expect(input is ClassMirror, isTrue);
-    expect(MirrorSystem.getName(input.simpleName), "Address");
-  });
-
-  test('round-trip, default format, pass to isolate', () {
-      Node n1 = new Node("1"), n2 = new Node("2"), n3 = new Node("3");
-      n1.children = [n2, n3];
-      n2.parent = n1;
-      n3.parent = n1;
-      var s = nodeSerializerReflective(n1);
-      var output = s.write(n2);
-      ReceivePort port = new ReceivePort();
-      var remote = Isolate.spawn(echo, [output, port.sendPort]);
-      port.first.then(verify);
-  });
-}
-
-/**
- * Verify serialized output that we have passed to an isolate and back.
- */
-void verify(input) {
-  var s2 = nodeSerializerReflective(new Node("a"));
-  var m2 = s2.read(input);
-  var m1 = m2.parent;
-  expect(m1 is Node, isTrue);
-  var children = m1.children;
-  expect(m1.name,"1");
-  var m3 = m1.children.last;
-  expect(m2.name, "2");
-  expect(m3.name, "3");
-  expect(m2.parent, m1);
-  expect(m3.parent, m1);
-  expect(m1.parent, isNull);
-}
-
-/******************************************************************************
- * The end of the tests and the beginning of various helper functions to make
- * it easier to write the repetitive sections.
- ******************************************************************************/
-
-writeAndReadBack(Serialization s, Format format, object) {
-  var output = s.write(object, format: format);
-  return s.read(output, format: format);
-}
-
-/** Create a Serialization for serializing Serializations. */
-Serialization metaSerialization() {
-  // Make some bogus rule instances so we have something to feed rule creation
-  // and get their types. If only we had class literals implemented...
-  var basicRule = new BasicRule(reflect(null).type, '', [], [], []);
-
-  var meta = new Serialization()
-    ..selfDescribing = false
-    ..addRuleFor(ListRule)
-    ..addRuleFor(PrimitiveRule)
-    // TODO(alanknight): Handle CustomRule as well.
-    // Note that we're passing in a constant for one of the fields.
-    ..addRuleFor(BasicRule,
-        constructorFields: ['type',
-          'constructorName',
-          'constructorFields', 'regularFields', []],
-        fields: [])
-     ..addRuleFor(Serialization, constructor: "blank")
-         .setFieldWith('rules',
-           (InstanceMirror s, List rules) {
-             rules.forEach((x) => s.reflectee.addRule(x));
-           })
-    ..addRule(new NamedObjectRule())
-    ..addRule(new MirrorRule())
-    ..addRule(new MapRule());
-  return meta;
-}
-
-Serialization metaSerializationUsingMaps() {
-  var meta = metaSerialization();
-  meta.rules.where((each) => each is BasicRule)
-      .forEach((x) => x.configureForMaps());
-  return meta;
-}
-
-/**
- * Read back a simple object, assumed to be the only one of its class in the
- * reader.
- */
-readBackSimple(Serialization s, object, Reader reader) {
-  var rule = s.rulesFor(object, null).first;
-  reader.inflateForRule(rule);
-  var list2 = reader.allObjectsForRule(rule).first;
-  return list2;
-}
-
-/**
- * Set up a basic reader with some fake data. Hard-codes the assumption
- * of how many rules there are.
- */
-Reader setUpReader(aSerialization, sampleData) {
-  var reader = new Reader(aSerialization);
-  // We're not sure which rule needs the sample data, so put it everywhere
-  // and trust that the extra will just be ignored.
-
-  var fillValue = [sampleData];
-  var data = [];
-  for (int i = 0; i < 10; i++) {
-    data.add(fillValue);
-  }
-  reader.data = data;
-  return reader;
-}
-
-/** Return a serialization for Node objects, using a reflective rule. */
-Serialization nodeSerializerReflective(Node n) {
-  return new Serialization()
-    ..addRuleFor(Node, constructorFields: ["name"])
-    ..namedObjects['Node'] = reflect(new Node('')).type;
-}
-
-/**
- * Return a serialization for Node objects but using Maps for the internal
- * representation rather than lists.
- */
-Serialization nodeSerializerUsingMaps(Node n) {
-  return new Serialization()
-    // Get the type using runtimeType to verify that works.
-    ..addRuleFor(n.runtimeType, constructorFields: ["name"]).configureForMaps()
-    ..namedObjects['Node'] = reflect(new Node('')).type;
-}
-
-/**
- * Return a serialization for Node objects but using Maps for the internal
- * representation rather than lists.
- */
-Serialization nodeSerializerCustom(Node n) {
-  return new Serialization()
-    ..addRule(new NodeRule());
-}
-
-/**
- * Return a serialization for Node objects where the "parent" instance
- * variable is considered essential state.
- */
-Serialization nodeSerializerWithEssentialParent(Node n) {
-  // Force the node rule to be first, in order to make a cycle which would
-  // not cause a problem if we handled the list first, because the list
-  // considers all of its state non-essential, thus breaking the cycle.
-  var s = new Serialization.blank()
-    ..addRuleFor(
-        Node,
-        constructor: "parentEssential",
-        constructorFields: ["parent"])
-    ..addDefaultRules()
-    ..namedObjects['Node'] = reflect(new Node('')).type
-    ..selfDescribing = false;
-  return s;
-}
-
-/** Return a serialization for Node objects using a ClosureToMapRule. */
-Serialization nodeSerializerNonReflective(Node n) {
-  var rule = new ClosureRule(
-      n.runtimeType,
-      (o) => {"name" : o.name, "children" : o.children, "parent" : o.parent},
-      (map) => new Node(map["name"]),
-      (object, map) {
-        object
-          ..children = map["children"]
-          ..parent = map["parent"];
-      });
-  return new Serialization()
-    ..selfDescribing = false
-    ..addRule(rule);
-}
-
-/**
- * Run a round-trip test on a simple tree of nodes, using a serialization
- * that's returned by the [serializerSetUp] function.
- */
-void runRoundTripTest(Function serializerSetUp) {
-  Node n1 = new Node("1"), n2 = new Node("2"), n3 = new Node("3");
-  n1.children = [n2, n3];
-  n2.parent = n1;
-  n3.parent = n1;
-  var s = serializerSetUp(n1);
-  var output = s.write(n2);
-  var s2 = serializerSetUp(n1);
-  var m2 = s2.read(output);
-  var m1 = m2.parent;
-  expect(m1 is Node, isTrue);
-  var children = m1.children;
-  expect(m1.name,"1");
-  var m3 = m1.children.last;
-  expect(m2.name, "2");
-  expect(m3.name, "3");
-  expect(m2.parent, m1);
-  expect(m3.parent, m1);
-  expect(m1.parent, isNull);
-}
-
-/**
- * Run a round-trip test on a simple of nodes, but using the flat format
- * rather than the maps.
- */
-void runRoundTripTestFlat(serializerSetUp) {
-  Node n1 = new Node("1"), n2 = new Node("2"), n3 = new Node("3");
-  n1.children = [n2, n3];
-  n2.parent = n1;
-  n3.parent = n1;
-  var s = serializerSetUp(n1);
-  var output = s.write(n2, format: const SimpleFlatFormat());
-  expect(output is List, isTrue);
-  var s2 = serializerSetUp(n1);
-  var m2 = s2.read(output, format: const SimpleFlatFormat());
-  var m1 = m2.parent;
-  expect(m1 is Node, isTrue);
-  var children = m1.children;
-  expect(m1.name,"1");
-  var m3 = m1.children.last;
-  expect(m2.name, "2");
-  expect(m3.name, "3");
-  expect(m2.parent, m1);
-  expect(m3.parent, m1);
-  expect(m1.parent, isNull);
-}
-
-/** Extract the state from [object] using the rules in [s] and return it. */
-List states(object, Serialization s) {
-  var rules = s.rulesFor(object, null);
-  return rules.map((x) => x.extractState(object, doNothing, null)).toList();
-}
-
-/** A hard-coded rule for serializing Node instances. */
-class NodeRule extends CustomRule {
-  bool appliesTo(instance, _) => instance.runtimeType == Node;
-  getState(instance) => [instance.parent, instance.name, instance.children];
-  create(state) => new Node(state[1]);
-  void setState(Node node, state) {
-    node.parent = state[0];
-    node.children = state[2];
-  }
-}
-
-/**
- * This is a rather silly rule which stores the address data in a map,
- * but inverts the keys and values, so we look up values and find the
- * corresponding key. This will lead to maps that aren't allowed in JSON,
- * and which have keys that need to be dereferenced.
- */
-class PersonRuleReturningMapWithNonStringKey extends CustomRule {
-  appliesTo(instance, _) => instance is Person;
-  getState(instance) {
-    return new Map()
-      ..[instance.name] = "name"
-      ..[instance.address] = "address";
-  }
-  create(state) => new Person();
-  void setState(Person a, state) {
-    a.name = findValue("name", state);
-    a.address = findValue("address", state);
-  }
-  findValue(String key, Map state) {
-    var answer;
-    for (var each in state.keys) {
-      var value = state[each];
-      if (value == key) return each;
-    }
-    return null;
-  }
-}
-
-/**
- * Function used in an isolate to make sure that the output passes through
- * isolate serialization properly.
- */
-void echo(initialMessage) {
-  var msg = initialMessage[0];
-  var reply = initialMessage[1];
-  reply.send(msg);
-}
diff --git a/pkg/serialization/test/test_models.dart b/pkg/serialization/test/test_models.dart
deleted file mode 100644
index 5ccfacc..0000000
--- a/pkg/serialization/test/test_models.dart
+++ /dev/null
@@ -1,75 +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.
-
-/** Provides some basic model classes to test serialization. */
-
-part of serialization_test;
-
-class Person {
-  String name, rank, serialNumber;
-  var address;
-}
-
-class Address {
-  String street, city, state, zip;
-  Address();
-  Address.withData(this.street, this.city, this.state, this.zip);
-}
-
-class Various {
-  Various.Foo(this._d, this.e);
-
-  // Field
-  var a;
-
-  // Get/Set pair
-  var _b;
-  get b => _b;
-  set b(value) { _b = value; }
-
-  // Private field (shouldn't be visible)
-  var _c = 'default value';
-
-  // Getter, value is set in the constructor
-  var _d;
-  get d => _d;
-
-  // Final, value set is the constructor.
-  final e;
-
-  // Get without corresponding set
-  get aLength => a.length;
-
-  static String thisShouldBeIgnored = "because it's static";
-  static get thisShouldAlsoBeIgnored => "for the same reason";
-  static set thisShouldAlsoBeIgnored(x) {}
-}
-
-class Node {
-  Node parent;
-  String name;
-  Node(this.name);
-  Node.parentEssential(this.parent);
-  List<Node> children;
-  bool someBoolean = true;
-
-  toString() => "Node($name)";
-}
-
-class NodeEqualByName extends Node {
-  NodeEqualByName(name) : super(name);
-  operator ==(x) => x is NodeEqualByName && name == x.name;
-  get hashCode => name.hashCode;
-}
-
-class Stream {
-  // In a real stream the position wouldn't likely be settable, making
-  // this trickier to reconstruct.
-  List _collection;
-  int position = 0;
-  Stream(this._collection);
-
-  next() => atEnd() ? null : _collection[position++];
-  atEnd() => position >= _collection.length;
-}
\ No newline at end of file
diff --git a/pkg/shelf/CHANGELOG.md b/pkg/shelf/CHANGELOG.md
index 5856040..d99158d 100644
--- a/pkg/shelf/CHANGELOG.md
+++ b/pkg/shelf/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 0.5.5
+
+* Added default body text for `Response.forbidden` and `Response.notFound` if
+null is provided.
+
+* Clarified documentation on a number of `Response` constructors.
+
+* Updated `README` links to point to latest docs on `www.dartdocs.org`.
+
 ## 0.5.4+3
 
 * Widen the version constraint on the `collection` package.
diff --git a/pkg/shelf/README.md b/pkg/shelf/README.md
index 98123a9..b138204 100644
--- a/pkg/shelf/README.md
+++ b/pkg/shelf/README.md
@@ -41,11 +41,11 @@
 do some processing and forward it to another handler--for example, a logger that
 prints information about requests and responses to the command line.
 
-[handler]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf.Handler
+[handler]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf@id_Handler
 
-[shelf.Request]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf.Request
+[shelf.Request]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Request
 
-[shelf.Response]:  https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf.Response
+[shelf.Response]:  http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Response
 
 The latter kind of handler is called "[middleware][]", since it sits in the
 middle of the server stack. Middleware can be thought of as a function that
@@ -54,9 +54,9 @@
 middleware with one or more handlers at the very center; the [shelf.Pipeline][]
 class makes this sort of application easy to construct.
 
-[middleware]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf.Middleware
+[middleware]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf@id_Middleware
 
-[shelf.Pipeline]:  https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf.Pipeline
+[shelf.Pipeline]:  http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Pipeline
 
 Some middleware can also take multiple handlers and call one or more of them for
 each request. For example, a routing middleware might choose which handler to
@@ -72,7 +72,7 @@
 HTTP requests within the browser using `window.location` and `window.history`,
 or it might pipe requests directly from an HTTP client to a Shelf handler.
 
-[shelf_io.serve]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf-io#id_serve
+[shelf_io.serve]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf-io@id_serve
 
 When implementing an adapter, some rules must be followed. The adapter must not
 pass the `url` or `scriptName` parameters to [new shelf.Request][]; it should
@@ -81,7 +81,7 @@
 with the same name are received, the adapter must collapse them into a single
 header separated by commas as per [RFC 2616 section 4.2][].
 
-[new shelf.Request]: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf/shelf.Request#id_Request-
+[new shelf.Request]: http://www.dartdocs.org/documentation/shelf/latest/index.html#shelf/shelf.Request@id_Request-
 
 [RFC 2616 section 4.2]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html
 
diff --git a/pkg/shelf/lib/src/response.dart b/pkg/shelf/lib/src/response.dart
index c36c551..f95fdb7 100644
--- a/pkg/shelf/lib/src/response.dart
+++ b/pkg/shelf/lib/src/response.dart
@@ -144,17 +144,19 @@
   ///
   /// This indicates that the server is refusing to fulfill the request.
   ///
-  /// [body] is the response body. It may be either a [String], a
-  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
-  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
-  /// UTF-8.
+  /// [body] is the response body. It may be a [String], a [Stream<List<int>>],
+  /// or `null`. If it's a [String], [encoding] is used to encode it to a
+  /// [Stream<List<int>>]. The default encoding is UTF-8. If it's `null` or not
+  /// passed, a default error message is used.
   ///
   /// If [encoding] is passed, the "encoding" field of the Content-Type header
   /// in [headers] will be set appropriately. If there is no existing
   /// Content-Type header, it will be set to "application/octet-stream".
   Response.forbidden(body, {Map<String, String> headers,
       Encoding encoding, Map<String, Object> context})
-      : this(403, body: body, headers: headers,
+      : this(403,
+          headers: body == null ? _adjustErrorHeaders(headers) : headers,
+          body: body == null ? 'Forbidden' : body,
           context: context);
 
   /// Constructs a 404 Not Found response.
@@ -162,17 +164,19 @@
   /// This indicates that the server didn't find any resource matching the
   /// requested URI.
   ///
-  /// [body] is the response body. It may be either a [String], a
-  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
-  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
-  /// UTF-8.
+  /// [body] is the response body. It may be a [String], a [Stream<List<int>>],
+  /// or `null`. If it's a [String], [encoding] is used to encode it to a
+  /// [Stream<List<int>>]. The default encoding is UTF-8. If it's `null` or not
+  /// passed, a default error message is used.
   ///
   /// If [encoding] is passed, the "encoding" field of the Content-Type header
   /// in [headers] will be set appropriately. If there is no existing
   /// Content-Type header, it will be set to "application/octet-stream".
   Response.notFound(body, {Map<String, String> headers, Encoding encoding,
     Map<String, Object> context})
-      : this(404, body: body, headers: headers,
+      : this(404,
+          headers: body == null ? _adjustErrorHeaders(headers) : headers,
+          body: body == null ? 'Not Found' : body,
           context: context);
 
   /// Constructs a 500 Internal Server Error response.
@@ -180,10 +184,10 @@
   /// This indicates that the server had an internal error that prevented it
   /// from fulfilling the request.
   ///
-  /// [body] is the response body. It may be either a [String], a
-  /// [Stream<List<int>>], or `null` to indicate no body. If it's `null` or not
-  /// passed, a default error message is used. If it's a [String], [encoding] is
-  /// used to encode it to a [Stream<List<int>>]. It defaults to UTF-8.
+  /// [body] is the response body. It may be a [String], a [Stream<List<int>>],
+  /// or `null`. If it's a [String], [encoding] is used to encode it to a
+  /// [Stream<List<int>>]. The default encoding is UTF-8. If it's `null` or not
+  /// passed, a default error message is used.
   ///
   /// If [encoding] is passed, the "encoding" field of the Content-Type header
   /// in [headers] will be set appropriately. If there is no existing
@@ -191,7 +195,7 @@
   Response.internalServerError({body, Map<String, String> headers,
       Encoding encoding, Map<String, Object> context})
       : this(500,
-            headers: body == null ? _adjust500Headers(headers) : headers,
+            headers: body == null ? _adjustErrorHeaders(headers) : headers,
             body: body == null ? 'Internal Server Error' : body,
             context: context);
 
@@ -200,9 +204,9 @@
   /// [statusCode] must be greater than or equal to 100.
   ///
   /// [body] is the response body. It may be either a [String], a
-  /// [Stream<List<int>>], or `null` to indicate no body. If it's `null` or not
-  /// passed, a default error message is used. If it's a [String], [encoding] is
-  /// used to encode it to a [Stream<List<int>>]. It defaults to UTF-8.
+  /// [Stream<List<int>>], or `null` to indicate no body.
+  /// If it's a [String], [encoding] is used to encode it to a
+  /// [Stream<List<int>>]. The default encoding is UTF-8.
   ///
   /// If [encoding] is passed, the "encoding" field of the Content-Type header
   /// in [headers] will be set appropriately. If there is no existing
@@ -283,7 +287,7 @@
 ///
 /// Returns a new map without modifying [headers]. This is used to add
 /// content-type information when creating a 500 response with a default body.
-Map<String, String> _adjust500Headers(Map<String, String> headers) {
+Map<String, String> _adjustErrorHeaders(Map<String, String> headers) {
   if (headers == null || headers['content-type'] == null) {
     return _addHeader(headers, 'content-type', 'text/plain');
   }
diff --git a/pkg/shelf/pubspec.yaml b/pkg/shelf/pubspec.yaml
index 01ae8de..d4b6c09 100644
--- a/pkg/shelf/pubspec.yaml
+++ b/pkg/shelf/pubspec.yaml
@@ -1,5 +1,5 @@
 name: shelf
-version: 0.5.4+3
+version: 0.5.5
 author: Dart Team <misc@dartlang.org>
 description: Web Server Middleware for Dart
 homepage: http://www.dartlang.org
diff --git a/pkg/smoke/CHANGELOG.md b/pkg/smoke/CHANGELOG.md
index 84ebd0d..3678e88 100644
--- a/pkg/smoke/CHANGELOG.md
+++ b/pkg/smoke/CHANGELOG.md
@@ -1,24 +1,23 @@
-# changelog
+#### 0.2.1+1
+  * Fix toString calls on Type instances.
 
-This file contains highlights of what changes on each version of this package.
-
-#### Pub version 0.2.0+3
+#### 0.2.0+3
   * Widen the constraint on analyzer.
 
-#### Pub version 0.2.0+2
+#### 0.2.0+2
   * Widen the constraint on barback.
 
-#### Pub version 0.2.0+1
+#### 0.2.0+1
   * Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan`
     class.
 
-#### Pub version 0.2.0
+#### 0.2.0
   * Static configuration can be modified, so code generators can split the
     static configuration in pieces.
   * **breaking change**: for codegen call `writeStaticConfiguration` instead of
     `writeInitCall`.
 
-#### Pub version 0.1.0
+#### 0.1.0
   * Initial release: introduces the smoke API, a mirror based implementation, a
     statically configured implementation that can be declared by hand or be
     generated by tools, and libraries that help generate the static
diff --git a/pkg/smoke/lib/mirrors.dart b/pkg/smoke/lib/mirrors.dart
index 87071c9..29742af 100644
--- a/pkg/smoke/lib/mirrors.dart
+++ b/pkg/smoke/lib/mirrors.dart
@@ -34,7 +34,7 @@
       {Map namedArgs, bool adjust: false}) {
     var receiverMirror;
     var method;
-    if (receiver is Type) {
+    if (receiver is Type && methodName != #toString) {
       receiverMirror = reflectType(receiver);
       method = receiverMirror.declarations[methodName];
     } else {
diff --git a/pkg/smoke/lib/static.dart b/pkg/smoke/lib/static.dart
index f7f7428..33f25da 100644
--- a/pkg/smoke/lib/static.dart
+++ b/pkg/smoke/lib/static.dart
@@ -116,7 +116,7 @@
 
   invoke(object, Symbol name, List args, {Map namedArgs, bool adjust: false}) {
     var method;
-    if (object is Type) {
+    if (object is Type && name != #toString) {
       var classMethods = _staticMethods[object];
       method = classMethods == null ? null : classMethods[name];
     } else {
diff --git a/pkg/smoke/pubspec.yaml b/pkg/smoke/pubspec.yaml
index 61f05ad..3e4669f 100644
--- a/pkg/smoke/pubspec.yaml
+++ b/pkg/smoke/pubspec.yaml
@@ -1,5 +1,5 @@
 name: smoke
-version: 0.2.1
+version: 0.2.1+1
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: "https://api.dartlang.org/apidocs/channels/be/#smoke"
 description: >
diff --git a/pkg/smoke/test/codegen/end_to_end_test.dart b/pkg/smoke/test/codegen/end_to_end_test.dart
index ad47215..8fafaf7 100644
--- a/pkg/smoke/test/codegen/end_to_end_test.dart
+++ b/pkg/smoke/test/codegen/end_to_end_test.dart
@@ -46,7 +46,8 @@
     }
 
     // Record all getters and setters we use in the tests.
-    ['i', 'j', 'j2', 'inc0', 'inc1', 'inc2'].forEach(generator.addGetter);
+    ['i', 'j', 'j2', 'inc0', 'inc1', 'inc2', 'toString']
+        .forEach(generator.addGetter);
     ['i', 'j2'].forEach(generator.addSetter);
 
     // Record static methods used in the tests
diff --git a/pkg/smoke/test/common.dart b/pkg/smoke/test/common.dart
index f8ce624..8d032d7 100644
--- a/pkg/smoke/test/common.dart
+++ b/pkg/smoke/test/common.dart
@@ -302,6 +302,12 @@
       expect(smoke.nameToSymbol('i'), #i);
     });
   });
+
+  test('invoke Type instance methods', () {
+    var a = new A();
+    expect(
+        smoke.invoke(a.runtimeType, #toString, []), a.runtimeType.toString());
+  });
 }
 
 class A {
@@ -315,7 +321,6 @@
 
   static int staticValue = 42;
   static void staticInc() { staticValue++; }
-
 }
 
 class B {
diff --git a/pkg/smoke/test/mirrors_used_test.dart b/pkg/smoke/test/mirrors_used_test.dart
index ec3a019..11c3bf3 100644
--- a/pkg/smoke/test/mirrors_used_test.dart
+++ b/pkg/smoke/test/mirrors_used_test.dart
@@ -11,7 +11,7 @@
 
 
 @MirrorsUsed(
-    targets: const [A, B, C, D, E, E2, F, F2, G, H],
+    targets: const [A, B, C, D, E, E2, F, F2, G, H, Type],
     override: 'smoke.mirrors')
 import 'dart:mirrors';
 
diff --git a/pkg/smoke/test/static_in_pieces_test.dart b/pkg/smoke/test/static_in_pieces_test.dart
index 17c0629..dd3848a 100644
--- a/pkg/smoke/test/static_in_pieces_test.dart
+++ b/pkg/smoke/test/static_in_pieces_test.dart
@@ -23,6 +23,7 @@
       #inc0: (o) => o.inc0,
       #inc1: (o) => o.inc1,
       #inc2: (o) => o.inc2,
+      #toString: (o) => o.toString,
     },
     setters: {
       #i: (o, v) { o.i = v; },
diff --git a/pkg/smoke/test/static_test.dart b/pkg/smoke/test/static_test.dart
index ed4e436..8661dfc 100644
--- a/pkg/smoke/test/static_test.dart
+++ b/pkg/smoke/test/static_test.dart
@@ -22,6 +22,7 @@
       #inc2: (o) => o.inc2,
       #j: (o) => o.j,
       #j2: (o) => o.j2,
+      #toString: (o) => o.toString,
     },
     setters: {
       #i: (o, v) { o.i = v; },
diff --git a/pkg/stack_trace/CHANGELOG.md b/pkg/stack_trace/CHANGELOG.md
index a5d594a..bbb7eb5 100644
--- a/pkg/stack_trace/CHANGELOG.md
+++ b/pkg/stack_trace/CHANGELOG.md
@@ -1,3 +1,18 @@
+## 1.1.0
+
+* Unify the parsing of Safari and Firefox stack traces. This fixes an error in
+  Firefox trace parsing.
+
+* Deprecate `Trace.parseSafari6_0`, `Trace.parseSafari6_1`,
+  `Frame.parseSafari6_0`, and `Frame.parseSafari6_1`.
+
+* Add `Frame.parseSafari`.
+
+## 1.0.3
+
+* Use `Zone.errorCallback` to attach stack chains to all errors without the need
+  for `Chain.track`, which is now deprecated.
+
 ## 1.0.2
 
 * Remove a workaround for [issue 17083][].
diff --git a/pkg/stack_trace/README.md b/pkg/stack_trace/README.md
index 492a52a..38b768d 100644
--- a/pkg/stack_trace/README.md
+++ b/pkg/stack_trace/README.md
@@ -205,13 +205,4 @@
 
 That's a lot easier to understand!
 
-### `Chain.track`
-
-For the most part `Chain.capture` will notice when an error is thrown and
-associate the correct stack chain with it. However, there are some cases where
-exceptions won't be automatically detected: any `Future` constructor,
-`Completer.completeError`, `Stream.addError`, and libraries that use these such
-as `dart:io` and `dart:async`. For these, all you need to do is wrap the Future
-or Stream in a call to `Chain.track` and the errors will be tracked correctly.
-
 [Zone]: https://api.dartlang.org/apidocs/channels/stable/#dart-async.Zone
diff --git a/pkg/stack_trace/lib/src/chain.dart b/pkg/stack_trace/lib/src/chain.dart
index 78c6ae4..f027025 100644
--- a/pkg/stack_trace/lib/src/chain.dart
+++ b/pkg/stack_trace/lib/src/chain.dart
@@ -35,14 +35,6 @@
 ///       print("Caught error $error\n"
 ///             "$stackChain");
 ///     });
-///
-/// For the most part [Chain.capture] will notice when an error is thrown and
-/// associate the correct stack chain with it; the chain can be accessed using
-/// [new Chain.forTrace]. However, there are some cases where exceptions won't
-/// be automatically detected: any [Future] constructor,
-/// [Completer.completeError], [Stream.addError], and libraries that use these.
-/// For these, all you need to do is wrap the Future or Stream in a call to
-/// [Chain.track] and the errors will be tracked correctly.
 class Chain implements StackTrace {
   /// The line used in the string representation of stack chains to represent
   /// the gap between traces.
@@ -69,13 +61,6 @@
   /// parent Zone's `unhandledErrorHandler` will be called with the error and
   /// its chain.
   ///
-  /// For the most part an error thrown in the zone will have the correct stack
-  /// chain associated with it. However, there are some cases where exceptions
-  /// won't be automatically detected: any [Future] constructor,
-  /// [Completer.completeError], [Stream.addError], and libraries that use
-  /// these. For these, all you need to do is wrap the Future or Stream in a
-  /// call to [Chain.track] and the errors will be tracked correctly.
-  ///
   /// Note that even if [onError] isn't passed, this zone will still be an error
   /// zone. This means that any errors that would cross the zone boundary are
   /// considered unhandled.
@@ -102,33 +87,13 @@
     });
   }
 
-  /// Ensures that any errors emitted by [futureOrStream] have the correct stack
-  /// chain information associated with them.
+  /// Returns [futureOrStream] unmodified.
   ///
-  /// For the most part an error thrown within a [capture] zone will have the
-  /// correct stack chain automatically associated with it. However, there are
-  /// some cases where exceptions won't be automatically detected: any [Future]
-  /// constructor, [Completer.completeError], [Stream.addError], and libraries
-  /// that use these.
-  ///
-  /// This returns a [Future] or [Stream] that will emit the same values and
-  /// errors as [futureOrStream]. The only exception is that if [futureOrStream]
-  /// emits an error without a stack trace, one will be added in the return
-  /// value.
-  ///
-  /// If this is called outside of a [capture] zone, it just returns
-  /// [futureOrStream] as-is.
-  ///
-  /// As the name suggests, [futureOrStream] may be either a [Future] or a
-  /// [Stream].
-  static track(futureOrStream) {
-    if (_currentSpec == null) return futureOrStream;
-    if (futureOrStream is Future) {
-      return _currentSpec.trackFuture(futureOrStream, 1);
-    } else {
-      return _currentSpec.trackStream(futureOrStream, 1);
-    }
-  }
+  /// Prior to Dart 1.7, this was necessary to ensure that stack traces for
+  /// exceptions reported with [Completer.completeError] and
+  /// [StreamController.addError] were tracked correctly.
+  @Deprecated("Chain.track is not necessary in Dart 1.7+.")
+  static track(futureOrStream) => futureOrStream;
 
   /// Returns the current stack chain.
   ///
diff --git a/pkg/stack_trace/lib/src/frame.dart b/pkg/stack_trace/lib/src/frame.dart
index b1db230..4f5b16c 100644
--- a/pkg/stack_trace/lib/src/frame.dart
+++ b/pkg/stack_trace/lib/src/frame.dart
@@ -30,15 +30,26 @@
 final _v8EvalLocation = new RegExp(
     r'^eval at (?:\S.*?) \((.*)\)(?:, .*?:\d+:\d+)?$');
 
-// foo$bar$0@http://pub.dartlang.org/stuff.dart.js:560:28
-// http://pub.dartlang.org/stuff.dart.js:560:28
-final _safariFrame = new RegExp(r"^(?:([0-9A-Za-z_$]*)@)?(.*):(\d*):(\d*)$");
-
 // .VW.call$0@http://pub.dartlang.org/stuff.dart.js:560
 // .VW.call$0("arg")@http://pub.dartlang.org/stuff.dart.js:560
 // .VW.call$0/name<@http://pub.dartlang.org/stuff.dart.js:560
-final _firefoxFrame = new RegExp(
-    r'^([^@(/]*)(?:\(.*\))?((?:/[^/]*)*)(?:\(.*\))?@(.*):(\d+)$');
+// .VW.call$0@http://pub.dartlang.org/stuff.dart.js:560:36
+// http://pub.dartlang.org/stuff.dart.js:560
+final _firefoxSafariFrame = new RegExp(
+    r'^'
+    r'(?:' // Member description. Not present in some Safari frames.
+      r'([^@(/]*)' // The actual name of the member.
+      r'(?:\(.*\))?' // Arguments to the member, sometimes captured by Firefox.
+      r'((?:/[^/]*)*)' // Extra characters indicating a nested closure.
+      r'(?:\(.*\))?' // Arguments to the closure.
+      r'@'
+    r')?'
+    r'(.*?)' // The frame's URL.
+    r':'
+    r'(\d*)' // The line number. Empty in Safari if it's unknown.
+    r'(?::(\d*))?' // The column number. Not present in older browsers and
+                   // empty in Safari if it's unknown.
+    r'$');
 
 // foo/bar.dart 10:11 in Foo._bar
 // http://dartlang.org/foo/bar.dart in Foo._bar
@@ -187,45 +198,45 @@
 
   /// Parses a string representation of a Firefox stack frame.
   factory Frame.parseFirefox(String frame) {
-    var match = _firefoxFrame.firstMatch(frame);
+    var match = _firefoxSafariFrame.firstMatch(frame);
     if (match == null) {
       throw new FormatException(
-          "Couldn't parse Firefox stack trace line '$frame'.");
+          "Couldn't parse Firefox/Safari stack trace line '$frame'.");
     }
 
     // Normally this is a URI, but in a jsshell trace it can be a path.
     var uri = _uriOrPathToUri(match[3]);
-    var member = match[1];
-    member += new List.filled('/'.allMatches(match[2]).length, ".<fn>").join();
-    if (member == '') member = '<fn>';
 
-    // Some Firefox members have initial dots. We remove them for consistency
-    // with other platforms.
-    member = member.replaceFirst(_initialDot, '');
-    return new Frame(uri, int.parse(match[4]), null, member);
+    var member;
+    if (match[1] != null) {
+      member = match[1];
+      member +=
+          new List.filled('/'.allMatches(match[2]).length, ".<fn>").join();
+      if (member == '') member = '<fn>';
+
+      // Some Firefox members have initial dots. We remove them for consistency
+      // with other platforms.
+      member = member.replaceFirst(_initialDot, '');
+    } else {
+      member = '<fn>';
+    }
+
+    var line = match[4] == '' ? null : int.parse(match[4]);
+    var column = match[5] == null || match[5] == '' ?
+        null : int.parse(match[5]);
+    return new Frame(uri, line, column, member);
   }
 
   /// Parses a string representation of a Safari 6.0 stack frame.
-  ///
-  /// Safari 6.0 frames look just like Firefox frames. Prior to Safari 6.0,
-  /// stack traces can't be retrieved.
+  @Deprecated("Use Frame.parseSafari instead.")
   factory Frame.parseSafari6_0(String frame) => new Frame.parseFirefox(frame);
 
   /// Parses a string representation of a Safari 6.1+ stack frame.
-  factory Frame.parseSafari6_1(String frame) {
-    var match = _safariFrame.firstMatch(frame);
-    if (match == null) {
-      throw new FormatException(
-          "Couldn't parse Safari stack trace line '$frame'.");
-    }
+  @Deprecated("Use Frame.parseSafari instead.")
+  factory Frame.parseSafari6_1(String frame) => new Frame.parseFirefox(frame);
 
-    var uri = Uri.parse(match[2]);
-    var member = match[1];
-    if (member == null) member = '<fn>';
-    var line = match[3] == '' ? null : int.parse(match[3]);
-    var column = match[4] == '' ? null : int.parse(match[4]);
-    return new Frame(uri, line, column, member);
-  }
+  /// Parses a string representation of a Safari stack frame.
+  factory Frame.parseSafari(String frame) => new Frame.parseFirefox(frame);
 
   /// Parses this package's string representation of a stack frame.
   factory Frame.parseFriendly(String frame) {
diff --git a/pkg/stack_trace/lib/src/stack_zone_specification.dart b/pkg/stack_trace/lib/src/stack_zone_specification.dart
index 9a4f7c0..0c1c7d2 100644
--- a/pkg/stack_trace/lib/src/stack_zone_specification.dart
+++ b/pkg/stack_trace/lib/src/stack_zone_specification.dart
@@ -22,9 +22,9 @@
 ///   it can be available to [Chain.current] and to be linked into additional
 ///   chains when more callbacks are scheduled.
 ///
-/// * When a callback throws an error or a [Chain.track]ed Future or Stream
-///   emits an error, the current node is associated with that error's stack
-///   trace using the [_chains] expando.
+/// * When a callback throws an error or a Future or Stream emits an error, the
+///   current node is associated with that error's stack trace using the
+///   [_chains] expando.
 ///
 /// Since [ZoneSpecification] can't be extended or even implemented, in order to
 /// get a real [ZoneSpecification] instance it's necessary to call [toSpec].
@@ -56,7 +56,8 @@
         handleUncaughtError: handleUncaughtError,
         registerCallback: registerCallback,
         registerUnaryCallback: registerUnaryCallback,
-        registerBinaryCallback: registerBinaryCallback);
+        registerBinaryCallback: registerBinaryCallback,
+        errorCallback: errorCallback);
   }
 
   /// Returns the current stack chain.
@@ -88,7 +89,9 @@
     var node = _createNode(level + 1);
     future.then(completer.complete).catchError((e, stackTrace) {
       if (stackTrace == null) stackTrace = new Trace.current();
-      if (_chains[stackTrace] == null) _chains[stackTrace] = node;
+      if (stackTrace is! Chain && _chains[stackTrace] == null) {
+        _chains[stackTrace] = node;
+      }
       completer.completeError(e, stackTrace);
     });
     return completer.future;
@@ -105,7 +108,9 @@
     return stream.transform(new StreamTransformer.fromHandlers(
         handleError: (error, stackTrace, sink) {
       if (stackTrace == null) stackTrace = new Trace.current();
-      if (_chains[stackTrace] == null) _chains[stackTrace] = node;
+      if (stackTrace is! Chain && _chains[stackTrace] == null) {
+        _chains[stackTrace] = node;
+      }
       sink.addError(error, stackTrace);
     }));
   }
@@ -163,6 +168,26 @@
     }
   }
 
+  /// Attaches the current stack chain to [stackTrace], replacing it if
+  /// necessary.
+  AsyncError errorCallback(Zone self, ZoneDelegate parent, Zone zone,
+      Object error, StackTrace stackTrace) {
+    var asyncError = parent.errorCallback(zone, error, stackTrace);
+    if (asyncError != null) {
+      error = asyncError.error;
+      stackTrace = asyncError.stackTrace;
+    }
+
+    // Go up two levels to get through [_CustomZone.errorCallback].
+    if (stackTrace == null) {
+      stackTrace = _createNode(2).toChain();
+    } else {
+      if (_chains[stackTrace] == null) _chains[stackTrace] = _createNode(2);
+    }
+
+    return new AsyncError(error, stackTrace);
+  }
+
   /// Creates a [_Node] with the current stack trace and linked to
   /// [_currentNode].
   ///
diff --git a/pkg/stack_trace/lib/src/trace.dart b/pkg/stack_trace/lib/src/trace.dart
index c540d78..2690ece 100644
--- a/pkg/stack_trace/lib/src/trace.dart
+++ b/pkg/stack_trace/lib/src/trace.dart
@@ -29,25 +29,28 @@
 /// though it is possible for the message to match this as well.
 final _v8TraceLine = new RegExp(r"    ?at ");
 
-/// A RegExp to match Safari's stack traces.
+/// A RegExp to match Firefox and Safari's stack traces.
 ///
-/// Prior to version 6, Safari's stack traces were uncapturable. In v6 they were
-/// almost identical to Firefox traces, and so are handled by the Firefox code.
-/// In v6.1+, they have their own format that's similar to Firefox but distinct
-/// enough to warrant handling separately.
-///
-/// Most notably, Safari traces occasionally don't include the initial method
-/// name followed by "@", and they always have both the line and column number
-/// (or just a trailing colon if no column number is available).
-final _safariTrace = new RegExp(r"^([0-9A-Za-z_$]*@)?.*:\d*:\d*$",
-    multiLine: true);
-
-/// A RegExp to match Firefox's stack traces.
+/// Firefox and Safari have very similar stack trace formats, so we use the same
+/// logic for parsing them.
 ///
 /// Firefox's trace frames start with the name of the function in which the
 /// error occurred, possibly including its parameters inside `()`. For example,
 /// `.VW.call$0("arg")@http://pub.dartlang.org/stuff.dart.js:560`.
-final _firefoxTrace = new RegExp(r"^([.0-9A-Za-z_$/<]|\(.*\))*@");
+///
+/// Safari traces occasionally don't include the initial method name followed by
+/// "@", and they always have both the line and column number (or just a
+/// trailing colon if no column number is available). They can also contain
+/// empty lines or lines consisting only of `[native code]`.
+final _firefoxSafariTrace = new RegExp(
+    r"^"
+    r"(" // Member description. Not present in some Safari frames.
+      r"([.0-9A-Za-z_$/<]|\(.*\))*" // Member name and arguments.
+      r"@"
+    r")?"
+    r"[^\s]*" // Frame URL.
+    r":\d*" // Line or column number. Some older frames only have a line number.
+    r"$", multiLine: true);
 
 /// A RegExp to match this package's stack traces.
 final _friendlyTrace = new RegExp(r"^[^\s]+( \d+(:\d+)?)?[ \t]+[^\s]+$",
@@ -112,12 +115,9 @@
     try {
       if (trace.isEmpty) return new Trace(<Frame>[]);
       if (trace.contains(_v8Trace)) return new Trace.parseV8(trace);
-      // Safari 6.1+ traces could be misinterpreted as Firefox traces, so we
-      // check for them first.
-      if (trace.contains(_safariTrace)) return new Trace.parseSafari6_1(trace);
-      // Safari 6.0 traces are a superset of Firefox traces, so we parse those
-      // two together.
-      if (trace.contains(_firefoxTrace)) return new Trace.parseSafari6_0(trace);
+      if (trace.contains(_firefoxSafariTrace)) {
+        return new Trace.parseFirefox(trace);
+      }
       if (trace.contains(_friendlyTrace)) {
         return new Trace.parseFriendly(trace);
       }
@@ -157,29 +157,20 @@
   /// Parses a string representation of a Firefox stack trace.
   Trace.parseFirefox(String trace)
       : this(trace.trim().split("\n")
+          .where((line) => line.isNotEmpty && line != '[native code]')
           .map((line) => new Frame.parseFirefox(line)));
 
   /// Parses a string representation of a Safari stack trace.
-  ///
-  /// This will automatically decide between [parseSafari6_0] and
-  /// [parseSafari6_1] based on the contents of [trace].
-  factory Trace.parseSafari(String trace) {
-    if (trace.contains(_safariTrace)) return new Trace.parseSafari6_1(trace);
-    return new Trace.parseSafari6_0(trace);
-  }
+  Trace.parseSafari(String trace)
+      : this.parseFirefox(trace);
 
   /// Parses a string representation of a Safari 6.1+ stack trace.
+  @Deprecated("Use Trace.parseSafari instead.")
   Trace.parseSafari6_1(String trace)
-      : this(trace.trim().split("\n")
-          .where((line) => line.isNotEmpty)
-          .map((line) => new Frame.parseSafari6_1(line)));
+      : this.parseSafari(trace);
 
   /// Parses a string representation of a Safari 6.0 stack trace.
-  ///
-  /// Safari 6.0 stack traces look just like Firefox traces, except that they
-  /// sometimes (e.g. in isolates) have a "[native code]" frame. We just ignore
-  /// this frame to make the stack format more consistent between browsers.
-  /// Prior to Safari 6.0, stack traces can't be retrieved.
+  @Deprecated("Use Trace.parseSafari instead.")
   Trace.parseSafari6_0(String trace)
       : this(trace.trim().split("\n")
           .where((line) => line != '[native code]')
diff --git a/pkg/stack_trace/pubspec.yaml b/pkg/stack_trace/pubspec.yaml
index 5226cf8..cd798bf 100644
--- a/pkg/stack_trace/pubspec.yaml
+++ b/pkg/stack_trace/pubspec.yaml
@@ -7,7 +7,7 @@
 #
 # When the major version is upgraded, you *must* update that version constraint
 # in pub to stay in sync with this.
-version: 1.0.2
+version: 1.1.0
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
@@ -19,4 +19,4 @@
 dev_dependencies:
   unittest: ">=0.9.0 <0.12.0"
 environment:
-  sdk: ">=1.0.0 <2.0.0"
+  sdk: ">=1.7.0-edge.40308 <2.0.0"
diff --git a/pkg/stack_trace/test/chain_test.dart b/pkg/stack_trace/test/chain_test.dart
index beb4721..6af3c6b 100644
--- a/pkg/stack_trace/test/chain_test.dart
+++ b/pkg/stack_trace/test/chain_test.dart
@@ -93,6 +93,37 @@
       });
     });
 
+    test('thrown in new Future()', () {
+      return captureFuture(() => inNewFuture(() => throw 'error'))
+          .then((chain) {
+        expect(chain.traces, hasLength(3));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+
+        // The second trace is the one captured by
+        // [StackZoneSpecification.errorCallback]. Because that runs
+        // asynchronously within [new Future], it doesn't actually refer to the
+        // source file at all.
+        expect(chain.traces[1].frames,
+            everyElement(frameLibrary(isNot(contains('chain_test')))));
+
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inNewFuture'))));
+      });
+    });
+
+    test('thrown in new Future.sync()', () {
+      return captureFuture(() {
+        inMicrotask(() => inSyncFuture(() => throw 'error'));
+      }).then((chain) {
+        expect(chain.traces, hasLength(3));
+        expect(chain.traces[0].frames.first, frameMember(startsWith('main')));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inSyncFuture'))));
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
     test('multiple times', () {
       var completer = new Completer();
       var first = true;
@@ -121,6 +152,73 @@
       return completer.future;
     });
 
+    test('passed to a completer', () {
+      var trace = new Trace.current();
+      return captureFuture(() {
+        inMicrotask(() => completerErrorFuture(trace));
+      }).then((chain) {
+        expect(chain.traces, hasLength(3));
+
+        // The first trace is the trace that was manually reported for the
+        // error.
+        expect(chain.traces.first.toString(), equals(trace.toString()));
+
+        // The second trace is the trace that was captured when
+        // [Completer.addError] was called.
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('completerErrorFuture'))));
+
+        // The third trace is the automatically-captured trace from when the
+        // microtask was scheduled.
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
+    test('passed to a completer with no stack trace', () {
+      return captureFuture(() {
+        inMicrotask(() => completerErrorFuture());
+      }).then((chain) {
+        expect(chain.traces, hasLength(2));
+
+        // The first trace is the one captured when [Completer.addError] was
+        // called.
+        expect(chain.traces[0].frames,
+            contains(frameMember(startsWith('completerErrorFuture'))));
+
+        // The second trace is the automatically-captured trace from when the
+        // microtask was scheduled.
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
+    test('passed to a stream controller', () {
+      var trace = new Trace.current();
+      return captureFuture(() {
+        inMicrotask(() => controllerErrorStream(trace).listen(null));
+      }).then((chain) {
+        expect(chain.traces, hasLength(3));
+        expect(chain.traces.first.toString(), equals(trace.toString()));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('controllerErrorStream'))));
+        expect(chain.traces[2].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
+    test('passed to a stream controller with no stack trace', () {
+      return captureFuture(() {
+        inMicrotask(() => controllerErrorStream().listen(null));
+      }).then((chain) {
+        expect(chain.traces, hasLength(2));
+        expect(chain.traces[0].frames,
+            contains(frameMember(startsWith('controllerErrorStream'))));
+        expect(chain.traces[1].frames,
+            contains(frameMember(startsWith('inMicrotask'))));
+      });
+    });
+
     test('and relays them to the parent zone', () {
       var completer = new Completer();
 
@@ -526,50 +624,6 @@
   });
 
   group('Chain.track(Future)', () {
-    test('associates the current chain with a manually-reported exception with '
-        'a stack trace', () {
-      var trace = new Trace.current();
-      return captureFuture(() {
-        inMicrotask(() => trackedErrorFuture(trace));
-      }).then((chain) {
-        expect(chain.traces, hasLength(3));
-
-        // The first trace is the trace that was manually reported for the
-        // error.
-        expect(chain.traces.first.toString(), equals(trace.toString()));
-
-        // The second trace is the trace that was captured when [Chain.track]
-        // was called.
-        expect(chain.traces[1].frames.first,
-            frameMember(startsWith('trackedErrorFuture')));
-
-        // The third trace is the automatically-captured trace from when the
-        // microtask was scheduled.
-        expect(chain.traces[2].frames,
-            contains(frameMember(startsWith('inMicrotask'))));
-      });
-    });
-
-    test('associates the current chain with a manually-reported exception with '
-        'no stack trace', () {
-      return captureFuture(() {
-        inMicrotask(() => trackedErrorFuture());
-      }).then((chain) {
-        expect(chain.traces, hasLength(3));
-
-        // The first trace is the one captured by
-        // [StackZoneSpecification.trackFuture], which should contain only
-        // stack_trace and dart: frames.
-        expect(chain.traces.first.frames,
-            everyElement(frameLibrary(isNot(contains('chain_test')))));
-
-        expect(chain.traces[1].frames.first,
-            frameMember(startsWith('trackedErrorFuture')));
-        expect(chain.traces[2].frames,
-            contains(frameMember(startsWith('inMicrotask'))));
-      });
-    });
-
     test('forwards the future value within Chain.capture()', () {
       Chain.capture(() {
         expect(Chain.track(new Future.value('value')),
@@ -598,36 +652,6 @@
   });
 
   group('Chain.track(Stream)', () {
-    test('associates the current chain with a manually-reported exception with '
-        'a stack trace', () {
-      var trace = new Trace.current();
-      return captureFuture(() {
-        inMicrotask(() => trackedErrorStream(trace).listen(null));
-      }).then((chain) {
-        expect(chain.traces, hasLength(3));
-        expect(chain.traces.first.toString(), equals(trace.toString()));
-        expect(chain.traces[1].frames.first,
-            frameMember(startsWith('trackedErrorStream')));
-        expect(chain.traces[2].frames,
-            contains(frameMember(startsWith('inMicrotask'))));
-      });
-    });
-
-    test('associates the current chain with a manually-reported exception with '
-        'no stack trace', () {
-      return captureFuture(() {
-        inMicrotask(() => trackedErrorStream().listen(null));
-      }).then((chain) {
-        expect(chain.traces, hasLength(3));
-        expect(chain.traces.first.frames,
-            everyElement(frameLibrary(isNot(contains('chain_test')))));
-        expect(chain.traces[1].frames.first,
-            frameMember(startsWith('trackedErrorStream')));
-        expect(chain.traces[2].frames,
-            contains(frameMember(startsWith('inMicrotask'))));
-      });
-    });
-
     test('forwards stream values within Chain.capture()', () {
       Chain.capture(() {
         var controller = new StreamController()
@@ -692,22 +716,30 @@
       .then((_) => new Future(() {}));
 }
 
-/// Returns a Future that completes to an error and is wrapped in [Chain.track].
-///
-/// If [trace] is passed, it's used as the stack trace for the error.
-Future trackedErrorFuture([StackTrace trace]) {
-  var completer = new Completer();
-  completer.completeError('error', trace);
-  return Chain.track(completer.future);
+void inNewFuture(callback()) {
+  new Future(callback);
 }
 
-/// Returns a Stream that emits an error and is wrapped in [Chain.track].
+void inSyncFuture(callback()) {
+  new Future.sync(callback);
+}
+
+/// Returns a Future that completes to an error using a completer.
 ///
 /// If [trace] is passed, it's used as the stack trace for the error.
-Stream trackedErrorStream([StackTrace trace]) {
+Future completerErrorFuture([StackTrace trace]) {
+  var completer = new Completer();
+  completer.completeError('error', trace);
+  return completer.future;
+}
+
+/// Returns a Stream that emits an error using a controller.
+///
+/// If [trace] is passed, it's used as the stack trace for the error.
+Stream controllerErrorStream([StackTrace trace]) {
   var controller = new StreamController();
   controller.addError('error', trace);
-  return Chain.track(controller.stream);
+  return controller.stream;
 }
 
 /// Runs [callback] within [asyncFn], then converts any errors raised into a
diff --git a/pkg/stack_trace/test/frame_test.dart b/pkg/stack_trace/test/frame_test.dart
index 1205d74..b132368 100644
--- a/pkg/stack_trace/test/frame_test.dart
+++ b/pkg/stack_trace/test/frame_test.dart
@@ -210,7 +210,7 @@
     });
   });
 
-  group('.parseFirefox', () {
+  group('.parseFirefox/.parseSafari', () {
     test('parses a simple stack frame correctly', () {
       var frame = new Frame.parseFirefox(
           ".VW.call\$0@http://pub.dartlang.org/stuff.dart.js:560");
@@ -356,11 +356,9 @@
       expect(() => new Frame.parseFirefox('@dart:async/future.dart'),
           throwsFormatException);
     });
-  });
 
-  group('.parseSafari6_1', () {
     test('parses a simple stack frame correctly', () {
-      var frame = new Frame.parseSafari6_1(
+      var frame = new Frame.parseFirefox(
           "foo\$bar@http://dartlang.org/foo/bar.dart:10:11");
       expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
       expect(frame.line, equals(10));
@@ -369,7 +367,7 @@
     });
 
     test('parses an anonymous stack frame correctly', () {
-      var frame = new Frame.parseSafari6_1(
+      var frame = new Frame.parseFirefox(
           "http://dartlang.org/foo/bar.dart:10:11");
       expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
       expect(frame.line, equals(10));
@@ -378,7 +376,7 @@
     });
 
     test('parses a stack frame with no line correctly', () {
-      var frame = new Frame.parseSafari6_1(
+      var frame = new Frame.parseFirefox(
           "foo\$bar@http://dartlang.org/foo/bar.dart::11");
       expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
       expect(frame.line, isNull);
@@ -387,7 +385,7 @@
     });
 
     test('parses a stack frame with no column correctly', () {
-      var frame = new Frame.parseSafari6_1(
+      var frame = new Frame.parseFirefox(
           "foo\$bar@http://dartlang.org/foo/bar.dart:10:");
       expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
       expect(frame.line, equals(10));
@@ -396,7 +394,7 @@
     });
 
     test('parses a stack frame with no line or column correctly', () {
-      var frame = new Frame.parseSafari6_1(
+      var frame = new Frame.parseFirefox(
           "foo\$bar@http://dartlang.org/foo/bar.dart:10:11");
       expect(frame.uri, equals(Uri.parse("http://dartlang.org/foo/bar.dart")));
       expect(frame.line, equals(10));
diff --git a/pkg/stack_trace/test/trace_test.dart b/pkg/stack_trace/test/trace_test.dart
index bc2db6b..17f9c22 100644
--- a/pkg/stack_trace/test/trace_test.dart
+++ b/pkg/stack_trace/test/trace_test.dart
@@ -92,7 +92,7 @@
           equals(Uri.parse("http://pub.dartlang.org/thing.js")));
     });
 
-    test('parses a Firefox stack trace correctly', () {
+    test('parses a Firefox/Safari stack trace correctly', () {
       var trace = new Trace.parse(
           'Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
           'zip/<@http://pub.dartlang.org/stuff.js:0\n'
@@ -130,7 +130,8 @@
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
     });
 
-    test('parses a Safari 6.0 stack trace correctly', () {
+    test('parses a Firefox/Safari stack trace containing native code correctly',
+        () {
       var trace = new Trace.parse(
           'Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
           'zip/<@http://pub.dartlang.org/stuff.js:0\n'
@@ -146,11 +147,29 @@
       expect(trace.frames.length, equals(3));
     });
 
-    test('parses a Safari 6.1 stack trace correctly', () {
+    test('parses a Firefox/Safari stack trace without a method name correctly',
+        () {
       var trace = new Trace.parse(
-          'http://pub.dartlang.org/stuff.js:42:43\n'
-          'zip@http://pub.dartlang.org/stuff.js:0:1\n'
-          'zip\$zap@http://pub.dartlang.org/thing.js:1:2');
+          'http://pub.dartlang.org/stuff.js:42\n'
+          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
+
+      expect(trace.frames[0].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[0].member, equals('<fn>'));
+      expect(trace.frames[1].uri,
+          equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[2].uri,
+          equals(Uri.parse("http://pub.dartlang.org/thing.js")));
+    });
+
+    test('parses a Firefox/Safari stack trace with an empty line correctly',
+        () {
+      var trace = new Trace.parse(
+          'Foo._bar@http://pub.dartlang.org/stuff.js:42\n'
+          '\n'
+          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
 
       expect(trace.frames[0].uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
@@ -160,15 +179,17 @@
           equals(Uri.parse("http://pub.dartlang.org/thing.js")));
     });
 
-    test('parses a Safari 6.1 stack trace with an empty line correctly', () {
+    test('parses a Firefox/Safari stack trace with a column number correctly',
+        () {
       var trace = new Trace.parse(
-          'http://pub.dartlang.org/stuff.js:42:43\n'
-          '\n'
-          'zip@http://pub.dartlang.org/stuff.js:0:1\n'
-          'zip\$zap@http://pub.dartlang.org/thing.js:1:2');
+          'Foo._bar@http://pub.dartlang.org/stuff.js:42:2\n'
+          'zip/<@http://pub.dartlang.org/stuff.js:0\n'
+          'zip.zap(12, "@)()/<")@http://pub.dartlang.org/thing.js:1');
 
       expect(trace.frames[0].uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
+      expect(trace.frames[0].line, equals(42));
+      expect(trace.frames[0].column, equals(2));
       expect(trace.frames[1].uri,
           equals(Uri.parse("http://pub.dartlang.org/stuff.js")));
       expect(trace.frames[2].uri,
diff --git a/pkg/unittest/CHANGELOG.md b/pkg/unittest/CHANGELOG.md
index 484113e..ff438f64 100644
--- a/pkg/unittest/CHANGELOG.md
+++ b/pkg/unittest/CHANGELOG.md
@@ -1,3 +1,11 @@
+##0.11.0+6
+
+* Refactored package tests.
+
+##0.11.0+5
+
+* Release test functions after each test is run.
+
 ##0.11.0+4
 
 * Fix for [20153](https://code.google.com/p/dart/issues/detail?id=20153)
diff --git a/pkg/unittest/pubspec.yaml b/pkg/unittest/pubspec.yaml
index b531c81..06f4c8f 100644
--- a/pkg/unittest/pubspec.yaml
+++ b/pkg/unittest/pubspec.yaml
@@ -1,5 +1,5 @@
 name: unittest
-version: 0.11.0+5
+version: 0.11.0+6
 author: Dart Team <misc@dartlang.org>
 description: A library for writing dart unit tests.
 homepage: https://pub.dartlang.org/packages/unittest
@@ -8,3 +8,5 @@
 dependencies:
   matcher: '>=0.10.0 <0.12.0'
   stack_trace: '>=0.9.0 <2.0.0'
+dev_dependencies:
+  metatest: '>=0.1.0 <0.2.0'
diff --git a/pkg/unittest/test/async_exception_test.dart b/pkg/unittest/test/async_exception_test.dart
index 8574416..d81e7de 100644
--- a/pkg/unittest/test/async_exception_test.dart
+++ b/pkg/unittest/test/async_exception_test.dart
@@ -2,22 +2,31 @@
 // for details. 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;
+library unittest.async_exception_test;
 
 import 'dart:async';
-import 'dart:isolate';
 
+import 'package:metatest/metatest.dart';
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+void main() => initTests(_test);
 
-var testName = 'async exception test';
+void _test(message) {
+  initMetatest(message);
 
-var testFunction = (_) {
-  test(testName, () {
-    expectAsync(() {});
-    _defer(() { throw "error!"; });
+  expectTestsFail('async errors cause tests to fail', () {
+    test('async', () {
+      expectAsync(() {});
+      new Future(() {
+        throw "an error!";
+      });
+    });
+
+    test('sync', () {
+      expectAsync(() {});
+      new Future(() {
+        throw "an error!";
+      });
+    });
   });
-};
-
-final expected = buildStatusString(0, 1, 0, testName, message: 'Caught error!');
+}
diff --git a/pkg/unittest/test/async_exception_with_future_test.dart b/pkg/unittest/test/async_exception_with_future_test.dart
index dd249cf..7dd8515 100644
--- a/pkg/unittest/test/async_exception_with_future_test.dart
+++ b/pkg/unittest/test/async_exception_with_future_test.dart
@@ -2,27 +2,46 @@
 // for details. 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;
+library unittest.async_exception_with_future_test;
 
 import 'dart:async';
-import 'dart:isolate';
 
+import 'package:metatest/metatest.dart';
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+void main() => initTests(_test);
 
-var testName = 'async exception with future test';
+void _test(message) {
+  initMetatest(message);
 
-var testFunction = (TestConfiguration testConfig) {
-  tearDown(() { testConfig.teardown = 'teardown'; });
-  test(testName, () {
-    // The "throw" statement below should terminate the test immediately.
-    // The framework should not wait for the future to complete.
-    // tearDown should still execute.
-    _defer(() { throw "error!"; });
-    return new Completer().future;
-  });
-};
+  expectTestResults('async exception with future test', () {
+    var tearDownHappened = false;
 
-final expected = buildStatusString(0, 1, 0, testName,
-    message: 'Caught error!', teardown: 'teardown');
+    tearDown(() {
+      tearDownHappened = true;
+    });
+
+    test('test', () {
+      expect(tearDownHappened, isFalse);
+      // The "throw" statement below should terminate the test immediately.
+      // The framework should not wait for the future to complete.
+      // tearDown should still execute.
+      new Future.sync(() {
+        throw "error!";
+      });
+      return new Completer().future;
+    });
+
+    test('follow up', () {
+      expect(tearDownHappened, isTrue);
+    });
+
+  }, [{
+    'description': 'test',
+    'message': 'Caught error!',
+    'result': 'fail',
+  }, {
+    'description': 'follow up',
+    'result': 'pass',
+  }]);
+}
diff --git a/pkg/unittest/test/async_setup_teardown_test.dart b/pkg/unittest/test/async_setup_teardown_test.dart
index 56e7c12..c9138d0 100644
--- a/pkg/unittest/test/async_setup_teardown_test.dart
+++ b/pkg/unittest/test/async_setup_teardown_test.dart
@@ -2,19 +2,19 @@
 // for details. 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;
+library unittest.async_setup_teardown;
 
 import 'dart:async';
-import 'dart:isolate';
 
+import 'package:metatest/metatest.dart';
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+void main() => initTests(_test);
 
-var testName = 'async setup teardown test';
+void _test(message) {
+  initMetatest(message);
 
-var testFunction = (_) {
-  group('good setup/good teardown', () {
+  expectTestsPass('good setup/good teardown', () {
     setUp(() {
       return new Future.value(0);
     });
@@ -23,7 +23,8 @@
     });
     test('foo1', () {});
   });
-  group('good setup/bad teardown', () {
+
+  expectTestResults('good setup/bad teardown', () {
     setUp(() {
       return new Future.value(0);
     });
@@ -31,8 +32,12 @@
       return new Future.error("Failed to complete tearDown");
     });
     test('foo2', () {});
-  });
-  group('bad setup/good teardown', () {
+  }, [{
+    'result': 'error',
+    'message': 'Teardown failed: Caught Failed to complete tearDown'
+  }]);
+
+  expectTestResults('bad setup/good teardown', () {
     setUp(() {
       return new Future.error("Failed to complete setUp");
     });
@@ -40,8 +45,12 @@
       return new Future.value(0);
     });
     test('foo3', () {});
-  });
-  group('bad setup/bad teardown', () {
+  }, [{
+    'result': 'error',
+    'message': 'Setup failed: Caught Failed to complete setUp'
+  }]);
+
+  expectTestResults('bad setup/bad teardown', () {
     setUp(() {
       return new Future.error("Failed to complete setUp");
     });
@@ -49,18 +58,8 @@
       return new Future.error("Failed to complete tearDown");
     });
     test('foo4', () {});
-  });
-  // The next test is just to make sure we make steady progress
-  // through the tests.
-  test('post groups', () {});
-};
-
-final expected = buildStatusString(2, 0, 3,
-    'good setup/good teardown foo1::'
-    'good setup/bad teardown foo2:'
-    'Teardown failed: Caught Failed to complete tearDown:'
-    'bad setup/good teardown foo3:'
-    'Setup failed: Caught Failed to complete setUp:'
-    'bad setup/bad teardown foo4:'
-    'Setup failed: Caught Failed to complete setUp:'
-    'post groups');
+  }, [{
+    'result': 'error',
+    'message': 'Setup failed: Caught Failed to complete setUp'
+  }]);
+}
diff --git a/pkg/unittest/test/breath_test.dart b/pkg/unittest/test/breath_test.dart
index 7b0a038..23eec84 100644
--- a/pkg/unittest/test/breath_test.dart
+++ b/pkg/unittest/test/breath_test.dart
@@ -16,7 +16,9 @@
     var start;
 
     test('initial', () {
-      Timer.run(() { sentinel = 1; });
+      Timer.run(() {
+        sentinel = 1;
+      });
     });
 
     test('starve', () {
diff --git a/pkg/unittest/test/completion_test.dart b/pkg/unittest/test/completion_test.dart
index c1ed574..6803e68 100644
--- a/pkg/unittest/test/completion_test.dart
+++ b/pkg/unittest/test/completion_test.dart
@@ -2,28 +2,32 @@
 // for details. 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;
+library unittest.completion_test;
 
 import 'dart:async';
-import 'dart:isolate';
 
+import 'package:metatest/metatest.dart';
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+void main() => initTests(_test);
 
-var testName = 'completion test';
+void _test(message) {
+  initMetatest(message);
 
-var testFunction = (TestConfiguration testConfig) {
-  test(testName, () {
-    var _callback;
-    _callback = expectAsyncUntil(() {
-      if (++testConfig.count < 10) {
-        _defer(_callback);
-      }
-    },
-    () => (testConfig.count == 10));
-    _defer(_callback);
+  expectTestsPass('completion test', () {
+    var count = 0;
+    test('test', () {
+      var _callback;
+      _callback = expectAsyncUntil(() {
+        if (++count < 10) {
+          new Future.sync(_callback);
+        }
+      }, () => (count == 10));
+      new Future.sync(_callback);
+    });
+
+    test('verify count', () {
+      expect(count, 10);
+    });
   });
-};
-
-var expected = buildStatusString(1, 0, 0, testName, count: 10);
+}
diff --git a/pkg/unittest/test/correct_callback_test.dart b/pkg/unittest/test/correct_callback_test.dart
index a5689b9..f69766e 100644
--- a/pkg/unittest/test/correct_callback_test.dart
+++ b/pkg/unittest/test/correct_callback_test.dart
@@ -2,20 +2,26 @@
 // for details. 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;
+library unittest.correct_callback_test;
 
 import 'dart:async';
-import 'dart:isolate';
 
+import 'package:metatest/metatest.dart';
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+void main() => initTests(_test);
 
-var testName = 'correct callback test';
+void _test(message) {
+  initMetatest(message);
 
-var testFunction = (TestConfiguration testConfig) {
-  test(testName,
-      () =>_defer(expectAsync((){ ++testConfig.count;})));
-};
+  expectTestsPass('correct callback test', () {
+    var count = 0;
+    test('test', () => new Future.sync(expectAsync(() {
+      ++count;
+    })));
 
-var expected = buildStatusString(1, 0, 0, testName, count: 1);
+    test('verify count', () {
+      expect(count, 1);
+    });
+  });
+}
diff --git a/pkg/unittest/test/exception_test.dart b/pkg/unittest/test/exception_test.dart
index f84ac18..023ab28 100644
--- a/pkg/unittest/test/exception_test.dart
+++ b/pkg/unittest/test/exception_test.dart
@@ -2,20 +2,23 @@
 // for details. 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:async';
-import 'dart:isolate';
+library unittest.exception_test;
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testName = 'exception test';
+void main() => initTests(_test);
 
-var testFunction = (_) {
-  test(testName, () { throw new Exception('Fail.'); });
-};
+void _test(message) {
+  initMetatest(message);
 
-var expected =  buildStatusString(0, 0, 1, testName,
-    message: 'Test failed: Caught Exception: Fail.');
+  expectTestResults('good setup/good teardown', () {
+    test('test', () {
+      throw new Exception('Fail.');
+    });
+  }, [{
+    'result': 'error',
+    'message': 'Test failed: Caught Exception: Fail.'
+  }]);
+}
diff --git a/pkg/unittest/test/excess_callback_test.dart b/pkg/unittest/test/excess_callback_test.dart
index 0bd985e..45dca37 100644
--- a/pkg/unittest/test/excess_callback_test.dart
+++ b/pkg/unittest/test/excess_callback_test.dart
@@ -2,29 +2,41 @@
 // for details. 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;
+library unittest.excess_callback_test;
 
 import 'dart:async';
-import 'dart:isolate';
 
+import 'package:metatest/metatest.dart';
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+void main() => initTests(_test);
 
-var testName = 'excess callback test';
+void _test(message) {
+  initMetatest(message);
 
-var testFunction = (TestConfiguration testConfig) {
-  test(testName, () {
-    var _callback0 = expectAsync(() => ++testConfig.count);
-    var _callback1 = expectAsync(() => ++testConfig.count);
-    var _callback2 = expectAsync(() {
-      _callback1();
-      _callback1();
-      _callback0();
+  var count = 0;
+
+  expectTestResults('excess callback test', () {
+    test('test', () {
+      var _callback0 = expectAsync(() => ++count);
+      var _callback1 = expectAsync(() => ++count);
+      var _callback2 = expectAsync(() {
+        _callback1();
+        _callback1();
+        _callback0();
+      });
+      new Future.sync(_callback2);
     });
-    _defer(_callback2);
-  });
-};
 
-var expected = buildStatusString(0, 1, 0, testName,
-    count: 1, message: 'Callback called more times than expected (1).');
+    test('verify count', () {
+      expect(count, 1);
+    });
+  }, [{
+    'description': 'test',
+    'message': 'Callback called more times than expected (1).',
+    'result': 'fail'
+  }, {
+    'description': 'verify count',
+    'result': 'pass',
+  }]);
+}
diff --git a/pkg/unittest/test/expect_async_args_test.dart b/pkg/unittest/test/expect_async_args_test.dart
index 82702b3..a7e6e21 100644
--- a/pkg/unittest/test/expect_async_args_test.dart
+++ b/pkg/unittest/test/expect_async_args_test.dart
@@ -2,37 +2,54 @@
 // for details. 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:async';
-import 'dart:isolate';
+library unittest.expect_async_args_test;
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.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];
-  }
+void main() => initTests(_test);
 
-  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]);
-  });
+void _test(message) {
+  initMetatest(message);
 
-  test('invoked with too many args', () {
-    expectAsync(_getArgs)(1, 2, 3, 4, 5, 6, 7);
-  });
+  expectTestResults('expect async args', () {
+    var count = 0;
+    List<int> _getArgs([a = 0, b = 0, c = 0, d = 0, e = 0, f = 0]) {
+      count++;
+      return [a, b, c, d, e, f];
+    }
 
-  test('created with too many args', () {
-    expectAsync((a1, a2, a3, a4, a5, a6, a7) {
-      testConfig.count++;
-    })();
-  });
-};
+    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]);
+    });
 
-final expected = startsWith('1:0:2:3:3:::null:expect async args::'
-    'invoked with too many args:Test failed:');
+    test('invoked with too many args', () {
+      expectAsync(_getArgs)(1, 2, 3, 4, 5, 6, 7);
+    });
+
+    test('created with too many args', () {
+      expectAsync((a1, a2, a3, a4, a5, a6, a7) {
+        count++;
+      })();
+    });
+
+    test('verify count', () {
+      expect(count, 3);
+    });
+  }, [{
+    'description': 'expect async args',
+    'result': 'pass',
+  }, {
+    'description': 'invoked with too many args',
+    'result': 'error',
+  }, {
+    'description': 'created with too many args',
+    'result': 'error',
+  }, {
+    'description': 'verify count',
+    'result': 'pass',
+  }]);
+}
diff --git a/pkg/unittest/test/expect_async_test.dart b/pkg/unittest/test/expect_async_test.dart
index cd771b1..844e44b 100644
--- a/pkg/unittest/test/expect_async_test.dart
+++ b/pkg/unittest/test/expect_async_test.dart
@@ -2,96 +2,99 @@
 // for details. 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;
+library unittest.expect_async_test;
 
 import 'dart:async';
-import 'dart:isolate';
 
+import 'package:metatest/metatest.dart';
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+void main() => initTests(_test);
 
-var testFunction = (TestConfiguration testConfig) {
-  test('expectAsync zero params', () {
-    _defer(expectAsync(() {
-      ++testConfig.count;
-    }));
-  });
+void _test(message) {
+  initMetatest(message);
 
-  test('expectAsync 1 param', () {
-    var func = expectAsync((arg) {
-      expect(arg, 0);
-      ++testConfig.count;
-    });
-    _defer(() => func(0));
-  });
+  var count = 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;
+  expectTestsPass('expect async test', () {
+    test('expectAsync zero params', () {
+      new Future.sync(expectAsync(() {
+        ++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;
+    test('expectAsync 1 param', () {
+      var func = expectAsync((arg) {
+        expect(arg, 0);
+        ++count;
+      });
+      new Future.sync(() => func(0));
     });
 
-    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;
+    test('expectAsync 2 param', () {
+      var func = expectAsync((arg0, arg1) {
+        expect(arg0, 0);
+        expect(arg1, 1);
+        ++count;
+      });
+      new Future.sync(() => func(0, 1));
     });
 
-    _defer(() => func());
-  });
+    test('single arg to Future.catchError', () {
+      var func = expectAsync((error) {
+        expect(error, isStateError);
+        ++count;
+      });
 
-  test('one of two optional positional args', () {
-    var func = expectAsync(([arg0 = true, arg1 = true]) {
-      expect(arg0, isFalse);
-      expect(arg1, isTrue);
-      ++testConfig.count;
+      new Future(() {
+        throw new StateError('test');
+      }).catchError(func);
     });
 
-    _defer(() => func(false));
-  });
+    test('2 args to Future.catchError', () {
+      var func = expectAsync((error, stack) {
+        expect(error, isStateError);
+        expect(stack is StackTrace, isTrue);
+        ++count;
+      });
 
-  test('two of two optional positional args', () {
-    var func = expectAsync(([arg0 = true, arg1 = true]) {
-      expect(arg0, isFalse);
-      expect(arg1, isNull);
-      ++testConfig.count;
+      new Future(() {
+        throw new StateError('test');
+      }).catchError(func);
     });
 
-    _defer(() => func(false, null));
-  });
-};
+    test('zero of two optional positional args', () {
+      var func = expectAsync(([arg0 = true, arg1 = true]) {
+        expect(arg0, isTrue);
+        expect(arg1, isTrue);
+        ++count;
+      });
 
-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:';
+      new Future.sync(() => func());
+    });
+
+    test('one of two optional positional args', () {
+      var func = expectAsync(([arg0 = true, arg1 = true]) {
+        expect(arg0, isFalse);
+        expect(arg1, isTrue);
+        ++count;
+      });
+
+      new Future.sync(() => func(false));
+    });
+
+    test('two of two optional positional args', () {
+      var func = expectAsync(([arg0 = true, arg1 = true]) {
+        expect(arg0, isFalse);
+        expect(arg1, isNull);
+        ++count;
+      });
+
+      new Future.sync(() => func(false, null));
+    });
+
+    test('verify count', () {
+      expect(count, 8);
+    });
+  });
+}
diff --git a/pkg/unittest/test/group_name_test.dart b/pkg/unittest/test/group_name_test.dart
index c0fdfa0..b833006 100644
--- a/pkg/unittest/test/group_name_test.dart
+++ b/pkg/unittest/test/group_name_test.dart
@@ -2,24 +2,27 @@
 // for details. 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:async';
-import 'dart:isolate';
+library unittest.group_name_test;
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testName = 'group name test';
+void main() => initTests(_test);
 
-var testFunction = (_) {
-  group('a', () {
-    test('a', () {});
-    group('b', () {
-      test('b', () {});
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('group name test', () {
+    group('a', () {
+      test('a', () {});
+      group('b', () {
+        test('b', () {});
+      });
     });
-  });
-};
-
-var expected = buildStatusString(2, 0, 0, 'a a::a b b');
+  }, [{
+    'description': 'a a'
+  }, {
+    'description': 'a b b'
+  }]);
+}
diff --git a/pkg/unittest/test/invalid_ops_test.dart b/pkg/unittest/test/invalid_ops_test.dart
index a1c5190..d9e05e7 100644
--- a/pkg/unittest/test/invalid_ops_test.dart
+++ b/pkg/unittest/test/invalid_ops_test.dart
@@ -2,27 +2,26 @@
 // for details. 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:async';
-import 'dart:isolate';
+library unittest.invalid_ops_test;
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testName = 'invalid ops throw while test is running';
+void main() => initTests(_test);
 
-var testFunction = (_) {
-  test(testName, () {
-    expect(() => test('test', () {}), throwsStateError);
-    expect(() => solo_test('test', () {}), throwsStateError);
-    expect(() => group('test', () {}), throwsStateError);
-    expect(() => solo_group('test', () {}), throwsStateError);
-    expect(() => setUp(() {}), throwsStateError);
-    expect(() => tearDown(() {}), throwsStateError);
-    expect(() => runTests(), throwsStateError);
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('testcases immutable', () {
+    test('test', () {
+      expect(() => test('test', () {}), throwsStateError);
+      expect(() => solo_test('test', () {}), throwsStateError);
+      expect(() => group('test', () {}), throwsStateError);
+      expect(() => solo_group('test', () {}), throwsStateError);
+      expect(() => setUp(() {}), throwsStateError);
+      expect(() => tearDown(() {}), throwsStateError);
+      expect(() => runTests(), throwsStateError);
+    });
   });
-};
-
-var expected = buildStatusString(1, 0, 0, testName);
+}
diff --git a/pkg/unittest/test/late_exception_test.dart b/pkg/unittest/test/late_exception_test.dart
index 4fec977..777085d 100644
--- a/pkg/unittest/test/late_exception_test.dart
+++ b/pkg/unittest/test/late_exception_test.dart
@@ -2,28 +2,36 @@
 // for details. 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;
+library unittest.late_exception_test;
 
 import 'dart:async';
-import 'dart:isolate';
 
+import 'package:metatest/metatest.dart';
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+void main() => initTests(_test);
 
-var testName = 'late exception test';
+void _test(message) {
+  initMetatest(message);
 
-var testFunction = (_) {
-  var f;
-  test('testOne', () {
-    f = expectAsync(() {});
-    _defer(f);
-  });
-  test('testTwo', () {
-    _defer(expectAsync(() { f(); }));
-  });
-};
-
-var expected = buildStatusString(1, 0, 1, 'testOne',
-    message: 'Callback called (2) after test case testOne has already '
-        'been marked as pass.:testTwo:');
+  expectTestResults('late exception test', () {
+    var f;
+    test('testOne', () {
+      f = expectAsync(() {});
+      new Future.sync(f);
+    });
+    test('testTwo', () {
+      new Future.sync(expectAsync(() {
+        f();
+      }));
+    });
+  }, [{
+    'description': 'testOne',
+    'message': 'Callback called (2) after test case testOne has already been '
+        'marked as pass.',
+    'result': 'error',
+  }, {
+    'description': 'testTwo',
+    'result': 'pass',
+  }]);
+}
diff --git a/pkg/unittest/test/middle_exception_test.dart b/pkg/unittest/test/middle_exception_test.dart
index 6fb1b7b..ba2d0d0 100644
--- a/pkg/unittest/test/middle_exception_test.dart
+++ b/pkg/unittest/test/middle_exception_test.dart
@@ -2,28 +2,37 @@
 // for details. 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;
+library unittest.middle_exception_test;
 
 import 'dart:async';
-import 'dart:isolate';
 
+import 'package:metatest/metatest.dart';
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+void main() => initTests(_test);
 
-var testName = 'late exception test';
+void _test(message) {
+  initMetatest(message);
 
-var testFunction = (_) {
-  test('testOne', () { expect(true, isTrue); });
-  test('testTwo', () { expect(true, isFalse); });
-  test('testThree', () {
-    var done = expectAsync(() {});
-    _defer(() {
+  expectTestResults('late exception test', () {
+    test('testOne', () {
       expect(true, isTrue);
-      done();
     });
-  });
-};
-
-final expected = buildStatusString(2, 1, 0,
-    'testOne::testTwo:Expected: false Actual: <true>:testThree');
+    test('testTwo', () {
+      expect(true, isFalse);
+    });
+    test('testThree', () {
+      var done = expectAsync(() {});
+      new Future.sync(() {
+        expect(true, isTrue);
+        done();
+      });
+    });
+  }, [{
+    'result': 'pass'
+  }, {
+    'result': 'fail',
+  }, {
+    'result': 'pass'
+  }]);
+}
diff --git a/pkg/unittest/test/missing_tick_test.dart b/pkg/unittest/test/missing_tick_test.dart
index bc7bd58..bffd0af 100644
--- a/pkg/unittest/test/missing_tick_test.dart
+++ b/pkg/unittest/test/missing_tick_test.dart
@@ -6,13 +6,21 @@
 
 import 'package:unittest/unittest.dart';
 
-// TODO(gram): Convert to a shouldFail passing test.
-void main() {
-  SimpleConfiguration config = unittestConfiguration;
-  config.timeout = const Duration(seconds: 2);
-  group('Broken', () {
+import 'package:metatest/metatest.dart';
+
+void main() => initTests(_test);
+
+void _test(message) {
+  initMetatest(message, timeout: const Duration(seconds: 1));
+
+  expectTestResults('missing tick', () {
+
     test('test that should time out', () {
       expectAsync(() {});
     });
-  });
+  }, [{
+    'description': 'test that should time out',
+    'message': 'Test timed out after 1 seconds.',
+    'result': 'error',
+  }]);
 }
diff --git a/pkg/unittest/test/nested_groups_setup_teardown_test.dart b/pkg/unittest/test/nested_groups_setup_teardown_test.dart
index fdd851a..212c9a88 100644
--- a/pkg/unittest/test/nested_groups_setup_teardown_test.dart
+++ b/pkg/unittest/test/nested_groups_setup_teardown_test.dart
@@ -2,44 +2,64 @@
 // for details. 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;
+library unittest.nested_groups_setup_teardown_test;
 
 import 'dart:async';
-import 'dart:isolate';
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testName = 'nested groups setup/teardown';
+void main() => initTests(_test);
 
-var testFunction = (_) {
-  StringBuffer s = new StringBuffer();
-  group('level 1', () {
-    setUp(makeDelayedSetup(1, s));
-    group('level 2', () {
-      setUp(makeImmediateSetup(2, s));
-      tearDown(makeDelayedTeardown(2, s));
-      group('level 3', () {
-        group('level 4', () {
-          setUp(makeDelayedSetup(4, s));
-          tearDown(makeImmediateTeardown(4, s));
-          group('level 5', () {
-            setUp(makeImmediateSetup(5, s));
-            group('level 6', () {
-              tearDown(makeDelayedTeardown(6, s));
-              test('inner', () {});
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('nested groups setup/teardown', () {
+    StringBuffer s = new StringBuffer();
+    group('level 1', () {
+      setUp(makeDelayedSetup(1, s));
+      group('level 2', () {
+        setUp(makeImmediateSetup(2, s));
+        tearDown(makeDelayedTeardown(2, s));
+        group('level 3', () {
+          group('level 4', () {
+            setUp(makeDelayedSetup(4, s));
+            tearDown(makeImmediateTeardown(4, s));
+            group('level 5', () {
+              setUp(makeImmediateSetup(5, s));
+              group('level 6', () {
+                tearDown(makeDelayedTeardown(6, s));
+                test('inner', () {});
+              });
             });
           });
         });
       });
     });
+    test('after nest', () {
+      expect(s.toString(), "l1 U l2 U l4 U l5 U l6 D l4 D l2 D ");
+    });
   });
-  test('after nest', () {
-    expect(s.toString(), "l1 U l2 U l4 U l5 U l6 D l4 D l2 D ");
+}
+
+
+Function makeDelayedSetup(int index, StringBuffer s) => () {
+  return new Future.delayed(new Duration(milliseconds: 1), () {
+    s.write('l$index U ');
   });
 };
 
-var expected = buildStatusString(2, 0, 0,
-    'level 1 level 2 level 3 level 4 level 5 level 6 inner::'
-    'after nest');
+Function makeDelayedTeardown(int index, StringBuffer s) => () {
+  return new Future.delayed(new Duration(milliseconds: 1), () {
+    s.write('l$index D ');
+  });
+};
+
+Function makeImmediateSetup(int index, StringBuffer s) => () {
+  s.write('l$index U ');
+};
+
+Function makeImmediateTeardown(int index, StringBuffer s) => () {
+  s.write('l$index D ');
+};
diff --git a/pkg/unittest/test/protect_async_test.dart b/pkg/unittest/test/protect_async_test.dart
index 8fd6765..d62816a 100644
--- a/pkg/unittest/test/protect_async_test.dart
+++ b/pkg/unittest/test/protect_async_test.dart
@@ -2,44 +2,55 @@
 // for details. 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;
+library unittest.protect_async_test;
 
 import 'dart:async';
-import 'dart:isolate';
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testFunction = (_) {
-  test('protectAsync0', () {
-    var protected = () {
-      throw new StateError('error during protectAsync0');
-    };
-    new Future(protected);
-  });
+void main() => initTests(_test);
 
-  test('protectAsync1', () {
-    var protected = (arg) {
-      throw new StateError('error during protectAsync1: $arg');
-    };
-    new Future(() => protected('one arg'));
-  });
+void _test(message) {
+  initMetatest(message);
 
-  test('protectAsync2', () {
-    var protected = (arg1, arg2) {
-      throw new StateError('error during protectAsync2: $arg1, $arg2');
-    };
-    new Future(() => protected('arg1', 'arg2'));
-  });
+  expectTestResults('protectAsync', () {
+    test('protectAsync0', () {
+      var protected = () {
+        throw new StateError('error during protectAsync0');
+      };
+      new Future(protected);
+    });
 
-  test('throw away 1', () {
-    return new Future(() {});
-  });
-};
+    test('protectAsync1', () {
+      var protected = (arg) {
+        throw new StateError('error during protectAsync1: $arg');
+      };
+      new Future(() => protected('one arg'));
+    });
 
-var expected = '1:0:3:4:0:::null:'
-  'protectAsync0:Caught Bad state: error during protectAsync0:'
-  'protectAsync1:Caught Bad state: error during protectAsync1: one arg:'
-  'protectAsync2:Caught Bad state: error during protectAsync2: arg1, arg2:'
-  'throw away 1:';
+    test('protectAsync2', () {
+      var protected = (arg1, arg2) {
+        throw new StateError('error during protectAsync2: $arg1, $arg2');
+      };
+      new Future(() => protected('arg1', 'arg2'));
+    });
+
+    test('throw away 1', () {
+      return new Future(() {});
+    });
+  }, [{
+    'result': 'error',
+    'message': 'Caught Bad state: error during protectAsync0'
+  }, {
+    'result': 'error',
+    'message': 'Caught Bad state: error during protectAsync1: one arg'
+  }, {
+    'result': 'error',
+    'message': 'Caught Bad state: error during protectAsync2: arg1, arg2'
+  }, {
+    'result': 'pass',
+    'message': ''
+  }]);
+}
diff --git a/pkg/unittest/test/returning_future_test.dart b/pkg/unittest/test/returning_future_test.dart
index 97faf8e..d522643 100644
--- a/pkg/unittest/test/returning_future_test.dart
+++ b/pkg/unittest/test/returning_future_test.dart
@@ -2,63 +2,73 @@
 // for details. 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;
+library unittest.returning_future_test;
 
 import 'dart:async';
-import 'dart:isolate';
 
+import 'package:metatest/metatest.dart';
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+void main() => initTests(_test);
 
-var testName = 'test returning future';
+void _test(message) {
+  initMetatest(message);
 
-var testFunction = (_) {
-  test("successful", () {
-    return _defer(() {
-      expect(true, true);
+  expectTestResults('returning futures', () {
+    test("successful", () {
+      return new Future.sync(() {
+        expect(true, true);
+      });
     });
-  });
-  // We repeat the fail and error tests, because during development
-  // I had a situation where either worked fine on their own, and
-  // error/fail worked, but fail/error would time out.
-  test("error1", () {
-    var callback = expectAsync(() {});
-    var excesscallback = expectAsync(() {});
-    return _defer(() {
-      excesscallback();
-      excesscallback();
-      excesscallback();
-      callback();
+    // We repeat the fail and error tests, because during development
+    // I had a situation where either worked fine on their own, and
+    // error/fail worked, but fail/error would time out.
+    test("error1", () {
+      var callback = expectAsync(() {});
+      var excesscallback = expectAsync(() {});
+      return new Future.sync(() {
+        excesscallback();
+        excesscallback();
+        excesscallback();
+        callback();
+      });
     });
-  });
-  test("fail1", () {
-    return _defer(() {
-      expect(true, false);
+    test("fail1", () {
+      return new Future.sync(() {
+        expect(true, false);
+      });
     });
-  });
-  test("error2", () {
-    var callback = expectAsync(() {});
-    var excesscallback = expectAsync(() {});
-    return _defer(() {
-      excesscallback();
-      excesscallback();
-      callback();
+    test("error2", () {
+      var callback = expectAsync(() {});
+      var excesscallback = expectAsync(() {});
+      return new Future.sync(() {
+        excesscallback();
+        excesscallback();
+        callback();
+      });
     });
-  });
-  test("fail2", () {
-    return _defer(() {
-      fail('failure');
+    test("fail2", () {
+      return new Future.sync(() {
+        fail('failure');
+      });
     });
-  });
-  test('foo5', () {
-  });
-};
-
-var expected = buildStatusString(2, 4, 0,
-    'successful::'
-    'error1:Callback called more times than expected (1).:'
-    'fail1:Expected: <false> Actual: <true>:'
-    'error2:Callback called more times than expected (1).:'
-    'fail2:failure:'
-    'foo5');
+    test('foo5', () {
+    });
+  }, [{
+    'result': 'pass'
+  }, {
+    'result': 'fail',
+    'message': 'Callback called more times than expected (1).'
+  }, {
+    'result': 'fail',
+    'message': 'Expected: <false>\n  Actual: <true>\n'
+  }, {
+    'result': 'fail',
+    'message': 'Callback called more times than expected (1).'
+  }, {
+    'result': 'fail',
+    'message': 'failure'
+  }, {
+    'result': 'pass'
+  }]);
+}
diff --git a/pkg/unittest/test/returning_future_using_runasync_test.dart b/pkg/unittest/test/returning_future_using_runasync_test.dart
index 0ba0b48..2f50173 100644
--- a/pkg/unittest/test/returning_future_using_runasync_test.dart
+++ b/pkg/unittest/test/returning_future_using_runasync_test.dart
@@ -2,74 +2,90 @@
 // for details. 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;
+library unittest.returning_future_using_runasync_test;
 
 import 'dart:async';
-import 'dart:isolate';
 
+import 'package:metatest/metatest.dart';
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+void main() => initTests(_test);
 
-var testName = 'test returning future using scheduleMicrotask';
+void _test(message) {
+  initMetatest(message);
 
-var testFunction = (_) {
-  test("successful", () {
-    return _defer(() {
-      scheduleMicrotask(() {
-        expect(true, true);
+  expectTestResults('test returning future using scheduleMicrotask', () {
+    test("successful", () {
+      return new Future.sync(() {
+        scheduleMicrotask(() {
+          expect(true, true);
+        });
       });
     });
-  });
-  test("fail1", () {
-    var callback = expectAsync(() {});
-    return _defer(() {
-      scheduleMicrotask(() {
-        expect(true, false);
-        callback();
+    test("fail1", () {
+      var callback = expectAsync(() {});
+      return new Future.sync(() {
+        scheduleMicrotask(() {
+          expect(true, false);
+          callback();
+        });
       });
     });
-  });
-  test('error1', () {
-    var callback = expectAsync(() {});
-    var excesscallback = expectAsync(() {});
-    return _defer(() {
-      scheduleMicrotask(() {
-        excesscallback();
-        excesscallback();
-        callback();
+    test('error1', () {
+      var callback = expectAsync(() {});
+      var excesscallback = expectAsync(() {});
+      return new Future.sync(() {
+        scheduleMicrotask(() {
+          excesscallback();
+          excesscallback();
+          callback();
+        });
       });
     });
-  });
-  test("fail2", () {
-    var callback = expectAsync(() {});
-    return _defer(() {
-      scheduleMicrotask(() {
-        fail('failure');
-        callback();
+    test("fail2", () {
+      var callback = expectAsync(() {});
+      return new Future.sync(() {
+        scheduleMicrotask(() {
+          fail('failure');
+          callback();
+        });
       });
     });
-  });
-  test('error2', () {
-    var callback = expectAsync(() {});
-    var excesscallback = expectAsync(() {});
-    return _defer(() {
-      scheduleMicrotask(() {
-        excesscallback();
-        excesscallback();
-        excesscallback();
-        callback();
+    test('error2', () {
+      var callback = expectAsync(() {});
+      var excesscallback = expectAsync(() {});
+      return new Future.sync(() {
+        scheduleMicrotask(() {
+          excesscallback();
+          excesscallback();
+          excesscallback();
+          callback();
+        });
       });
     });
-  });
-  test('foo6', () {
-  });
-};
-
-final expected = buildStatusString(2, 4, 0,
-    'successful::'
-    'fail1:Expected: <false> Actual: <true>:'
-    'error1:Callback called more times than expected (1).:'
-    'fail2:failure:'
-    'error2:Callback called more times than expected (1).:'
-    'foo6');
+    test('foo6', () {
+    });
+  }, [{
+    'description': 'successful',
+    'result': 'pass',
+  }, {
+    'description': 'fail1',
+    'message': 'Expected: <false>\n' '  Actual: <true>\n' '',
+    'result': 'fail',
+  }, {
+    'description': 'error1',
+    'message': 'Callback called more times than expected (1).',
+    'result': 'fail',
+  }, {
+    'description': 'fail2',
+    'message': 'failure',
+    'result': 'fail',
+  }, {
+    'description': 'error2',
+    'message': 'Callback called more times than expected (1).',
+    'result': 'fail',
+  }, {
+    'description': 'foo6',
+    'result': 'pass',
+  }]);
+}
diff --git a/pkg/unittest/test/runtests_without_tests_test.dart b/pkg/unittest/test/runtests_without_tests_test.dart
index b4c95122..4257dda 100644
--- a/pkg/unittest/test/runtests_without_tests_test.dart
+++ b/pkg/unittest/test/runtests_without_tests_test.dart
@@ -2,19 +2,18 @@
 // for details. 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:async';
-import 'dart:isolate';
+library unittest.runtests_without_tests;
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testName = 'runTests() without tests';
+void main() => initTests(_test);
 
-var testFunction = (_) {
-  runTests();
-};
+void _test(message) {
+  initMetatest(message);
 
-var expected = buildStatusString(0, 0, 0, null);
+  expectTestResults('runTests() without tests', () {
+    group('no tests', () {});
+  }, []);
+}
diff --git a/pkg/unittest/test/setup_and_teardown_test.dart b/pkg/unittest/test/setup_and_teardown_test.dart
index 4b3a7f8..3712137 100644
--- a/pkg/unittest/test/setup_and_teardown_test.dart
+++ b/pkg/unittest/test/setup_and_teardown_test.dart
@@ -2,24 +2,34 @@
 // for details. 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:async';
-import 'dart:isolate';
+library unittest.setup_and_teardown_test;
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testName = 'setup and teardown test';
+void main() => initTests(_test);
 
-var testFunction = (TestConfiguration testConfig) {
-  group('a', () {
-    setUp(() { testConfig.setup = 'setup'; });
-    tearDown(() { testConfig.teardown = 'teardown'; });
-    test(testName, () {});
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('setup and teardown test', () {
+    var hasSetup = false;
+    var hasTeardown = false;
+
+    group('a', () {
+      setUp(() {
+        hasSetup = true;
+      });
+      tearDown(() {
+        hasTeardown = true;
+      });
+      test('test', () {});
+    });
+
+    test('verify', () {
+      expect(hasSetup, isTrue);
+      expect(hasTeardown, isTrue);
+    });
   });
-};
-
-var expected = buildStatusString(1, 0, 0, 'a $testName', count: 0,
-    setup: 'setup', teardown: 'teardown');
+}
diff --git a/pkg/unittest/test/setup_test.dart b/pkg/unittest/test/setup_test.dart
index dfb5ee1..ba27b44 100644
--- a/pkg/unittest/test/setup_test.dart
+++ b/pkg/unittest/test/setup_test.dart
@@ -2,23 +2,26 @@
 // for details. 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:async';
-import 'dart:isolate';
+library unittest.setup_test;
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testName = 'setup test';
+void main() => initTests(_test);
 
-var testFunction = (TestConfiguration testConfig) {
-  group('a', () {
-    setUp(() { testConfig.setup = 'setup'; });
-    test(testName, () {});
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('setup test', () {
+    group('a', () {
+      var hasSetup = false;
+      setUp(() {
+        hasSetup = true;
+      });
+      test('test', () {
+        expect(hasSetup, isTrue);
+      });
+    });
   });
-};
-
-var expected = buildStatusString(1, 0, 0, 'a $testName',
-    count: 0, setup: 'setup');
+}
diff --git a/pkg/unittest/test/single_correct_test.dart b/pkg/unittest/test/single_correct_test.dart
index f10ff0c..a6b4155 100644
--- a/pkg/unittest/test/single_correct_test.dart
+++ b/pkg/unittest/test/single_correct_test.dart
@@ -2,19 +2,18 @@
 // for details. 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:async';
-import 'dart:isolate';
+library unittest.single_correct_test;
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testName = 'single correct test';
+void main() => initTests(_test);
 
-var testFunction = (_) {
-  test(testName, () => expect(2 + 3, equals(5)));
-};
+void _test(message) {
+  initMetatest(message);
 
-var expected = buildStatusString(1, 0, 0, testName);
+  expectTestsPass('single correct test', () {
+    test('test', () => expect(2 + 3, equals(5)));
+  });
+}
diff --git a/pkg/unittest/test/single_failing_test.dart b/pkg/unittest/test/single_failing_test.dart
index 0ba648e..e9c1819 100644
--- a/pkg/unittest/test/single_failing_test.dart
+++ b/pkg/unittest/test/single_failing_test.dart
@@ -2,20 +2,18 @@
 // for details. 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:async';
-import 'dart:isolate';
+library unittest.single_failing_test;
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testName = 'single failing test';
+void main() => initTests(_test);
 
-var testFunction = (_) {
-  test(testName, () => expect(2 + 2, equals(5)));
-};
+void _test(message) {
+  initMetatest(message);
 
-var expected = buildStatusString(0, 1, 0, testName,
-    message: 'Expected: <5> Actual: <4>');
+  expectTestsFail('single failing test', () {
+    test('test', () => expect(2 + 2, equals(5)));
+  });
+}
diff --git a/pkg/unittest/test/skipped_soloed_nested_test.dart b/pkg/unittest/test/skipped_soloed_nested_test.dart
index cf32f2c..35d7d24 100644
--- a/pkg/unittest/test/skipped_soloed_nested_test.dart
+++ b/pkg/unittest/test/skipped_soloed_nested_test.dart
@@ -2,77 +2,88 @@
 // for details. 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:async';
-import 'dart:isolate';
+library unittest.skipped_soloed_nested_test;
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testName = 'skipped/soloed nested groups with setup/teardown';
+void main() => initTests(_test);
 
-var testFunction = (_) {
-  StringBuffer s = null;
-  setUp(() {
-    if (s == null) s = new StringBuffer();
-  });
-  test('top level', () {
-    s.write('A');
-  });
-  skip_test('skipped top level', () {
-    s.write('B');
-  });
-  skip_group('skipped top level group', () {
+void _test(message) {
+  initMetatest(message);
+
+  expectTestResults('skipped/soloed nested groups with setup/teardown', () {
+    StringBuffer s = null;
     setUp(() {
-      s.write('C');
+      if (s == null) s = new StringBuffer();
     });
-    solo_test('skipped solo nested test', () {
-      s.write('D');
+    test('top level', () {
+      s.write('A');
     });
-  });
-  group('non-solo group', () {
-    setUp(() {
-      s.write('E');
+    skip_test('skipped top level', () {
+      s.write('B');
     });
-    test('in non-solo group', () {
-      s.write('F');
-    });
-    solo_test('solo_test in non-solo group', () {
-      s.write('G');
-    });
-  });
-  solo_group('solo group', () {
-    setUp(() {
-      s.write('H');
-    });
-    test('solo group non-solo test', () {
-      s.write('I');
-    });
-    solo_test('solo group solo test', () {
-      s.write('J');
-    });
-    group('nested non-solo group in solo group', () {
-      test('nested non-solo group non-solo test', () {
-        s.write('K');
+    skip_group('skipped top level group', () {
+      setUp(() {
+        s.write('C');
       });
-      solo_test('nested non-solo group solo test', () {
-        s.write('L');
+      solo_test('skipped solo nested test', () {
+        s.write('D');
       });
     });
-  });
-  solo_test('final', () {
-    expect(s.toString(), "EGHIHJHKHL");
-  });
-};
-
-var expected =  buildStatusString(6, 0, 0,
-    'non-solo group solo_test in non-solo group::'
-    'solo group solo group non-solo test::'
-    'solo group solo group solo test::'
-    'solo group nested non-solo group in solo group nested non-'
-    'solo group non-solo test::'
-    'solo group nested non-solo group in solo'
-    ' group nested non-solo group solo test::'
-    'final');
+    group('non-solo group', () {
+      setUp(() {
+        s.write('E');
+      });
+      test('in non-solo group', () {
+        s.write('F');
+      });
+      solo_test('solo_test in non-solo group', () {
+        s.write('G');
+      });
+    });
+    solo_group('solo group', () {
+      setUp(() {
+        s.write('H');
+      });
+      test('solo group non-solo test', () {
+        s.write('I');
+      });
+      solo_test('solo group solo test', () {
+        s.write('J');
+      });
+      group('nested non-solo group in solo group', () {
+        test('nested non-solo group non-solo test', () {
+          s.write('K');
+        });
+        solo_test('nested non-solo group solo test', () {
+          s.write('L');
+        });
+      });
+    });
+    solo_test('final', () {
+      expect(s.toString(), "EGHIHJHKHL");
+    });
+  }, [{
+    'description': 'non-solo group solo_test in non-solo group',
+    'result': 'pass',
+  }, {
+    'description': 'solo group solo group non-solo test',
+    'result': 'pass',
+  }, {
+    'description': 'solo group solo group solo test',
+    'result': 'pass',
+  }, {
+    'description': 'solo group nested non-solo group in solo group '
+        'nested non-solo group non-solo test',
+    'result': 'pass',
+  }, {
+    'description': 'solo group nested non-solo group in solo group '
+        'nested non-solo group solo test',
+    'result': 'pass',
+  }, {
+    'description': 'final',
+    'result': 'pass',
+  }]);
+}
diff --git a/pkg/unittest/test/teardown_test.dart b/pkg/unittest/test/teardown_test.dart
index 8d23398..b1f6ee0 100644
--- a/pkg/unittest/test/teardown_test.dart
+++ b/pkg/unittest/test/teardown_test.dart
@@ -2,23 +2,29 @@
 // for details. 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:async';
-import 'dart:isolate';
+library unittest.teardown_test;
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testName = 'teardown test';
+void main() => initTests(_test);
 
-var testFunction = (TestConfiguration testConfig) {
-  group('a', () {
-    tearDown(() { testConfig.teardown = 'teardown'; });
-    test(testName, () {});
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('teardown test', () {
+    var tornDown = false;
+
+    group('a', () {
+      tearDown(() {
+        tornDown = true;
+      });
+      test('test', () {});
+    });
+
+    test('expect teardown', () {
+      expect(tornDown, isTrue);
+    });
   });
-};
-
-var expected = buildStatusString(1, 0, 0, 'a $testName',
-    count: 0, setup: '', teardown: 'teardown');
+}
diff --git a/pkg/unittest/test/testcases_immutable_test.dart b/pkg/unittest/test/testcases_immutable_test.dart
index ddd42d2..c744fa1 100644
--- a/pkg/unittest/test/testcases_immutable_test.dart
+++ b/pkg/unittest/test/testcases_immutable_test.dart
@@ -2,22 +2,21 @@
 // for details. 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:async';
-import 'dart:isolate';
+library unittest.testcases_immutable;
 
 import 'package:unittest/unittest.dart';
 
-part 'utils.dart';
+import 'package:metatest/metatest.dart';
 
-var testName = 'testcases immutable';
+void main() => initTests(_test);
 
-var testFunction = (_) {
-  test(testName, () {
-    expect(() => testCases.clear(), throwsUnsupportedError);
-    expect(() => testCases.removeLast(), throwsUnsupportedError);
+void _test(message) {
+  initMetatest(message);
+
+  expectTestsPass('testcases immutable', () {
+    test('test', () {
+      expect(() => testCases.clear(), throwsUnsupportedError);
+      expect(() => testCases.removeLast(), throwsUnsupportedError);
+    });
   });
-};
-
-var expected = buildStatusString(1, 0, 0, testName);
+}
diff --git a/pkg/unittest/test/utils.dart b/pkg/unittest/test/utils.dart
deleted file mode 100644
index 553d359..0000000
--- a/pkg/unittest/test/utils.dart
+++ /dev/null
@@ -1,96 +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 unittestTest;
-
-/**
- * Schedule [fn] for future execution in an event handler.
- */
-Future _defer(void fn()) {
-  return new Future(fn);
-}
-
-String buildStatusString(int passed, int failed, int errors,
-                         var results,
-                         {int count: 0,
-                         String setup: '', String teardown: '',
-                         String uncaughtError: null,
-                         String message: ''}) {
-  var totalTests = 0;
-  var testDetails = new StringBuffer();
-  if (results == null) {
-    // no op
-    assert(message == '');
-  } else if (results is String) {
-    totalTests = passed + failed + errors;
-    testDetails.write(':$results:$message');
-  } else {
-    totalTests = results.length;
-    for (var i = 0; i < results.length; i++) {
-      testDetails.write(':${results[i].description}:'
-          '${collapseWhitespace(results[i].message)}');
-    }
-  }
-  return '$passed:$failed:$errors:$totalTests:$count:'
-      '$setup:$teardown:$uncaughtError$testDetails';
-}
-
-class TestConfiguration extends Configuration {
-
-  // Some test state that is captured.
-  int count = 0; // A count of callbacks.
-  String setup = ''; // The name of the test group setup function, if any.
-  String teardown = ''; // The name of the group teardown function, if any.
-
-  // The port to communicate with the parent isolate
-  final SendPort _port;
-  String _result;
-
-  TestConfiguration(this._port): super.blank();
-
-  void onSummary(int passed, int failed, int errors, List<TestCase> results,
-      String uncaughtError) {
-    _result = buildStatusString(passed, failed, errors, results,
-        count: count, setup: setup, teardown: teardown,
-        uncaughtError: uncaughtError);
-  }
-
-  void onDone(bool success) {
-    _port.send(_result);
-  }
-}
-
-Function makeDelayedSetup(index, s) => () {
-  return new Future.delayed(new Duration(milliseconds: 1), () {
-    s.write('l$index U ');
-  });
-};
-
-Function makeDelayedTeardown(index, s) => () {
-  return new Future.delayed(new Duration(milliseconds: 1), () {
-    s.write('l$index D ');
-  });
-};
-
-Function makeImmediateSetup(index, s) => () {
-  s.write('l$index U ');
-};
-
-Function makeImmediateTeardown(index, s) => () {
-  s.write('l$index D ');
-};
-
-void runTestInIsolate(sendport) {
-  var testConfig = new TestConfiguration(sendport);
-  unittestConfiguration = testConfig;
-  testFunction(testConfig);
-}
-
-void main() {
-  var replyPort = new ReceivePort();
-  Isolate.spawn(runTestInIsolate, replyPort.sendPort);
-  replyPort.first.then((String msg) {
-    expect(msg.trim(), expected);
-  });
-}
diff --git a/pkg/web_components/CHANGELOG.md b/pkg/web_components/CHANGELOG.md
index 837de65..94901ea 100644
--- a/pkg/web_components/CHANGELOG.md
+++ b/pkg/web_components/CHANGELOG.md
@@ -1,3 +1,9 @@
+#### Pub version 0.7.1-dev
+  * Update to platform version 0.4.1-d214582.
+
+#### Pub version 0.7.0+1
+  * Cherry pick https://github.com/Polymer/ShadowDOM/pull/506 to fix IOS 8.
+
 #### Pub version 0.7.0
   * Updated to 0.4.0-5a7353d release, with same cherry pick as 0.6.0+1.
   * Many features were moved into the polymer package, this package is now
diff --git a/pkg/web_components/lib/build.log b/pkg/web_components/lib/build.log
index 62346a0..2625367 100644
--- a/pkg/web_components/lib/build.log
+++ b/pkg/web_components/lib/build.log
@@ -1,14 +1,14 @@
 BUILD LOG
 ---------
-Build Time: 2014-09-10T15:36:06
+Build Time: 2014-09-22T10:39:00
 
 NODEJS INFORMATION
 ==================
 nodejs: v0.10.29
-grunt: 0.4.5
 chai: 1.9.1
-grunt-audit: 0.0.3
+grunt: 0.4.5
 grunt-concat-sourcemap: 0.4.3
+grunt-audit: 0.0.3
 grunt-contrib-concat: 0.4.0
 grunt-contrib-uglify: 0.5.1
 grunt-karma: 0.8.3
@@ -22,12 +22,12 @@
 
 REPO REVISIONS
 ==============
-CustomElements: c2605585e079b042e5c0fba84bc1d25f7b530ae9
-HTMLImports: d0c8d08f23ed407288bcac385e19747a3fbeba96
-ShadowDOM: 481f9adb761c2226ccd94a35140a7d6f3830257d
+CustomElements: 85981b0986799744f452bd71ee6170f9d05851ac
+HTMLImports: 77efd89e04ae63a3ee7c88cb7e1d2784cf60dcb1
+ShadowDOM: bb82f0b0d361e90ca5efb1c59dd44c976ffeffb4
 URL: 35e0e6aaab5979d277afa4822a2776a7fb7562ba
-platform-dev: 5a7353db53048b8ab4caa6279a56de7d1097d824
+platform-dev: d214582dd9537aa4cf0d6034d33c071be2970a66
 
 BUILD HASHES
 ============
-build/platform.js: f590b5e657640112e98eb5d428885f429789d913
\ No newline at end of file
+build/platform.js: fe9dc71d22c46bb23f01014e77cdda430227b114
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.concat.js b/pkg/web_components/lib/platform.concat.js
index c4009c6..dccbcc9 100644
--- a/pkg/web_components/lib/platform.concat.js
+++ b/pkg/web_components/lib/platform.concat.js
@@ -115,19 +115,14 @@
 // select ShadowDOM impl

 if (Platform.flags.shadow) {

 
-// Copyright 2012 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+/*
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
 
 (function(global) {
   'use strict';
@@ -187,7 +182,7 @@
     // Firefox OS Apps do not allow eval. This feature detection is very hacky
     // but even if some other platform adds support for this function this code
     // will continue to work.
-    if (navigator.getDeviceStorage) {
+    if (typeof navigator != 'undefined' && navigator.getDeviceStorage) {
       return false;
     }
 
@@ -202,7 +197,7 @@
   var hasEval = detectEval();
 
   function isIndex(s) {
-    return +s === s >>> 0;
+    return +s === s >>> 0 && s !== '';
   }
 
   function toNumber(s) {
@@ -916,26 +911,12 @@
 
   var runningMicrotaskCheckpoint = false;
 
-  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {
-    try {
-      eval('%RunMicrotasks()');
-      return true;
-    } catch (ex) {
-      return false;
-    }
-  })();
-
   global.Platform = global.Platform || {};
 
   global.Platform.performMicrotaskCheckpoint = function() {
     if (runningMicrotaskCheckpoint)
       return;
 
-    if (hasDebugForceFullDelivery) {
-      eval('%RunMicrotasks()');
-      return;
-    }
-
     if (!collectObservers)
       return;
 
@@ -2019,6 +2000,15 @@
     }
   }
 
+  // Safari 8 exposes WebIDL attributes as an invalid accessor property. Its
+  // descriptor has {get: undefined, set: undefined}. We therefore ignore the
+  // shape of the descriptor and make all properties read-write.
+  // https://bugs.webkit.org/show_bug.cgi?id=49739
+  var isBrokenSafari = function() {
+    var descr = Object.getOwnPropertyDescriptor(Node.prototype, 'nodeType');
+    return !!descr && 'set' in descr;
+  }();
+
   function installProperty(source, target, allowMethod, opt_blacklist) {
     var names = getOwnPropertyNames(source);
     for (var i = 0; i < names.length; i++) {
@@ -2049,7 +2039,7 @@
       else
         getter = getGetter(name);
 
-      if (descriptor.writable || descriptor.set) {
+      if (descriptor.writable || descriptor.set || isBrokenSafari) {
         if (isEvent)
           setter = scope.getEventHandlerSetter(name);
         else
@@ -3009,6 +2999,19 @@
     }
   }
 
+
+  function isLoadLikeEvent(event) {
+    switch (event.type) {
+      // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object
+      case 'load':
+      // http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#unloading-documents
+      case 'beforeunload':
+      case 'unload':
+        return true;
+    }
+    return false;
+  }
+
   function dispatchEvent(event, originalWrapperTarget) {
     if (currentlyDispatchingEvents.get(event))
       throw new Error('InvalidStateError');
@@ -3026,12 +3029,11 @@
     // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end
     var overrideTarget;
     var win;
-    var type = event.type;
 
     // Should really be not cancelable too but since Firefox has a bug there
     // we skip that check.
     // https://bugzilla.mozilla.org/show_bug.cgi?id=999456
-    if (type === 'load' && !event.bubbles) {
+    if (isLoadLikeEvent(event) && !event.bubbles) {
       var doc = originalWrapperTarget;
       if (doc instanceof wrappers.Document && (win = doc.defaultView)) {
         overrideTarget = doc;
@@ -3046,7 +3048,7 @@
       } else {
         eventPath = getEventPath(originalWrapperTarget, event);
 
-        if (event.type !== 'load') {
+        if (!isLoadLikeEvent(event)) {
           var doc = eventPath[eventPath.length - 1];
           if (doc instanceof wrappers.Document)
             win = doc.defaultView;
@@ -3152,7 +3154,6 @@
     var type = event.type;
 
     var anyRemoved = false;
-    // targetTable.set(event, target);
     targetTable.set(event, target);
     currentTargetTable.set(event, currentTarget);
 
@@ -3237,7 +3238,12 @@
   function Event(type, options) {
     if (type instanceof OriginalEvent) {
       var impl = type;
-      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload') {
+      // In browsers that do not correctly support BeforeUnloadEvent we get to
+      // the generic Event wrapper but we still want to ensure we create a
+      // BeforeUnloadEvent. Since BeforeUnloadEvent calls super, we need to
+      // prevent reentrancty.
+      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload' &&
+          !(this instanceof BeforeUnloadEvent)) {
         return new BeforeUnloadEvent(impl);
       }
       setWrapper(impl, this);
@@ -4601,6 +4607,8 @@
   scope.nodeWasRemoved = nodeWasRemoved;
   scope.nodesWereAdded = nodesWereAdded;
   scope.nodesWereRemoved = nodesWereRemoved;
+  scope.originalInsertBefore = originalInsertBefore;
+  scope.originalRemoveChild = originalRemoveChild;
   scope.snapshotNodeList = snapshotNodeList;
   scope.wrappers.Node = Node;
 
@@ -6705,7 +6713,7 @@
       refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;
     }
 
-    parentNode.insertBefore(newChild, refChild);
+    scope.originalInsertBefore.call(parentNode, newChild, refChild);
   }
 
   function remove(nodeWrapper) {
@@ -6727,7 +6735,7 @@
     if (parentNodeWrapper.firstChild === nodeWrapper)
       parentNodeWrapper.firstChild_ = nodeWrapper;
 
-    parentNode.removeChild(node);
+    scope.originalRemoveChild.call(parentNode, node);
   }
 
   var distributedNodesTable = new WeakMap();
@@ -6930,7 +6938,7 @@
 
     // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms
     distribution: function(root) {
-      this.resetAll(root);
+      this.resetAllSubtrees(root);
       this.distributionResolution(root);
     },
 
@@ -6940,6 +6948,10 @@
       else
         resetDestinationInsertionPoints(node);
 
+      this.resetAllSubtrees(node);
+    },
+
+    resetAllSubtrees: function(node) {
       for (var child = node.firstChild; child; child = child.nextSibling) {
         this.resetAll(child);
       }
@@ -7880,6 +7892,7 @@
   var unwrap = scope.unwrap;
 
   var OriginalFormData = window.FormData;
+  if (!OriginalFormData) return;
 
   function FormData(formElement) {
     var impl;
@@ -7897,6 +7910,26 @@
 
 })(window.ShadowDOMPolyfill);
 
+/*
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  var unwrapIfNeeded = scope.unwrapIfNeeded;
+  var originalSend = XMLHttpRequest.prototype.send;
+
+  // Since we only need to adjust XHR.send, we just patch it instead of wrapping
+  // the entire object. This happens when FormData is passed.
+  XMLHttpRequest.prototype.send = function(obj) {
+    return originalSend.call(this, unwrapIfNeeded(obj));
+  };
+
+})(window.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
@@ -9524,96 +9557,6 @@
 })(window.Platform);
 
 /*
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
-
-(function(scope) {
-
-  'use strict';
-
-  // polyfill performance.now
-
-  if (!window.performance) {
-    var start = Date.now();
-    // only at millisecond precision
-    window.performance = {now: function(){ return Date.now() - start }};
-  }
-
-  // polyfill for requestAnimationFrame
-
-  if (!window.requestAnimationFrame) {
-    window.requestAnimationFrame = (function() {
-      var nativeRaf = window.webkitRequestAnimationFrame ||
-        window.mozRequestAnimationFrame;
-
-      return nativeRaf ?
-        function(callback) {
-          return nativeRaf(function() {
-            callback(performance.now());
-          });
-        } :
-        function( callback ){
-          return window.setTimeout(callback, 1000 / 60);
-        };
-    })();
-  }
-
-  if (!window.cancelAnimationFrame) {
-    window.cancelAnimationFrame = (function() {
-      return  window.webkitCancelAnimationFrame ||
-        window.mozCancelAnimationFrame ||
-        function(id) {
-          clearTimeout(id);
-        };
-    })();
-  }
-
-  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports
-  // polyfill, scripts in the main document run before imports. That means
-  // if (1) polymer is imported and (2) Polymer() is called in the main document
-  // in a script after the import, 2 occurs before 1. We correct this here
-  // by specfiically patching Polymer(); this is not necessary under native
-  // HTMLImports.
-  var elementDeclarations = [];
-
-  var polymerStub = function(name, dictionary) {
-    Array.prototype.push.call(arguments, document._currentScript);
-    elementDeclarations.push(arguments);
-  };
-  window.Polymer = polymerStub;
-
-  // deliver queued delcarations
-  scope.consumeDeclarations = function(callback) {
-    scope.consumeDeclarations = function() {
-     throw 'Possible attempt to load Polymer twice';
-    };
-    if (callback) {
-      callback(elementDeclarations);
-    }
-    elementDeclarations = null;
-  };
-
-  // Once DOMContent has loaded, any main document scripts that depend on
-  // Polymer() should have run. Calling Polymer() now is an error until
-  // polymer is imported.
-  window.addEventListener('DOMContentLoaded', function() {
-    if (window.Polymer === polymerStub) {
-      window.Polymer = function() {
-        console.error('You tried to use polymer without loading it first. To ' +
-          'load polymer, <link rel="import" href="' + 
-          'components/polymer/polymer.html">');
-      };
-    }
-  });
-
-})(window.Platform);
-
-/*
  * Copyright 2012 The Polymer Authors. All rights reserved.
  * Use of this source code is goverened by a BSD-style
  * license that can be found in the LICENSE file.
@@ -10282,8 +10225,14 @@
 

 // NOTE: test for native imports loading is based on explicitly watching

 // all imports (see below).

+// We cannot rely on this entirely without watching the entire document

+// for import links. For perf reasons, currently only head is watched.

+// Instead, we fallback to checking if the import property is available 

+// and the document is not itself loading. 

 function isImportLoaded(link) {

-  return useNative ? link.__loaded : link.__importParsed;

+  return useNative ? link.__loaded || 

+      (link.import && link.import.readyState !== 'loading') :

+      link.__importParsed;

 }

 

 // TODO(sorvell): Workaround for 

@@ -10759,10 +10708,14 @@
   },
   // determine the next element in the tree which should be parsed
   nextToParse: function() {
+    this._mayParse = [];
     return !this.parsingElement && this.nextToParseInDoc(mainDoc);
   },
   nextToParseInDoc: function(doc, link) {
-    if (doc) {
+    // use `marParse` list to avoid looping into the same document again
+    // since it could cause an iloop.
+    if (doc && this._mayParse.indexOf(doc) < 0) {
+      this._mayParse.push(doc);
       var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));
       for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {
         if (!this.isParsed(n)) {
@@ -11492,14 +11445,34 @@
   logFlags.dom && console.groupEnd();

 }

 

+/*

+This method is intended to be called when the document tree (including imports)

+has pending custom elements to upgrade. It can be called multiple times and 

+should do nothing if no elements are in need of upgrade.

+

+Note that the import tree can consume itself and therefore special care

+must be taken to avoid recursion.

+*/

+var upgradedDocuments;

 function upgradeDocumentTree(doc) {

+  upgradedDocuments = [];

+  _upgradeDocumentTree(doc);

+  upgradedDocuments = null;

+}

+

+

+function _upgradeDocumentTree(doc) {

   doc = wrapIfNeeded(doc);

+  if (upgradedDocuments.indexOf(doc) >= 0) {

+    return;

+  }

+  upgradedDocuments.push(doc);

   //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());

   // upgrade contained imported documents

   var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');

   for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {

     if (n.import && n.import.__parsed) {

-      upgradeDocumentTree(n.import);

+      _upgradeDocumentTree(n.import);

     }

   }

   upgradeDocument(doc);

@@ -12182,20 +12155,120 @@
 
 (function(scope) {
 
-  // TODO(sorvell): It's desireable to provide a default stylesheet 
+  'use strict';
+
+  // polyfill performance.now
+
+  if (!window.performance) {
+    var start = Date.now();
+    // only at millisecond precision
+    window.performance = {now: function(){ return Date.now() - start }};
+  }
+
+  // polyfill for requestAnimationFrame
+
+  if (!window.requestAnimationFrame) {
+    window.requestAnimationFrame = (function() {
+      var nativeRaf = window.webkitRequestAnimationFrame ||
+        window.mozRequestAnimationFrame;
+
+      return nativeRaf ?
+        function(callback) {
+          return nativeRaf(function() {
+            callback(performance.now());
+          });
+        } :
+        function( callback ){
+          return window.setTimeout(callback, 1000 / 60);
+        };
+    })();
+  }
+
+  if (!window.cancelAnimationFrame) {
+    window.cancelAnimationFrame = (function() {
+      return  window.webkitCancelAnimationFrame ||
+        window.mozCancelAnimationFrame ||
+        function(id) {
+          clearTimeout(id);
+        };
+    })();
+  }
+
+  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports
+  // polyfill, scripts in the main document run before imports. That means
+  // if (1) polymer is imported and (2) Polymer() is called in the main document
+  // in a script after the import, 2 occurs before 1. We correct this here
+  // by specfiically patching Polymer(); this is not necessary under native
+  // HTMLImports.
+  var elementDeclarations = [];
+
+  var polymerStub = function(name, dictionary) {
+    if ((typeof name !== 'string') && (arguments.length === 1)) {
+      Array.prototype.push.call(arguments, document._currentScript);
+    }
+    elementDeclarations.push(arguments);
+  };
+  window.Polymer = polymerStub;
+
+  // deliver queued delcarations
+  scope.consumeDeclarations = function(callback) {
+    scope.consumeDeclarations = function() {
+     throw 'Possible attempt to load Polymer twice';
+    };
+    if (callback) {
+      callback(elementDeclarations);
+    }
+    elementDeclarations = null;
+  };
+
+  function installPolymerWarning() {
+    if (window.Polymer === polymerStub) {
+      window.Polymer = function() {
+        throw new Error('You tried to use polymer without loading it first. To ' +
+          'load polymer, <link rel="import" href="' + 
+          'components/polymer/polymer.html">');
+      };
+    }
+  }
+
+  // Once DOMContent has loaded, any main document scripts that depend on
+  // Polymer() should have run. Calling Polymer() now is an error until
+  // polymer is imported.
+  if (HTMLImports.useNative) {
+    installPolymerWarning();
+  } else {
+    addEventListener('DOMContentLoaded', installPolymerWarning);
+  }
+
+})(window.Platform);
+
+/*
+ * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+(function(scope) {
+
+  // It's desireable to provide a default stylesheet 
   // that's convenient for styling unresolved elements, but
   // it's cumbersome to have to include this manually in every page.
   // It would make sense to put inside some HTMLImport but 
   // the HTMLImports polyfill does not allow loading of stylesheets 
   // that block rendering. Therefore this injection is tolerated here.
-
+  //
+  // NOTE: position: relative fixes IE's failure to inherit opacity 
+  // when a child is not statically positioned.
   var style = document.createElement('style');
   style.textContent = ''
       + 'body {'
       + 'transition: opacity ease-in 0.2s;' 
       + ' } \n'
       + 'body[unresolved] {'
-      + 'opacity: 0; display: block; overflow: hidden;' 
+      + 'opacity: 0; display: block; overflow: hidden; position: relative;' 
       + ' } \n'
       ;
   var head = document.querySelector('head');
diff --git a/pkg/web_components/lib/platform.concat.js.map b/pkg/web_components/lib/platform.concat.js.map
index fda9673..878ed44 100644
--- a/pkg/web_components/lib/platform.concat.js.map
+++ b/pkg/web_components/lib/platform.concat.js.map
@@ -51,6 +51,7 @@
     "../ShadowDOM/src/wrappers/Window.js",
     "../ShadowDOM/src/wrappers/DataTransfer.js",
     "../ShadowDOM/src/wrappers/FormData.js",
+    "../ShadowDOM/src/wrappers/XMLHttpRequest.js",
     "../ShadowDOM/src/wrappers/override-constructors.js",
     "src/patches-shadowdom-polyfill.js",
     "src/ShadowCSS.js",
@@ -59,7 +60,6 @@
     "build/end-if.js",
     "../URL/url.js",
     "src/lang.js",
-    "src/dom.js",
     "../MutationObservers/MutationObserver.js",
     "../HTMLImports/src/scope.js",
     "../HTMLImports/src/base.js",
@@ -74,25 +74,26 @@
     "../CustomElements/src/Parser.js",
     "../CustomElements/src/boot.js",
     "src/patches-custom-elements.js",
+    "src/dom.js",
     "src/unresolved.js",
     "src/module.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;A;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9rDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACv4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3wBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3BA,C;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sD;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uB;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4D;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0B;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;A;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3qDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACv5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3wBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3BA,C;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sD;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uB;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4D;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0B;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
   "sourcesContent": [
     "/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n",
     "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        var hasValue = entry[0] === key;\n        entry[0] = entry[1] = undefined;\n        return hasValue;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n",
     "// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n",
-    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
-    "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  // The name of the implementation property is intentionally hard to\n  // remember. Unfortunately, browsers are slower doing obj[expr] than\n  // obj.foo so we resort to repeat this ugly name. This ugly name is never\n  // used outside of this file though.\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name) :\n        function() { return this.__impl4cf1e782hg__[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.__impl4cf1e782hg__.' + name + ' = v') :\n        function(v) { this.__impl4cf1e782hg__[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name +\n                     '.apply(this.__impl4cf1e782hg__, arguments)') :\n        function() {\n          return this.__impl4cf1e782hg__[name].apply(\n              this.__impl4cf1e782hg__, arguments);\n        };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  function isWrapper(object) {\n    return object && object.__impl4cf1e782hg__;\n  }\n\n  function isNative(object) {\n    return !isWrapper(object);\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.__wrapper8e3dd93a60__ ||\n        (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function unsafeUnwrap(wrapper) {\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function setWrapper(impl, wrapper) {\n    wrapper.__impl4cf1e782hg__ = impl;\n    impl.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.__impl4cf1e782hg__[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.setWrapper = setWrapper;\n  scope.unsafeUnwrap = unsafeUnwrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (typeof navigator != 'undefined' && navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0 && s !== '';\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n",
+    "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  // The name of the implementation property is intentionally hard to\n  // remember. Unfortunately, browsers are slower doing obj[expr] than\n  // obj.foo so we resort to repeat this ugly name. This ugly name is never\n  // used outside of this file though.\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name) :\n        function() { return this.__impl4cf1e782hg__[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.__impl4cf1e782hg__.' + name + ' = v') :\n        function(v) { this.__impl4cf1e782hg__[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name +\n                     '.apply(this.__impl4cf1e782hg__, arguments)') :\n        function() {\n          return this.__impl4cf1e782hg__[name].apply(\n              this.__impl4cf1e782hg__, arguments);\n        };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  // Safari 8 exposes WebIDL attributes as an invalid accessor property. Its\n  // descriptor has {get: undefined, set: undefined}. We therefore ignore the\n  // shape of the descriptor and make all properties read-write.\n  // https://bugs.webkit.org/show_bug.cgi?id=49739\n  var isBrokenSafari = function() {\n    var descr = Object.getOwnPropertyDescriptor(Node.prototype, 'nodeType');\n    return !!descr && 'set' in descr;\n  }();\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set || isBrokenSafari) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  function isWrapper(object) {\n    return object && object.__impl4cf1e782hg__;\n  }\n\n  function isNative(object) {\n    return !isWrapper(object);\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.__wrapper8e3dd93a60__ ||\n        (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function unsafeUnwrap(wrapper) {\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function setWrapper(impl, wrapper) {\n    wrapper.__impl4cf1e782hg__ = impl;\n    impl.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.__impl4cf1e782hg__[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.setWrapper = setWrapper;\n  scope.unsafeUnwrap = unsafeUnwrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback() {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    while (globalMutationObservers.length) {\n      var notifyList = globalMutationObservers;\n      globalMutationObservers = [];\n\n      // Deliver changes in birth order of the MutationObservers.\n      notifyList.sort(function(x, y) { return x.uid_ - y.uid_; });\n\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n        }\n      }\n    }\n  }\n\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyObserversEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      if (!observer.records_.length) {\n        globalMutationObservers.push(observer);\n        anyObserversEnqueued = true;\n      }\n      observer.records_.push(record);\n    }\n\n    if (anyObserversEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  MutationObserver.prototype = {\n    constructor: MutationObserver,\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n",
     "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload') {\n        return new BeforeUnloadEvent(impl);\n      }\n      setWrapper(impl, this);\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        setWrapper(type, this);\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return unsafeUnwrap(this).returnValue;\n    },\n    set returnValue(v) {\n      unsafeUnwrap(this).returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    setWrapper(impl, this);\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element =\n        wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n\n  function isLoadLikeEvent(event) {\n    switch (event.type) {\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n      case 'load':\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#unloading-documents\n      case 'beforeunload':\n      case 'unload':\n        return true;\n    }\n    return false;\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (isLoadLikeEvent(event) && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (!isLoadLikeEvent(event)) {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      // In browsers that do not correctly support BeforeUnloadEvent we get to\n      // the generic Event wrapper but we still want to ensure we create a\n      // BeforeUnloadEvent. Since BeforeUnloadEvent calls super, we need to\n      // prevent reentrancty.\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload' &&\n          !(this instanceof BeforeUnloadEvent)) {\n        return new BeforeUnloadEvent(impl);\n      }\n      setWrapper(impl, this);\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        setWrapper(type, this);\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return unsafeUnwrap(this).returnValue;\n    },\n    set returnValue(v) {\n      unsafeUnwrap(this).returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    setWrapper(impl, this);\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element =\n        wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    setWrapper(impl, this);\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(unsafeUnwrap(this).target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return unsafeUnwrap(this)[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unsafeUnwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unsafeUnwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unsafeUnwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n",
     "// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(\n          unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n",
-    "/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false));\n    else\n      clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(unsafeUnwrap(this), childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to unsafeUnwrap(this).textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        unsafeUnwrap(this).textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(unsafeUnwrap(this),\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false));\n    else\n      clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(unsafeUnwrap(this), childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to unsafeUnwrap(this).textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        unsafeUnwrap(this).textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(unsafeUnwrap(this),\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.originalInsertBefore = originalInsertBefore;\n  scope.originalRemoveChild = originalRemoveChild;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n  var getTreeScope = scope.getTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var originalDocumentQuerySelector = document.querySelector;\n  var originalElementQuerySelector = document.documentElement.querySelector;\n\n  var originalDocumentQuerySelectorAll = document.querySelectorAll;\n  var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;\n\n  var originalDocumentGetElementsByTagName = document.getElementsByTagName;\n  var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;\n\n  var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;\n  var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;\n\n  var OriginalElement = window.Element;\n  var OriginalDocument = window.HTMLDocument || window.Document;\n\n  function filterNodeList(list, index, result, deep) {\n    var wrappedItem = null;\n    var root = null;\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrappedItem = wrap(list[i]);\n      if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          continue;\n        }\n      }\n      result[index++] = wrappedItem;\n    }\n\n    return index;\n  }\n\n  function shimSelector(selector) {\n    return String(selector).replace(/\\/deep\\//g, ' ');\n  }\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalNameOnly(el, ns, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, index, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[index++] = el;\n      index = findElements(el, index, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return index;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  function querySelectorAllFiltered(p, index, result, selector, deep) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementQuerySelectorAll.call(target, selector);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentQuerySelectorAll.call(target, selector);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    }\n\n    return filterNodeList(list, index, result, deep);\n  }\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var target = unsafeUnwrap(this);\n      var wrappedItem;\n      var root = getTreeScope(this).root;\n      if (root instanceof scope.wrappers.ShadowRoot) {\n        // We are in the shadow tree and the logical tree is\n        // going to be disconnected so we do a manual tree traversal\n        return findOne(this, selector);\n      } else if (target instanceof OriginalElement) {\n        wrappedItem = wrap(originalElementQuerySelector.call(target, selector));\n      } else if (target instanceof OriginalDocument) {\n        wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));\n      } else {\n        // When we get a ShadowRoot the logical tree is going to be disconnected\n        // so we do a manual tree traversal\n        return findOne(this, selector);\n      }\n\n      if (!wrappedItem) {\n        // When the original query returns nothing\n        // we return nothing (to be consistent with the other wrapped calls)\n        return wrappedItem;\n      } else if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          // When the original query returns an element in the ShadowDOM\n          // we must do a manual tree traversal\n          return findOne(this, selector);\n        }\n      }\n\n      return wrappedItem;\n    },\n    querySelectorAll: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var result = new NodeList();\n\n      result.length = querySelectorAllFiltered.call(this,\n          matchesSelector,\n          0,\n          result,\n          selector,\n          deep);\n\n      return result;\n    }\n  };\n\n  function getElementsByTagNameFiltered(p, index, result, localName,\n                                        lowercase) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagName.call(target, localName,\n                                                      lowercase);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagName.call(target, localName,\n                                                       lowercase);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagNameNS.call(target, ns, localName);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      var match = localName === '*' ? matchesEveryThing : matchesTagName;\n\n      result.length = getElementsByTagNameFiltered.call(this,\n          match,\n          0,\n          result,\n          localName,\n          localName.toLowerCase());\n\n      return result;\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n      var match = null;\n\n      if (ns === '*') {\n        match = localName === '*' ? matchesEveryThing : matchesLocalNameOnly;\n      } else {\n        match = localName === '*' ? matchesNameSpace : matchesLocalNameNS;\n      }\n\n      result.length = getElementsByTagNameNSFiltered.call(this,\n          match,\n          0,\n          result,\n          ns || null,\n          localName);\n\n      return result;\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return unsafeUnwrap(this).data;\n    },\n    set data(value) {\n      var oldValue = unsafeUnwrap(this).data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      unsafeUnwrap(this).data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n",
@@ -122,13 +123,14 @@
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    setWrapper(impl, this);\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(unsafeUnwrap(this).startContainer);\n    },\n    get endContainer() {\n      return wrap(unsafeUnwrap(this).endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(unsafeUnwrap(this).commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(unsafeUnwrap(this).extractContents());\n    },\n    cloneContents: function() {\n      return wrap(unsafeUnwrap(this).cloneContents());\n    },\n    insertNode: function(node) {\n      unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(unsafeUnwrap(this).cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(unsafeUnwrap(this).createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    constructor: ShadowRoot,\n\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer)\n          parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      unsafeUnwrap(node).polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  //   negation\n  var selectorStartCharRe = /^(:not\\()?[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    scope.originalInsertBefore.call(parentNode, newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    scope.originalRemoveChild.call(parentNode, node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer)\n          parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAllSubtrees(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      this.resetAllSubtrees(node);\n    },\n\n    resetAllSubtrees: function(node) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      unsafeUnwrap(node).polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  //   negation\n  var selectorStartCharRe = /^(:not\\()?[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    setWrapper(impl, this);\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(unsafeUnwrap(this).anchorNode);\n    },\n    get focusNode() {\n      return wrap(unsafeUnwrap(this).focusNode);\n    },\n    addRange: function(range) {\n      unsafeUnwrap(this).addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(unsafeUnwrap(this).getRangeAt(index));\n    },\n    removeRange: function(range) {\n      unsafeUnwrap(this).removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      unsafeUnwrap(this).selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, unsafeUnwrap(this));\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        setWrapper(node, this);\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    setWrapper(impl, this);\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(unsafeUnwrap(this), arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      return wrap(this || window).getDefaultComputedStyle(\n          unwrapIfNeeded(el), pseudo);\n    };\n  }\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getDefaultComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    Window.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      renderAllPending();\n      return originalGetDefaultComputedStyle.call(unwrap(this),\n          unwrapIfNeeded(el),pseudo);\n    };\n  }\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n",
     "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  if (OriginalDataTransferSetDragImage) {\n    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n    };\n  }\n\n})(window.ShadowDOMPolyfill);\n",
-    "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n\n  function FormData(formElement) {\n    var impl;\n    if (formElement instanceof OriginalFormData) {\n      impl = formElement;\n    } else {\n      impl = new OriginalFormData(formElement && unwrap(formElement));\n    }\n    setWrapper(impl, this);\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n  if (!OriginalFormData) return;\n\n  function FormData(formElement) {\n    var impl;\n    if (formElement instanceof OriginalFormData) {\n      impl = formElement;\n    } else {\n      impl = new OriginalFormData(formElement && unwrap(formElement));\n    }\n    setWrapper(impl, this);\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var originalSend = XMLHttpRequest.prototype.send;\n\n  // Since we only need to adjust XHR.send, we just patch it instead of wrapping\n  // the entire object. This happens when FormData is passed.\n  XMLHttpRequest.prototype.send = function(obj) {\n    return originalSend.call(this, unwrapIfNeeded(obj));\n  };\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // KEYFRAMES_RULE in IE throws when we query cssText\n          // when it contains a -webkit- property.\n          // if this happens, we fallback to constructing the rule\n          // from the CSSRuleSet\n          // https://connect.microsoft.com/IE/feedbackdetail/view/955703/accessing-csstext-of-a-keyframe-rule-that-contains-a-webkit-property-via-cssom-generates-exception\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            if (rule.type === CSSRule.KEYFRAMES_RULE && rule.cssRules) {\n              cssText += this.ieSafeCssTextFromKeyFrameRule(rule);\n            }\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  ieSafeCssTextFromKeyFrameRule: function(rule) {\n    var cssText = '@keyframes ' + rule.name + ' {';\n    Array.prototype.forEach.call(rule.cssRules, function(rule) {\n      cssText += ' ' + rule.keyText + ' {' + rule.style.cssText + '}';\n    });\n    cssText += ' }';\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*?['\"](.*?)['\"][;\\s]*}([^{]*?){/gim,  \n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = Array.prototype.slice.call(style.sheet.cssRules, 0);\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = elt.__resource;\n        }\n        // relay on HTMLImports for path fixup\n        HTMLImports.path.resolveUrlsInStyle(style);\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            this.addElementToDocument(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n",
@@ -137,22 +139,22 @@
     "}",
     "/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  // Copy over the static methods\n  var OriginalURL = scope.URL;\n  if (OriginalURL) {\n    jURL.createObjectURL = function(blob) {\n      // IE extension allows a second optional options argument.\n      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx\n      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n    };\n    jURL.revokeObjectURL = function(url) {\n      OriginalURL.revokeObjectURL(url);\n    };\n  }\n\n  scope.URL = jURL;\n\n})(this);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n})(window.Platform);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    Array.prototype.push.call(arguments, document._currentScript);\n    elementDeclarations.push(arguments);\n  };\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.consumeDeclarations = function(callback) {\n    scope.consumeDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    if (callback) {\n      callback(elementDeclarations);\n    }\n    elementDeclarations = null;\n  };\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n})(window.Platform);\n",
     "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};",
-    "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\nvar hasNative = ('import' in document.createElement('link'));\r\nvar useNative = hasNative;\r\n\r\nisIE = /Trident/.test(navigator.userAgent);\r\n\r\n// TODO(sorvell): SD polyfill intrusion\r\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\r\nvar wrap = function(node) {\r\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\r\n};\r\nvar mainDoc = wrap(document);\r\n    \r\n// NOTE: We cannot polyfill document.currentScript because it's not possible\r\n// both to override and maintain the ability to capture the native value;\r\n// therefore we choose to expose _currentScript both when native imports\r\n// and the polyfill are in use.\r\nvar currentScriptDescriptor = {\r\n  get: function() {\r\n    var script = HTMLImports.currentScript || document.currentScript ||\r\n        // NOTE: only works when called in synchronously executing code.\r\n        // readyState should check if `loading` but IE10 is \r\n        // interactive when scripts run so we cheat.\r\n        (document.readyState !== 'complete' ? \r\n        document.scripts[document.scripts.length - 1] : null);\r\n    return wrap(script);\r\n  },\r\n  configurable: true\r\n};\r\n\r\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\r\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\r\n\r\n// call a callback when all HTMLImports in the document at call (or at least\r\n//  document ready) time have loaded.\r\n// 1. ensure the document is in a ready state (has dom), then \r\n// 2. watch for loading of imports and call callback when done\r\nfunction whenImportsReady(callback, doc) {\r\n  doc = doc || mainDoc;\r\n  // if document is loading, wait and try again\r\n  whenDocumentReady(function() {\r\n    watchImportsLoad(callback, doc);\r\n  }, doc);\r\n}\r\n\r\n// call the callback when the document is in a ready state (has dom)\r\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\r\nvar READY_EVENT = 'readystatechange';\r\nfunction isDocumentReady(doc) {\r\n  return (doc.readyState === 'complete' ||\r\n      doc.readyState === requiredReadyState);\r\n}\r\n\r\n// call <callback> when we ensure the document is in a ready state\r\nfunction whenDocumentReady(callback, doc) {\r\n  if (!isDocumentReady(doc)) {\r\n    var checkReady = function() {\r\n      if (doc.readyState === 'complete' || \r\n          doc.readyState === requiredReadyState) {\r\n        doc.removeEventListener(READY_EVENT, checkReady);\r\n        whenDocumentReady(callback, doc);\r\n      }\r\n    };\r\n    doc.addEventListener(READY_EVENT, checkReady);\r\n  } else if (callback) {\r\n    callback();\r\n  }\r\n}\r\n\r\nfunction markTargetLoaded(event) {\r\n  event.target.__loaded = true;\r\n}\r\n\r\n// call <callback> when we ensure all imports have loaded\r\nfunction watchImportsLoad(callback, doc) {\r\n  var imports = doc.querySelectorAll('link[rel=import]');\r\n  var loaded = 0, l = imports.length;\r\n  function checkDone(d) { \r\n    if (loaded == l) {\r\n      callback && callback();\r\n    }\r\n  }\r\n  function loadedImport(e) {\r\n    markTargetLoaded(e);\r\n    loaded++;\r\n    checkDone();\r\n  }\r\n  if (l) {\r\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\r\n      if (isImportLoaded(imp)) {\r\n        loadedImport.call(imp, {target: imp});\r\n      } else {\r\n        imp.addEventListener('load', loadedImport);\r\n        imp.addEventListener('error', loadedImport);\r\n      }\r\n    }\r\n  } else {\r\n    checkDone();\r\n  }\r\n}\r\n\r\n// NOTE: test for native imports loading is based on explicitly watching\r\n// all imports (see below).\r\nfunction isImportLoaded(link) {\r\n  return useNative ? link.__loaded : link.__importParsed;\r\n}\r\n\r\n// TODO(sorvell): Workaround for \r\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\r\n// this bug is addressed.\r\n// (1) Install a mutation observer to see when HTMLImports have loaded\r\n// (2) if this script is run during document load it will watch any existing\r\n// imports for loading.\r\n//\r\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\r\n// with imports that are added to document.head since the mutation observer \r\n// watches only head for perf reasons, (2) it requires this script\r\n// to run before any imports have completed loading.\r\nif (useNative) {\r\n  new MutationObserver(function(mxns) {\r\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\r\n      if (m.addedNodes) {\r\n        handleImports(m.addedNodes);\r\n      }\r\n    }\r\n  }).observe(document.head, {childList: true});\r\n\r\n  function handleImports(nodes) {\r\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\r\n      if (isImport(n)) {\r\n        handleImport(n);  \r\n      }\r\n    }\r\n  }\r\n\r\n  function isImport(element) {\r\n    return element.localName === 'link' && element.rel === 'import';\r\n  }\r\n\r\n  function handleImport(element) {\r\n    var loaded = element.import;\r\n    if (loaded) {\r\n      markTargetLoaded({target: element});\r\n    } else {\r\n      element.addEventListener('load', markTargetLoaded);\r\n      element.addEventListener('error', markTargetLoaded);\r\n    }\r\n  }\r\n\r\n  // make sure to catch any imports that are in the process of loading\r\n  // when this script is run.\r\n  (function() {\r\n    if (document.readyState === 'loading') {\r\n      var imports = document.querySelectorAll('link[rel=import]');\r\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\r\n        handleImport(imp);\r\n      }\r\n    }\r\n  })();\r\n\r\n}\r\n\r\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \r\n// have loaded. This event is required to simulate the script blocking \r\n// behavior of native imports. A main document script that needs to be sure\r\n// imports have loaded should wait for this event.\r\nwhenImportsReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  mainDoc.dispatchEvent(\r\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\r\n  );\r\n});\r\n\r\n// exports\r\nscope.useNative = useNative;\r\nscope.isImportLoaded = isImportLoaded;\r\nscope.whenReady = whenImportsReady;\r\nscope.isIE = isIE;\r\n\r\n// deprecated\r\nscope.whenImportsReady = whenImportsReady;\r\n\r\n})(window.HTMLImports);",
+    "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\nvar hasNative = ('import' in document.createElement('link'));\r\nvar useNative = hasNative;\r\n\r\nisIE = /Trident/.test(navigator.userAgent);\r\n\r\n// TODO(sorvell): SD polyfill intrusion\r\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\r\nvar wrap = function(node) {\r\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\r\n};\r\nvar mainDoc = wrap(document);\r\n    \r\n// NOTE: We cannot polyfill document.currentScript because it's not possible\r\n// both to override and maintain the ability to capture the native value;\r\n// therefore we choose to expose _currentScript both when native imports\r\n// and the polyfill are in use.\r\nvar currentScriptDescriptor = {\r\n  get: function() {\r\n    var script = HTMLImports.currentScript || document.currentScript ||\r\n        // NOTE: only works when called in synchronously executing code.\r\n        // readyState should check if `loading` but IE10 is \r\n        // interactive when scripts run so we cheat.\r\n        (document.readyState !== 'complete' ? \r\n        document.scripts[document.scripts.length - 1] : null);\r\n    return wrap(script);\r\n  },\r\n  configurable: true\r\n};\r\n\r\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\r\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\r\n\r\n// call a callback when all HTMLImports in the document at call (or at least\r\n//  document ready) time have loaded.\r\n// 1. ensure the document is in a ready state (has dom), then \r\n// 2. watch for loading of imports and call callback when done\r\nfunction whenImportsReady(callback, doc) {\r\n  doc = doc || mainDoc;\r\n  // if document is loading, wait and try again\r\n  whenDocumentReady(function() {\r\n    watchImportsLoad(callback, doc);\r\n  }, doc);\r\n}\r\n\r\n// call the callback when the document is in a ready state (has dom)\r\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\r\nvar READY_EVENT = 'readystatechange';\r\nfunction isDocumentReady(doc) {\r\n  return (doc.readyState === 'complete' ||\r\n      doc.readyState === requiredReadyState);\r\n}\r\n\r\n// call <callback> when we ensure the document is in a ready state\r\nfunction whenDocumentReady(callback, doc) {\r\n  if (!isDocumentReady(doc)) {\r\n    var checkReady = function() {\r\n      if (doc.readyState === 'complete' || \r\n          doc.readyState === requiredReadyState) {\r\n        doc.removeEventListener(READY_EVENT, checkReady);\r\n        whenDocumentReady(callback, doc);\r\n      }\r\n    };\r\n    doc.addEventListener(READY_EVENT, checkReady);\r\n  } else if (callback) {\r\n    callback();\r\n  }\r\n}\r\n\r\nfunction markTargetLoaded(event) {\r\n  event.target.__loaded = true;\r\n}\r\n\r\n// call <callback> when we ensure all imports have loaded\r\nfunction watchImportsLoad(callback, doc) {\r\n  var imports = doc.querySelectorAll('link[rel=import]');\r\n  var loaded = 0, l = imports.length;\r\n  function checkDone(d) { \r\n    if (loaded == l) {\r\n      callback && callback();\r\n    }\r\n  }\r\n  function loadedImport(e) {\r\n    markTargetLoaded(e);\r\n    loaded++;\r\n    checkDone();\r\n  }\r\n  if (l) {\r\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\r\n      if (isImportLoaded(imp)) {\r\n        loadedImport.call(imp, {target: imp});\r\n      } else {\r\n        imp.addEventListener('load', loadedImport);\r\n        imp.addEventListener('error', loadedImport);\r\n      }\r\n    }\r\n  } else {\r\n    checkDone();\r\n  }\r\n}\r\n\r\n// NOTE: test for native imports loading is based on explicitly watching\r\n// all imports (see below).\r\n// We cannot rely on this entirely without watching the entire document\r\n// for import links. For perf reasons, currently only head is watched.\r\n// Instead, we fallback to checking if the import property is available \r\n// and the document is not itself loading. \r\nfunction isImportLoaded(link) {\r\n  return useNative ? link.__loaded || \r\n      (link.import && link.import.readyState !== 'loading') :\r\n      link.__importParsed;\r\n}\r\n\r\n// TODO(sorvell): Workaround for \r\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\r\n// this bug is addressed.\r\n// (1) Install a mutation observer to see when HTMLImports have loaded\r\n// (2) if this script is run during document load it will watch any existing\r\n// imports for loading.\r\n//\r\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\r\n// with imports that are added to document.head since the mutation observer \r\n// watches only head for perf reasons, (2) it requires this script\r\n// to run before any imports have completed loading.\r\nif (useNative) {\r\n  new MutationObserver(function(mxns) {\r\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\r\n      if (m.addedNodes) {\r\n        handleImports(m.addedNodes);\r\n      }\r\n    }\r\n  }).observe(document.head, {childList: true});\r\n\r\n  function handleImports(nodes) {\r\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\r\n      if (isImport(n)) {\r\n        handleImport(n);  \r\n      }\r\n    }\r\n  }\r\n\r\n  function isImport(element) {\r\n    return element.localName === 'link' && element.rel === 'import';\r\n  }\r\n\r\n  function handleImport(element) {\r\n    var loaded = element.import;\r\n    if (loaded) {\r\n      markTargetLoaded({target: element});\r\n    } else {\r\n      element.addEventListener('load', markTargetLoaded);\r\n      element.addEventListener('error', markTargetLoaded);\r\n    }\r\n  }\r\n\r\n  // make sure to catch any imports that are in the process of loading\r\n  // when this script is run.\r\n  (function() {\r\n    if (document.readyState === 'loading') {\r\n      var imports = document.querySelectorAll('link[rel=import]');\r\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\r\n        handleImport(imp);\r\n      }\r\n    }\r\n  })();\r\n\r\n}\r\n\r\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \r\n// have loaded. This event is required to simulate the script blocking \r\n// behavior of native imports. A main document script that needs to be sure\r\n// imports have loaded should wait for this event.\r\nwhenImportsReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  mainDoc.dispatchEvent(\r\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\r\n  );\r\n});\r\n\r\n// exports\r\nscope.useNative = useNative;\r\nscope.isImportLoaded = isImportLoaded;\r\nscope.whenReady = whenImportsReady;\r\nscope.isIE = isIE;\r\n\r\n// deprecated\r\nscope.whenImportsReady = whenImportsReady;\r\n\r\n})(window.HTMLImports);",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        // If url was redirected, use the redirected location so paths are\n        // calculated relative to that.\n        this.onload(url, p, resource, err, redirectedUrl);\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : locationHeader;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIE = scope.isIE;\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    if (elt.import) {\n      elt.import.__importParsed = true;\n    }\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource && !elt.__error) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    this.addElementToDocument(elt);\n  },\n  rootImportForElement: function(elt) {\n    var n = elt;\n    while (n.ownerDocument.__importLink) {\n      n = n.ownerDocument.__importLink;\n    }\n    return n;\n  },\n  addElementToDocument: function(elt) {\n    var port = this.rootImportForElement(elt.__importElement || elt);\n    var l = port.__insertedElements = port.__insertedElements || 0;\n    var refNode = port.nextElementSibling;\n    for (var i=0; i < l; i++) {\n      refNode = refNode && refNode.nextElementSibling;\n    }\n    port.parentNode.insertBefore(elt, refNode);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIE && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    this.addElementToDocument(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    if (doc) {\n      var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n      for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n        if (!this.isParsed(n)) {\n          if (this.hasResource(n)) {\n            return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n          } else {\n            return;\n          }\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && (node.import === undefined)) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  return 'data:text/javascript;charset=utf-8,' + encodeURIComponent(scriptContent);\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\n\n})(HTMLImports);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIE = scope.isIE;\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    if (elt.import) {\n      elt.import.__importParsed = true;\n    }\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource && !elt.__error) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    this.addElementToDocument(elt);\n  },\n  rootImportForElement: function(elt) {\n    var n = elt;\n    while (n.ownerDocument.__importLink) {\n      n = n.ownerDocument.__importLink;\n    }\n    return n;\n  },\n  addElementToDocument: function(elt) {\n    var port = this.rootImportForElement(elt.__importElement || elt);\n    var l = port.__insertedElements = port.__insertedElements || 0;\n    var refNode = port.nextElementSibling;\n    for (var i=0; i < l; i++) {\n      refNode = refNode && refNode.nextElementSibling;\n    }\n    port.parentNode.insertBefore(elt, refNode);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIE && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    this.addElementToDocument(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    this._mayParse = [];\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    // use `marParse` list to avoid looping into the same document again\n    // since it could cause an iloop.\n    if (doc && this._mayParse.indexOf(doc) < 0) {\n      this._mayParse.push(doc);\n      var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n      for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n        if (!this.isParsed(n)) {\n          if (this.hasResource(n)) {\n            return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n          } else {\n            return;\n          }\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && (node.import === undefined)) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  return 'data:text/javascript;charset=utf-8,' + encodeURIComponent(scriptContent);\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\n\n})(HTMLImports);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n (function(scope) {\n\nvar useNative = scope.useNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (doc === undefined) {\n          // generate an HTMLDocument from data\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            // note, we cannot use MO to detect parsed nodes because\n            // SD polyfill does not report these as mutations.\n            this.bootDocument(doc);\n          }\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n\n  // Polyfill document.baseURI for browsers without it.\n  if (!document.baseURI) {\n    var baseURIDescriptor = {\n      get: function() {\n        var base = document.querySelector('base');\n        return base ? base.href : window.location.href;\n      },\n      configurable: true\n    };\n\n    Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n    Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n  }\n\n  // IE shim for CustomEvent\n  if (typeof window.CustomEvent !== 'function') {\n    window.CustomEvent = function(inType, dictionary) {\n       var e = document.createEvent('HTMLEvents');\n       e.initEvent(inType,\n          dictionary.bubbles === false ? false : true,\n          dictionary.cancelable === false ? false : true,\n          dictionary.detail);\n       return e;\n    };\n  }\n\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// exports\nscope.importer = importer;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.importLoader = importLoader;\n\n\n})(window.HTMLImports);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(){\n\n// bootstrap\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};",
-    "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n",
+    "/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\n/*\r\nThis method is intended to be called when the document tree (including imports)\r\nhas pending custom elements to upgrade. It can be called multiple times and \r\nshould do nothing if no elements are in need of upgrade.\r\n\r\nNote that the import tree can consume itself and therefore special care\r\nmust be taken to avoid recursion.\r\n*/\r\nvar upgradedDocuments;\r\nfunction upgradeDocumentTree(doc) {\r\n  upgradedDocuments = [];\r\n  _upgradeDocumentTree(doc);\r\n  upgradedDocuments = null;\r\n}\r\n\r\n\r\nfunction _upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  if (upgradedDocuments.indexOf(doc) >= 0) {\r\n    return;\r\n  }\r\n  upgradedDocuments.push(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      _upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * Implements `document.registerElement`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // install upgrade hook if HTMLImports are available\n  if (window.HTMLImports) {\n    HTMLImports.__importsParsingHook = function(elt) {\n      CustomElements.parser.parse(elt.import);\n    }\n  }\n  // set internal 'ready' flag, now document.registerElement will trigger \n  // synchronous upgrades\n  CustomElements.ready = true;\n  // async to ensure *native* custom elements upgrade prior to this\n  // DOMContentLoaded can fire before elements upgrade (e.g. when there's\n  // an external script)\n  setTimeout(function() {\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, params) {\n    params = params || {};\n    var e = document.createEvent('CustomEvent');\n    e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n    return e;\n  };\n  window.CustomEvent.prototype = window.Event.prototype;\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    if ((typeof name !== 'string') && (arguments.length === 1)) {\n      Array.prototype.push.call(arguments, document._currentScript);\n    }\n    elementDeclarations.push(arguments);\n  };\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.consumeDeclarations = function(callback) {\n    scope.consumeDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    if (callback) {\n      callback(elementDeclarations);\n    }\n    elementDeclarations = null;\n  };\n\n  function installPolymerWarning() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        throw new Error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  if (HTMLImports.useNative) {\n    installPolymerWarning();\n  } else {\n    addEventListener('DOMContentLoaded', installPolymerWarning);\n  }\n\n})(window.Platform);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n  //\n  // NOTE: position: relative fixes IE's failure to inherit opacity \n  // when a child is not statically positioned.\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden; position: relative;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n"
   ]
 }
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.js b/pkg/web_components/lib/platform.js
index d7e6fb8..0d32bb5 100644
--- a/pkg/web_components/lib/platform.js
+++ b/pkg/web_components/lib/platform.js
@@ -7,11 +7,11 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version: 0.4.0-5a7353d
+// @version: 0.4.1-d214582
 
-window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.shadow&&document.querySelectorAll("script").length>1&&console.warn("platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){var b=a[this.name];if(!b)return!1;var c=b[0]===a;return b[0]=b[1]=void 0,c},has:function(a){var b=a[this.name];return b?b[0]===a:!1}},window.WeakMap=c}(),Platform.flags.shadow?(!function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var testingExposeCycleCount=global.testingExposeCycleCount,hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&hasEval&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];M(a,e,O(b,e))}return a}function e(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}M(a,e,O(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){P.value=c,M(a,b,P)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=I.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a):function(){return this.__impl4cf1e782hg__[a]}}function n(a){return L&&l(a)?new Function("v","this.__impl4cf1e782hg__."+a+" = v"):function(b){this.__impl4cf1e782hg__[a]=b}}function o(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[a].apply(this.__impl4cf1e782hg__,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return R}}function q(b,c,d){for(var e=N(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){Q&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),M(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===I.get(a)),I.set(a,b),J.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return I.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a&&a.__impl4cf1e782hg__}function x(a){return!w(a)}function y(a){return null===a?null:(c(x(a)),a.__wrapper8e3dd93a60__||(a.__wrapper8e3dd93a60__=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.__impl4cf1e782hg__)}function A(a){return a.__impl4cf1e782hg__}function B(a,b){b.__impl4cf1e782hg__=a,a.__wrapper8e3dd93a60__=b}function C(a){return a&&w(a)?z(a):a}function D(a){return a&&!w(a)?y(a):a}function E(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.__wrapper8e3dd93a60__=b)}function F(a,b,c){S.get=c,M(a.prototype,b,S)}function G(a,b){F(a,b,function(){return y(this.__impl4cf1e782hg__[b])})}function H(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=D(this);return a[b].apply(a,arguments)}})})}var I=new WeakMap,J=new WeakMap,K=Object.create(null),L=b(),M=Object.defineProperty,N=Object.getOwnPropertyNames,O=Object.getOwnPropertyDescriptor,P={value:void 0,configurable:!0,enumerable:!1,writable:!0};N(window);var Q=/Firefox/.test(navigator.userAgent),R={get:function(){},set:function(){},configurable:!0,enumerable:!0},S={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=I,a.defineGetter=F,a.defineWrapGetter=G,a.forwardMethodsToWrapper=H,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=J,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=E,a.setWrapper=B,a.unsafeUnwrap=A,a.unwrap=z,a.unwrapIfNeeded=C,a.wrap=y,a.wrapIfNeeded=D,a.wrappers=K}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){for(p=!1;o.length;){var a=o;o=[],a.sort(function(a,b){return a.uid_-b.uid_});for(var b=0;b<a.length;b++){var c=a[b],d=c.takeRecords();f(c),d.length&&c.callback_(d,c)}}}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var p=!1;for(var q in f){var m=f[q],r=new d(c,a);"name"in e&&"namespace"in e&&(r.attributeName=e.name,r.attributeNamespace=e.namespace),e.addedNodes&&(r.addedNodes=e.addedNodes),e.removedNodes&&(r.removedNodes=e.removedNodes),e.previousSibling&&(r.previousSibling=e.previousSibling),e.nextSibling&&(r.nextSibling=e.nextSibling),void 0!==g[q]&&(r.oldValue=g[q]),m.records_.length||(o.push(m),p=!0),m.records_.push(r)}p&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={constructor:i,observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof S.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof S.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof S.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!U.get(a)&&(U.set(a,!0),n(R(a),R(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(V.get(b))throw new Error("InvalidStateError");V.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof S.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof S.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];
-i instanceof S.Document&&(g=i.defaultView)}return bb.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),Z.set(b,cb),X.delete(b,null),V.delete(b),b.defaultPrevented}function o(a,b,c,d){var e=db;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=eb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=fb,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=T.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===db)return!0;c===fb&&(c=eb)}else if(c===fb&&!b.bubbles)return!0;if("relatedTarget"in b){var i=Q(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=R(j),m=k(b,a,l);if(m===g)return!0}else m=null;Y.set(b,m)}}Z.set(b,c);var n=b.type,o=!1;W.set(b,g),X.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===db||r.capture&&c===fb))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),_.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!$.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof gb))return R(x(gb,"Event",a,b));var c=a;return rb||"beforeunload"!==c.type?void O(c,this):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:Q(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void O(b,this):R(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=Q(arguments[b]);var c=Q(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(pb)return new a(c,u(d));var e=Q(document.createEvent(b)),f=ob[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=Q(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){O(a,this)}function C(a){return a instanceof S.ShadowRoot&&(a=a.host),Q(a)}function D(a,b){var c=T.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=Q(a);c;c=c.parentNode)if(D(R(c),b))return!0;return!1}function F(a){K(a,tb)}function G(b,c,e,f){a.renderAllPending();var g=R(ub.call(P(c),e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=ab.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=ab.get(this);d||(d=Object.create(null),ab.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.setWrapper,P=a.unsafeUnwrap,Q=a.unwrap,R=a.wrap,S=a.wrappers,T=(new WeakMap,new WeakMap),U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=new WeakMap,bb=new WeakMap,cb=0,db=1,eb=2,fb=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var gb=window.Event;gb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return W.get(this)},get currentTarget(){return X.get(this)},get eventPhase(){return Z.get(this)},get path(){var a=bb.get(this);return a?a.slice():[]},stopPropagation:function(){$.set(this,!0)},stopImmediatePropagation:function(){$.set(this,!0),_.set(this,!0)}},N(gb,t,document.createEvent("Event"));var hb=v("UIEvent",t),ib=v("CustomEvent",t),jb={get relatedTarget(){var a=Y.get(this);return void 0!==a?a:R(Q(this).relatedTarget)}},kb=M({initMouseEvent:w("initMouseEvent",14)},jb),lb=M({initFocusEvent:w("initFocusEvent",5)},jb),mb=v("MouseEvent",hb,kb),nb=v("FocusEvent",hb,lb),ob=Object.create(null),pb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!pb){var qb=function(a,b,c){if(c){var d=ob[c];b=M(M({},d),b)}ob[a]=b};qb("Event",{bubbles:!1,cancelable:!1}),qb("CustomEvent",{detail:null},"Event"),qb("UIEvent",{view:null,detail:0},"Event"),qb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),qb("FocusEvent",{relatedTarget:null},"UIEvent")}var rb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return P(this).returnValue},set returnValue(a){P(this).returnValue=a}}),rb&&N(rb,y);var sb=window.EventTarget,tb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;tb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=T.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,T.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=T.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=Q(b),d=c.type;U.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return Q(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},sb&&N(sb,B);var ub=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=ib,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=nb,a.wrappers.MouseEvent=mb,a.wrappers.UIEvent=hb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,p)}function c(a){j(a,this)}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.setWrapper,k=a.unsafeUnwrap,l=a.wrap,m=window.TouchEvent;if(m){var n;try{n=document.createEvent("TouchEvent")}catch(o){return}var p={enumerable:!1};c.prototype={get target(){return l(k(this).target)}};var q={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){q.get=function(){return k(this)[a]},Object.defineProperty(c.prototype,a,q)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(k(this).touches)},get targetTouches(){return e(k(this).targetTouches)},get changedTouches(){return e(k(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(m,f,n),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,h)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=g(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(f(this)[b].apply(f(this),arguments))}}var f=a.unsafeUnwrap,g=a.wrap,h={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);P=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;P=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return K(b[0]);for(var d=K(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(K(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=K(b),e=d.parentNode;e&&W.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=K(a),g=f.firstChild;g;)c=g.nextSibling,W.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=M(c?Q.call(c,J(a),!1):R.call(J(a),!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof O.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof S),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unsafeUnwrap,K=a.unwrap,L=a.unwrapIfNeeded,M=a.wrap,N=a.wrapIfNeeded,O=a.wrappers,P=!1,Q=document.importNode,R=window.Node.prototype.cloneNode,S=window.Node,T=window.DocumentFragment,U=(S.prototype.appendChild,S.prototype.compareDocumentPosition),V=S.prototype.insertBefore,W=S.prototype.removeChild,X=S.prototype.replaceChild,Y=/Trident/.test(navigator.userAgent),Z=Y?function(a,b){try{W.call(a,b)}catch(c){if(!(a instanceof T))throw c}}:function(a,b){W.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=K(c):(d=c,c=M(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),V.call(J(this),K(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:J(this);j?V.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=K(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Z(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Z(J(this),f);return P||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=K(d):(e=d,d=M(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),X.call(J(this),K(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&X.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:M(J(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:M(J(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:M(J(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:M(J(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:M(J(this).previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=J(this).ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),J(this).textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,N(a))},compareDocumentPosition:function(a){return U.call(J(this),L(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(S,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c,d,e){for(var f=null,g=null,h=0,i=b.length;i>h;h++)f=s(b[h]),!e&&(g=q(f).root)&&g instanceof a.wrappers.ShadowRoot||(d[c++]=f);return c}function c(a){return String(a).replace(/\/deep\//g," ")}function d(a,b){for(var c,e=a.firstElementChild;e;){if(e.matches(b))return e;if(c=d(e,b))return c;e=e.nextElementSibling}return null}function e(a,b){return a.matches(b)}function f(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===D}function g(){return!0}function h(a,b,c){return a.localName===c}function i(a,b){return a.namespaceURI===b}function j(a,b,c){return a.namespaceURI===b&&a.localName===c}function k(a,b,c,d,e,f){for(var g=a.firstElementChild;g;)d(g,e,f)&&(c[b++]=g),b=k(g,b,c,d,e,f),g=g.nextElementSibling;return b}function l(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,null);if(i instanceof B)h=w.call(i,f);else{if(!(i instanceof C))return k(this,d,e,c,f,null);h=v.call(i,f)}return b(h,d,e,g)}function m(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=y.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=x.call(i,f,g)}return b(h,d,e,!1)}function n(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=A.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=z.call(i,f,g)}return b(h,d,e,!1)}var o=a.wrappers.HTMLCollection,p=a.wrappers.NodeList,q=a.getTreeScope,r=a.unsafeUnwrap,s=a.wrap,t=document.querySelector,u=document.documentElement.querySelector,v=document.querySelectorAll,w=document.documentElement.querySelectorAll,x=document.getElementsByTagName,y=document.documentElement.getElementsByTagName,z=document.getElementsByTagNameNS,A=document.documentElement.getElementsByTagNameNS,B=window.Element,C=window.HTMLDocument||window.Document,D="http://www.w3.org/1999/xhtml",E={querySelector:function(b){var e=c(b),f=e!==b;b=e;var g,h=r(this),i=q(this).root;if(i instanceof a.wrappers.ShadowRoot)return d(this,b);if(h instanceof B)g=s(u.call(h,b));else{if(!(h instanceof C))return d(this,b);g=s(t.call(h,b))}return g&&!f&&(i=q(g).root)&&i instanceof a.wrappers.ShadowRoot?d(this,b):g},querySelectorAll:function(a){var b=c(a),d=b!==a;a=b;var f=new p;return f.length=l.call(this,e,0,f,a,d),f}},F={getElementsByTagName:function(a){var b=new o,c="*"===a?g:f;return b.length=m.call(this,c,0,b,a,a.toLowerCase()),b},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new o,d=null;return d="*"===a?"*"===b?g:h:"*"===b?i:j,c.length=n.call(this,d,0,c,a||null,b),c}};a.GetElementsByInterface=F,a.SelectorsInterface=E}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return h(this).data},set data(a){var b=h(this).data;e(this,"characterData",{oldValue:b}),h(this).data=a}}),f(b.prototype,c),g(i,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){d(a,this),this.ownerElement_=b}var d=a.setWrapper,e=a.unsafeUnwrap;c.prototype={constructor:c,get length(){return e(this).length},item:function(a){return e(this).item(a)},contains:function(a){return e(this).contains(a)},add:function(){e(this).add.apply(e(this),arguments),b(this.ownerElement_)},remove:function(){e(this).remove.apply(e(this),arguments),b(this.ownerElement_)},toggle:function(){var a=e(this).toggle.apply(e(this),arguments);return b(this.ownerElement_),a},toString:function(){return e(this).toString()}},a.wrappers.DOMTokenList=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unsafeUnwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);n(this).polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return n(this).polymerShadowRoot_||null},setAttribute:function(a,d){var e=n(this).getAttribute(a);n(this).setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=n(this).getAttribute(a);n(this).removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(n(this),a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(A,b)}function d(a){return a.replace(B,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",C[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&D[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof z.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=x(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(y(f))}function i(a){o.call(this,a)}function j(a,b){var c=x(a.cloneNode(!1));c.innerHTML=b;for(var d,e=x(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return y(e)}function k(b){return function(){return a.renderAllPending(),w(this)[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),w(this)[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),w(this)[b].apply(w(this),arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unsafeUnwrap,x=a.unwrap,y=a.wrap,z=a.wrappers,A=/[&\u00A0"]/g,B=/[&\u00A0<>]/g,C=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),D=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),E=/MSIE/.test(navigator.userAgent),F=window.HTMLElement,G=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(E&&D[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof z.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!G&&this instanceof z.HTMLTemplateElement?h(this.content,a):w(this).innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)},get hidden(){return this.hasAttribute("hidden")},set hidden(a){a?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(F,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=f(this).getContext.apply(f(this),arguments);return a&&g(a)}}),e(h,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=window.HTMLFormElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get elements(){return f(g(this).elements)}}),e(h,b,document.createElement("form")),a.wrappers.HTMLFormElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),b.prototype.constructor=b,e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=l.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);l.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=i(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!m){var b=c(a);k.set(this,j(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=a.unwrap,j=a.wrap,k=new WeakMap,l=new WeakMap,m=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{constructor:d,get content(){return m?j(h(this).content):k.get(this)}}),m&&g(m,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;e&&(b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;h&&(b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())
-},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.SVGElementInstance;h&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return g(f(this).correspondingElement)},get correspondingUseElement(){return g(f(this).correspondingUseElement)},get parentNode(){return g(f(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return g(f(this).firstChild)},get lastChild(){return g(f(this).lastChild)},get previousSibling(){return g(f(this).previousSibling)},get nextSibling(){return g(f(this).nextSibling)}}),e(h,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrap,h=a.unwrapIfNeeded,i=a.wrap,j=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return i(f(this).canvas)},drawImage:function(){arguments[0]=h(arguments[0]),f(this).drawImage.apply(f(this),arguments)},createPattern:function(){return arguments[0]=g(arguments[0]),f(this).createPattern.apply(f(this),arguments)}}),d(j,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.WebGLRenderingContext;if(i){c(b.prototype,{get canvas(){return h(f(this).canvas)},texImage2D:function(){arguments[5]=g(arguments[5]),f(this).texImage2D.apply(f(this),arguments)},texSubImage2D:function(){arguments[6]=g(arguments[6]),f(this).texSubImage2D.apply(f(this),arguments)}});var j=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(i,b,j),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.Range;b.prototype={get startContainer(){return h(e(this).startContainer)},get endContainer(){return h(e(this).endContainer)},get commonAncestorContainer(){return h(e(this).commonAncestorContainer)},setStart:function(a,b){e(this).setStart(g(a),b)},setEnd:function(a,b){e(this).setEnd(g(a),b)},setStartBefore:function(a){e(this).setStartBefore(g(a))},setStartAfter:function(a){e(this).setStartAfter(g(a))},setEndBefore:function(a){e(this).setEndBefore(g(a))},setEndAfter:function(a){e(this).setEndAfter(g(a))},selectNode:function(a){e(this).selectNode(g(a))},selectNodeContents:function(a){e(this).selectNodeContents(g(a))},compareBoundaryPoints:function(a,b){return e(this).compareBoundaryPoints(a,f(b))},extractContents:function(){return h(e(this).extractContents())},cloneContents:function(){return h(e(this).cloneContents())},insertNode:function(a){e(this).insertNode(g(a))},surroundContents:function(a){e(this).surroundContents(g(a))},cloneRange:function(){return h(e(this).cloneRange())},isPointInRange:function(a,b){return e(this).isPointInRange(g(a),b)},comparePoint:function(a,b){return e(this).comparePoint(g(a),b)},intersectsNode:function(a){return e(this).intersectsNode(g(a))},toString:function(){return e(this).toString()}},i.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return h(e(this).createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=l(k(a).ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;n.set(this,e),this.treeScope_=new d(this,g(e||a)),m.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unsafeUnwrap,l=a.unwrap,m=new WeakMap,n=new WeakMap,o=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{constructor:b,get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return n.get(this)||null},get host(){return m.get(this)||null},invalidateShadowRenderer:function(){return m.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return o.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=H(a),g=H(c),h=e?H(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=I(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=H(a),d=c.parentNode;if(d){var e=I(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){J.set(a,[])}function f(a){var b=J.get(a);return b||J.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<N.length;a++){var b=N[a],c=b.parentRenderer;c&&c.dirty||b.render()}N=[]}function i(){y=null,h()}function j(a){var b=L.get(a);return b||(b=new n(a),L.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=K.get(a);c?c.push(b):K.set(a,[b])}function r(a){return K.get(a)}function s(a){K.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!P.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unsafeUnwrap,H=a.unwrap,I=a.wrap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),N=[],O=new ArraySplice;O.equals=function(a,b){return H(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(H(b)),h=a||new WeakMap,i=O.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(h);for(var o=n.removed.length,p=0;o>p;p++){var q=I(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&I(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var a=this.parentRenderer;if(a&&a.invalidate(),N.push(this),y)return;y=window[M](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){G(a).polymerShadowRenderer_=this}};var P=/^(:not\()?[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=G(this).polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),G(this).polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}{var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap;window.Selection}b.prototype={get anchorNode(){return h(e(this).anchorNode)},get focusNode(){return h(e(this).focusNode)},addRange:function(a){e(this).addRange(f(a))},collapse:function(a,b){e(this).collapse(g(a),b)},containsNode:function(a,b){return e(this).containsNode(g(a),b)},extend:function(a,b){e(this).extend(g(a),b)},getRangeAt:function(a){return h(e(this).getRangeAt(a))},removeRange:function(a){e(this).removeRange(f(a))},selectAllChildren:function(a){e(this).selectAllChildren(g(a))},toString:function(){return e(this).toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return C(c.apply(A(this),arguments))}}function d(a,b){F.call(A(b),B(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){z(a,this)}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return C(c.apply(A(this),arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(A(this),arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.setWrapper,A=a.unsafeUnwrap,B=a.unwrap,C=a.wrap,D=a.wrapEventTargetMethods,E=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var F=document.adoptNode,G=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,A(this))},getSelection:function(){return x(),new m(G.call(B(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var H=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void z(a,this):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){C(this)instanceof d||y(this),b.apply(C(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);H.call(B(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=E.get(this);return a?a:(a=new g(B(this).implementation),E.set(this,a),a)},get defaultView(){return C(B(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getDefaultComputedStyle,n=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},m&&(k.prototype.getDefaultComputedStyle=function(a,b){return j(this||window).getDefaultComputedStyle(i(a),b)}),k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(n.call(h(this)))},get document(){return j(h(this).document)}}),m&&(b.prototype.getDefaultComputedStyle=function(a,b){return g(),m.call(h(this),i(a),b)}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;d&&(c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)})}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b;b=a instanceof f?a:new f(a&&e(a)),d(b,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unwrap,f=window.FormData;c(f,b,new f),a.wrappers.FormData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.Platform),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=Array.prototype.slice.call(g.sheet.cssRules,0),b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertShadowDOMSelectors(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertShadowDOMSelectors:function(a){for(var b=0;b<shadowDOMSelectorsRe.length;b++)a=a.replace(shadowDOMSelectorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){a.type===CSSRule.KEYFRAMES_RULE&&a.cssRules&&(c+=this.ieSafeCssTextFromKeyFrameRule(a))}},this),c},ieSafeCssTextFromKeyFrameRule:function(a){var b="@keyframes "+a.name+" {";return Array.prototype.forEach.call(a.cssRules,function(a){b+=" "+a.keyText+" {"+a.style.cssText+"}"}),b+=" }"},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),shadowDOMSelectorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g,/::content/g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var b="link[rel=stylesheet]["+y+"]",c="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+b,HTMLImports.importer.importsPreloadSelectors+=","+b,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,b,c].join(",");var d=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var b=a.__importElement||a;if(!b.hasAttribute(y))return void d.call(this,a);
-a.__resource&&(b=a.ownerDocument.createElement("style"),b.textContent=a.__resource),HTMLImports.path.resolveUrlsInStyle(b),b.textContent=k.shimStyle(b),b.removeAttribute(y,""),b.setAttribute(z,""),b[z]=!0,b.parentNode!==C&&(a.parentNode===C?C.replaceChild(b,a):this.addElementToDocument(b)),b.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var e=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:e.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}})}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}};var r=a.URL;r&&(i.createObjectURL=function(){return r.createObjectURL.apply(r,arguments)},i.revokeObjectURL=function(a){r.revokeObjectURL(a)}),a.URL=i}}(this),function(){Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}})}(window.Platform),function(a){"use strict";if(!window.performance){var b=Date.now();window.performance={now:function(){return Date.now()-b}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var c=[],d=function(){Array.prototype.push.call(arguments,document._currentScript),c.push(arguments)};window.Polymer=d,a.consumeDeclarations=function(b){a.consumeDeclarations=function(){throw"Possible attempt to load Polymer twice"},b&&b(c),c=null},window.addEventListener("DOMContentLoaded",function(){window.Polymer===d&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})})}(window.Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){function b(a,b){b=b||o,d(function(){f(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===q}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===q)&&(b.removeEventListener(r,e),d(a,b))};b.addEventListener(r,e)}}function e(a){a.target.__loaded=!0}function f(a,b){function c(){h==i&&a&&a()}function d(a){e(a),h++,c()}var f=b.querySelectorAll("link[rel=import]"),h=0,i=f.length;if(i)for(var j,k=0;i>k&&(j=f[k]);k++)g(j)?d.call(j,{target:j}):(j.addEventListener("load",d),j.addEventListener("error",d));else c()}function g(a){return l?a.__loaded:a.__importParsed}function h(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)i(b)&&j(b)}function i(a){return"link"===a.localName&&"import"===a.rel}function j(a){var b=a.import;b?e({target:a}):(a.addEventListener("load",e),a.addEventListener("error",e))}var k="import"in document.createElement("link"),l=k;isIE=/Trident/.test(navigator.userAgent);var m=Boolean(window.ShadowDOMPolyfill),n=function(a){return m?ShadowDOMPolyfill.wrapIfNeeded(a):a},o=n(document),p={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return n(a)},configurable:!0};Object.defineProperty(document,"_currentScript",p),Object.defineProperty(o,"_currentScript",p);var q=isIE?"complete":"interactive",r="readystatechange";l&&(new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&h(b.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var a,b=document.querySelectorAll("link[rel=import]"),c=0,d=b.length;d>c&&(a=b[c]);c++)j(a)}()),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),o.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=l,a.isImportLoaded=g,a.whenReady=b,a.isIE=isIE,a.whenImportsReady=b}(window.HTMLImports),function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;for(var f,g=this.pending[a],h=0,i=g.length;i>h&&(f=g[h]);h++)this.onload(a,f,d,c,e),this.tail();this.pending[a]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:a;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b=d(a);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(b)}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=a.isIE,j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import&&(a.import.__importParsed=!0),this.markParsingComplete(a),a.dispatchEvent(a.__resource&&!a.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),this.addElementToDocument(a)},rootImportForElement:function(a){for(var b=a;b.ownerDocument.__importLink;)b=b.ownerDocument.__importLink;return b},addElementToDocument:function(a){for(var b=this.rootImportForElement(a.__importElement||a),c=b.__insertedElements=b.__insertedElements||0,d=b.nextElementSibling,e=0;c>e;e++)d=d&&d.nextElementSibling;b.parentNode.insertBefore(a,d)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),this.addElementToDocument(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){if(a)for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0;return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&void 0===a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n}(HTMLImports),function(a){function b(a){return c(a,g)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(g)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}var e=a.useNative,f=a.flags,g="import",h=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(e)var i={};else{var j=(a.xhr,a.Loader),k=a.parser,i={documents:{},documentPreloadSelectors:"link[rel="+g+"]",importsPreloadSelectors:["link[rel="+g+"]"].join(","),loadNode:function(a){l.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);l.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===h?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e,g,h){if(f.load&&console.log("loaded",a,c),c.__resource=e,c.__error=g,b(c)){var i=this.documents[a];void 0===i&&(i=g?null:d(e,h||a),i&&(i.__importLink=c,this.bootDocument(i)),this.documents[a]=i),c.import=i}k.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),k.parseNext()},loadedAll:function(){k.parseNext()}},l=new j(i.loaded.bind(i),i.loadedAll.bind(i));if(!document.baseURI){var m={get:function(){var a=document.querySelector("base");return a?a.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",m),Object.defineProperty(h,"baseURI",m)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c})}a.importer=i,a.IMPORT_LINK_TYPE=g,a.importLoader=l}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);
-if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)}),CustomElements.ready=!0,setTimeout(function(){CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");return c.initCustomEvent(a,Boolean(b.bubbles),Boolean(b.cancelable),b.detail),c},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window);
+window.Platform=window.Platform||{},window.logFlags=window.logFlags||{},function(a){var b=a.flags||{};location.search.slice(1).split("&").forEach(function(a){a=a.split("="),a[0]&&(b[a[0]]=a[1]||!0)});var c=document.currentScript||document.querySelector('script[src*="platform.js"]');if(c)for(var d,e=c.attributes,f=0;f<e.length;f++)d=e[f],"src"!==d.name&&(b[d.name]=d.value||!0);b.log&&b.log.split(",").forEach(function(a){window.logFlags[a]=!0}),b.shadow=b.shadow||b.shadowdom||b.polyfill,b.shadow="native"===b.shadow?!1:b.shadow||!HTMLElement.prototype.createShadowRoot,b.shadow&&document.querySelectorAll("script").length>1&&console.warn("platform.js is not the first script on the page. See http://www.polymer-project.org/docs/start/platform.html#setup for details."),b.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=b.register),b.imports&&(window.HTMLImports=window.HTMLImports||{flags:{}},window.HTMLImports.flags.imports=b.imports),a.flags=b}(Platform),"undefined"==typeof WeakMap&&!function(){var a=Object.defineProperty,b=Date.now()%1e9,c=function(){this.name="__st"+(1e9*Math.random()>>>0)+(b++ +"__")};c.prototype={set:function(b,c){var d=b[this.name];d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0})},get:function(a){var b;return(b=a[this.name])&&b[0]===a?b[1]:void 0},"delete":function(a){var b=a[this.name];if(!b)return!1;var c=b[0]===a;return b[0]=b[1]=void 0,c},has:function(a){var b=a[this.name];return b?b[0]===a:!1}},window.WeakMap=c}(),Platform.flags.shadow?(!function(a){"use strict";function b(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function c(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if("undefined"!=typeof navigator&&navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function d(a){return+a===a>>>0&&""!==a}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:R(a)&&R(b)?!0:a!==a&&b!==b}function h(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function i(){}function j(a){function b(){if(!(m>=a.length)){var b=a[m+1];return"inSingleQuote"==n&&"'"==b||"inDoubleQuote"==n&&'"'==b?(m++,d=b,o.append(),!0):void 0}}for(var c,d,e,f,g,j,k,l=[],m=-1,n="beforePath",o={push:function(){void 0!==e&&(l.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};n;)if(m++,c=a[m],"\\"!=c||!b(n)){if(f=h(c),k=W[n],g=k[f]||k["else"]||"error","error"==g)return;if(n=g[0],j=o[g[1]]||i,d=void 0===g[2]?c:g[2],j(),"afterPath"===n)return l}}function k(a){return V.test(a)}function l(a,b){if(b!==X)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));Q&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function m(a){if(a instanceof l)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(d(a.length))return new l(a,X);a=String(a)}var b=Y[a];if(b)return b;var c=j(a);if(!c)return Z;var b=new l(c,X);return Y[a]=b,b}function n(a){return d(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function o(b){for(var c=0;_>c&&b.check_();)c++;return O&&(a.dirtyCheckCycleCount=c),c>0}function p(a){for(var b in a)return!1;return!0}function q(a){return p(a.added)&&p(a.removed)&&p(a.changed)}function r(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function s(){if(!ab.length)return!1;for(var a=0;a<ab.length;a++)ab[a]();return ab.length=0,!0}function t(){function a(a){b&&b.state_===fb&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),cb.push(this)}}}function u(a,b,c){var d=cb.pop()||t();return d.open(a),d.observe(b,c),d}function v(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==fb&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==fb&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),x.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,db.push(this)}}};return i}function w(a,b){return $&&$.object===b||($=db.pop()||v(),$.object=b),$.open(a,b),$}function x(){this.state_=eb,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=ib++}function y(a){x._allObserversCount++,kb&&jb.push(a)}function z(){x._allObserversCount--}function A(a){x.call(this),this.value_=a,this.oldObject_=void 0}function B(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");A.call(this,a)}function C(a,b){x.call(this),this.object_=a,this.path_=m(b),this.directObserver_=void 0}function D(a){x.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function E(a){return a}function F(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||E,this.setValueFn_=c||E,this.dontPassThroughSet_=d}function G(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];nb[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function H(a,b,c){return{index:a,removed:b,addedCount:c}}function I(){}function J(a,b,c,d,e,f){return sb.calcSplices(a,b,c,d,e,f)}function K(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function L(a,b,c,d){for(var e=H(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=K(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function M(a,b){for(var c=[],f=0;f<b.length;f++){var g=b[f];switch(g.type){case"splice":L(c,g.index,g.removed.slice(),g.addedCount);break;case"add":case"update":case"delete":if(!d(g.name))continue;var h=e(g.name);if(0>h)continue;L(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function N(a,b){var c=[];return M(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(J(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var O=a.testingExposeCycleCount,P=b(),Q=c(),R=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},S="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},T="[$_a-zA-Z]",U="[$_a-zA-Z0-9]",V=new RegExp("^"+T+"+"+U+"*$"),W={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},X={},Y={};l.get=m,l.prototype=S({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=k(c)?b?"."+c:c:n(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!f(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=k(c)?"."+c:n(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=k(c)?"."+c:n(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!f(a))return!1;a=a[this[c]]}return f(a)?(a[this[c]]=b,!0):!1}});var Z=new l("",X);Z.valid=!1,Z.getValueFrom=Z.setValueFrom=function(){};var $,_=1e3,ab=[],bb=P?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){s(),b=!1}),function(c){ab.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){ab.push(a)}}(),cb=[],db=[],eb=0,fb=1,gb=2,hb=3,ib=1;x.prototype={open:function(a,b){if(this.state_!=eb)throw Error("Observer has already been opened.");return y(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=fb,this.value_},close:function(){this.state_==fb&&(z(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=gb)},deliver:function(){this.state_==fb&&o(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){x._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var jb,kb=!P;x._allObserversCount=0,kb&&(jb=[]);var lb=!1;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!lb&&kb){lb=!0;var b,c,d=0;do{d++,c=jb,jb=[],b=!1;for(var e=0;e<c.length;e++){var f=c[e];f.state_==fb&&(f.check_()&&(b=!0),jb.push(f))}s()&&(b=!0)}while(_>d&&b);O&&(a.dirtyCheckCycleCount=d),lb=!1}},kb&&(a.Platform.clearObservers=function(){jb=[]}),A.prototype=S({__proto__:x.prototype,arrayObserve:!1,connect_:function(){P?this.directObserver_=u(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(P){if(!a)return!1;c={},b=G(this.value_,a,c)}else c=this.oldObject_,b=r(this.value_,this.oldObject_);return q(b)?!1:(P||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){P?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==fb&&(P?this.directObserver_.deliver(!1):o(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),B.prototype=S({__proto__:A.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(P){if(!a)return!1;b=N(this.value_,a)}else b=J(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(P||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),B.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},C.prototype=S({__proto__:x.prototype,get path(){return this.path_},connect_:function(){P&&(this.directObserver_=w(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||g(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var mb={};D.prototype=S({__proto__:x.prototype,connect_:function(){if(P){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==mb){b=!0;break}b&&(this.directObserver_=w(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===mb&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=eb&&this.state_!=hb)throw Error("Cannot add paths once started.");var b=m(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=eb&&this.state_!=hb)throw Error("Cannot add observers once started.");if(this.observed_.push(mb,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=fb)throw Error("Can only reset while open");this.state_=hb,this.disconnect_()},finishReset:function(){if(this.state_!=hb)throw Error("Can only finishReset after startReset");return this.state_=fb,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==mb&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],h=this.observed_[d+1];if(f===mb){var i=h;e=this.state_===eb?i.open(this.deliver,this):i.discardChanges()}else e=h.getValueFrom(f);b?this.value_[d/2]=e:g(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),F.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!g(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var nb={add:!0,update:!0,"delete":!0},ob=0,pb=1,qb=2,rb=3;I.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(ob):(e.push(pb),d=g),b--,c--):f==h?(e.push(rb),b--,d=h):(e.push(qb),c--,d=i)}else e.push(rb),b--;else e.push(qb),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=H(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[H(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case ob:j&&(l.push(j),j=void 0),m++,n++;break;case pb:j||(j=H(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case qb:j||(j=H(m,[],0)),j.addedCount++,m++;break;case rb:j||(j=H(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var sb=new I;a.Observer=x,a.Observer.runEOM_=bb,a.Observer.observerSentinel_=mb,a.Observer.hasObjectObserve=P,a.ArrayObserver=B,a.ArrayObserver.calculateSplices=function(a,b){return sb.calculateSplices(a,b)},a.ArraySplice=I,a.ObjectObserver=A,a.PathObserver=C,a.CompoundObserver=D,a.Path=l,a.ObserverTransform=F}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var a=new Function("return true;");return a()}catch(b){return!1}}function c(a){if(!a)throw new Error("Assertion failed")}function d(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];M(a,e,O(b,e))}return a}function e(a,b){for(var c=N(b),d=0;d<c.length;d++){var e=c[d];switch(e){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}M(a,e,O(b,e))}return a}function f(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function g(a,b,c){P.value=c,M(a,b,P)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=I.get(b);if(c)return c;var d=h(b),e=v(d);return s(b,e,a),e}function i(a,b){q(a,b,!0)}function j(a,b){q(b,a,!1)}function k(a){return/^on[a-z]+$/.test(a)}function l(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function m(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a):function(){return this.__impl4cf1e782hg__[a]}}function n(a){return L&&l(a)?new Function("v","this.__impl4cf1e782hg__."+a+" = v"):function(b){this.__impl4cf1e782hg__[a]=b}}function o(a){return L&&l(a)?new Function("return this.__impl4cf1e782hg__."+a+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[a].apply(this.__impl4cf1e782hg__,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return R}}function q(b,c,d){for(var e=N(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){Q&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set||S)&&(i=l?a.getEventHandlerSetter(g):n(g)),M(c,g,{get:h,set:i,configurable:j.configurable,enumerable:j.enumerable})}}}}function r(a,b,c){var d=a.prototype;s(d,b,c),e(b,a)}function s(a,b,d){var e=b.prototype;c(void 0===I.get(a)),I.set(a,b),J.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return I.get(b.prototype)===a}function u(a){var b=Object.getPrototypeOf(a),c=h(b),d=v(c);return s(b,d,a),d}function v(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function w(a){return a&&a.__impl4cf1e782hg__}function x(a){return!w(a)}function y(a){return null===a?null:(c(x(a)),a.__wrapper8e3dd93a60__||(a.__wrapper8e3dd93a60__=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.__impl4cf1e782hg__)}function A(a){return a.__impl4cf1e782hg__}function B(a,b){b.__impl4cf1e782hg__=a,a.__wrapper8e3dd93a60__=b}function C(a){return a&&w(a)?z(a):a}function D(a){return a&&!w(a)?y(a):a}function E(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.__wrapper8e3dd93a60__=b)}function F(a,b,c){T.get=c,M(a.prototype,b,T)}function G(a,b){F(a,b,function(){return y(this.__impl4cf1e782hg__[b])})}function H(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=D(this);return a[b].apply(a,arguments)}})})}var I=new WeakMap,J=new WeakMap,K=Object.create(null),L=b(),M=Object.defineProperty,N=Object.getOwnPropertyNames,O=Object.getOwnPropertyDescriptor,P={value:void 0,configurable:!0,enumerable:!1,writable:!0};N(window);var Q=/Firefox/.test(navigator.userAgent),R={get:function(){},set:function(){},configurable:!0,enumerable:!0},S=function(){var a=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return!!a&&"set"in a}(),T={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=I,a.defineGetter=F,a.defineWrapGetter=G,a.forwardMethodsToWrapper=H,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=J,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=E,a.setWrapper=B,a.unsafeUnwrap=A,a.unwrap=z,a.unwrapIfNeeded=C,a.wrap=y,a.wrapIfNeeded=D,a.wrappers=K}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){g=!1;var a=f.slice(0);f=[];for(var b=0;b<a.length;b++)a[b]()}function c(a){f.push(a),g||(g=!0,d(b,0))}var d,e=window.MutationObserver,f=[],g=!1;if(e){var h=1,i=new e(b),j=document.createTextNode(h);i.observe(j,{characterData:!0}),d=function(){h=(h+1)%2,j.data=h}}else d=window.setImmediate||window.setTimeout;a.setEndOfMicrotask=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(){p||(k(c),p=!0)}function c(){for(p=!1;o.length;){var a=o;o=[],a.sort(function(a,b){return a.uid_-b.uid_});for(var b=0;b<a.length;b++){var c=a[b],d=c.takeRecords();f(c),d.length&&c.callback_(d,c)}}}function d(a,b){this.type=a,this.target=b,this.addedNodes=new m.NodeList,this.removedNodes=new m.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function e(a,b){for(;a;a=a.parentNode){var c=n.get(a);if(c)for(var d=0;d<c.length;d++){var e=c[d];e.options.subtree&&e.addTransientObserver(b)}}}function f(a){for(var b=0;b<a.nodes_.length;b++){var c=a.nodes_[b],d=n.get(c);if(!d)return;for(var e=0;e<d.length;e++){var f=d[e];f.observer===a&&f.removeTransientObservers()}}}function g(a,c,e){for(var f=Object.create(null),g=Object.create(null),h=a;h;h=h.parentNode){var i=n.get(h);if(i)for(var j=0;j<i.length;j++){var k=i[j],l=k.options;if((h===a||l.subtree)&&!("attributes"===c&&!l.attributes||"attributes"===c&&l.attributeFilter&&(null!==e.namespace||-1===l.attributeFilter.indexOf(e.name))||"characterData"===c&&!l.characterData||"childList"===c&&!l.childList)){var m=k.observer;f[m.uid_]=m,("attributes"===c&&l.attributeOldValue||"characterData"===c&&l.characterDataOldValue)&&(g[m.uid_]=e.oldValue)}}}var p=!1;for(var q in f){var m=f[q],r=new d(c,a);"name"in e&&"namespace"in e&&(r.attributeName=e.name,r.attributeNamespace=e.namespace),e.addedNodes&&(r.addedNodes=e.addedNodes),e.removedNodes&&(r.removedNodes=e.removedNodes),e.previousSibling&&(r.previousSibling=e.previousSibling),e.nextSibling&&(r.nextSibling=e.nextSibling),void 0!==g[q]&&(r.oldValue=g[q]),m.records_.length||(o.push(m),p=!0),m.records_.push(r)}p&&b()}function h(a){if(this.childList=!!a.childList,this.subtree=!!a.subtree,this.attributes="attributes"in a||!("attributeOldValue"in a||"attributeFilter"in a)?!!a.attributes:!0,this.characterData="characterDataOldValue"in a&&!("characterData"in a)?!0:!!a.characterData,!this.attributes&&(a.attributeOldValue||"attributeFilter"in a)||!this.characterData&&a.characterDataOldValue)throw new TypeError;if(this.characterData=!!a.characterData,this.attributeOldValue=!!a.attributeOldValue,this.characterDataOldValue=!!a.characterDataOldValue,"attributeFilter"in a){if(null==a.attributeFilter||"object"!=typeof a.attributeFilter)throw new TypeError;this.attributeFilter=q.call(a.attributeFilter)}else this.attributeFilter=null}function i(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++r}function j(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var k=a.setEndOfMicrotask,l=a.wrapIfNeeded,m=a.wrappers,n=new WeakMap,o=[],p=!1,q=Array.prototype.slice,r=0;i.prototype={constructor:i,observe:function(a,b){a=l(a);var c,d=new h(b),e=n.get(a);e||n.set(a,e=[]);for(var f=0;f<e.length;f++)e[f].observer===this&&(c=e[f],c.removeTransientObservers(),c.options=d);c||(c=new j(this,a,d),e.push(c),this.nodes_.push(a))},disconnect:function(){this.nodes_.forEach(function(a){for(var b=n.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}},j.prototype={addTransientObserver:function(a){if(a!==this.target){this.transientObservedNodes.push(a);var b=n.get(a);b||n.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[];for(var b=0;b<a.length;b++)for(var c=a[b],d=n.get(c),e=0;e<d.length;e++)if(d[e]===this){d.splice(e,1);break}}},a.enqueueMutation=g,a.registerTransientObservers=e,a.wrappers.MutationObserver=i,a.wrappers.MutationRecord=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){this.root=a,this.parent=b}function c(a,b){if(a.treeScope_!==b){a.treeScope_=b;for(var d=a.shadowRoot;d;d=d.olderShadowRoot)d.treeScope_.parent=b;for(var e=a.firstChild;e;e=e.nextSibling)c(e,b)}}function d(c){if(c instanceof a.wrappers.Window,c.treeScope_)return c.treeScope_;var e,f=c.parentNode;return e=f?d(f):new b(c,null),c.treeScope_=e}b.prototype={get renderer(){return this.root instanceof a.wrappers.ShadowRoot?a.getRendererForHost(this.root.host):null},contains:function(a){for(;a;a=a.parent)if(a===this)return!0;return!1}},a.TreeScope=b,a.getTreeScope=d,a.setTreeScope=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a instanceof T.ShadowRoot}function c(a){return M(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof T.Window&&(b=b.document);for(var c=M(b),d=a[0],e=M(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(M(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof T.Window&&(b=b.document);var e,f=M(b),g=M(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(M(l)===i)return l}return null}function l(a,b){return M(a)===M(b)}function m(a){if(!V.get(a)&&(V.set(a,!0),o(S(a),S(a.target)),K)){var b=K;throw K=null,b}}function n(a){switch(a.type){case"load":case"beforeunload":case"unload":return!0}return!1}function o(b,c){if(W.get(b))throw new Error("InvalidStateError");W.set(b,!0),a.renderAllPending();var e,f,g;if(n(b)&&!b.bubbles){var h=c;h instanceof T.Document&&(g=h.defaultView)&&(f=h,e=[])}if(!e)if(c instanceof T.Window)g=c,e=[];else if(e=d(c,b),!n(b)){var h=e[e.length-1];h instanceof T.Document&&(g=h.defaultView)}return cb.set(b,e),p(b,e,g,f)&&q(b,e,g,f)&&r(b,e,g,f),$.set(b,db),Y.delete(b,null),W.delete(b),b.defaultPrevented}function p(a,b,c,d){var e=eb;if(c&&!s(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!s(b[f],a,e,b,d))return!1;return!0}function q(a,b,c,d){var e=fb,f=b[0]||c;return s(f,a,e,b,d)}function r(a,b,c,d){for(var e=gb,f=1;f<b.length;f++)if(!s(b[f],a,e,b,d))return;c&&b.length>0&&s(c,a,e,b,d)}function s(a,b,c,d,e){var f=U.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===eb)return!0;c===gb&&(c=fb)}else if(c===gb&&!b.bubbles)return!0;if("relatedTarget"in b){var i=R(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=S(j),m=k(b,a,l);if(m===g)return!0}else m=null;Z.set(b,m)}}$.set(b,c);var n=b.type,o=!1;X.set(b,g),Y.set(b,a),f.depth++;for(var p=0,q=f.length;q>p;p++){var r=f[p];if(r.removed)o=!0;else if(!(r.type!==n||!r.capture&&c===eb||r.capture&&c===gb))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),ab.get(b))return!1}catch(s){K||(K=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!_.get(b)}function t(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function u(a,b){if(!(a instanceof hb))return S(y(hb,"Event",a,b));var c=a;return sb||"beforeunload"!==c.type||this instanceof z?void P(c,this):new z(c)}function v(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:R(a.relatedTarget)}}):a}function w(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void P(b,this):S(y(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&N(e.prototype,c),d)try{O(d,e,new d("temp"))}catch(f){O(d,e,document.createEvent(a))}return e}function x(a,b){return function(){arguments[b]=R(arguments[b]);var c=R(this);c[a].apply(c,arguments)}}function y(a,b,c,d){if(qb)return new a(c,v(d));var e=R(document.createEvent(b)),f=pb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=R(b)),g.push(b)}),e["init"+b].apply(e,g),e}function z(a){u.call(this,a)}function A(a){return"function"==typeof a?!0:a&&a.handleEvent}function B(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function C(a){P(a,this)}function D(a){return a instanceof T.ShadowRoot&&(a=a.host),R(a)}function E(a,b){var c=U.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function F(a,b){for(var c=R(a);c;c=c.parentNode)if(E(S(c),b))return!0;return!1}function G(a){L(a,ub)}function H(b,c,e,f){a.renderAllPending();var g=S(vb.call(Q(c),e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function I(a){return function(){var b=bb.get(this);return b&&b[a]&&b[a].value||null}}function J(a){var b=a.slice(2);
+return function(c){var d=bb.get(this);d||(d=Object.create(null),bb.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var K,L=a.forwardMethodsToWrapper,M=a.getTreeScope,N=a.mixin,O=a.registerWrapper,P=a.setWrapper,Q=a.unsafeUnwrap,R=a.unwrap,S=a.wrap,T=a.wrappers,U=(new WeakMap,new WeakMap),V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=new WeakMap,bb=new WeakMap,cb=new WeakMap,db=0,eb=1,fb=2,gb=3;t.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var hb=window.Event;hb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},u.prototype={get target(){return X.get(this)},get currentTarget(){return Y.get(this)},get eventPhase(){return $.get(this)},get path(){var a=cb.get(this);return a?a.slice():[]},stopPropagation:function(){_.set(this,!0)},stopImmediatePropagation:function(){_.set(this,!0),ab.set(this,!0)}},O(hb,u,document.createEvent("Event"));var ib=w("UIEvent",u),jb=w("CustomEvent",u),kb={get relatedTarget(){var a=Z.get(this);return void 0!==a?a:S(R(this).relatedTarget)}},lb=N({initMouseEvent:x("initMouseEvent",14)},kb),mb=N({initFocusEvent:x("initFocusEvent",5)},kb),nb=w("MouseEvent",ib,lb),ob=w("FocusEvent",ib,mb),pb=Object.create(null),qb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!qb){var rb=function(a,b,c){if(c){var d=pb[c];b=N(N({},d),b)}pb[a]=b};rb("Event",{bubbles:!1,cancelable:!1}),rb("CustomEvent",{detail:null},"Event"),rb("UIEvent",{view:null,detail:0},"Event"),rb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),rb("FocusEvent",{relatedTarget:null},"UIEvent")}var sb=window.BeforeUnloadEvent;z.prototype=Object.create(u.prototype),N(z.prototype,{get returnValue(){return Q(this).returnValue},set returnValue(a){Q(this).returnValue=a}}),sb&&O(sb,z);var tb=window.EventTarget,ub=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;ub.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),C.prototype={addEventListener:function(a,b,c){if(A(b)&&!B(a)){var d=new t(a,b,c),e=U.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,U.set(this,e);e.push(d);var g=D(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=U.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=D(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=R(b),d=c.type;V.set(c,!1),a.renderAllPending();var e;F(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return R(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},tb&&O(tb,C);var vb=document.elementFromPoint;a.elementFromPoint=H,a.getEventHandlerGetter=I,a.getEventHandlerSetter=J,a.wrapEventTargetMethods=G,a.wrappers.BeforeUnloadEvent=z,a.wrappers.CustomEvent=jb,a.wrappers.Event=u,a.wrappers.EventTarget=C,a.wrappers.FocusEvent=ob,a.wrappers.MouseEvent=nb,a.wrappers.UIEvent=ib}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,p)}function c(a){j(a,this)}function d(){this.length=0,b(this,"length")}function e(a){for(var b=new d,e=0;e<a.length;e++)b[e]=new c(a[e]);return b.length=e,b}function f(a){g.call(this,a)}var g=a.wrappers.UIEvent,h=a.mixin,i=a.registerWrapper,j=a.setWrapper,k=a.unsafeUnwrap,l=a.wrap,m=window.TouchEvent;if(m){var n;try{n=document.createEvent("TouchEvent")}catch(o){return}var p={enumerable:!1};c.prototype={get target(){return l(k(this).target)}};var q={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){q.get=function(){return k(this)[a]},Object.defineProperty(c.prototype,a,q)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(k(this).touches)},get targetTouches(){return e(k(this).targetTouches)},get changedTouches(){return e(k(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(m,f,n),a.wrappers.Touch=c,a.wrappers.TouchEvent=f,a.wrappers.TouchList=d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,h)}function c(){this.length=0,b(this,"length")}function d(a){if(null==a)return a;for(var b=new c,d=0,e=a.length;e>d;d++)b[d]=g(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(f(this)[b].apply(f(this),arguments))}}var f=a.unsafeUnwrap,g=a.wrap,h={enumerable:!1};c.prototype={item:function(a){return this[a]}},b(c.prototype,"item"),a.wrappers.NodeList=c,a.addWrapNodeListMethod=e,a.wrapNodeList=d}(window.ShadowDOMPolyfill),function(a){"use strict";a.wrapHTMLCollection=a.wrapNodeList,a.wrappers.HTMLCollection=a.wrappers.NodeList}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){A(a instanceof w)}function c(a){var b=new y;return b[0]=a,b.length=1,b}function d(a,b,c){C(b,"childList",{removedNodes:c,previousSibling:a.previousSibling,nextSibling:a.nextSibling})}function e(a,b){C(a,"childList",{removedNodes:b})}function f(a,b,d,e){if(a instanceof DocumentFragment){var f=h(a);P=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;P=!1;for(var g=0;g<f.length;g++)f[g].previousSibling_=f[g-1]||d,f[g].nextSibling_=f[g+1]||e;return d&&(d.nextSibling_=f[0]),e&&(e.previousSibling_=f[f.length-1]),f}var f=c(a),i=a.parentNode;return i&&i.removeChild(a),a.parentNode_=b,a.previousSibling_=d,a.nextSibling_=e,d&&(d.nextSibling_=a),e&&(e.previousSibling_=a),f}function g(a){if(a instanceof DocumentFragment)return h(a);var b=c(a),e=a.parentNode;return e&&d(a,e,b),b}function h(a){for(var b=new y,c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b.length=c,e(a,b),b}function i(a){return a}function j(a,b){I(a,b),a.nodeIsInserted_()}function k(a,b){for(var c=D(b),d=0;d<a.length;d++)j(a[d],c)}function l(a){I(a,new z(a,null))}function m(a){for(var b=0;b<a.length;b++)l(a[b])}function n(a,b){var c=a.nodeType===w.DOCUMENT_NODE?a:a.ownerDocument;c!==b.ownerDocument&&c.adoptNode(b)}function o(b,c){if(c.length){var d=b.ownerDocument;if(d!==c[0].ownerDocument)for(var e=0;e<c.length;e++)a.adoptNodeNoRemove(c[e],d)}}function p(a,b){o(a,b);var c=b.length;if(1===c)return K(b[0]);for(var d=K(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(K(b[e]));return d}function q(a){if(void 0!==a.firstChild_)for(var b=a.firstChild_;b;){var c=b;b=b.nextSibling_,c.parentNode_=c.previousSibling_=c.nextSibling_=void 0}a.firstChild_=a.lastChild_=void 0}function r(a){if(a.invalidateShadowRenderer()){for(var b=a.firstChild;b;){A(b.parentNode===a);var c=b.nextSibling,d=K(b),e=d.parentNode;e&&W.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=K(a),g=f.firstChild;g;)c=g.nextSibling,W.call(f,g),g=c}function s(a){var b=a.parentNode;return b&&b.invalidateShadowRenderer()}function t(a){for(var b,c=0;c<a.length;c++)b=a[c],b.parentNode.removeChild(b)}function u(a,b,c){var d;if(d=M(c?Q.call(c,J(a),!1):R.call(J(a),!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof O.HTMLTemplateElement)for(var f=d.content,e=a.content.firstChild;e;e=e.nextSibling)f.appendChild(u(e,!0,c))}return d}function v(a,b){if(!b||D(a)!==D(b))return!1;for(var c=b;c;c=c.parentNode)if(c===a)return!0;return!1}function w(a){A(a instanceof S),x.call(this,a),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var x=a.wrappers.EventTarget,y=a.wrappers.NodeList,z=a.TreeScope,A=a.assert,B=a.defineWrapGetter,C=a.enqueueMutation,D=a.getTreeScope,E=a.isWrapper,F=a.mixin,G=a.registerTransientObservers,H=a.registerWrapper,I=a.setTreeScope,J=a.unsafeUnwrap,K=a.unwrap,L=a.unwrapIfNeeded,M=a.wrap,N=a.wrapIfNeeded,O=a.wrappers,P=!1,Q=document.importNode,R=window.Node.prototype.cloneNode,S=window.Node,T=window.DocumentFragment,U=(S.prototype.appendChild,S.prototype.compareDocumentPosition),V=S.prototype.insertBefore,W=S.prototype.removeChild,X=S.prototype.replaceChild,Y=/Trident/.test(navigator.userAgent),Z=Y?function(a,b){try{W.call(a,b)}catch(c){if(!(a instanceof T))throw c}}:function(a,b){W.call(a,b)};w.prototype=Object.create(x.prototype),F(w.prototype,{appendChild:function(a){return this.insertBefore(a,null)},insertBefore:function(a,c){b(a);var d;c?E(c)?d=K(c):(d=c,c=M(d)):(c=null,d=null),c&&A(c.parentNode===this);var e,h=c?c.previousSibling:this.lastChild,i=!this.invalidateShadowRenderer()&&!s(a);if(e=i?g(a):f(a,this,h,c),i)n(this,a),q(this),V.call(J(this),K(a),d);else{h||(this.firstChild_=e[0]),c||(this.lastChild_=e[e.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var j=d?d.parentNode:J(this);j?V.call(j,p(this,e),d):o(this,e)}return C(this,"childList",{addedNodes:e,nextSibling:c,previousSibling:h}),k(e,this),a},removeChild:function(a){if(b(a),a.parentNode!==this){for(var d=!1,e=(this.childNodes,this.firstChild);e;e=e.nextSibling)if(e===a){d=!0;break}if(!d)throw new Error("NotFoundError")}var f=K(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Z(k,f),i===a&&(this.firstChild_=g),j===a&&(this.lastChild_=h),h&&(h.nextSibling_=g),g&&(g.previousSibling_=h),a.previousSibling_=a.nextSibling_=a.parentNode_=void 0}else q(this),Z(J(this),f);return P||C(this,"childList",{removedNodes:c(a),nextSibling:g,previousSibling:h}),G(this,a),a},replaceChild:function(a,d){b(a);var e;if(E(d)?e=K(d):(e=d,d=M(e)),d.parentNode!==this)throw new Error("NotFoundError");var h,i=d.nextSibling,j=d.previousSibling,m=!this.invalidateShadowRenderer()&&!s(a);return m?h=g(a):(i===a&&(i=a.nextSibling),h=f(a,this,j,i)),m?(n(this,a),q(this),X.call(J(this),K(a),e)):(this.firstChild===d&&(this.firstChild_=h[0]),this.lastChild===d&&(this.lastChild_=h[h.length-1]),d.previousSibling_=d.nextSibling_=d.parentNode_=void 0,e.parentNode&&X.call(e.parentNode,p(this,h),e)),C(this,"childList",{addedNodes:h,removedNodes:c(d),nextSibling:i,previousSibling:j}),l(d),k(h,this),d},nodeIsInserted_:function(){for(var a=this.firstChild;a;a=a.nextSibling)a.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:M(J(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:M(J(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:M(J(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:M(J(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:M(J(this).previousSibling)},get parentElement(){for(var a=this.parentNode;a&&a.nodeType!==w.ELEMENT_NODE;)a=a.parentNode;return a},get textContent(){for(var a="",b=this.firstChild;b;b=b.nextSibling)b.nodeType!=w.COMMENT_NODE&&(a+=b.textContent);return a},set textContent(a){var b=i(this.childNodes);if(this.invalidateShadowRenderer()){if(r(this),""!==a){var c=J(this).ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),J(this).textContent=a;var d=i(this.childNodes);C(this,"childList",{addedNodes:d,removedNodes:b}),m(b),k(d,this)},get childNodes(){for(var a=new y,b=0,c=this.firstChild;c;c=c.nextSibling)a[b++]=c;return a.length=b,a},cloneNode:function(a){return u(this,a)},contains:function(a){return v(this,N(a))},compareDocumentPosition:function(a){return U.call(J(this),L(a))},normalize:function(){for(var a,b,c=i(this.childNodes),d=[],e="",f=0;f<c.length;f++)b=c[f],b.nodeType===w.TEXT_NODE?a||b.data.length?a?(e+=b.data,d.push(b)):a=b:this.removeNode(b):(a&&d.length&&(a.data+=e,t(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(S,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.originalInsertBefore=V,a.originalRemoveChild=W,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c,d,e){for(var f=null,g=null,h=0,i=b.length;i>h;h++)f=s(b[h]),!e&&(g=q(f).root)&&g instanceof a.wrappers.ShadowRoot||(d[c++]=f);return c}function c(a){return String(a).replace(/\/deep\//g," ")}function d(a,b){for(var c,e=a.firstElementChild;e;){if(e.matches(b))return e;if(c=d(e,b))return c;e=e.nextElementSibling}return null}function e(a,b){return a.matches(b)}function f(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===D}function g(){return!0}function h(a,b,c){return a.localName===c}function i(a,b){return a.namespaceURI===b}function j(a,b,c){return a.namespaceURI===b&&a.localName===c}function k(a,b,c,d,e,f){for(var g=a.firstElementChild;g;)d(g,e,f)&&(c[b++]=g),b=k(g,b,c,d,e,f),g=g.nextElementSibling;return b}function l(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,null);if(i instanceof B)h=w.call(i,f);else{if(!(i instanceof C))return k(this,d,e,c,f,null);h=v.call(i,f)}return b(h,d,e,g)}function m(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=y.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=x.call(i,f,g)}return b(h,d,e,!1)}function n(c,d,e,f,g){var h,i=r(this),j=q(this).root;if(j instanceof a.wrappers.ShadowRoot)return k(this,d,e,c,f,g);if(i instanceof B)h=A.call(i,f,g);else{if(!(i instanceof C))return k(this,d,e,c,f,g);h=z.call(i,f,g)}return b(h,d,e,!1)}var o=a.wrappers.HTMLCollection,p=a.wrappers.NodeList,q=a.getTreeScope,r=a.unsafeUnwrap,s=a.wrap,t=document.querySelector,u=document.documentElement.querySelector,v=document.querySelectorAll,w=document.documentElement.querySelectorAll,x=document.getElementsByTagName,y=document.documentElement.getElementsByTagName,z=document.getElementsByTagNameNS,A=document.documentElement.getElementsByTagNameNS,B=window.Element,C=window.HTMLDocument||window.Document,D="http://www.w3.org/1999/xhtml",E={querySelector:function(b){var e=c(b),f=e!==b;b=e;var g,h=r(this),i=q(this).root;if(i instanceof a.wrappers.ShadowRoot)return d(this,b);if(h instanceof B)g=s(u.call(h,b));else{if(!(h instanceof C))return d(this,b);g=s(t.call(h,b))}return g&&!f&&(i=q(g).root)&&i instanceof a.wrappers.ShadowRoot?d(this,b):g},querySelectorAll:function(a){var b=c(a),d=b!==a;a=b;var f=new p;return f.length=l.call(this,e,0,f,a,d),f}},F={getElementsByTagName:function(a){var b=new o,c="*"===a?g:f;return b.length=m.call(this,c,0,b,a,a.toLowerCase()),b},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new o,d=null;return d="*"===a?"*"===b?g:h:"*"===b?i:j,c.length=n.call(this,d,0,c,a||null,b),c}};a.GetElementsByInterface=F,a.SelectorsInterface=E}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}function c(a){for(;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}var d=a.wrappers.NodeList,e={get firstElementChild(){return b(this.firstChild)},get lastElementChild(){return c(this.lastChild)},get childElementCount(){for(var a=0,b=this.firstElementChild;b;b=b.nextElementSibling)a++;return a},get children(){for(var a=new d,b=0,c=this.firstElementChild;c;c=c.nextElementSibling)a[b++]=c;return a.length=b,a},remove:function(){var a=this.parentNode;a&&a.removeChild(this)}},f={get nextElementSibling(){return b(this.nextSibling)},get previousElementSibling(){return c(this.previousSibling)}};a.ChildNodeInterface=f,a.ParentNodeInterface=e}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}var c=a.ChildNodeInterface,d=a.wrappers.Node,e=a.enqueueMutation,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=window.CharacterData;b.prototype=Object.create(d.prototype),f(b.prototype,{get textContent(){return this.data},set textContent(a){this.data=a},get data(){return h(this).data},set data(a){var b=h(this).data;e(this,"characterData",{oldValue:b}),h(this).data=a}}),f(b.prototype,c),g(i,b,document.createTextNode("")),a.wrappers.CharacterData=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a>>>0}function c(a){d.call(this,a)}var d=a.wrappers.CharacterData,e=(a.enqueueMutation,a.mixin),f=a.registerWrapper,g=window.Text;c.prototype=Object.create(d.prototype),e(c.prototype,{splitText:function(a){a=b(a);var c=this.data;if(a>c.length)throw new Error("IndexSizeError");var d=c.slice(0,a),e=c.slice(a);this.data=d;var f=this.ownerDocument.createTextNode(e);return this.parentNode&&this.parentNode.insertBefore(f,this.nextSibling),f}}),f(g,c,document.createTextNode("")),a.wrappers.Text=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){a.invalidateRendererBasedOnAttribute(b,"class")}function c(a,b){d(a,this),this.ownerElement_=b}var d=a.setWrapper,e=a.unsafeUnwrap;c.prototype={constructor:c,get length(){return e(this).length},item:function(a){return e(this).item(a)},contains:function(a){return e(this).contains(a)},add:function(){e(this).add.apply(e(this),arguments),b(this.ownerElement_)},remove:function(){e(this).remove.apply(e(this),arguments),b(this.ownerElement_)},toggle:function(){var a=e(this).toggle.apply(e(this),arguments);return b(this.ownerElement_),a},toString:function(){return e(this).toString()}},a.wrappers.DOMTokenList=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b,c){var d=b.parentNode;if(d&&d.shadowRoot){var e=a.getRendererForHost(d);e.dependsOnAttribute(c)&&e.invalidate()}}function c(a,b,c){k(a,"attributes",{name:b,namespace:null,oldValue:c})}function d(a){g.call(this,a)}var e=a.ChildNodeInterface,f=a.GetElementsByInterface,g=a.wrappers.Node,h=a.wrappers.DOMTokenList,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.unsafeUnwrap,o=a.wrappers,p=window.Element,q=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return p.prototype[a]}),r=q[0],s=p.prototype[r],t=new WeakMap;d.prototype=Object.create(g.prototype),l(d.prototype,{createShadowRoot:function(){var b=new o.ShadowRoot(this);n(this).polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return n(this).polymerShadowRoot_||null},setAttribute:function(a,d){var e=n(this).getAttribute(a);n(this).setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=n(this).getAttribute(a);n(this).removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(n(this),a)},get classList(){var a=t.get(this);return a||t.set(this,a=new h(n(this).classList,this)),a},get className(){return n(this).className},set className(a){this.setAttribute("class",a)},get id(){return n(this).id},set id(a){this.setAttribute("id",a)}}),q.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),p.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),l(d.prototype,e),l(d.prototype,f),l(d.prototype,i),l(d.prototype,j),m(p,d,document.createElementNS(null,"x")),a.invalidateRendererBasedOnAttribute=b,a.matchesNames=q,a.wrappers.Element=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"\xa0":return"&nbsp;"}}function c(a){return a.replace(A,b)}function d(a){return a.replace(B,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",C[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&D[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof z.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=x(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(y(f))}function i(a){o.call(this,a)}function j(a,b){var c=x(a.cloneNode(!1));c.innerHTML=b;for(var d,e=x(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return y(e)}function k(b){return function(){return a.renderAllPending(),w(this)[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),w(this)[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),w(this)[b].apply(w(this),arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unsafeUnwrap,x=a.unwrap,y=a.wrap,z=a.wrappers,A=/[&\u00A0"]/g,B=/[&\u00A0<>]/g,C=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),D=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),E=/MSIE/.test(navigator.userAgent),F=window.HTMLElement,G=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(E&&D[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof z.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!G&&this instanceof z.HTMLTemplateElement?h(this.content,a):w(this).innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)},get hidden(){return this.hasAttribute("hidden")},set hidden(a){a?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(F,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=f(this).getContext.apply(f(this),arguments);return a&&g(a)}}),e(h,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=window.HTMLFormElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get elements(){return f(g(this).elements)}}),e(h,b,document.createElement("form")),a.wrappers.HTMLFormElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=(a.mixin,a.wrappers.NodeList,a.registerWrapper),e=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),b.prototype.constructor=b,e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=l.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);l.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=i(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!m){var b=c(a);k.set(this,j(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unsafeUnwrap,i=a.unwrap,j=a.wrap,k=new WeakMap,l=new WeakMap,m=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{constructor:d,get content(){return m?j(h(this).content):k.get(this)}}),m&&g(m,d),a.wrappers.HTMLTemplateElement=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.registerWrapper,e=window.HTMLMediaElement;e&&(b.prototype=Object.create(c.prototype),d(e,b,document.createElement("audio")),a.wrappers.HTMLMediaElement=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var b=f(document.createElement("audio"));d.call(this,b),g(b,this),b.setAttribute("preload","auto"),void 0!==a&&b.setAttribute("src",a)}var d=a.wrappers.HTMLMediaElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLAudioElement;h&&(b.prototype=Object.create(d.prototype),e(h,b,document.createElement("audio")),c.prototype=b.prototype,a.wrappers.HTMLAudioElement=b,a.wrappers.Audio=c)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){return a.replace(/\s+/g," ").trim()}function c(a){e.call(this,a)}function d(a,b,c,f){if(!(this instanceof d))throw new TypeError("DOM object constructor cannot be called as a function.");var g=i(document.createElement("option"));e.call(this,g),h(g,this),void 0!==a&&(g.text=a),void 0!==b&&g.setAttribute("value",b),c===!0&&g.setAttribute("selected",""),g.selected=f===!0}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.rewrap,i=a.unwrap,j=a.wrap,k=window.HTMLOptionElement;c.prototype=Object.create(e.prototype),f(c.prototype,{get text(){return b(this.textContent)},set text(a){this.textContent=b(String(a))},get form(){return j(i(this).form)}}),g(k,c,document.createElement("option")),d.prototype=c.prototype,a.wrappers.HTMLOptionElement=c,a.wrappers.Option=d}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=window.HTMLSelectElement;b.prototype=Object.create(c.prototype),d(b.prototype,{add:function(a,b){"object"==typeof b&&(b=f(b)),f(this).add(f(a),b)},remove:function(a){return void 0===a?void c.prototype.remove.call(this):("object"==typeof a&&(a=f(a)),void f(this).remove(a))},get form(){return g(f(this).form)}}),e(h,b,document.createElement("select")),a.wrappers.HTMLSelectElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.unwrap,g=a.wrap,h=a.wrapHTMLCollection,i=window.HTMLTableElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get caption(){return g(f(this).caption)},createCaption:function(){return g(f(this).createCaption())},get tHead(){return g(f(this).tHead)},createTHead:function(){return g(f(this).createTHead())},createTFoot:function(){return g(f(this).createTFoot())},get tFoot(){return g(f(this).tFoot)},get tBodies(){return h(f(this).tBodies)},createTBody:function(){return g(f(this).createTBody())},get rows(){return h(f(this).rows)},insertRow:function(a){return g(f(this).insertRow(a))}}),e(i,b,document.createElement("table")),a.wrappers.HTMLTableElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableSectionElement;b.prototype=Object.create(c.prototype),d(b.prototype,{constructor:b,get rows(){return f(g(this).rows)},insertRow:function(a){return h(g(this).insertRow(a))}}),e(i,b,document.createElement("thead")),a.wrappers.HTMLTableSectionElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrapHTMLCollection,g=a.unwrap,h=a.wrap,i=window.HTMLTableRowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get cells(){return f(g(this).cells)},insertCell:function(a){return h(g(this).insertCell(a))}}),e(i,b,document.createElement("tr")),a.wrappers.HTMLTableRowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){switch(a.localName){case"content":return new c(a);case"shadow":return new e(a);case"template":return new f(a)}d.call(this,a)}var c=a.wrappers.HTMLContentElement,d=a.wrappers.HTMLElement,e=a.wrappers.HTMLShadowElement,f=a.wrappers.HTMLTemplateElement,g=(a.mixin,a.registerWrapper),h=window.HTMLUnknownElement;b.prototype=Object.create(d.prototype),g(h,b),a.wrappers.HTMLUnknownElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.wrappers.Element,c=a.wrappers.HTMLElement,d=a.registerObject,e="http://www.w3.org/2000/svg",f=document.createElementNS(e,"title"),g=d(f),h=Object.getPrototypeOf(g.prototype).constructor;if(!("classList"in f)){var i=Object.getOwnPropertyDescriptor(b.prototype,"classList");Object.defineProperty(c.prototype,"classList",i),delete b.prototype.classList}a.wrappers.SVGElement=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){m.call(this,a)}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.wrap,g=window.SVGUseElement,h="http://www.w3.org/2000/svg",i=f(document.createElementNS(h,"g")),j=document.createElementNS(h,"use"),k=i.constructor,l=Object.getPrototypeOf(k.prototype),m=l.constructor;b.prototype=Object.create(l),"instanceRoot"in j&&c(b.prototype,{get instanceRoot(){return f(e(this).instanceRoot)},get animatedInstanceRoot(){return f(e(this).animatedInstanceRoot)}}),d(g,b,j),a.wrappers.SVGUseElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.mixin,e=a.registerWrapper,f=a.unsafeUnwrap,g=a.wrap,h=window.SVGElementInstance;h&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return g(f(this).correspondingElement)
+},get correspondingUseElement(){return g(f(this).correspondingUseElement)},get parentNode(){return g(f(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return g(f(this).firstChild)},get lastChild(){return g(f(this).lastChild)},get previousSibling(){return g(f(this).previousSibling)},get nextSibling(){return g(f(this).nextSibling)}}),e(h,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrap,h=a.unwrapIfNeeded,i=a.wrap,j=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return i(f(this).canvas)},drawImage:function(){arguments[0]=h(arguments[0]),f(this).drawImage.apply(f(this),arguments)},createPattern:function(){return arguments[0]=g(arguments[0]),f(this).createPattern.apply(f(this),arguments)}}),d(j,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){e(a,this)}var c=a.mixin,d=a.registerWrapper,e=a.setWrapper,f=a.unsafeUnwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.WebGLRenderingContext;if(i){c(b.prototype,{get canvas(){return h(f(this).canvas)},texImage2D:function(){arguments[5]=g(arguments[5]),f(this).texImage2D.apply(f(this),arguments)},texSubImage2D:function(){arguments[6]=g(arguments[6]),f(this).texSubImage2D.apply(f(this),arguments)}});var j=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(i,b,j),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap,i=window.Range;b.prototype={get startContainer(){return h(e(this).startContainer)},get endContainer(){return h(e(this).endContainer)},get commonAncestorContainer(){return h(e(this).commonAncestorContainer)},setStart:function(a,b){e(this).setStart(g(a),b)},setEnd:function(a,b){e(this).setEnd(g(a),b)},setStartBefore:function(a){e(this).setStartBefore(g(a))},setStartAfter:function(a){e(this).setStartAfter(g(a))},setEndBefore:function(a){e(this).setEndBefore(g(a))},setEndAfter:function(a){e(this).setEndAfter(g(a))},selectNode:function(a){e(this).selectNode(g(a))},selectNodeContents:function(a){e(this).selectNodeContents(g(a))},compareBoundaryPoints:function(a,b){return e(this).compareBoundaryPoints(a,f(b))},extractContents:function(){return h(e(this).extractContents())},cloneContents:function(){return h(e(this).cloneContents())},insertNode:function(a){e(this).insertNode(g(a))},surroundContents:function(a){e(this).surroundContents(g(a))},cloneRange:function(){return h(e(this).cloneRange())},isPointInRange:function(a,b){return e(this).isPointInRange(g(a),b)},comparePoint:function(a,b){return e(this).comparePoint(g(a),b)},intersectsNode:function(a){return e(this).intersectsNode(g(a))},toString:function(){return e(this).toString()}},i.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return h(e(this).createContextualFragment(a))}),c(window.Range,b,document.createRange()),a.wrappers.Range=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.GetElementsByInterface,c=a.ParentNodeInterface,d=a.SelectorsInterface,e=a.mixin,f=a.registerObject,g=f(document.createDocumentFragment());e(g.prototype,c),e(g.prototype,d),e(g.prototype,b);var h=f(document.createComment(""));a.wrappers.Comment=h,a.wrappers.DocumentFragment=g}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=l(k(a).ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;n.set(this,e),this.treeScope_=new d(this,g(e||a)),m.set(this,a)}var c=a.wrappers.DocumentFragment,d=a.TreeScope,e=a.elementFromPoint,f=a.getInnerHTML,g=a.getTreeScope,h=a.mixin,i=a.rewrap,j=a.setInnerHTML,k=a.unsafeUnwrap,l=a.unwrap,m=new WeakMap,n=new WeakMap,o=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{constructor:b,get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return n.get(this)||null},get host(){return m.get(this)||null},invalidateShadowRenderer:function(){return m.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return o.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(c,e,f){var g=H(c),h=H(e),i=f?H(f):null;if(d(e),b(e),f)c.firstChild===f&&(c.firstChild_=f),f.previousSibling_=f.previousSibling;else{c.lastChild_=c.lastChild,c.lastChild===c.firstChild&&(c.firstChild_=c.firstChild);var j=I(g.lastChild);j&&(j.nextSibling_=j.nextSibling)}a.originalInsertBefore.call(g,h,i)}function d(c){var d=H(c),e=d.parentNode;if(e){var f=I(e);b(c),c.previousSibling&&(c.previousSibling.nextSibling_=c),c.nextSibling&&(c.nextSibling.previousSibling_=c),f.lastChild===c&&(f.lastChild_=c),f.firstChild===c&&(f.firstChild_=c),a.originalRemoveChild.call(e,d)}}function e(a){J.set(a,[])}function f(a){var b=J.get(a);return b||J.set(a,b=[]),b}function g(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function h(){for(var a=0;a<N.length;a++){var b=N[a],c=b.parentRenderer;c&&c.dirty||b.render()}N=[]}function i(){y=null,h()}function j(a){var b=L.get(a);return b||(b=new n(a),L.set(a,b)),b}function k(a){var b=E(a).root;return b instanceof D?b:null}function l(a){return j(a.host)}function m(a){this.skip=!1,this.node=a,this.childNodes=[]}function n(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function o(a){for(var b=[],c=a.firstChild;c;c=c.nextSibling)v(c)?b.push.apply(b,f(c)):b.push(c);return b}function p(a){if(a instanceof B)return a;if(a instanceof A)return null;for(var b=a.firstChild;b;b=b.nextSibling){var c=p(b);if(c)return c}return null}function q(a,b){f(b).push(a);var c=K.get(a);c?c.push(b):K.set(a,[b])}function r(a){return K.get(a)}function s(a){K.set(a,void 0)}function t(a,b){var c=b.getAttribute("select");if(!c)return!0;if(c=c.trim(),!c)return!0;if(!(a instanceof z))return!1;if(!P.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function u(a,b){var c=r(b);return c&&c[c.length-1]===a}function v(a){return a instanceof A||a instanceof B}function w(a){return a.shadowRoot}function x(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}var y,z=a.wrappers.Element,A=a.wrappers.HTMLContentElement,B=a.wrappers.HTMLShadowElement,C=a.wrappers.Node,D=a.wrappers.ShadowRoot,E=(a.assert,a.getTreeScope),F=(a.mixin,a.oneOf),G=a.unsafeUnwrap,H=a.unwrap,I=a.wrap,J=new WeakMap,K=new WeakMap,L=new WeakMap,M=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),N=[],O=new ArraySplice;O.equals=function(a,b){return H(a.node)===b},m.prototype={append:function(a){var b=new m(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=g(H(b)),h=a||new WeakMap,i=O.calculateSplices(e,f),j=0,k=0,l=0,m=0;m<i.length;m++){for(var n=i[m];l<n.index;l++)k++,e[j++].sync(h);for(var o=n.removed.length,p=0;o>p;p++){var q=I(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&I(f[k]),p=0;r>p;p++){var t=e[j++],u=t.node;c(b,u,s),h.set(u,!0),t.sync(h)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(h)}}},n.prototype={render:function(a){if(this.dirty){this.invalidateAttributes();var b=this.host;this.distribution(b);var c=a||new m(b);this.buildRenderTree(c,b);var d=!a;d&&c.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var a=this.parentRenderer;if(a&&a.invalidate(),N.push(this),y)return;y=window[M](i,0)}},distribution:function(a){this.resetAllSubtrees(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a),this.resetAllSubtrees(a)},resetAllSubtrees:function(a){for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){G(a).polymerShadowRenderer_=this}};var P=/^(:not\()?[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=G(this).polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=B.prototype.getDistributedNodes=function(){return h(),f(this)},z.prototype.getDestinationInsertionPoints=function(){return h(),r(this)||[]},A.prototype.nodeIsInserted_=B.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=k(this);b&&(a=l(b)),G(this).polymerShadowRenderer_=a,a&&a.invalidate()},a.getRendererForHost=j,a.getShadowTrees=x,a.renderAllPending=h,a.getDestinationInsertionPoints=r,a.visual={insertBefore:c,remove:d}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(b){if(window[b]){d(!a.wrappers[b]);var i=function(a){c.call(this,a)};i.prototype=Object.create(c.prototype),e(i.prototype,{get form(){return h(g(this).form)}}),f(window[b],i,document.createElement(b.slice(4,-7))),a.wrappers[b]=i}}var c=a.wrappers.HTMLElement,d=a.assert,e=a.mixin,f=a.registerWrapper,g=a.unwrap,h=a.wrap,i=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];i.forEach(b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d(a,this)}{var c=a.registerWrapper,d=a.setWrapper,e=a.unsafeUnwrap,f=a.unwrap,g=a.unwrapIfNeeded,h=a.wrap;window.Selection}b.prototype={get anchorNode(){return h(e(this).anchorNode)},get focusNode(){return h(e(this).focusNode)},addRange:function(a){e(this).addRange(f(a))},collapse:function(a,b){e(this).collapse(g(a),b)},containsNode:function(a,b){return e(this).containsNode(g(a),b)},extend:function(a,b){e(this).extend(g(a),b)},getRangeAt:function(a){return h(e(this).getRangeAt(a))},removeRange:function(a){e(this).removeRange(f(a))},selectAllChildren:function(a){e(this).selectAllChildren(g(a))},toString:function(){return e(this).toString()}},c(window.Selection,b,window.getSelection()),a.wrappers.Selection=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){k.call(this,a),this.treeScope_=new p(this,null)}function c(a){var c=document[a];b.prototype[a]=function(){return C(c.apply(A(this),arguments))}}function d(a,b){F.call(A(b),B(a)),e(a,b)}function e(a,b){a.shadowRoot&&b.adoptNode(a.shadowRoot),a instanceof o&&f(a,b);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}function f(a,b){var c=a.olderShadowRoot;c&&b.adoptNode(c)}function g(a){z(a,this)}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return C(c.apply(A(this),arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(A(this),arguments)}}var j=a.GetElementsByInterface,k=a.wrappers.Node,l=a.ParentNodeInterface,m=a.wrappers.Selection,n=a.SelectorsInterface,o=a.wrappers.ShadowRoot,p=a.TreeScope,q=a.cloneNode,r=a.defineWrapGetter,s=a.elementFromPoint,t=a.forwardMethodsToWrapper,u=a.matchesNames,v=a.mixin,w=a.registerWrapper,x=a.renderAllPending,y=a.rewrap,z=a.setWrapper,A=a.unsafeUnwrap,B=a.unwrap,C=a.wrap,D=a.wrapEventTargetMethods,E=(a.wrapNodeList,new WeakMap);b.prototype=Object.create(k.prototype),r(b,"documentElement"),r(b,"body"),r(b,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(c);var F=document.adoptNode,G=document.getSelection;if(v(b.prototype,{adoptNode:function(a){return a.parentNode&&a.parentNode.removeChild(a),d(a,this),a},elementFromPoint:function(a,b){return s(this,this,a,b)},importNode:function(a,b){return q(a,b,A(this))},getSelection:function(){return x(),new m(G.call(B(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var H=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void z(a,this):f?document.createElement(f,b):document.createElement(b)}var e,f;if(void 0!==c&&(e=c.prototype,f=c.extends),e||(e=Object.create(HTMLElement.prototype)),a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var g,h=Object.getPrototypeOf(e),i=[];h&&!(g=a.nativePrototypeTable.get(h));)i.push(h),h=Object.getPrototypeOf(h);if(!g)throw new Error("NotSupportedError");for(var j=Object.create(g),k=i.length-1;k>=0;k--)j=Object.create(j);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(j[a]=function(){C(this)instanceof d||y(this),b.apply(C(this),arguments)})});var l={prototype:j};f&&(l.extends=f),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(j,d),a.nativePrototypeTable.set(e,j);H.call(B(this),b,l);return d},t([window.HTMLDocument||window.Document],["registerElement"])}t([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(u)),t([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=E.get(this);return a?a:(a=new g(B(this).implementation),E.set(this,a),a)},get defaultView(){return C(B(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),h(g,"createDocumentType"),h(g,"createDocument"),h(g,"createHTMLDocument"),i(g,"hasFeature"),w(window.DOMImplementation,g),t([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),a.adoptNodeNoRemove=d,a.wrappers.DOMImplementation=g,a.wrappers.Document=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.EventTarget,d=a.wrappers.Selection,e=a.mixin,f=a.registerWrapper,g=a.renderAllPending,h=a.unwrap,i=a.unwrapIfNeeded,j=a.wrap,k=window.Window,l=window.getComputedStyle,m=window.getDefaultComputedStyle,n=window.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},m&&(k.prototype.getDefaultComputedStyle=function(a,b){return j(this||window).getDefaultComputedStyle(i(a),b)}),k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(a){k.prototype[a]=function(){var b=j(this||window);return b[a].apply(b,arguments)},delete window[a]}),e(b.prototype,{getComputedStyle:function(a,b){return g(),l.call(h(this),i(a),b)},getSelection:function(){return g(),new d(n.call(h(this)))},get document(){return j(h(this).document)}}),m&&(b.prototype.getDefaultComputedStyle=function(a,b){return g(),m.call(h(this),i(a),b)}),f(k,b,window),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;d&&(c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)})}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b;b=a instanceof f?a:new f(a&&e(a)),d(b,this)}var c=a.registerWrapper,d=a.setWrapper,e=a.unwrap,f=window.FormData;f&&(c(f,b,new f),a.wrappers.FormData=b)}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrapIfNeeded,c=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(a){return c.call(this,b(a))}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(a){function b(a,c){var d,e,f,g,h=a.firstElementChild;for(e=[],f=a.shadowRoot;f;)e.push(f),f=f.olderShadowRoot;for(g=e.length-1;g>=0;g--)if(d=e[g].querySelector(c))return d;for(;h;){if(d=b(h,c))return d;h=h.nextElementSibling}return null}function c(a,b,d){var e,f,g,h,i,j=a.firstElementChild;for(g=[],f=a.shadowRoot;f;)g.push(f),f=f.olderShadowRoot;for(h=g.length-1;h>=0;h--)for(e=g[h].querySelectorAll(b),i=0;i<e.length;i++)d.push(e[i]);for(;j;)c(j,b,d),j=j.nextElementSibling;return d}window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var d=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var a=d.call(this);return CustomElements.watchShadow(this),a},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot,a.queryAllShadows=function(a,d,e){return e?c(a,d,[]):b(a,d)}}(window.Platform),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=Array.prototype.slice.call(g.sheet.cssRules,0),b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertShadowDOMSelectors(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertShadowDOMSelectors:function(a){for(var b=0;b<shadowDOMSelectorsRe.length;b++)a=a.replace(shadowDOMSelectorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){if(a.selectorText&&a.style&&void 0!==a.style.cssText)c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n";else if(a.type===CSSRule.MEDIA_RULE)c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n";else try{a.cssText&&(c+=a.cssText+"\n\n")}catch(d){a.type===CSSRule.KEYFRAMES_RULE&&a.cssRules&&(c+=this.ieSafeCssTextFromKeyFrameRule(a))}},this),c},ieSafeCssTextFromKeyFrameRule:function(a){var b="@keyframes "+a.name+" {";return Array.prototype.forEach.call(a.cssRules,function(a){b+=" "+a.keyText+" {"+a.style.cssText+"}"}),b+=" }"},scopeSelector:function(a,b,c){var d=[],e=a.split(",");return e.forEach(function(a){a=a.trim(),this.selectorNeedsScoping(a,b)&&(a=c&&!a.match(polyfillHostNoCombinator)?this.applyStrictSelectorScope(a,b):this.applySelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){if(Array.isArray(b))return!0;var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySelectorScope:function(a,b){return Array.isArray(b)?this.applySelectorScopeList(a,b):this.applySimpleSelectorScope(a,b)},applySelectorScopeList:function(a,b){for(var c,d=[],e=0;c=b[e];e++)d.push(this.applySimpleSelectorScope(a,c));return d.join(", ")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),shadowDOMSelectorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g,/::content/g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var b="link[rel=stylesheet]["+y+"]",c="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+b,HTMLImports.importer.importsPreloadSelectors+=","+b,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,b,c].join(",");var d=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var b=a.__importElement||a;if(!b.hasAttribute(y))return void d.call(this,a);a.__resource&&(b=a.ownerDocument.createElement("style"),b.textContent=a.__resource),HTMLImports.path.resolveUrlsInStyle(b),b.textContent=k.shimStyle(b),b.removeAttribute(y,""),b.setAttribute(z,""),b[z]=!0,b.parentNode!==C&&(a.parentNode===C?C.replaceChild(b,a):this.addElementToDocument(b)),b.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var e=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:e.call(this,a)}}})}a.ShadowCSS=k}(window.Platform)):!function(){window.wrap=window.unwrap=function(a){return a},addEventListener("DOMContentLoaded",function(){if(CustomElements.useNative===!1){var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b}}})}(window.Platform),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";
+else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");j="http://a/b"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))}};var r=a.URL;r&&(i.createObjectURL=function(){return r.createObjectURL.apply(r,arguments)},i.revokeObjectURL=function(a){r.revokeObjectURL(a)}),a.URL=i}}(this),function(){Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();return d.push.apply(d,arguments),b.apply(a,d)}})}(window.Platform),function(a){function b(a){u.push(a),t||(t=!0,q(d))}function c(a){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(a)||a}function d(){t=!1;var a=u;u=[],a.sort(function(a,b){return a.uid_-b.uid_});var b=!1;a.forEach(function(a){var c=a.takeRecords();e(a),c.length&&(a.callback_(c,a),b=!0)}),b&&d()}function e(a){a.nodes_.forEach(function(b){var c=p.get(b);c&&c.forEach(function(b){b.observer===a&&b.removeTransientObservers()})})}function f(a,b){for(var c=a;c;c=c.parentNode){var d=p.get(c);if(d)for(var e=0;e<d.length;e++){var f=d[e],g=f.options;if(c===a||g.subtree){var h=b(g);h&&f.enqueue(h)}}}}function g(a){this.callback_=a,this.nodes_=[],this.records_=[],this.uid_=++v}function h(a,b){this.type=a,this.target=b,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function i(a){var b=new h(a.type,a.target);return b.addedNodes=a.addedNodes.slice(),b.removedNodes=a.removedNodes.slice(),b.previousSibling=a.previousSibling,b.nextSibling=a.nextSibling,b.attributeName=a.attributeName,b.attributeNamespace=a.attributeNamespace,b.oldValue=a.oldValue,b}function j(a,b){return w=new h(a,b)}function k(a){return x?x:(x=i(w),x.oldValue=a,x)}function l(){w=x=void 0}function m(a){return a===x||a===w}function n(a,b){return a===b?a:x&&m(a)?x:null}function o(a,b,c){this.observer=a,this.target=b,this.options=c,this.transientObservedNodes=[]}var p=new WeakMap,q=window.msSetImmediate;if(!q){var r=[],s=String(Math.random());window.addEventListener("message",function(a){if(a.data===s){var b=r;r=[],b.forEach(function(a){a()})}}),q=function(a){r.push(a),window.postMessage(s,"*")}}var t=!1,u=[],v=0;g.prototype={observe:function(a,b){if(a=c(a),!b.childList&&!b.attributes&&!b.characterData||b.attributeOldValue&&!b.attributes||b.attributeFilter&&b.attributeFilter.length&&!b.attributes||b.characterDataOldValue&&!b.characterData)throw new SyntaxError;var d=p.get(a);d||p.set(a,d=[]);for(var e,f=0;f<d.length;f++)if(d[f].observer===this){e=d[f],e.removeListeners(),e.options=b;break}e||(e=new o(this,a,b),d.push(e),this.nodes_.push(a)),e.addListeners()},disconnect:function(){this.nodes_.forEach(function(a){for(var b=p.get(a),c=0;c<b.length;c++){var d=b[c];if(d.observer===this){d.removeListeners(),b.splice(c,1);break}}},this),this.records_=[]},takeRecords:function(){var a=this.records_;return this.records_=[],a}};var w,x;o.prototype={enqueue:function(a){var c=this.observer.records_,d=c.length;if(c.length>0){var e=c[d-1],f=n(e,a);if(f)return void(c[d-1]=f)}else b(this.observer);c[d]=a},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(a){var b=this.options;b.attributes&&a.addEventListener("DOMAttrModified",this,!0),b.characterData&&a.addEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.addEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(a){var b=this.options;b.attributes&&a.removeEventListener("DOMAttrModified",this,!0),b.characterData&&a.removeEventListener("DOMCharacterDataModified",this,!0),b.childList&&a.removeEventListener("DOMNodeInserted",this,!0),(b.childList||b.subtree)&&a.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(a){if(a!==this.target){this.addListeners_(a),this.transientObservedNodes.push(a);var b=p.get(a);b||p.set(a,b=[]),b.push(this)}},removeTransientObservers:function(){var a=this.transientObservedNodes;this.transientObservedNodes=[],a.forEach(function(a){this.removeListeners_(a);for(var b=p.get(a),c=0;c<b.length;c++)if(b[c]===this){b.splice(c,1);break}},this)},handleEvent:function(a){switch(a.stopImmediatePropagation(),a.type){case"DOMAttrModified":var b=a.attrName,c=a.relatedNode.namespaceURI,d=a.target,e=new j("attributes",d);e.attributeName=b,e.attributeNamespace=c;var g=a.attrChange===MutationEvent.ADDITION?null:a.prevValue;f(d,function(a){return!a.attributes||a.attributeFilter&&a.attributeFilter.length&&-1===a.attributeFilter.indexOf(b)&&-1===a.attributeFilter.indexOf(c)?void 0:a.attributeOldValue?k(g):e});break;case"DOMCharacterDataModified":var d=a.target,e=j("characterData",d),g=a.prevValue;f(d,function(a){return a.characterData?a.characterDataOldValue?k(g):e:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(a.target);case"DOMNodeInserted":var h,i,d=a.relatedNode,m=a.target;"DOMNodeInserted"===a.type?(h=[m],i=[]):(h=[],i=[m]);var n=m.previousSibling,o=m.nextSibling,e=j("childList",d);e.addedNodes=h,e.removedNodes=i,e.previousSibling=n,e.nextSibling=o,f(d,function(a){return a.childList?e:void 0})}l()}},a.JsMutationObserver=g,a.MutationObserver||(a.MutationObserver=g)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){function b(a,b){b=b||o,d(function(){f(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===q}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===q)&&(b.removeEventListener(r,e),d(a,b))};b.addEventListener(r,e)}}function e(a){a.target.__loaded=!0}function f(a,b){function c(){h==i&&a&&a()}function d(a){e(a),h++,c()}var f=b.querySelectorAll("link[rel=import]"),h=0,i=f.length;if(i)for(var j,k=0;i>k&&(j=f[k]);k++)g(j)?d.call(j,{target:j}):(j.addEventListener("load",d),j.addEventListener("error",d));else c()}function g(a){return l?a.__loaded||a.import&&"loading"!==a.import.readyState:a.__importParsed}function h(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)i(b)&&j(b)}function i(a){return"link"===a.localName&&"import"===a.rel}function j(a){var b=a.import;b?e({target:a}):(a.addEventListener("load",e),a.addEventListener("error",e))}var k="import"in document.createElement("link"),l=k;isIE=/Trident/.test(navigator.userAgent);var m=Boolean(window.ShadowDOMPolyfill),n=function(a){return m?ShadowDOMPolyfill.wrapIfNeeded(a):a},o=n(document),p={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return n(a)},configurable:!0};Object.defineProperty(document,"_currentScript",p),Object.defineProperty(o,"_currentScript",p);var q=isIE?"complete":"interactive",r="readystatechange";l&&(new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&h(b.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var a,b=document.querySelectorAll("link[rel=import]"),c=0,d=b.length;d>c&&(a=b[c]);c++)j(a)}()),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),o.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=l,a.isImportLoaded=g,a.whenReady=b,a.isIE=isIE,a.whenImportsReady=b}(window.HTMLImports),function(a){var b=(a.path,a.xhr),c=a.flags,d=function(a,b){this.cache={},this.onload=a,this.oncomplete=b,this.inflight=0,this.pending={}};d.prototype={addNodes:function(a){this.inflight+=a.length;for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)this.require(b);this.checkDone()},addNode:function(a){this.inflight++,this.require(a),this.checkDone()},require:function(a){var b=a.src||a.href;a.__nodeUrl=b,this.dedupe(b,a)||this.fetch(b,a)},dedupe:function(a,b){if(this.pending[a])return this.pending[a].push(b),!0;return this.cache[a]?(this.onload(a,b,this.cache[a]),this.tail(),!0):(this.pending[a]=[b],!1)},fetch:function(a,d){if(c.load&&console.log("fetch",a,d),a.match(/^data:/)){var e=a.split(","),f=e[0],g=e[1];g=f.indexOf(";base64")>-1?atob(g):decodeURIComponent(g),setTimeout(function(){this.receive(a,d,null,g)}.bind(this),0)}else{var h=function(b,c,e){this.receive(a,d,b,c,e)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d,e){this.cache[a]=d;for(var f,g=this.pending[a],h=0,i=g.length;i>h&&(f=g[h]);h++)this.onload(a,f,d,c,e),this.tail();this.pending[a]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},b=b||{async:!0,ok:function(a){return a.status>=200&&a.status<300||304===a.status||0===a.status},load:function(c,d,e){var f=new XMLHttpRequest;return(a.flags.debug||a.flags.bust)&&(c+="?"+Math.random()),f.open("GET",c,b.async),f.addEventListener("readystatechange",function(){if(4===f.readyState){var a=f.getResponseHeader("Location"),c=null;if(a)var c="/"===a.substr(0,1)?location.origin+a:a;d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b=d(a);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(b)}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=a.isIE,j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a)},invalidateParse:function(a){a&&a.__importLink&&(a.__importParsed=a.__importLink.__importParsed=!1,this.parseSoon())},parseSoon:function(){this._parseSoon&&cancelAnimationFrame(this._parseDelay);var a=this;this._parseSoon=requestAnimationFrame(function(){a.parseNext()})},parseImport:function(a){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.import&&(a.import.__importParsed=!0),this.markParsingComplete(a),a.dispatchEvent(a.__resource&&!a.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),a.__pending)for(var b;a.__pending.length;)b=a.__pending.shift(),b&&b({target:a});this.parseNext()},parseLink:function(a){b(a)?this.parseImport(a):(a.href=a.href,this.parseGeneric(a))},parseStyle:function(a){var b=a;a=f(a),a.__importElement=b,this.parseGeneric(a)},parseGeneric:function(a){this.trackElement(a),this.addElementToDocument(a)},rootImportForElement:function(a){for(var b=a;b.ownerDocument.__importLink;)b=b.ownerDocument.__importLink;return b},addElementToDocument:function(a){for(var b=this.rootImportForElement(a.__importElement||a),c=b.__insertedElements=b.__insertedElements||0,d=b.nextElementSibling,e=0;c>e;e++)d=d&&d.nextElementSibling;b.parentNode.insertBefore(a,d)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a),c.parseNext()};if(a.addEventListener("load",d),a.addEventListener("error",d),i&&"style"===a.localName){var e=!1;if(-1==a.textContent.indexOf("@import"))e=!0;else if(a.sheet){e=!0;for(var f,g=a.sheet.cssRules,h=g?g.length:0,j=0;h>j&&(f=g[j]);j++)f.type===CSSRule.IMPORT_RULE&&(e=e&&Boolean(f.styleSheet))}e&&a.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(b){var d=document.createElement("script");d.__importElement=b,d.src=b.src?b.src:c(b),a.currentScript=b,this.trackElement(d,function(){d.parentNode.removeChild(d),a.currentScript=null}),this.addElementToDocument(d)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){if(a&&this._mayParse.indexOf(a)<0){this._mayParse.push(a);for(var d,e=a.querySelectorAll(this.parseSelectorsForNode(a)),f=0,g=e.length;g>f&&(d=e[f]);f++)if(!this.isParsed(d))return this.hasResource(d)?b(d)?this.nextToParseInDoc(d.import,d):d:void 0}return c},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===j?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},hasResource:function(a){return b(a)&&void 0===a.import?!1:!0}},l=/(url\()([^)]*)(\))/g,m=/(@import[\s]+(?!url\())([^;]*)(;)/g,n={resolveUrlsInStyle:function(a){var b=a.ownerDocument,c=b.createElement("a");return a.textContent=this.resolveUrlsInCssText(a.textContent,c),a},resolveUrlsInCssText:function(a,b){var c=this.replaceUrls(a,b,l);return c=this.replaceUrls(c,b,m)},replaceUrls:function(a,b,c){return a.replace(c,function(a,c,d,e){var f=d.replace(/["']/g,"");return b.href=f,f=b.href,c+"'"+f+"'"+e})}};a.parser=k,a.path=n}(HTMLImports),function(a){function b(a){return c(a,g)}function c(a,b){return"link"===a.localName&&a.getAttribute("rel")===b}function d(a,b){var c=a;c instanceof Document||(c=document.implementation.createHTMLDocument(g)),c._URL=b;var d=c.createElement("base");d.setAttribute("href",b),c.baseURI||(c.baseURI=b);var e=c.createElement("meta");return e.setAttribute("charset","utf-8"),c.head.appendChild(e),c.head.appendChild(d),a instanceof Document||(c.body.innerHTML=a),window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(c),c}var e=a.useNative,f=a.flags,g="import",h=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(e)var i={};else{var j=(a.xhr,a.Loader),k=a.parser,i={documents:{},documentPreloadSelectors:"link[rel="+g+"]",importsPreloadSelectors:["link[rel="+g+"]"].join(","),loadNode:function(a){l.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);l.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===h?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e,g,h){if(f.load&&console.log("loaded",a,c),c.__resource=e,c.__error=g,b(c)){var i=this.documents[a];void 0===i&&(i=g?null:d(e,h||a),i&&(i.__importLink=c,this.bootDocument(i)),this.documents[a]=i),c.import=i}k.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),k.parseNext()},loadedAll:function(){k.parseNext()}},l=new j(i.loaded.bind(i),i.loadedAll.bind(i));if(!document.baseURI){var m={get:function(){var a=document.querySelector("base");return a?a.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",m),Object.defineProperty(h,"baseURI",m)}"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){var c=document.createEvent("HTMLEvents");return c.initEvent(a,b.bubbles===!1?!1:!0,b.cancelable===!1?!1:!0,b.detail),c})}a.importer=i,a.IMPORT_LINK_TYPE=g,a.importLoader=l}(window.HTMLImports),function(a){function b(a){for(var b,d=0,e=a.length;e>d&&(b=a[d]);d++)"childList"===b.type&&b.addedNodes.length&&c(b.addedNodes)}function c(a){for(var b,e,g=0,h=a.length;h>g&&(e=a[g]);g++)b=b||e.ownerDocument,d(e)&&f.loadNode(e),e.children&&e.children.length&&c(e.children)}function d(a){return 1===a.nodeType&&g.call(a,f.loadSelectorsForNode(a))}function e(a){h.observe(a,{childList:!0,subtree:!0})}var f=(a.IMPORT_LINK_TYPE,a.importer),g=(a.parser,HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector),h=new MutationObserver(b);a.observe=e,f.observe=e}(HTMLImports),function(){function a(){HTMLImports.importer.bootDocument(b)}var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return B.dom&&console.group("upgrade:",b.localName),a.upgrade(b),B.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(G.push(a),!F){F=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){F=!1;for(var a,b=G,c=0,d=b.length;d>c&&(a=b[c]);c++)a();G=[]}function l(a){D?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&B.dom)&&(B.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?B.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(B.dom&&console.log("inserted:",a.localName),a.attachedCallback())),B.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){D?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&B.dom)&&(B.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?B.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),B.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){B.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(B.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(I(a.addedNodes,function(a){a.localName&&g(a)}),I(a.removedNodes,function(a){a.localName&&n(a)}))}),B.dom&&console.groupEnd()}function v(){u(H.takeRecords()),k()}function w(a){H.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){B.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),B.dom&&console.groupEnd()}function z(a){E=[],A(a),E=null}function A(a){if(a=q(a),!(E.indexOf(a)>=0)){E.push(a);for(var b,c=a.querySelectorAll("link[rel="+C+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&A(b.import);y(a)}}var B=window.logFlags||{},C=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",D=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=D;var E,F=!1,G=[],H=new MutationObserver(u),I=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=C,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),i(b,c),b.__upgraded__=!0,k(b),a.insertedNode(b),a.upgradeSubtree(b),b}function i(a,b){Object.__proto__?a.__proto__=b.prototype:(j(a,b.prototype,b.native),a.__proto__=b.prototype)}function j(a,b,c){for(var d={},e=b;e!==c&&e!==HTMLElement.prototype;){for(var f,g=Object.getOwnPropertyNames(e),h=0;f=g[h];h++)d[f]||(Object.defineProperty(a,f,Object.getOwnPropertyDescriptor(e,f)),d[f]=1);e=Object.getPrototypeOf(e)}}function k(a){a.createdCallback&&a.createdCallback()}function l(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){m.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){m.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function m(a,b,c){a=a.toLowerCase();var d=this.getAttribute(a);c.apply(this,arguments);var e=this.getAttribute(a);this.attributeChangedCallback&&e!==d&&this.attributeChangedCallback(a,d,e)}function n(a){return a?z[a.toLowerCase()]:void 0}function o(a,b){z[a]=b}function p(a){return function(){return g(a)}}function q(a,b,c){return a===A?r(b,c):C(a,b)}function r(a,b){var c=n(b||a);if(c){if(a==c.tag&&b==c.is)return new c.ctor;if(!b&&!c.is)return new c.ctor}if(b){var d=r(a);return d.setAttribute("is",b),d}var d=B(a);return a.indexOf("-")>=0&&i(d,HTMLElement),d}function s(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=n(b||a.localName);if(c){if(b&&c.tag==a.localName)return h(a,c);if(!b&&!c.extends)return h(a,c)}}}function t(b){var c=D.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var u=a.flags,v=Boolean(document.registerElement),w=!u.register&&v&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative);if(w){var x=function(){};a.registry={},a.upgradeElement=x,a.watchShadow=x,a.upgrade=x,a.upgradeAll=x,a.upgradeSubtree=x,a.observeDocument=x,a.upgradeDocument=x,a.upgradeDocumentTree=x,a.takeRecords=x,a.reservedTagList=[]}else{var y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],z={},A="http://www.w3.org/1999/xhtml",B=document.createElement.bind(document),C=document.createElementNS.bind(document),D=Node.prototype.cloneNode;document.registerElement=b,document.createElement=r,document.createElementNS=q,Node.prototype.cloneNode=t,a.registry=z,a.upgrade=s}var E;E=Object.__proto__||w?function(a,b){return a instanceof b}:function(a,b){for(var c=a;c;){if(c===b.prototype)return!0;c=c.__proto__}return!1},a.instanceof=E,a.reservedTagList=y,document.register=document.registerElement,a.hasNative=v,a.useNative=w}(window.CustomElements),function(a){function b(a){return"link"===a.localName&&a.getAttribute("rel")===c}var c=a.IMPORT_LINK_TYPE,d={selectors:["link[rel="+c+"]"],map:{link:"parseLink"},parse:function(a){if(!a.__parsed){a.__parsed=!0;var b=a.querySelectorAll(d.selectors);e(b,function(a){d[d.map[a.localName]](a)}),CustomElements.upgradeDocument(a),CustomElements.observeDocument(a)}},parseLink:function(a){b(a)&&this.parseImport(a)},parseImport:function(a){a.import&&d.parse(a.import)}},e=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.parser=d,a.IMPORT_LINK_TYPE=c}(window.CustomElements),function(a){function b(){CustomElements.parser.parse(document),CustomElements.upgradeDocument(document),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)}),CustomElements.ready=!0,setTimeout(function(){CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");return c.initCustomEvent(a,Boolean(b.bubbles),Boolean(b.cancelable),b.detail),c},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||a.flags.eager)b();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,b)}else b()}(window.CustomElements),function(){if(window.ShadowDOMPolyfill){var a=["upgradeAll","upgradeSubtree","observeDocument","upgradeDocument"],b={};a.forEach(function(a){b[a]=CustomElements[a]}),a.forEach(function(a){CustomElements[a]=function(c){return b[a](wrap(c))}})}}(),function(a){"use strict";function b(){window.Polymer===e&&(window.Polymer=function(){throw new Error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}if(!window.performance){var c=Date.now();window.performance={now:function(){return Date.now()-c}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var a=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return a?function(b){return a(function(){b(performance.now())})}:function(a){return window.setTimeout(a,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(a){clearTimeout(a)}}());var d=[],e=function(a){"string"!=typeof a&&1===arguments.length&&Array.prototype.push.call(arguments,document._currentScript),d.push(arguments)
+};window.Polymer=e,a.consumeDeclarations=function(b){a.consumeDeclarations=function(){throw"Possible attempt to load Polymer twice"},b&&b(d),d=null},HTMLImports.useNative?b():addEventListener("DOMContentLoaded",b)}(window.Platform),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window);
 //# sourceMappingURL=platform.js.map
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.js.map b/pkg/web_components/lib/platform.js.map
index 096554d..f6b3145 100644
--- a/pkg/web_components/lib/platform.js.map
+++ b/pkg/web_components/lib/platform.js.map
@@ -1 +1 @@
-{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","build/if-poly.js","../observe-js/src/observe.js","../ShadowDOM/src/wrappers.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/TouchEvent.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/DOMTokenList.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLFormElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/FormData.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","../MutationObservers/MutationObserver.js","../HTMLImports/src/scope.js","../HTMLImports/src/base.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/unresolved.js","src/module.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        var hasValue = entry[0] === key;\n        entry[0] = entry[1] = undefined;\n        return hasValue;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && hasEval && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  // The name of the implementation property is intentionally hard to\n  // remember. Unfortunately, browsers are slower doing obj[expr] than\n  // obj.foo so we resort to repeat this ugly name. This ugly name is never\n  // used outside of this file though.\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name) :\n        function() { return this.__impl4cf1e782hg__[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.__impl4cf1e782hg__.' + name + ' = v') :\n        function(v) { this.__impl4cf1e782hg__[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name +\n                     '.apply(this.__impl4cf1e782hg__, arguments)') :\n        function() {\n          return this.__impl4cf1e782hg__[name].apply(\n              this.__impl4cf1e782hg__, arguments);\n        };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  function isWrapper(object) {\n    return object && object.__impl4cf1e782hg__;\n  }\n\n  function isNative(object) {\n    return !isWrapper(object);\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.__wrapper8e3dd93a60__ ||\n        (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function unsafeUnwrap(wrapper) {\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function setWrapper(impl, wrapper) {\n    wrapper.__impl4cf1e782hg__ = impl;\n    impl.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.__impl4cf1e782hg__[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.setWrapper = setWrapper;\n  scope.unsafeUnwrap = unsafeUnwrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback() {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    while (globalMutationObservers.length) {\n      var notifyList = globalMutationObservers;\n      globalMutationObservers = [];\n\n      // Deliver changes in birth order of the MutationObservers.\n      notifyList.sort(function(x, y) { return x.uid_ - y.uid_; });\n\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n        }\n      }\n    }\n  }\n\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyObserversEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      if (!observer.records_.length) {\n        globalMutationObservers.push(observer);\n        anyObserversEnqueued = true;\n      }\n      observer.records_.push(record);\n    }\n\n    if (anyObserversEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  MutationObserver.prototype = {\n    constructor: MutationObserver,\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload') {\n        return new BeforeUnloadEvent(impl);\n      }\n      setWrapper(impl, this);\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        setWrapper(type, this);\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return unsafeUnwrap(this).returnValue;\n    },\n    set returnValue(v) {\n      unsafeUnwrap(this).returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    setWrapper(impl, this);\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element =\n        wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    setWrapper(impl, this);\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(unsafeUnwrap(this).target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return unsafeUnwrap(this)[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unsafeUnwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unsafeUnwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unsafeUnwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(\n          unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false));\n    else\n      clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(unsafeUnwrap(this), childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to unsafeUnwrap(this).textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        unsafeUnwrap(this).textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(unsafeUnwrap(this),\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n  var getTreeScope = scope.getTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var originalDocumentQuerySelector = document.querySelector;\n  var originalElementQuerySelector = document.documentElement.querySelector;\n\n  var originalDocumentQuerySelectorAll = document.querySelectorAll;\n  var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;\n\n  var originalDocumentGetElementsByTagName = document.getElementsByTagName;\n  var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;\n\n  var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;\n  var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;\n\n  var OriginalElement = window.Element;\n  var OriginalDocument = window.HTMLDocument || window.Document;\n\n  function filterNodeList(list, index, result, deep) {\n    var wrappedItem = null;\n    var root = null;\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrappedItem = wrap(list[i]);\n      if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          continue;\n        }\n      }\n      result[index++] = wrappedItem;\n    }\n\n    return index;\n  }\n\n  function shimSelector(selector) {\n    return String(selector).replace(/\\/deep\\//g, ' ');\n  }\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalNameOnly(el, ns, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, index, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[index++] = el;\n      index = findElements(el, index, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return index;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  function querySelectorAllFiltered(p, index, result, selector, deep) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementQuerySelectorAll.call(target, selector);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentQuerySelectorAll.call(target, selector);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    }\n\n    return filterNodeList(list, index, result, deep);\n  }\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var target = unsafeUnwrap(this);\n      var wrappedItem;\n      var root = getTreeScope(this).root;\n      if (root instanceof scope.wrappers.ShadowRoot) {\n        // We are in the shadow tree and the logical tree is\n        // going to be disconnected so we do a manual tree traversal\n        return findOne(this, selector);\n      } else if (target instanceof OriginalElement) {\n        wrappedItem = wrap(originalElementQuerySelector.call(target, selector));\n      } else if (target instanceof OriginalDocument) {\n        wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));\n      } else {\n        // When we get a ShadowRoot the logical tree is going to be disconnected\n        // so we do a manual tree traversal\n        return findOne(this, selector);\n      }\n\n      if (!wrappedItem) {\n        // When the original query returns nothing\n        // we return nothing (to be consistent with the other wrapped calls)\n        return wrappedItem;\n      } else if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          // When the original query returns an element in the ShadowDOM\n          // we must do a manual tree traversal\n          return findOne(this, selector);\n        }\n      }\n\n      return wrappedItem;\n    },\n    querySelectorAll: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var result = new NodeList();\n\n      result.length = querySelectorAllFiltered.call(this,\n          matchesSelector,\n          0,\n          result,\n          selector,\n          deep);\n\n      return result;\n    }\n  };\n\n  function getElementsByTagNameFiltered(p, index, result, localName,\n                                        lowercase) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagName.call(target, localName,\n                                                      lowercase);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagName.call(target, localName,\n                                                       lowercase);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagNameNS.call(target, ns, localName);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      var match = localName === '*' ? matchesEveryThing : matchesTagName;\n\n      result.length = getElementsByTagNameFiltered.call(this,\n          match,\n          0,\n          result,\n          localName,\n          localName.toLowerCase());\n\n      return result;\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n      var match = null;\n\n      if (ns === '*') {\n        match = localName === '*' ? matchesEveryThing : matchesLocalNameOnly;\n      } else {\n        match = localName === '*' ? matchesNameSpace : matchesLocalNameNS;\n      }\n\n      result.length = getElementsByTagNameNSFiltered.call(this,\n          match,\n          0,\n          result,\n          ns || null,\n          localName);\n\n      return result;\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return unsafeUnwrap(this).data;\n    },\n    set data(value) {\n      var oldValue = unsafeUnwrap(this).data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      unsafeUnwrap(this).data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    setWrapper(impl, this);\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    constructor: DOMTokenList,\n    get length() {\n      return unsafeUnwrap(this).length;\n    },\n    item: function(index) {\n      return unsafeUnwrap(this).item(index);\n    },\n    contains: function(token) {\n      return unsafeUnwrap(this).contains(token);\n    },\n    add: function() {\n      unsafeUnwrap(this).add.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      unsafeUnwrap(this).remove.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = unsafeUnwrap(this).toggle.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return unsafeUnwrap(this).polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = unsafeUnwrap(this).getAttribute(name);\n      unsafeUnwrap(this).setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = unsafeUnwrap(this).getAttribute(name);\n      unsafeUnwrap(this).removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(unsafeUnwrap(this), selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unsafeUnwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unsafeUnwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unsafeUnwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        unsafeUnwrap(this).innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    },\n\n    get hidden() {\n      return this.hasAttribute('hidden');\n    },\n    set hidden(v) {\n      if (v) {\n        this.setAttribute('hidden', '');\n      } else {\n        this.removeAttribute('hidden');\n      }\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return unsafeUnwrap(this)[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        unsafeUnwrap(this)[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    constructor: HTMLContentElement,\n\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n  HTMLShadowElement.prototype.constructor = HTMLShadowElement;\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    constructor: HTMLTemplateElement,\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(unsafeUnwrap(this).content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  if (!OriginalHTMLMediaElement) return;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  if (!OriginalHTMLAudioElement) return;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    constructor: HTMLTableSectionElement,\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(unsafeUnwrap(this).correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(unsafeUnwrap(this).correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(unsafeUnwrap(this).nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    setWrapper(impl, this);\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    setWrapper(impl, this);\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    setWrapper(impl, this);\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(unsafeUnwrap(this).startContainer);\n    },\n    get endContainer() {\n      return wrap(unsafeUnwrap(this).endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(unsafeUnwrap(this).commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(unsafeUnwrap(this).extractContents());\n    },\n    cloneContents: function() {\n      return wrap(unsafeUnwrap(this).cloneContents());\n    },\n    insertNode: function(node) {\n      unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(unsafeUnwrap(this).cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(unsafeUnwrap(this).createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    constructor: ShadowRoot,\n\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer)\n          parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      unsafeUnwrap(node).polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  //   negation\n  var selectorStartCharRe = /^(:not\\()?[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    setWrapper(impl, this);\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(unsafeUnwrap(this).anchorNode);\n    },\n    get focusNode() {\n      return wrap(unsafeUnwrap(this).focusNode);\n    },\n    addRange: function(range) {\n      unsafeUnwrap(this).addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(unsafeUnwrap(this).getRangeAt(index));\n    },\n    removeRange: function(range) {\n      unsafeUnwrap(this).removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      unsafeUnwrap(this).selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, unsafeUnwrap(this));\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        setWrapper(node, this);\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    setWrapper(impl, this);\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(unsafeUnwrap(this), arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      return wrap(this || window).getDefaultComputedStyle(\n          unwrapIfNeeded(el), pseudo);\n    };\n  }\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getDefaultComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    Window.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      renderAllPending();\n      return originalGetDefaultComputedStyle.call(unwrap(this),\n          unwrapIfNeeded(el),pseudo);\n    };\n  }\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  if (OriginalDataTransferSetDragImage) {\n    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n    };\n  }\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n\n  function FormData(formElement) {\n    var impl;\n    if (formElement instanceof OriginalFormData) {\n      impl = formElement;\n    } else {\n      impl = new OriginalFormData(formElement && unwrap(formElement));\n    }\n    setWrapper(impl, this);\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // KEYFRAMES_RULE in IE throws when we query cssText\n          // when it contains a -webkit- property.\n          // if this happens, we fallback to constructing the rule\n          // from the CSSRuleSet\n          // https://connect.microsoft.com/IE/feedbackdetail/view/955703/accessing-csstext-of-a-keyframe-rule-that-contains-a-webkit-property-via-cssom-generates-exception\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            if (rule.type === CSSRule.KEYFRAMES_RULE && rule.cssRules) {\n              cssText += this.ieSafeCssTextFromKeyFrameRule(rule);\n            }\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  ieSafeCssTextFromKeyFrameRule: function(rule) {\n    var cssText = '@keyframes ' + rule.name + ' {';\n    Array.prototype.forEach.call(rule.cssRules, function(rule) {\n      cssText += ' ' + rule.keyText + ' {' + rule.style.cssText + '}';\n    });\n    cssText += ' }';\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*?['\"](.*?)['\"][;\\s]*}([^{]*?){/gim,  \n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = Array.prototype.slice.call(style.sheet.cssRules, 0);\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = elt.__resource;\n        }\n        // relay on HTMLImports for path fixup\n        HTMLImports.path.resolveUrlsInStyle(style);\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            this.addElementToDocument(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  // Copy over the static methods\n  var OriginalURL = scope.URL;\n  if (OriginalURL) {\n    jURL.createObjectURL = function(blob) {\n      // IE extension allows a second optional options argument.\n      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx\n      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n    };\n    jURL.revokeObjectURL = function(url) {\n      OriginalURL.revokeObjectURL(url);\n    };\n  }\n\n  scope.URL = jURL;\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    Array.prototype.push.call(arguments, document._currentScript);\n    elementDeclarations.push(arguments);\n  };\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.consumeDeclarations = function(callback) {\n    scope.consumeDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    if (callback) {\n      callback(elementDeclarations);\n    }\n    elementDeclarations = null;\n  };\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n})(window.Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\nvar hasNative = ('import' in document.createElement('link'));\r\nvar useNative = hasNative;\r\n\r\nisIE = /Trident/.test(navigator.userAgent);\r\n\r\n// TODO(sorvell): SD polyfill intrusion\r\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\r\nvar wrap = function(node) {\r\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\r\n};\r\nvar mainDoc = wrap(document);\r\n    \r\n// NOTE: We cannot polyfill document.currentScript because it's not possible\r\n// both to override and maintain the ability to capture the native value;\r\n// therefore we choose to expose _currentScript both when native imports\r\n// and the polyfill are in use.\r\nvar currentScriptDescriptor = {\r\n  get: function() {\r\n    var script = HTMLImports.currentScript || document.currentScript ||\r\n        // NOTE: only works when called in synchronously executing code.\r\n        // readyState should check if `loading` but IE10 is \r\n        // interactive when scripts run so we cheat.\r\n        (document.readyState !== 'complete' ? \r\n        document.scripts[document.scripts.length - 1] : null);\r\n    return wrap(script);\r\n  },\r\n  configurable: true\r\n};\r\n\r\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\r\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\r\n\r\n// call a callback when all HTMLImports in the document at call (or at least\r\n//  document ready) time have loaded.\r\n// 1. ensure the document is in a ready state (has dom), then \r\n// 2. watch for loading of imports and call callback when done\r\nfunction whenImportsReady(callback, doc) {\r\n  doc = doc || mainDoc;\r\n  // if document is loading, wait and try again\r\n  whenDocumentReady(function() {\r\n    watchImportsLoad(callback, doc);\r\n  }, doc);\r\n}\r\n\r\n// call the callback when the document is in a ready state (has dom)\r\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\r\nvar READY_EVENT = 'readystatechange';\r\nfunction isDocumentReady(doc) {\r\n  return (doc.readyState === 'complete' ||\r\n      doc.readyState === requiredReadyState);\r\n}\r\n\r\n// call <callback> when we ensure the document is in a ready state\r\nfunction whenDocumentReady(callback, doc) {\r\n  if (!isDocumentReady(doc)) {\r\n    var checkReady = function() {\r\n      if (doc.readyState === 'complete' || \r\n          doc.readyState === requiredReadyState) {\r\n        doc.removeEventListener(READY_EVENT, checkReady);\r\n        whenDocumentReady(callback, doc);\r\n      }\r\n    };\r\n    doc.addEventListener(READY_EVENT, checkReady);\r\n  } else if (callback) {\r\n    callback();\r\n  }\r\n}\r\n\r\nfunction markTargetLoaded(event) {\r\n  event.target.__loaded = true;\r\n}\r\n\r\n// call <callback> when we ensure all imports have loaded\r\nfunction watchImportsLoad(callback, doc) {\r\n  var imports = doc.querySelectorAll('link[rel=import]');\r\n  var loaded = 0, l = imports.length;\r\n  function checkDone(d) { \r\n    if (loaded == l) {\r\n      callback && callback();\r\n    }\r\n  }\r\n  function loadedImport(e) {\r\n    markTargetLoaded(e);\r\n    loaded++;\r\n    checkDone();\r\n  }\r\n  if (l) {\r\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\r\n      if (isImportLoaded(imp)) {\r\n        loadedImport.call(imp, {target: imp});\r\n      } else {\r\n        imp.addEventListener('load', loadedImport);\r\n        imp.addEventListener('error', loadedImport);\r\n      }\r\n    }\r\n  } else {\r\n    checkDone();\r\n  }\r\n}\r\n\r\n// NOTE: test for native imports loading is based on explicitly watching\r\n// all imports (see below).\r\nfunction isImportLoaded(link) {\r\n  return useNative ? link.__loaded : link.__importParsed;\r\n}\r\n\r\n// TODO(sorvell): Workaround for \r\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\r\n// this bug is addressed.\r\n// (1) Install a mutation observer to see when HTMLImports have loaded\r\n// (2) if this script is run during document load it will watch any existing\r\n// imports for loading.\r\n//\r\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\r\n// with imports that are added to document.head since the mutation observer \r\n// watches only head for perf reasons, (2) it requires this script\r\n// to run before any imports have completed loading.\r\nif (useNative) {\r\n  new MutationObserver(function(mxns) {\r\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\r\n      if (m.addedNodes) {\r\n        handleImports(m.addedNodes);\r\n      }\r\n    }\r\n  }).observe(document.head, {childList: true});\r\n\r\n  function handleImports(nodes) {\r\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\r\n      if (isImport(n)) {\r\n        handleImport(n);  \r\n      }\r\n    }\r\n  }\r\n\r\n  function isImport(element) {\r\n    return element.localName === 'link' && element.rel === 'import';\r\n  }\r\n\r\n  function handleImport(element) {\r\n    var loaded = element.import;\r\n    if (loaded) {\r\n      markTargetLoaded({target: element});\r\n    } else {\r\n      element.addEventListener('load', markTargetLoaded);\r\n      element.addEventListener('error', markTargetLoaded);\r\n    }\r\n  }\r\n\r\n  // make sure to catch any imports that are in the process of loading\r\n  // when this script is run.\r\n  (function() {\r\n    if (document.readyState === 'loading') {\r\n      var imports = document.querySelectorAll('link[rel=import]');\r\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\r\n        handleImport(imp);\r\n      }\r\n    }\r\n  })();\r\n\r\n}\r\n\r\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \r\n// have loaded. This event is required to simulate the script blocking \r\n// behavior of native imports. A main document script that needs to be sure\r\n// imports have loaded should wait for this event.\r\nwhenImportsReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  mainDoc.dispatchEvent(\r\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\r\n  );\r\n});\r\n\r\n// exports\r\nscope.useNative = useNative;\r\nscope.isImportLoaded = isImportLoaded;\r\nscope.whenReady = whenImportsReady;\r\nscope.isIE = isIE;\r\n\r\n// deprecated\r\nscope.whenImportsReady = whenImportsReady;\r\n\r\n})(window.HTMLImports);","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        // If url was redirected, use the redirected location so paths are\n        // calculated relative to that.\n        this.onload(url, p, resource, err, redirectedUrl);\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : locationHeader;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIE = scope.isIE;\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    if (elt.import) {\n      elt.import.__importParsed = true;\n    }\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource && !elt.__error) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    this.addElementToDocument(elt);\n  },\n  rootImportForElement: function(elt) {\n    var n = elt;\n    while (n.ownerDocument.__importLink) {\n      n = n.ownerDocument.__importLink;\n    }\n    return n;\n  },\n  addElementToDocument: function(elt) {\n    var port = this.rootImportForElement(elt.__importElement || elt);\n    var l = port.__insertedElements = port.__insertedElements || 0;\n    var refNode = port.nextElementSibling;\n    for (var i=0; i < l; i++) {\n      refNode = refNode && refNode.nextElementSibling;\n    }\n    port.parentNode.insertBefore(elt, refNode);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIE && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    this.addElementToDocument(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    if (doc) {\n      var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n      for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n        if (!this.isParsed(n)) {\n          if (this.hasResource(n)) {\n            return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n          } else {\n            return;\n          }\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && (node.import === undefined)) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  return 'data:text/javascript;charset=utf-8,' + encodeURIComponent(scriptContent);\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\n\n})(HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n (function(scope) {\n\nvar useNative = scope.useNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (doc === undefined) {\n          // generate an HTMLDocument from data\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            // note, we cannot use MO to detect parsed nodes because\n            // SD polyfill does not report these as mutations.\n            this.bootDocument(doc);\n          }\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n\n  // Polyfill document.baseURI for browsers without it.\n  if (!document.baseURI) {\n    var baseURIDescriptor = {\n      get: function() {\n        var base = document.querySelector('base');\n        return base ? base.href : window.location.href;\n      },\n      configurable: true\n    };\n\n    Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n    Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n  }\n\n  // IE shim for CustomEvent\n  if (typeof window.CustomEvent !== 'function') {\n    window.CustomEvent = function(inType, dictionary) {\n       var e = document.createEvent('HTMLEvents');\n       e.initEvent(inType,\n          dictionary.bubbles === false ? false : true,\n          dictionary.cancelable === false ? false : true,\n          dictionary.detail);\n       return e;\n    };\n  }\n\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// exports\nscope.importer = importer;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.importLoader = importLoader;\n\n\n})(window.HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(){\n\n// bootstrap\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * Implements `document.registerElement`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // install upgrade hook if HTMLImports are available\n  if (window.HTMLImports) {\n    HTMLImports.__importsParsingHook = function(elt) {\n      CustomElements.parser.parse(elt.import);\n    }\n  }\n  // set internal 'ready' flag, now document.registerElement will trigger \n  // synchronous upgrades\n  CustomElements.ready = true;\n  // async to ensure *native* custom elements upgrade prior to this\n  // DOMContentLoaded can fire before elements upgrade (e.g. when there's\n  // an external script)\n  setTimeout(function() {\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, params) {\n    params = params || {};\n    var e = document.createEvent('CustomEvent');\n    e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n    return e;\n  };\n  window.CustomEvent.prototype = window.Event.prototype;\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n"]}
\ No newline at end of file
+{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","build/if-poly.js","../observe-js/src/observe.js","../ShadowDOM/src/wrappers.js","../ShadowDOM/src/microtask.js","../ShadowDOM/src/MutationObserver.js","../ShadowDOM/src/TreeScope.js","../ShadowDOM/src/wrappers/events.js","../ShadowDOM/src/wrappers/TouchEvent.js","../ShadowDOM/src/wrappers/NodeList.js","../ShadowDOM/src/wrappers/HTMLCollection.js","../ShadowDOM/src/wrappers/Node.js","../ShadowDOM/src/querySelector.js","../ShadowDOM/src/wrappers/node-interfaces.js","../ShadowDOM/src/wrappers/CharacterData.js","../ShadowDOM/src/wrappers/Text.js","../ShadowDOM/src/wrappers/DOMTokenList.js","../ShadowDOM/src/wrappers/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLFormElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/generic.js","../ShadowDOM/src/wrappers/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/elements-with-form-property.js","../ShadowDOM/src/wrappers/Selection.js","../ShadowDOM/src/wrappers/Document.js","../ShadowDOM/src/wrappers/Window.js","../ShadowDOM/src/wrappers/DataTransfer.js","../ShadowDOM/src/wrappers/FormData.js","../ShadowDOM/src/wrappers/XMLHttpRequest.js","../ShadowDOM/src/wrappers/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","../MutationObservers/MutationObserver.js","../HTMLImports/src/scope.js","../HTMLImports/src/base.js","../HTMLImports/src/Loader.js","../HTMLImports/src/Parser.js","../HTMLImports/src/HTMLImports.js","../HTMLImports/src/Observer.js","../HTMLImports/src/boot.js","../CustomElements/src/scope.js","../CustomElements/src/Observer.js","../CustomElements/src/CustomElements.js","../CustomElements/src/Parser.js","../CustomElements/src/boot.js","src/patches-custom-elements.js","src/dom.js","src/unresolved.js","src/module.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        var hasValue = entry[0] === key;\n        entry[0] = entry[1] = undefined;\n        return hasValue;\n      },\n      has: function(key) {\n        var entry = key[this.name];\n        if (!entry) return false;\n        return entry[0] === key;\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(global) {\n  'use strict';\n\n  var testingExposeCycleCount = global.testingExposeCycleCount;\n\n  // Detect and do basic sanity checking on Object/Array.observe.\n  function detectObjectObserve() {\n    if (typeof Object.observe !== 'function' ||\n        typeof Array.observe !== 'function') {\n      return false;\n    }\n\n    var records = [];\n\n    function callback(recs) {\n      records = recs;\n    }\n\n    var test = {};\n    var arr = [];\n    Object.observe(test, callback);\n    Array.observe(arr, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    arr.push(1, 2);\n    arr.length = 0;\n\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 5)\n      return false;\n\n    if (records[0].type != 'add' ||\n        records[1].type != 'update' ||\n        records[2].type != 'delete' ||\n        records[3].type != 'splice' ||\n        records[4].type != 'splice') {\n      return false;\n    }\n\n    Object.unobserve(test, callback);\n    Array.unobserve(arr, callback);\n\n    return true;\n  }\n\n  var hasObserve = detectObjectObserve();\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (typeof navigator != 'undefined' && navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0 && s !== '';\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    for (var i = 0; i < parts.length; i++) {\n      this.push(String(parts[i]));\n    }\n\n    if (hasEval && this.length) {\n      this.getValueFrom = this.compiledGetValueFromFn();\n    }\n  }\n\n  // TODO(rafaelw): Make simple LRU cache\n  var pathCache = {};\n\n  function getPath(pathString) {\n    if (pathString instanceof Path)\n      return pathString;\n\n    if (pathString == null || pathString.length == 0)\n      pathString = '';\n\n    if (typeof pathString != 'string') {\n      if (isIndex(pathString.length)) {\n        // Constructed with array-like (pre-parsed) keys\n        return new Path(pathString, constructorIsPrivate);\n      }\n\n      pathString = String(pathString);\n    }\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n\n    var parts = parsePath(pathString);\n    if (!parts)\n      return invalidPath;\n\n    var path = new Path(parts, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  function formatAccessor(key) {\n    if (isIndex(key)) {\n      return '[' + key + ']';\n    } else {\n      return '[\"' + key.replace(/\"/g, '\\\\\"') + '\"]';\n    }\n  }\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      var pathString = '';\n      for (var i = 0; i < this.length; i++) {\n        var key = this[i];\n        if (isIdent(key)) {\n          pathString += i ? '.' + key : key;\n        } else {\n          pathString += formatAccessor(key);\n        }\n      }\n\n      return pathString;\n    },\n\n    getValueFrom: function(obj, directObserver) {\n      for (var i = 0; i < this.length; i++) {\n        if (obj == null)\n          return;\n        obj = obj[this[i]];\n      }\n      return obj;\n    },\n\n    iterateObjects: function(obj, observe) {\n      for (var i = 0; i < this.length; i++) {\n        if (i)\n          obj = obj[this[i - 1]];\n        if (!isObject(obj))\n          return;\n        observe(obj, this[0]);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      var key;\n      for (; i < (this.length - 1); i++) {\n        key = this[i];\n        pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      var key = this[i];\n      pathString += isIdent(key) ? '.' + key : formatAccessor(key);\n\n      str += '  return ' + pathString + ';\\nelse\\n  return undefined;';\n      return new Function('obj', str);\n    },\n\n    setValueFrom: function(obj, value) {\n      if (!this.length)\n        return false;\n\n      for (var i = 0; i < this.length - 1; i++) {\n        if (!isObject(obj))\n          return false;\n        obj = obj[this[i]];\n      }\n\n      if (!isObject(obj))\n        return false;\n\n      obj[this[i]] = value;\n      return true;\n    }\n  });\n\n  var invalidPath = new Path('', constructorIsPrivate);\n  invalidPath.valid = false;\n  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};\n\n  var MAX_DIRTY_CHECK_CYCLES = 1000;\n\n  function dirtyCheck(observer) {\n    var cycles = 0;\n    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {\n      cycles++;\n    }\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    get path() {\n      return this.path_;\n    },\n\n    connect_: function() {\n      if (hasObserve)\n        this.directObserver_ = getObservedSet(this, this.object_);\n\n      this.check_(undefined, true);\n    },\n\n    disconnect_: function() {\n      this.value_ = undefined;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    iterateObjects_: function(observe) {\n      this.path_.iterateObjects(this.object_, observe);\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValue = this.value_;\n      this.value_ = this.path_.getValueFrom(this.object_);\n      if (skipChanges || areSameValue(this.value_, oldValue))\n        return false;\n\n      this.report_([this.value_, oldValue, this]);\n      return true;\n    },\n\n    setValue: function(newValue) {\n      if (this.path_)\n        this.path_.setValueFrom(this.object_, newValue);\n    }\n  });\n\n  function CompoundObserver(reportChangesOnOpen) {\n    Observer.call(this);\n\n    this.reportChangesOnOpen_ = reportChangesOnOpen;\n    this.value_ = [];\n    this.directObserver_ = undefined;\n    this.observed_ = [];\n  }\n\n  var observerSentinel = {};\n\n  CompoundObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    connect_: function() {\n      if (hasObserve) {\n        var object;\n        var needsDirectObserver = false;\n        for (var i = 0; i < this.observed_.length; i += 2) {\n          object = this.observed_[i]\n          if (object !== observerSentinel) {\n            needsDirectObserver = true;\n            break;\n          }\n        }\n\n        if (needsDirectObserver)\n          this.directObserver_ = getObservedSet(this, object);\n      }\n\n      this.check_(undefined, !this.reportChangesOnOpen_);\n    },\n\n    disconnect_: function() {\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        if (this.observed_[i] === observerSentinel)\n          this.observed_[i + 1].close();\n      }\n      this.observed_.length = 0;\n      this.value_.length = 0;\n\n      if (this.directObserver_) {\n        this.directObserver_.close(this);\n        this.directObserver_ = undefined;\n      }\n    },\n\n    addPath: function(object, path) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add paths once started.');\n\n      var path = getPath(path);\n      this.observed_.push(object, path);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = path.getValueFrom(object);\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      this.observed_.push(observerSentinel, observer);\n      if (!this.reportChangesOnOpen_)\n        return;\n      var index = this.observed_.length / 2 - 1;\n      this.value_[index] = observer.open(this.deliver, this);\n    },\n\n    startReset: function() {\n      if (this.state_ != OPENED)\n        throw Error('Can only reset while open');\n\n      this.state_ = RESETTING;\n      this.disconnect_();\n    },\n\n    finishReset: function() {\n      if (this.state_ != RESETTING)\n        throw Error('Can only finishReset after startReset');\n      this.state_ = OPENED;\n      this.connect_();\n\n      return this.value_;\n    },\n\n    iterateObjects_: function(observe) {\n      var object;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        object = this.observed_[i]\n        if (object !== observerSentinel)\n          this.observed_[i + 1].iterateObjects(object, observe)\n      }\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var oldValues;\n      for (var i = 0; i < this.observed_.length; i += 2) {\n        var object = this.observed_[i];\n        var path = this.observed_[i+1];\n        var value;\n        if (object === observerSentinel) {\n          var observable = path;\n          value = this.state_ === UNOPENED ?\n              observable.open(this.deliver, this) :\n              observable.discardChanges();\n        } else {\n          value = path.getValueFrom(object);\n        }\n\n        if (skipChanges) {\n          this.value_[i / 2] = value;\n          continue;\n        }\n\n        if (areSameValue(value, this.value_[i / 2]))\n          continue;\n\n        oldValues = oldValues || [];\n        oldValues[i / 2] = this.value_[i / 2];\n        this.value_[i / 2] = value;\n      }\n\n      if (!oldValues)\n        return false;\n\n      // TODO(rafaelw): Having observed_ as the third callback arg here is\n      // pretty lame API. Fix.\n      this.report_([this.value_, oldValues, this.observed_]);\n      return true;\n    }\n  });\n\n  function identFn(value) { return value; }\n\n  function ObserverTransform(observable, getValueFn, setValueFn,\n                             dontPassThroughSet) {\n    this.callback_ = undefined;\n    this.target_ = undefined;\n    this.value_ = undefined;\n    this.observable_ = observable;\n    this.getValueFn_ = getValueFn || identFn;\n    this.setValueFn_ = setValueFn || identFn;\n    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this\n    // at the moment because of a bug in it's dependency tracking.\n    this.dontPassThroughSet_ = dontPassThroughSet;\n  }\n\n  ObserverTransform.prototype = {\n    open: function(callback, target) {\n      this.callback_ = callback;\n      this.target_ = target;\n      this.value_ =\n          this.getValueFn_(this.observable_.open(this.observedCallback_, this));\n      return this.value_;\n    },\n\n    observedCallback_: function(value) {\n      value = this.getValueFn_(value);\n      if (areSameValue(value, this.value_))\n        return;\n      var oldValue = this.value_;\n      this.value_ = value;\n      this.callback_.call(this.target_, this.value_, oldValue);\n    },\n\n    discardChanges: function() {\n      this.value_ = this.getValueFn_(this.observable_.discardChanges());\n      return this.value_;\n    },\n\n    deliver: function() {\n      return this.observable_.deliver();\n    },\n\n    setValue: function(value) {\n      value = this.setValueFn_(value);\n      if (!this.dontPassThroughSet_ && this.observable_.setValue)\n        return this.observable_.setValue(value);\n    },\n\n    close: function() {\n      if (this.observable_)\n        this.observable_.close();\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.observable_ = undefined;\n      this.value_ = undefined;\n      this.getValueFn_ = undefined;\n      this.setValueFn_ = undefined;\n    }\n  }\n\n  var expectedRecordTypes = {\n    add: true,\n    update: true,\n    delete: true\n  };\n\n  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {\n    var added = {};\n    var removed = {};\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      if (!expectedRecordTypes[record.type]) {\n        console.error('Unknown changeRecord type: ' + record.type);\n        console.error(record);\n        continue;\n      }\n\n      if (!(record.name in oldValues))\n        oldValues[record.name] = record.oldValue;\n\n      if (record.type == 'update')\n        continue;\n\n      if (record.type == 'add') {\n        if (record.name in removed)\n          delete removed[record.name];\n        else\n          added[record.name] = true;\n\n        continue;\n      }\n\n      // type = 'delete'\n      if (record.name in added) {\n        delete added[record.name];\n        delete oldValues[record.name];\n      } else {\n        removed[record.name] = true;\n      }\n    }\n\n    for (var prop in added)\n      added[prop] = object[prop];\n\n    for (var prop in removed)\n      removed[prop] = undefined;\n\n    var changed = {};\n    for (var prop in oldValues) {\n      if (prop in added || prop in removed)\n        continue;\n\n      var newValue = object[prop];\n      if (oldValues[prop] !== newValue)\n        changed[prop] = newValue;\n    }\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  function newSplice(index, removed, addedCount) {\n    return {\n      index: index,\n      removed: removed,\n      addedCount: addedCount\n    };\n  }\n\n  var EDIT_LEAVE = 0;\n  var EDIT_UPDATE = 1;\n  var EDIT_ADD = 2;\n  var EDIT_DELETE = 3;\n\n  function ArraySplice() {}\n\n  ArraySplice.prototype = {\n\n    // Note: This function is *based* on the computation of the Levenshtein\n    // \"edit\" distance. The one change is that \"updates\" are treated as two\n    // edits - not one. With Array splices, an update is really a delete\n    // followed by an add. By retaining this, we optimize for \"keeping\" the\n    // maximum array items in the original array. For example:\n    //\n    //   'xxxx123' -> '123yyyy'\n    //\n    // With 1-edit updates, the shortest path would be just to update all seven\n    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This\n    // leaves the substring '123' intact.\n    calcEditDistances: function(current, currentStart, currentEnd,\n                                old, oldStart, oldEnd) {\n      // \"Deletion\" columns\n      var rowCount = oldEnd - oldStart + 1;\n      var columnCount = currentEnd - currentStart + 1;\n      var distances = new Array(rowCount);\n\n      // \"Addition\" rows. Initialize null column.\n      for (var i = 0; i < rowCount; i++) {\n        distances[i] = new Array(columnCount);\n        distances[i][0] = i;\n      }\n\n      // Initialize null row\n      for (var j = 0; j < columnCount; j++)\n        distances[0][j] = j;\n\n      for (var i = 1; i < rowCount; i++) {\n        for (var j = 1; j < columnCount; j++) {\n          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))\n            distances[i][j] = distances[i - 1][j - 1];\n          else {\n            var north = distances[i - 1][j] + 1;\n            var west = distances[i][j - 1] + 1;\n            distances[i][j] = north < west ? north : west;\n          }\n        }\n      }\n\n      return distances;\n    },\n\n    // This starts at the final weight, and walks \"backward\" by finding\n    // the minimum previous weight recursively until the origin of the weight\n    // matrix.\n    spliceOperationsFromEditDistances: function(distances) {\n      var i = distances.length - 1;\n      var j = distances[0].length - 1;\n      var current = distances[i][j];\n      var edits = [];\n      while (i > 0 || j > 0) {\n        if (i == 0) {\n          edits.push(EDIT_ADD);\n          j--;\n          continue;\n        }\n        if (j == 0) {\n          edits.push(EDIT_DELETE);\n          i--;\n          continue;\n        }\n        var northWest = distances[i - 1][j - 1];\n        var west = distances[i - 1][j];\n        var north = distances[i][j - 1];\n\n        var min;\n        if (west < north)\n          min = west < northWest ? west : northWest;\n        else\n          min = north < northWest ? north : northWest;\n\n        if (min == northWest) {\n          if (northWest == current) {\n            edits.push(EDIT_LEAVE);\n          } else {\n            edits.push(EDIT_UPDATE);\n            current = northWest;\n          }\n          i--;\n          j--;\n        } else if (min == west) {\n          edits.push(EDIT_DELETE);\n          i--;\n          current = west;\n        } else {\n          edits.push(EDIT_ADD);\n          j--;\n          current = north;\n        }\n      }\n\n      edits.reverse();\n      return edits;\n    },\n\n    /**\n     * Splice Projection functions:\n     *\n     * A splice map is a representation of how a previous array of items\n     * was transformed into a new array of items. Conceptually it is a list of\n     * tuples of\n     *\n     *   <index, removed, addedCount>\n     *\n     * which are kept in ascending index order of. The tuple represents that at\n     * the |index|, |removed| sequence of items were removed, and counting forward\n     * from |index|, |addedCount| items were added.\n     */\n\n    /**\n     * Lacking individual splice mutation information, the minimal set of\n     * splices can be synthesized given the previous state and final state of an\n     * array. The basic approach is to calculate the edit distance matrix and\n     * choose the shortest path through it.\n     *\n     * Complexity: O(l * p)\n     *   l: The length of the current array\n     *   p: The length of the old array\n     */\n    calcSplices: function(current, currentStart, currentEnd,\n                          old, oldStart, oldEnd) {\n      var prefixCount = 0;\n      var suffixCount = 0;\n\n      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);\n      if (currentStart == 0 && oldStart == 0)\n        prefixCount = this.sharedPrefix(current, old, minLength);\n\n      if (currentEnd == current.length && oldEnd == old.length)\n        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);\n\n      currentStart += prefixCount;\n      oldStart += prefixCount;\n      currentEnd -= suffixCount;\n      oldEnd -= suffixCount;\n\n      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)\n        return [];\n\n      if (currentStart == currentEnd) {\n        var splice = newSplice(currentStart, [], 0);\n        while (oldStart < oldEnd)\n          splice.removed.push(old[oldStart++]);\n\n        return [ splice ];\n      } else if (oldStart == oldEnd)\n        return [ newSplice(currentStart, [], currentEnd - currentStart) ];\n\n      var ops = this.spliceOperationsFromEditDistances(\n          this.calcEditDistances(current, currentStart, currentEnd,\n                                 old, oldStart, oldEnd));\n\n      var splice = undefined;\n      var splices = [];\n      var index = currentStart;\n      var oldIndex = oldStart;\n      for (var i = 0; i < ops.length; i++) {\n        switch(ops[i]) {\n          case EDIT_LEAVE:\n            if (splice) {\n              splices.push(splice);\n              splice = undefined;\n            }\n\n            index++;\n            oldIndex++;\n            break;\n          case EDIT_UPDATE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n          case EDIT_ADD:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.addedCount++;\n            index++;\n            break;\n          case EDIT_DELETE:\n            if (!splice)\n              splice = newSplice(index, [], 0);\n\n            splice.removed.push(old[oldIndex]);\n            oldIndex++;\n            break;\n        }\n      }\n\n      if (splice) {\n        splices.push(splice);\n      }\n      return splices;\n    },\n\n    sharedPrefix: function(current, old, searchLength) {\n      for (var i = 0; i < searchLength; i++)\n        if (!this.equals(current[i], old[i]))\n          return i;\n      return searchLength;\n    },\n\n    sharedSuffix: function(current, old, searchLength) {\n      var index1 = current.length;\n      var index2 = old.length;\n      var count = 0;\n      while (count < searchLength && this.equals(current[--index1], old[--index2]))\n        count++;\n\n      return count;\n    },\n\n    calculateSplices: function(current, previous) {\n      return this.calcSplices(current, 0, current.length, previous, 0,\n                              previous.length);\n    },\n\n    equals: function(currentValue, previousValue) {\n      return currentValue === previousValue;\n    }\n  };\n\n  var arraySplice = new ArraySplice();\n\n  function calcSplices(current, currentStart, currentEnd,\n                       old, oldStart, oldEnd) {\n    return arraySplice.calcSplices(current, currentStart, currentEnd,\n                                   old, oldStart, oldEnd);\n  }\n\n  function intersect(start1, end1, start2, end2) {\n    // Disjoint\n    if (end1 < start2 || end2 < start1)\n      return -1;\n\n    // Adjacent\n    if (end1 == start2 || end2 == start1)\n      return 0;\n\n    // Non-zero intersect, span1 first\n    if (start1 < start2) {\n      if (end1 < end2)\n        return end1 - start2; // Overlap\n      else\n        return end2 - start2; // Contained\n    } else {\n      // Non-zero intersect, span2 first\n      if (end2 < end1)\n        return end2 - start1; // Overlap\n      else\n        return end1 - start1; // Contained\n    }\n  }\n\n  function mergeSplice(splices, index, removed, addedCount) {\n\n    var splice = newSplice(index, removed, addedCount);\n\n    var inserted = false;\n    var insertionOffset = 0;\n\n    for (var i = 0; i < splices.length; i++) {\n      var current = splices[i];\n      current.index += insertionOffset;\n\n      if (inserted)\n        continue;\n\n      var intersectCount = intersect(splice.index,\n                                     splice.index + splice.removed.length,\n                                     current.index,\n                                     current.index + current.addedCount);\n\n      if (intersectCount >= 0) {\n        // Merge the two splices\n\n        splices.splice(i, 1);\n        i--;\n\n        insertionOffset -= current.addedCount - current.removed.length;\n\n        splice.addedCount += current.addedCount - intersectCount;\n        var deleteCount = splice.removed.length +\n                          current.removed.length - intersectCount;\n\n        if (!splice.addedCount && !deleteCount) {\n          // merged splice is a noop. discard.\n          inserted = true;\n        } else {\n          var removed = current.removed;\n\n          if (splice.index < current.index) {\n            // some prefix of splice.removed is prepended to current.removed.\n            var prepend = splice.removed.slice(0, current.index - splice.index);\n            Array.prototype.push.apply(prepend, removed);\n            removed = prepend;\n          }\n\n          if (splice.index + splice.removed.length > current.index + current.addedCount) {\n            // some suffix of splice.removed is appended to current.removed.\n            var append = splice.removed.slice(current.index + current.addedCount - splice.index);\n            Array.prototype.push.apply(removed, append);\n          }\n\n          splice.removed = removed;\n          if (current.index < splice.index) {\n            splice.index = current.index;\n          }\n        }\n      } else if (splice.index < current.index) {\n        // Insert splice here.\n\n        inserted = true;\n\n        splices.splice(i, 0, splice);\n        i++;\n\n        var offset = splice.addedCount - splice.removed.length\n        current.index += offset;\n        insertionOffset += offset;\n      }\n    }\n\n    if (!inserted)\n      splices.push(splice);\n  }\n\n  function createInitialSplices(array, changeRecords) {\n    var splices = [];\n\n    for (var i = 0; i < changeRecords.length; i++) {\n      var record = changeRecords[i];\n      switch(record.type) {\n        case 'splice':\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case 'add':\n        case 'update':\n        case 'delete':\n          if (!isIndex(record.name))\n            continue;\n          var index = toNumber(record.name);\n          if (index < 0)\n            continue;\n          mergeSplice(splices, index, [record.oldValue], 1);\n          break;\n        default:\n          console.error('Unexpected record type: ' + JSON.stringify(record));\n          break;\n      }\n    }\n\n    return splices;\n  }\n\n  function projectArraySplices(array, changeRecords) {\n    var splices = [];\n\n    createInitialSplices(array, changeRecords).forEach(function(splice) {\n      if (splice.addedCount == 1 && splice.removed.length == 1) {\n        if (splice.removed[0] !== array[splice.index])\n          splices.push(splice);\n\n        return\n      };\n\n      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,\n                                           splice.removed, 0, splice.removed.length));\n    });\n\n    return splices;\n  }\n\n  global.Observer = Observer;\n  global.Observer.runEOM_ = runEOM;\n  global.Observer.observerSentinel_ = observerSentinel; // for testing.\n  global.Observer.hasObjectObserve = hasObserve;\n  global.ArrayObserver = ArrayObserver;\n  global.ArrayObserver.calculateSplices = function(current, previous) {\n    return arraySplice.calculateSplices(current, previous);\n  };\n\n  global.ArraySplice = ArraySplice;\n  global.ObjectObserver = ObjectObserver;\n  global.PathObserver = PathObserver;\n  global.CompoundObserver = CompoundObserver;\n  global.Path = Path;\n  global.ObserverTransform = ObserverTransform;\n})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\nwindow.ShadowDOMPolyfill = {};\n\n(function(scope) {\n  'use strict';\n\n  var constructorTable = new WeakMap();\n  var nativePrototypeTable = new WeakMap();\n  var wrappers = Object.create(null);\n\n  function detectEval() {\n    // Don't test for eval if we're running in a Chrome App environment.\n    // We check for APIs set that only exist in a Chrome App context.\n    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {\n      return false;\n    }\n\n    // Firefox OS Apps do not allow eval. This feature detection is very hacky\n    // but even if some other platform adds support for this function this code\n    // will continue to work.\n    if (navigator.getDeviceStorage) {\n      return false;\n    }\n\n    try {\n      var f = new Function('return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function assert(b) {\n    if (!b)\n      throw new Error('Assertion failed');\n  };\n\n  var defineProperty = Object.defineProperty;\n  var getOwnPropertyNames = Object.getOwnPropertyNames;\n  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n  function mixin(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    var names = getOwnPropertyNames(from);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          continue;\n      }\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    }\n    return to;\n  };\n\n  function oneOf(object, propertyNames) {\n    for (var i = 0; i < propertyNames.length; i++) {\n      if (propertyNames[i] in object)\n        return propertyNames[i];\n    }\n  }\n\n  var nonEnumerableDataDescriptor = {\n    value: undefined,\n    configurable: true,\n    enumerable: false,\n    writable: true\n  };\n\n  function defineNonEnumerableDataProperty(object, name, value) {\n    nonEnumerableDataDescriptor.value = value;\n    defineProperty(object, name, nonEnumerableDataDescriptor);\n  }\n\n  // Mozilla's old DOM bindings are bretty busted:\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844\n  // Make sure they are create before we start modifying things.\n  getOwnPropertyNames(window);\n\n  function getWrapperConstructor(node) {\n    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);\n    var wrapperConstructor = constructorTable.get(nativePrototype);\n    if (wrapperConstructor)\n      return wrapperConstructor;\n\n    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);\n\n    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, node);\n\n    return GeneratedWrapper;\n  }\n\n  function addForwardingProperties(nativePrototype, wrapperPrototype) {\n    installProperty(nativePrototype, wrapperPrototype, true);\n  }\n\n  function registerInstanceProperties(wrapperPrototype, instanceObject) {\n    installProperty(instanceObject, wrapperPrototype, false);\n  }\n\n  var isFirefox = /Firefox/.test(navigator.userAgent);\n\n  // This is used as a fallback when getting the descriptor fails in\n  // installProperty.\n  var dummyDescriptor = {\n    get: function() {},\n    set: function(v) {},\n    configurable: true,\n    enumerable: true\n  };\n\n  function isEventHandlerName(name) {\n    return /^on[a-z]+$/.test(name);\n  }\n\n  function isIdentifierName(name) {\n    return /^\\w[a-zA-Z_0-9]*$/.test(name);\n  }\n\n  // The name of the implementation property is intentionally hard to\n  // remember. Unfortunately, browsers are slower doing obj[expr] than\n  // obj.foo so we resort to repeat this ugly name. This ugly name is never\n  // used outside of this file though.\n\n  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name) :\n        function() { return this.__impl4cf1e782hg__[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.__impl4cf1e782hg__.' + name + ' = v') :\n        function(v) { this.__impl4cf1e782hg__[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.__impl4cf1e782hg__.' + name +\n                     '.apply(this.__impl4cf1e782hg__, arguments)') :\n        function() {\n          return this.__impl4cf1e782hg__[name].apply(\n              this.__impl4cf1e782hg__, arguments);\n        };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  // Safari 8 exposes WebIDL attributes as an invalid accessor property. Its\n  // descriptor has {get: undefined, set: undefined}. We therefore ignore the\n  // shape of the descriptor and make all properties read-write.\n  // https://bugs.webkit.org/show_bug.cgi?id=49739\n  var isBrokenSafari = function() {\n    var descr = Object.getOwnPropertyDescriptor(Node.prototype, 'nodeType');\n    return !!descr && 'set' in descr;\n  }();\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set || isBrokenSafari) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  function isWrapper(object) {\n    return object && object.__impl4cf1e782hg__;\n  }\n\n  function isNative(object) {\n    return !isWrapper(object);\n  }\n\n  /**\n   * Wraps a node in a WrapperNode. If there already exists a wrapper for the\n   * |node| that wrapper is returned instead.\n   * @param {Node} node\n   * @return {WrapperNode}\n   */\n  function wrap(impl) {\n    if (impl === null)\n      return null;\n\n    assert(isNative(impl));\n    return impl.__wrapper8e3dd93a60__ ||\n        (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));\n  }\n\n  /**\n   * Unwraps a wrapper and returns the node it is wrapping.\n   * @param {WrapperNode} wrapper\n   * @return {Node}\n   */\n  function unwrap(wrapper) {\n    if (wrapper === null)\n      return null;\n    assert(isWrapper(wrapper));\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function unsafeUnwrap(wrapper) {\n    return wrapper.__impl4cf1e782hg__;\n  }\n\n  function setWrapper(impl, wrapper) {\n    wrapper.__impl4cf1e782hg__ = impl;\n    impl.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  /**\n   * Unwraps object if it is a wrapper.\n   * @param {Object} object\n   * @return {Object} The native implementation object.\n   */\n  function unwrapIfNeeded(object) {\n    return object && isWrapper(object) ? unwrap(object) : object;\n  }\n\n  /**\n   * Wraps object if it is not a wrapper.\n   * @param {Object} object\n   * @return {Object} The wrapper for object.\n   */\n  function wrapIfNeeded(object) {\n    return object && !isWrapper(object) ? wrap(object) : object;\n  }\n\n  /**\n   * Overrides the current wrapper (if any) for node.\n   * @param {Node} node\n   * @param {WrapperNode=} wrapper If left out the wrapper will be created as\n   *     needed next time someone wraps the node.\n   */\n  function rewrap(node, wrapper) {\n    if (wrapper === null)\n      return;\n    assert(isNative(node));\n    assert(wrapper === undefined || isWrapper(wrapper));\n    node.__wrapper8e3dd93a60__ = wrapper;\n  }\n\n  var getterDescriptor = {\n    get: undefined,\n    configurable: true,\n    enumerable: true\n  };\n\n  function defineGetter(constructor, name, getter) {\n    getterDescriptor.get = getter;\n    defineProperty(constructor.prototype, name, getterDescriptor);\n  }\n\n  function defineWrapGetter(constructor, name) {\n    defineGetter(constructor, name, function() {\n      return wrap(this.__impl4cf1e782hg__[name]);\n    });\n  }\n\n  /**\n   * Forwards existing methods on the native object to the wrapper methods.\n   * This does not wrap any of the arguments or the return value since the\n   * wrapper implementation already takes care of that.\n   * @param {Array.<Function>} constructors\n   * @parem {Array.<string>} names\n   */\n  function forwardMethodsToWrapper(constructors, names) {\n    constructors.forEach(function(constructor) {\n      names.forEach(function(name) {\n        constructor.prototype[name] = function() {\n          var w = wrapIfNeeded(this);\n          return w[name].apply(w, arguments);\n        };\n      });\n    });\n  }\n\n  scope.assert = assert;\n  scope.constructorTable = constructorTable;\n  scope.defineGetter = defineGetter;\n  scope.defineWrapGetter = defineWrapGetter;\n  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;\n  scope.isWrapper = isWrapper;\n  scope.isWrapperFor = isWrapperFor;\n  scope.mixin = mixin;\n  scope.nativePrototypeTable = nativePrototypeTable;\n  scope.oneOf = oneOf;\n  scope.registerObject = registerObject;\n  scope.registerWrapper = register;\n  scope.rewrap = rewrap;\n  scope.setWrapper = setWrapper;\n  scope.unsafeUnwrap = unsafeUnwrap;\n  scope.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(context) {\n  'use strict';\n\n  var OriginalMutationObserver = window.MutationObserver;\n  var callbacks = [];\n  var pending = false;\n  var timerFunc;\n\n  function handle() {\n    pending = false;\n    var copies = callbacks.slice(0);\n    callbacks = [];\n    for (var i = 0; i < copies.length; i++) {\n      (0, copies[i])();\n    }\n  }\n\n  if (OriginalMutationObserver) {\n    var counter = 1;\n    var observer = new OriginalMutationObserver(handle);\n    var textNode = document.createTextNode(counter);\n    observer.observe(textNode, {characterData: true});\n\n    timerFunc = function() {\n      counter = (counter + 1) % 2;\n      textNode.data = counter;\n    };\n\n  } else {\n    timerFunc = window.setImmediate || window.setTimeout;\n  }\n\n  function setEndOfMicrotask(func) {\n    callbacks.push(func);\n    if (pending)\n      return;\n    pending = true;\n    timerFunc(handle, 0);\n  }\n\n  context.setEndOfMicrotask = setEndOfMicrotask;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var setEndOfMicrotask = scope.setEndOfMicrotask\n  var wrapIfNeeded = scope.wrapIfNeeded\n  var wrappers = scope.wrappers;\n\n  var registrationsTable = new WeakMap();\n  var globalMutationObservers = [];\n  var isScheduled = false;\n\n  function scheduleCallback() {\n    if (isScheduled)\n      return;\n    setEndOfMicrotask(notifyObservers);\n    isScheduled = true;\n  }\n\n  // http://dom.spec.whatwg.org/#mutation-observers\n  function notifyObservers() {\n    isScheduled = false;\n\n    while (globalMutationObservers.length) {\n      var notifyList = globalMutationObservers;\n      globalMutationObservers = [];\n\n      // Deliver changes in birth order of the MutationObservers.\n      notifyList.sort(function(x, y) { return x.uid_ - y.uid_; });\n\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n        }\n      }\n    }\n  }\n\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyObserversEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      if (!observer.records_.length) {\n        globalMutationObservers.push(observer);\n        anyObserversEnqueued = true;\n      }\n      observer.records_.push(record);\n    }\n\n    if (anyObserversEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  MutationObserver.prototype = {\n    constructor: MutationObserver,\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n\n  function isLoadLikeEvent(event) {\n    switch (event.type) {\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n      case 'load':\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#unloading-documents\n      case 'beforeunload':\n      case 'unload':\n        return true;\n    }\n    return false;\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (isLoadLikeEvent(event) && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (!isLoadLikeEvent(event)) {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      // In browsers that do not correctly support BeforeUnloadEvent we get to\n      // the generic Event wrapper but we still want to ensure we create a\n      // BeforeUnloadEvent. Since BeforeUnloadEvent calls super, we need to\n      // prevent reentrancty.\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload' &&\n          !(this instanceof BeforeUnloadEvent)) {\n        return new BeforeUnloadEvent(impl);\n      }\n      setWrapper(impl, this);\n    } else {\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\n    }\n  }\n  Event.prototype = {\n    get target() {\n      return targetTable.get(this);\n    },\n    get currentTarget() {\n      return currentTargetTable.get(this);\n    },\n    get eventPhase() {\n      return eventPhaseTable.get(this);\n    },\n    get path() {\n      var eventPath = eventPathTable.get(this);\n      if (!eventPath)\n        return [];\n      // TODO(arv): Event path should contain window.\n      return eventPath.slice();\n    },\n    stopPropagation: function() {\n      stopPropagationTable.set(this, true);\n    },\n    stopImmediatePropagation: function() {\n      stopPropagationTable.set(this, true);\n      stopImmediatePropagationTable.set(this, true);\n    }\n  };\n  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));\n\n  function unwrapOptions(options) {\n    if (!options || !options.relatedTarget)\n      return options;\n    return Object.create(options, {\n      relatedTarget: {value: unwrap(options.relatedTarget)}\n    });\n  }\n\n  function registerGenericEvent(name, SuperEvent, prototype) {\n    var OriginalEvent = window[name];\n    var GenericEvent = function(type, options) {\n      if (type instanceof OriginalEvent)\n        setWrapper(type, this);\n      else\n        return wrap(constructEvent(OriginalEvent, name, type, options));\n    };\n    GenericEvent.prototype = Object.create(SuperEvent.prototype);\n    if (prototype)\n      mixin(GenericEvent.prototype, prototype);\n    if (OriginalEvent) {\n      // - Old versions of Safari fails on new FocusEvent (and others?).\n      // - IE does not support event constructors.\n      // - createEvent('FocusEvent') throws in Firefox.\n      // => Try the best practice solution first and fallback to the old way\n      // if needed.\n      try {\n        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));\n      } catch (ex) {\n        registerWrapper(OriginalEvent, GenericEvent,\n                        document.createEvent(name));\n      }\n    }\n    return GenericEvent;\n  }\n\n  var UIEvent = registerGenericEvent('UIEvent', Event);\n  var CustomEvent = registerGenericEvent('CustomEvent', Event);\n\n  var relatedTargetProto = {\n    get relatedTarget() {\n      var relatedTarget = relatedTargetTable.get(this);\n      // relatedTarget can be null.\n      if (relatedTarget !== undefined)\n        return relatedTarget;\n      return wrap(unwrap(this).relatedTarget);\n    }\n  };\n\n  function getInitFunction(name, relatedTargetIndex) {\n    return function() {\n      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);\n      var impl = unwrap(this);\n      impl[name].apply(impl, arguments);\n    };\n  }\n\n  var mouseEventProto = mixin({\n    initMouseEvent: getInitFunction('initMouseEvent', 14)\n  }, relatedTargetProto);\n\n  var focusEventProto = mixin({\n    initFocusEvent: getInitFunction('initFocusEvent', 5)\n  }, relatedTargetProto);\n\n  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);\n  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);\n\n  // In case the browser does not support event constructors we polyfill that\n  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to\n  // `initFooEvent` are derived from the registered default event init dict.\n  var defaultInitDicts = Object.create(null);\n\n  var supportsEventConstructors = (function() {\n    try {\n      new window.FocusEvent('focus');\n    } catch (ex) {\n      return false;\n    }\n    return true;\n  })();\n\n  /**\n   * Constructs a new native event.\n   */\n  function constructEvent(OriginalEvent, name, type, options) {\n    if (supportsEventConstructors)\n      return new OriginalEvent(type, unwrapOptions(options));\n\n    // Create the arguments from the default dictionary.\n    var event = unwrap(document.createEvent(name));\n    var defaultDict = defaultInitDicts[name];\n    var args = [type];\n    Object.keys(defaultDict).forEach(function(key) {\n      var v = options != null && key in options ?\n          options[key] : defaultDict[key];\n      if (key === 'relatedTarget')\n        v = unwrap(v);\n      args.push(v);\n    });\n    event['init' + name].apply(event, args);\n    return event;\n  }\n\n  if (!supportsEventConstructors) {\n    var configureEventConstructor = function(name, initDict, superName) {\n      if (superName) {\n        var superDict = defaultInitDicts[superName];\n        initDict = mixin(mixin({}, superDict), initDict);\n      }\n\n      defaultInitDicts[name] = initDict;\n    };\n\n    // The order of the default event init dictionary keys is important, the\n    // arguments to initFooEvent is derived from that.\n    configureEventConstructor('Event', {bubbles: false, cancelable: false});\n    configureEventConstructor('CustomEvent', {detail: null}, 'Event');\n    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');\n    configureEventConstructor('MouseEvent', {\n      screenX: 0,\n      screenY: 0,\n      clientX: 0,\n      clientY: 0,\n      ctrlKey: false,\n      altKey: false,\n      shiftKey: false,\n      metaKey: false,\n      button: 0,\n      relatedTarget: null\n    }, 'UIEvent');\n    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');\n  }\n\n  // Safari 7 does not yet have BeforeUnloadEvent.\n  // https://bugs.webkit.org/show_bug.cgi?id=120849\n  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;\n\n  function BeforeUnloadEvent(impl) {\n    Event.call(this, impl);\n  }\n  BeforeUnloadEvent.prototype = Object.create(Event.prototype);\n  mixin(BeforeUnloadEvent.prototype, {\n    get returnValue() {\n      return unsafeUnwrap(this).returnValue;\n    },\n    set returnValue(v) {\n      unsafeUnwrap(this).returnValue = v;\n    }\n  });\n\n  if (OriginalBeforeUnloadEvent)\n    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);\n\n  function isValidListener(fun) {\n    if (typeof fun === 'function')\n      return true;\n    return fun && fun.handleEvent;\n  }\n\n  function isMutationEvent(type) {\n    switch (type) {\n      case 'DOMAttrModified':\n      case 'DOMAttributeNameChanged':\n      case 'DOMCharacterDataModified':\n      case 'DOMElementNameChanged':\n      case 'DOMNodeInserted':\n      case 'DOMNodeInsertedIntoDocument':\n      case 'DOMNodeRemoved':\n      case 'DOMNodeRemovedFromDocument':\n      case 'DOMSubtreeModified':\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalEventTarget = window.EventTarget;\n\n  /**\n   * This represents a wrapper for an EventTarget.\n   * @param {!EventTarget} impl The original event target.\n   * @constructor\n   */\n  function EventTarget(impl) {\n    setWrapper(impl, this);\n  }\n\n  // Node and Window have different internal type checks in WebKit so we cannot\n  // use the same method as the original function.\n  var methodNames = [\n    'addEventListener',\n    'removeEventListener',\n    'dispatchEvent'\n  ];\n\n  [Node, Window].forEach(function(constructor) {\n    var p = constructor.prototype;\n    methodNames.forEach(function(name) {\n      Object.defineProperty(p, name + '_', {value: p[name]});\n    });\n  });\n\n  function getTargetToListenAt(wrapper) {\n    if (wrapper instanceof wrappers.ShadowRoot)\n      wrapper = wrapper.host;\n    return unwrap(wrapper);\n  }\n\n  EventTarget.prototype = {\n    addEventListener: function(type, fun, capture) {\n      if (!isValidListener(fun) || isMutationEvent(type))\n        return;\n\n      var listener = new Listener(type, fun, capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners) {\n        listeners = [];\n        listeners.depth = 0;\n        listenersTable.set(this, listeners);\n      } else {\n        // Might have a duplicate.\n        for (var i = 0; i < listeners.length; i++) {\n          if (listener.equals(listeners[i]))\n            return;\n        }\n      }\n\n      listeners.push(listener);\n\n      var target = getTargetToListenAt(this);\n      target.addEventListener_(type, dispatchOriginalEvent, true);\n    },\n    removeEventListener: function(type, fun, capture) {\n      capture = Boolean(capture);\n      var listeners = listenersTable.get(this);\n      if (!listeners)\n        return;\n      var count = 0, found = false;\n      for (var i = 0; i < listeners.length; i++) {\n        if (listeners[i].type === type && listeners[i].capture === capture) {\n          count++;\n          if (listeners[i].handler === fun) {\n            found = true;\n            listeners[i].remove();\n          }\n        }\n      }\n\n      if (found && count === 1) {\n        var target = getTargetToListenAt(this);\n        target.removeEventListener_(type, dispatchOriginalEvent, true);\n      }\n    },\n    dispatchEvent: function(event) {\n      // We want to use the native dispatchEvent because it triggers the default\n      // actions (like checking a checkbox). However, if there are no listeners\n      // in the composed tree then there are no events that will trigger and\n      // listeners in the non composed tree that are part of the event path are\n      // not notified.\n      //\n      // If we find out that there are no listeners in the composed tree we add\n      // a temporary listener to the target which makes us get called back even\n      // in that case.\n\n      var nativeEvent = unwrap(event);\n      var eventType = nativeEvent.type;\n\n      // Allow dispatching the same event again. This is safe because if user\n      // code calls this during an existing dispatch of the same event the\n      // native dispatchEvent throws (that is required by the spec).\n      handledEventsTable.set(nativeEvent, false);\n\n      // Force rendering since we prefer native dispatch and that works on the\n      // composed tree.\n      scope.renderAllPending();\n\n      var tempListener;\n      if (!hasListenerInAncestors(this, eventType)) {\n        tempListener = function() {};\n        this.addEventListener(eventType, tempListener, true);\n      }\n\n      try {\n        return unwrap(this).dispatchEvent_(nativeEvent);\n      } finally {\n        if (tempListener)\n          this.removeEventListener(eventType, tempListener, true);\n      }\n    }\n  };\n\n  function hasListener(node, type) {\n    var listeners = listenersTable.get(node);\n    if (listeners) {\n      for (var i = 0; i < listeners.length; i++) {\n        if (!listeners[i].removed && listeners[i].type === type)\n          return true;\n      }\n    }\n    return false;\n  }\n\n  function hasListenerInAncestors(target, type) {\n    for (var node = unwrap(target); node; node = node.parentNode) {\n      if (hasListener(wrap(node), type))\n        return true;\n    }\n    return false;\n  }\n\n  if (OriginalEventTarget)\n    registerWrapper(OriginalEventTarget, EventTarget);\n\n  function wrapEventTargetMethods(constructors) {\n    forwardMethodsToWrapper(constructors, methodNames);\n  }\n\n  var originalElementFromPoint = document.elementFromPoint;\n\n  function elementFromPoint(self, document, x, y) {\n    scope.renderAllPending();\n\n    var element =\n        wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n\n    // scope the path to this TreeScope\n    var idx = path.lastIndexOf(self);\n    if (idx == -1)\n      return null;\n    else\n      path = path.slice(0, idx);\n\n    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var UIEvent = scope.wrappers.UIEvent;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  // TouchEvent is WebKit/Blink only.\n  var OriginalTouchEvent = window.TouchEvent;\n  if (!OriginalTouchEvent)\n    return;\n\n  var nativeEvent;\n  try {\n    nativeEvent = document.createEvent('TouchEvent');\n  } catch (ex) {\n    // In Chrome creating a TouchEvent fails if the feature is not turned on\n    // which it isn't on desktop Chrome.\n    return;\n  }\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function Touch(impl) {\n    setWrapper(impl, this);\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(unsafeUnwrap(this).target);\n    }\n  };\n\n  var descr = {\n    configurable: true,\n    enumerable: true,\n    get: null\n  };\n\n  [\n    'clientX',\n    'clientY',\n    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'identifier',\n    'webkitRadiusX',\n    'webkitRadiusY',\n    'webkitRotationAngle',\n    'webkitForce'\n  ].forEach(function(name) {\n    descr.get = function() {\n      return unsafeUnwrap(this)[name];\n    };\n    Object.defineProperty(Touch.prototype, name, descr);\n  });\n\n  function TouchList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n\n  TouchList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n\n  function wrapTouchList(nativeTouchList) {\n    var list = new TouchList();\n    for (var i = 0; i < nativeTouchList.length; i++) {\n      list[i] = new Touch(nativeTouchList[i]);\n    }\n    list.length = i;\n    return list;\n  }\n\n  function TouchEvent(impl) {\n    UIEvent.call(this, impl);\n  }\n\n  TouchEvent.prototype = Object.create(UIEvent.prototype);\n\n  mixin(TouchEvent.prototype, {\n    get touches() {\n      return wrapTouchList(unsafeUnwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unsafeUnwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unsafeUnwrap(this).changedTouches);\n    },\n\n    initTouchEvent: function() {\n      // The only way to use this is to reuse the TouchList from an existing\n      // TouchEvent. Since this is WebKit/Blink proprietary API we will not\n      // implement this until someone screams.\n      throw new Error('Not implemented');\n    }\n  });\n\n  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);\n\n  scope.wrappers.Touch = Touch;\n  scope.wrappers.TouchEvent = TouchEvent;\n  scope.wrappers.TouchList = TouchList;\n\n})(window.ShadowDOMPolyfill);\n\n","// Copyright 2012 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var nonEnumDescriptor = {enumerable: false};\n\n  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, nonEnumDescriptor);\n  }\n\n  function NodeList() {\n    this.length = 0;\n    nonEnum(this, 'length');\n  }\n  NodeList.prototype = {\n    item: function(index) {\n      return this[index];\n    }\n  };\n  nonEnum(NodeList.prototype, 'item');\n\n  function wrapNodeList(list) {\n    if (list == null)\n      return list;\n    var wrapperList = new NodeList();\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrapperList[i] = wrap(list[i]);\n    }\n    wrapperList.length = length;\n    return wrapperList;\n  }\n\n  function addWrapNodeListMethod(wrapperConstructor, name) {\n    wrapperConstructor.prototype[name] = function() {\n      return wrapNodeList(\n          unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  scope.wrappers.NodeList = NodeList;\n  scope.addWrapNodeListMethod = addWrapNodeListMethod;\n  scope.wrapNodeList = wrapNodeList;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  // TODO(arv): Implement.\n\n  scope.wrapHTMLCollection = scope.wrapNodeList;\n  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false));\n    else\n      clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper) {\n          this.lastChild_ = nodes[nodes.length - 1];\n          if (this.firstChild_ === undefined)\n            this.firstChild_ = this.firstChild;\n        }\n\n        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);\n\n        // insertBefore refWrapper no matter what the parent is?\n        if (parentNode) {\n          originalInsertBefore.call(parentNode,\n              unwrapNodesForInsertion(this, nodes), refNode);\n        } else {\n          adoptNodesIfNeeded(this, nodes);\n        }\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        nextSibling: refWrapper,\n        previousSibling: previousNode\n      });\n\n      nodesWereAdded(nodes, this);\n\n      return childWrapper;\n    },\n\n    removeChild: function(childWrapper) {\n      assertIsNodeWrapper(childWrapper);\n      if (childWrapper.parentNode !== this) {\n        // IE has invalid DOM trees at times.\n        var found = false;\n        var childNodes = this.childNodes;\n        for (var ieChild = this.firstChild; ieChild;\n             ieChild = ieChild.nextSibling) {\n          if (ieChild === childWrapper) {\n            found = true;\n            break;\n          }\n        }\n        if (!found) {\n          // TODO(arv): DOMException\n          throw new Error('NotFoundError');\n        }\n      }\n\n      var childNode = unwrap(childWrapper);\n      var childWrapperNextSibling = childWrapper.nextSibling;\n      var childWrapperPreviousSibling = childWrapper.previousSibling;\n\n      if (this.invalidateShadowRenderer()) {\n        // We need to remove the real node from the DOM before updating the\n        // pointers. This is so that that mutation event is dispatched before\n        // the pointers have changed.\n        var thisFirstChild = this.firstChild;\n        var thisLastChild = this.lastChild;\n\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          removeChildOriginalHelper(parentNode, childNode);\n\n        if (thisFirstChild === childWrapper)\n          this.firstChild_ = childWrapperNextSibling;\n        if (thisLastChild === childWrapper)\n          this.lastChild_ = childWrapperPreviousSibling;\n        if (childWrapperPreviousSibling)\n          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;\n        if (childWrapperNextSibling) {\n          childWrapperNextSibling.previousSibling_ =\n              childWrapperPreviousSibling;\n        }\n\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = undefined;\n      } else {\n        clearChildNodes(this);\n        removeChildOriginalHelper(unsafeUnwrap(this), childNode);\n      }\n\n      if (!surpressMutations) {\n        enqueueMutation(this, 'childList', {\n          removedNodes: createOneElementNodeList(childWrapper),\n          nextSibling: childWrapperNextSibling,\n          previousSibling: childWrapperPreviousSibling\n        });\n      }\n\n      registerTransientObservers(this, childWrapper);\n\n      return childWrapper;\n    },\n\n    replaceChild: function(newChildWrapper, oldChildWrapper) {\n      assertIsNodeWrapper(newChildWrapper);\n\n      var oldChildNode;\n      if (isWrapper(oldChildWrapper)) {\n        oldChildNode = unwrap(oldChildWrapper);\n      } else {\n        oldChildNode = oldChildWrapper;\n        oldChildWrapper = wrap(oldChildNode);\n      }\n\n      if (oldChildWrapper.parentNode !== this) {\n        // TODO(arv): DOMException\n        throw new Error('NotFoundError');\n      }\n\n      var nextNode = oldChildWrapper.nextSibling;\n      var previousNode = oldChildWrapper.previousSibling;\n      var nodes;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(newChildWrapper);\n\n      if (useNative) {\n        nodes = collectNodesNative(newChildWrapper);\n      } else {\n        if (nextNode === newChildWrapper)\n          nextNode = newChildWrapper.nextSibling;\n        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);\n      }\n\n      if (!useNative) {\n        if (this.firstChild === oldChildWrapper)\n          this.firstChild_ = nodes[0];\n        if (this.lastChild === oldChildWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\n        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =\n            oldChildWrapper.parentNode_ = undefined;\n\n        // replaceChild no matter what the parent is?\n        if (oldChildNode.parentNode) {\n          originalReplaceChild.call(\n              oldChildNode.parentNode,\n              unwrapNodesForInsertion(this, nodes),\n              oldChildNode);\n        }\n      } else {\n        ensureSameOwnerDocument(this, newChildWrapper);\n        clearChildNodes(this);\n        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper),\n                                  oldChildNode);\n      }\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: nodes,\n        removedNodes: createOneElementNodeList(oldChildWrapper),\n        nextSibling: nextNode,\n        previousSibling: previousNode\n      });\n\n      nodeWasRemoved(oldChildWrapper);\n      nodesWereAdded(nodes, this);\n\n      return oldChildWrapper;\n    },\n\n    /**\n     * Called after a node was inserted. Subclasses override this to invalidate\n     * the renderer as needed.\n     * @private\n     */\n    nodeIsInserted_: function() {\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        child.nodeIsInserted_();\n      }\n    },\n\n    hasChildNodes: function() {\n      return this.firstChild !== null;\n    },\n\n    /** @type {Node} */\n    get parentNode() {\n      // If the parentNode has not been overridden, use the original parentNode.\n      return this.parentNode_ !== undefined ?\n          this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    get parentElement() {\n      var p = this.parentNode;\n      while (p && p.nodeType !== Node.ELEMENT_NODE) {\n        p = p.parentNode;\n      }\n      return p;\n    },\n\n    get textContent() {\n      // TODO(arv): This should fallback to unsafeUnwrap(this).textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        unsafeUnwrap(this).textContent = textContent;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get childNodes() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    cloneNode: function(deep) {\n      return cloneNode(this, deep);\n    },\n\n    contains: function(child) {\n      return contains(this, wrapIfNeeded(child));\n    },\n\n    compareDocumentPosition: function(otherNode) {\n      // This only wraps, it therefore only operates on the composed DOM and not\n      // the logical DOM.\n      return originalCompareDocumentPosition.call(unsafeUnwrap(this),\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.originalInsertBefore = originalInsertBefore;\n  scope.originalRemoveChild = originalRemoveChild;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n  var getTreeScope = scope.getTreeScope;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var originalDocumentQuerySelector = document.querySelector;\n  var originalElementQuerySelector = document.documentElement.querySelector;\n\n  var originalDocumentQuerySelectorAll = document.querySelectorAll;\n  var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;\n\n  var originalDocumentGetElementsByTagName = document.getElementsByTagName;\n  var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;\n\n  var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;\n  var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;\n\n  var OriginalElement = window.Element;\n  var OriginalDocument = window.HTMLDocument || window.Document;\n\n  function filterNodeList(list, index, result, deep) {\n    var wrappedItem = null;\n    var root = null;\n    for (var i = 0, length = list.length; i < length; i++) {\n      wrappedItem = wrap(list[i]);\n      if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          continue;\n        }\n      }\n      result[index++] = wrappedItem;\n    }\n\n    return index;\n  }\n\n  function shimSelector(selector) {\n    return String(selector).replace(/\\/deep\\//g, ' ');\n  }\n\n  function findOne(node, selector) {\n    var m, el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        return el;\n      m = findOne(el, selector);\n      if (m)\n        return m;\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function matchesSelector(el, selector) {\n    return el.matches(selector);\n  }\n\n  var XHTML_NS = 'http://www.w3.org/1999/xhtml';\n\n  function matchesTagName(el, localName, localNameLowerCase) {\n    var ln = el.localName;\n    return ln === localName ||\n        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;\n  }\n\n  function matchesEveryThing() {\n    return true;\n  }\n\n  function matchesLocalNameOnly(el, ns, localName) {\n    return el.localName === localName;\n  }\n\n  function matchesNameSpace(el, ns) {\n    return el.namespaceURI === ns;\n  }\n\n  function matchesLocalNameNS(el, ns, localName) {\n    return el.namespaceURI === ns && el.localName === localName;\n  }\n\n  function findElements(node, index, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[index++] = el;\n      index = findElements(el, index, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return index;\n  }\n\n  // find and findAll will only match Simple Selectors,\n  // Structural Pseudo Classes are not guarenteed to be correct\n  // http://www.w3.org/TR/css3-selectors/#simple-selectors\n\n  function querySelectorAllFiltered(p, index, result, selector, deep) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementQuerySelectorAll.call(target, selector);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentQuerySelectorAll.call(target, selector);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, selector, null);\n    }\n\n    return filterNodeList(list, index, result, deep);\n  }\n\n  var SelectorsInterface = {\n    querySelector: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var target = unsafeUnwrap(this);\n      var wrappedItem;\n      var root = getTreeScope(this).root;\n      if (root instanceof scope.wrappers.ShadowRoot) {\n        // We are in the shadow tree and the logical tree is\n        // going to be disconnected so we do a manual tree traversal\n        return findOne(this, selector);\n      } else if (target instanceof OriginalElement) {\n        wrappedItem = wrap(originalElementQuerySelector.call(target, selector));\n      } else if (target instanceof OriginalDocument) {\n        wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));\n      } else {\n        // When we get a ShadowRoot the logical tree is going to be disconnected\n        // so we do a manual tree traversal\n        return findOne(this, selector);\n      }\n\n      if (!wrappedItem) {\n        // When the original query returns nothing\n        // we return nothing (to be consistent with the other wrapped calls)\n        return wrappedItem;\n      } else if (!deep && (root = getTreeScope(wrappedItem).root)) {\n        if (root instanceof scope.wrappers.ShadowRoot) {\n          // When the original query returns an element in the ShadowDOM\n          // we must do a manual tree traversal\n          return findOne(this, selector);\n        }\n      }\n\n      return wrappedItem;\n    },\n    querySelectorAll: function(selector) {\n      var shimmed = shimSelector(selector);\n      var deep = shimmed !== selector;\n      selector = shimmed;\n\n      var result = new NodeList();\n\n      result.length = querySelectorAllFiltered.call(this,\n          matchesSelector,\n          0,\n          result,\n          selector,\n          deep);\n\n      return result;\n    }\n  };\n\n  function getElementsByTagNameFiltered(p, index, result, localName,\n                                        lowercase) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagName.call(target, localName,\n                                                      lowercase);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagName.call(target, localName,\n                                                       lowercase);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, localName, lowercase);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {\n    var target = unsafeUnwrap(this);\n    var list;\n    var root = getTreeScope(this).root;\n    if (root instanceof scope.wrappers.ShadowRoot) {\n      // We are in the shadow tree and the logical tree is\n      // going to be disconnected so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    } else if (target instanceof OriginalElement) {\n      list = originalElementGetElementsByTagNameNS.call(target, ns, localName);\n    } else if (target instanceof OriginalDocument) {\n      list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);\n    } else {\n      // When we get a ShadowRoot the logical tree is going to be disconnected\n      // so we do a manual tree traversal\n      return findElements(this, index, result, p, ns, localName);\n    }\n\n    return filterNodeList(list, index, result, false);\n  }\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      var match = localName === '*' ? matchesEveryThing : matchesTagName;\n\n      result.length = getElementsByTagNameFiltered.call(this,\n          match,\n          0,\n          result,\n          localName,\n          localName.toLowerCase());\n\n      return result;\n    },\n\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n\n    getElementsByTagNameNS: function(ns, localName) {\n      var result = new HTMLCollection();\n      var match = null;\n\n      if (ns === '*') {\n        match = localName === '*' ? matchesEveryThing : matchesLocalNameOnly;\n      } else {\n        match = localName === '*' ? matchesNameSpace : matchesLocalNameNS;\n      }\n\n      result.length = getElementsByTagNameNSFiltered.call(this,\n          match,\n          0,\n          result,\n          ns || null,\n          localName);\n\n      return result;\n    }\n  };\n\n  scope.GetElementsByInterface = GetElementsByInterface;\n  scope.SelectorsInterface = SelectorsInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var NodeList = scope.wrappers.NodeList;\n\n  function forwardElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.nextSibling;\n    }\n    return node;\n  }\n\n  function backwardsElement(node) {\n    while (node && node.nodeType !== Node.ELEMENT_NODE) {\n      node = node.previousSibling;\n    }\n    return node;\n  }\n\n  var ParentNodeInterface = {\n    get firstElementChild() {\n      return forwardElement(this.firstChild);\n    },\n\n    get lastElementChild() {\n      return backwardsElement(this.lastChild);\n    },\n\n    get childElementCount() {\n      var count = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        count++;\n      }\n      return count;\n    },\n\n    get children() {\n      var wrapperList = new NodeList();\n      var i = 0;\n      for (var child = this.firstElementChild;\n           child;\n           child = child.nextElementSibling) {\n        wrapperList[i++] = child;\n      }\n      wrapperList.length = i;\n      return wrapperList;\n    },\n\n    remove: function() {\n      var p = this.parentNode;\n      if (p)\n        p.removeChild(this);\n    }\n  };\n\n  var ChildNodeInterface = {\n    get nextElementSibling() {\n      return forwardElement(this.nextSibling);\n    },\n\n    get previousElementSibling() {\n      return backwardsElement(this.previousSibling);\n    }\n  };\n\n  scope.ChildNodeInterface = ChildNodeInterface;\n  scope.ParentNodeInterface = ParentNodeInterface;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var Node = scope.wrappers.Node;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  var OriginalCharacterData = window.CharacterData;\n\n  function CharacterData(node) {\n    Node.call(this, node);\n  }\n  CharacterData.prototype = Object.create(Node.prototype);\n  mixin(CharacterData.prototype, {\n    get textContent() {\n      return this.data;\n    },\n    set textContent(value) {\n      this.data = value;\n    },\n    get data() {\n      return unsafeUnwrap(this).data;\n    },\n    set data(value) {\n      var oldValue = unsafeUnwrap(this).data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      unsafeUnwrap(this).data = value;\n    }\n  });\n\n  mixin(CharacterData.prototype, ChildNodeInterface);\n\n  registerWrapper(OriginalCharacterData, CharacterData,\n                  document.createTextNode(''));\n\n  scope.wrappers.CharacterData = CharacterData;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var CharacterData = scope.wrappers.CharacterData;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  function toUInt32(x) {\n    return x >>> 0;\n  }\n\n  var OriginalText = window.Text;\n\n  function Text(node) {\n    CharacterData.call(this, node);\n  }\n  Text.prototype = Object.create(CharacterData.prototype);\n  mixin(Text.prototype, {\n    splitText: function(offset) {\n      offset = toUInt32(offset);\n      var s = this.data;\n      if (offset > s.length)\n        throw new Error('IndexSizeError');\n      var head = s.slice(0, offset);\n      var tail = s.slice(offset);\n      this.data = head;\n      var newTextNode = this.ownerDocument.createTextNode(tail);\n      if (this.parentNode)\n        this.parentNode.insertBefore(newTextNode, this.nextSibling);\n      return newTextNode;\n    }\n  });\n\n  registerWrapper(OriginalText, Text, document.createTextNode(''));\n\n  scope.wrappers.Text = Text;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n\n  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    setWrapper(impl, this);\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    constructor: DOMTokenList,\n    get length() {\n      return unsafeUnwrap(this).length;\n    },\n    item: function(index) {\n      return unsafeUnwrap(this).item(index);\n    },\n    contains: function(token) {\n      return unsafeUnwrap(this).contains(token);\n    },\n    add: function() {\n      unsafeUnwrap(this).add.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      unsafeUnwrap(this).remove.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = unsafeUnwrap(this).toggle.apply(unsafeUnwrap(this), arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  scope.wrappers.DOMTokenList = DOMTokenList;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var ChildNodeInterface = scope.ChildNodeInterface;\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var DOMTokenList = scope.wrappers.DOMTokenList;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var addWrapNodeListMethod = scope.addWrapNodeListMethod;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrappers = scope.wrappers;\n\n  var OriginalElement = window.Element;\n\n  var matchesNames = [\n    'matches',  // needs to come first.\n    'mozMatchesSelector',\n    'msMatchesSelector',\n    'webkitMatchesSelector',\n  ].filter(function(name) {\n    return OriginalElement.prototype[name];\n  });\n\n  var matchesName = matchesNames[0];\n\n  var originalMatches = OriginalElement.prototype[matchesName];\n\n  function invalidateRendererBasedOnAttribute(element, name) {\n    // Only invalidate if parent node is a shadow host.\n    var p = element.parentNode;\n    if (!p || !p.shadowRoot)\n      return;\n\n    var renderer = scope.getRendererForHost(p);\n    if (renderer.dependsOnAttribute(name))\n      renderer.invalidate();\n  }\n\n  function enqueAttributeChange(element, name, oldValue) {\n    // This is not fully spec compliant. We should use localName (which might\n    // have a different case than name) and the namespace (which requires us\n    // to get the Attr object).\n    enqueueMutation(element, 'attributes', {\n      name: name,\n      namespace: null,\n      oldValue: oldValue\n    });\n  }\n\n  var classListTable = new WeakMap();\n\n  function Element(node) {\n    Node.call(this, node);\n  }\n  Element.prototype = Object.create(Node.prototype);\n  mixin(Element.prototype, {\n    createShadowRoot: function() {\n      var newShadowRoot = new wrappers.ShadowRoot(this);\n      unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return unsafeUnwrap(this).polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = unsafeUnwrap(this).getAttribute(name);\n      unsafeUnwrap(this).setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = unsafeUnwrap(this).getAttribute(name);\n      unsafeUnwrap(this).removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(unsafeUnwrap(this), selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unsafeUnwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unsafeUnwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unsafeUnwrap(this).id;\n    },\n\n    set id(v) {\n      this.setAttribute('id', v);\n    }\n  });\n\n  matchesNames.forEach(function(name) {\n    if (name !== 'matches') {\n      Element.prototype[name] = function(selector) {\n        return this.matches(selector);\n      };\n    }\n  });\n\n  if (OriginalElement.prototype.webkitCreateShadowRoot) {\n    Element.prototype.webkitCreateShadowRoot =\n        Element.prototype.createShadowRoot;\n  }\n\n  mixin(Element.prototype, ChildNodeInterface);\n  mixin(Element.prototype, GetElementsByInterface);\n  mixin(Element.prototype, ParentNodeInterface);\n  mixin(Element.prototype, SelectorsInterface);\n\n  registerWrapper(OriginalElement, Element,\n                  document.createElementNS(null, 'x'));\n\n  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var defineGetter = scope.defineGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var mixin = scope.mixin;\n  var nodesWereAdded = scope.nodesWereAdded;\n  var nodesWereRemoved = scope.nodesWereRemoved;\n  var registerWrapper = scope.registerWrapper;\n  var snapshotNodeList = scope.snapshotNodeList;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  /////////////////////////////////////////////////////////////////////////////\n  // innerHTML and outerHTML\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString\n  var escapeAttrRegExp = /[&\\u00A0\"]/g;\n  var escapeDataRegExp = /[&\\u00A0<>]/g;\n\n  function escapeReplace(c) {\n    switch (c) {\n      case '&':\n        return '&amp;';\n      case '<':\n        return '&lt;';\n      case '>':\n        return '&gt;';\n      case '\"':\n        return '&quot;'\n      case '\\u00A0':\n        return '&nbsp;';\n    }\n  }\n\n  function escapeAttr(s) {\n    return s.replace(escapeAttrRegExp, escapeReplace);\n  }\n\n  function escapeData(s) {\n    return s.replace(escapeDataRegExp, escapeReplace);\n  }\n\n  function makeSet(arr) {\n    var set = {};\n    for (var i = 0; i < arr.length; i++) {\n      set[arr[i]] = true;\n    }\n    return set;\n  }\n\n  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements\n  var voidElements = makeSet([\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr'\n  ]);\n\n  var plaintextParents = makeSet([\n    'style',\n    'script',\n    'xmp',\n    'iframe',\n    'noembed',\n    'noframes',\n    'plaintext',\n    'noscript'\n  ]);\n\n  function getOuterHTML(node, parentNode) {\n    switch (node.nodeType) {\n      case Node.ELEMENT_NODE:\n        var tagName = node.tagName.toLowerCase();\n        var s = '<' + tagName;\n        var attrs = node.attributes;\n        for (var i = 0, attr; attr = attrs[i]; i++) {\n          s += ' ' + attr.name + '=\"' + escapeAttr(attr.value) + '\"';\n        }\n        s += '>';\n        if (voidElements[tagName])\n          return s;\n\n        return s + getInnerHTML(node) + '</' + tagName + '>';\n\n      case Node.TEXT_NODE:\n        var data = node.data;\n        if (parentNode && plaintextParents[parentNode.localName])\n          return data;\n        return escapeData(data);\n\n      case Node.COMMENT_NODE:\n        return '<!--' + node.data + '-->';\n\n      default:\n        console.error(node);\n        throw new Error('not implemented');\n    }\n  }\n\n  function getInnerHTML(node) {\n    if (node instanceof wrappers.HTMLTemplateElement)\n      node = node.content;\n\n    var s = '';\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      s += getOuterHTML(child, node);\n    }\n    return s;\n  }\n\n  function setInnerHTML(node, value, opt_tagName) {\n    var tagName = opt_tagName || 'div';\n    node.textContent = '';\n    var tempElement = unwrap(node.ownerDocument.createElement(tagName));\n    tempElement.innerHTML = value;\n    var firstChild;\n    while (firstChild = tempElement.firstChild) {\n      node.appendChild(wrap(firstChild));\n    }\n  }\n\n  // IE11 does not have MSIE in the user agent string.\n  var oldIe = /MSIE/.test(navigator.userAgent);\n\n  var OriginalHTMLElement = window.HTMLElement;\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLElement(node) {\n    Element.call(this, node);\n  }\n  HTMLElement.prototype = Object.create(Element.prototype);\n  mixin(HTMLElement.prototype, {\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      // IE9 does not handle set innerHTML correctly on plaintextParents. It\n      // creates element children. For example\n      //\n      //   scriptElement.innerHTML = '<a>test</a>'\n      //\n      // Creates a single HTMLAnchorElement child.\n      if (oldIe && plaintextParents[this.localName]) {\n        this.textContent = value;\n        return;\n      }\n\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        if (this instanceof wrappers.HTMLTemplateElement)\n          setInnerHTML(this.content, value);\n        else\n          setInnerHTML(this, value, this.tagName);\n\n      // If we have a non native template element we need to handle this\n      // manually since setting impl.innerHTML would add the html as direct\n      // children and not be moved over to the content fragment.\n      } else if (!OriginalHTMLTemplateElement &&\n                 this instanceof wrappers.HTMLTemplateElement) {\n        setInnerHTML(this.content, value);\n      } else {\n        unsafeUnwrap(this).innerHTML = value;\n      }\n\n      var addedNodes = snapshotNodeList(this.childNodes);\n\n      enqueueMutation(this, 'childList', {\n        addedNodes: addedNodes,\n        removedNodes: removedNodes\n      });\n\n      nodesWereRemoved(removedNodes);\n      nodesWereAdded(addedNodes, this);\n    },\n\n    get outerHTML() {\n      return getOuterHTML(this, this.parentNode);\n    },\n    set outerHTML(value) {\n      var p = this.parentNode;\n      if (p) {\n        p.invalidateShadowRenderer();\n        var df = frag(p, value);\n        p.replaceChild(df, this);\n      }\n    },\n\n    insertAdjacentHTML: function(position, text) {\n      var contextElement, refNode;\n      switch (String(position).toLowerCase()) {\n        case 'beforebegin':\n          contextElement = this.parentNode;\n          refNode = this;\n          break;\n        case 'afterend':\n          contextElement = this.parentNode;\n          refNode = this.nextSibling;\n          break;\n        case 'afterbegin':\n          contextElement = this;\n          refNode = this.firstChild;\n          break;\n        case 'beforeend':\n          contextElement = this;\n          refNode = null;\n          break;\n        default:\n          return;\n      }\n\n      var df = frag(contextElement, text);\n      contextElement.insertBefore(df, refNode);\n    },\n\n    get hidden() {\n      return this.hasAttribute('hidden');\n    },\n    set hidden(v) {\n      if (v) {\n        this.setAttribute('hidden', '');\n      } else {\n        this.removeAttribute('hidden');\n      }\n    }\n  });\n\n  function frag(contextElement, html) {\n    // TODO(arv): This does not work with SVG and other non HTML elements.\n    var p = unwrap(contextElement.cloneNode(false));\n    p.innerHTML = html;\n    var df = unwrap(document.createDocumentFragment());\n    var c;\n    while (c = p.firstChild) {\n      df.appendChild(c);\n    }\n    return wrap(df);\n  }\n\n  function getter(name) {\n    return function() {\n      scope.renderAllPending();\n      return unsafeUnwrap(this)[name];\n    };\n  }\n\n  function getterRequiresRendering(name) {\n    defineGetter(HTMLElement, name, getter(name));\n  }\n\n  [\n    'clientHeight',\n    'clientLeft',\n    'clientTop',\n    'clientWidth',\n    'offsetHeight',\n    'offsetLeft',\n    'offsetTop',\n    'offsetWidth',\n    'scrollHeight',\n    'scrollWidth',\n  ].forEach(getterRequiresRendering);\n\n  function getterAndSetterRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      get: getter(name),\n      set: function(v) {\n        scope.renderAllPending();\n        unsafeUnwrap(this)[name] = v;\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'scrollLeft',\n    'scrollTop',\n  ].forEach(getterAndSetterRequiresRendering);\n\n  function methodRequiresRendering(name) {\n    Object.defineProperty(HTMLElement.prototype, name, {\n      value: function() {\n        scope.renderAllPending();\n        return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  [\n    'getBoundingClientRect',\n    'getClientRects',\n    'scrollIntoView'\n  ].forEach(methodRequiresRendering);\n\n  // HTMLElement is abstract so we use a subclass that has no members.\n  registerWrapper(OriginalHTMLElement, HTMLElement,\n                  document.createElement('b'));\n\n  scope.wrappers.HTMLElement = HTMLElement;\n\n  // TODO: Find a better way to share these two with WrapperShadowRoot.\n  scope.getInnerHTML = getInnerHTML;\n  scope.setInnerHTML = setInnerHTML\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;\n\n  function HTMLCanvasElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLCanvasElement.prototype, {\n    getContext: function() {\n      var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments);\n      return context && wrap(context);\n    }\n  });\n\n  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,\n                  document.createElement('canvas'));\n\n  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLContentElement = window.HTMLContentElement;\n\n  function HTMLContentElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLContentElement.prototype, {\n    constructor: HTMLContentElement,\n\n    get select() {\n      return this.getAttribute('select');\n    },\n    set select(value) {\n      this.setAttribute('select', value);\n    },\n\n    setAttribute: function(n, v) {\n      HTMLElement.prototype.setAttribute.call(this, n, v);\n      if (String(n).toLowerCase() === 'select')\n        this.invalidateShadowRenderer(true);\n    }\n\n    // getDistributedNodes is added in ShadowRenderer\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n\n  var OriginalHTMLFormElement = window.HTMLFormElement;\n\n  function HTMLFormElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLFormElement.prototype, {\n    get elements() {\n      // Note: technically this should be an HTMLFormControlsCollection, but\n      // that inherits from HTMLCollection, so should be good enough. Spec:\n      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection\n      return wrapHTMLCollection(unwrap(this).elements);\n    }\n  });\n\n  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,\n                  document.createElement('form'));\n\n  scope.wrappers.HTMLFormElement = HTMLFormElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var NodeList = scope.wrappers.NodeList;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n  HTMLShadowElement.prototype.constructor = HTMLShadowElement;\n\n  // getDistributedNodes is added in ShadowRenderer\n\n  if (OriginalHTMLShadowElement)\n    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);\n\n  scope.wrappers.HTMLShadowElement = HTMLShadowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var contentTable = new WeakMap();\n  var templateContentsOwnerTable = new WeakMap();\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner\n  function getTemplateContentsOwner(doc) {\n    if (!doc.defaultView)\n      return doc;\n    var d = templateContentsOwnerTable.get(doc);\n    if (!d) {\n      // TODO(arv): This should either be a Document or HTMLDocument depending\n      // on doc.\n      d = doc.implementation.createHTMLDocument('');\n      while (d.lastChild) {\n        d.removeChild(d.lastChild);\n      }\n      templateContentsOwnerTable.set(doc, d);\n    }\n    return d;\n  }\n\n  function extractContent(templateElement) {\n    // templateElement is not a wrapper here.\n    var doc = getTemplateContentsOwner(templateElement.ownerDocument);\n    var df = unwrap(doc.createDocumentFragment());\n    var child;\n    while (child = templateElement.firstChild) {\n      df.appendChild(child);\n    }\n    return df;\n  }\n\n  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;\n\n  function HTMLTemplateElement(node) {\n    HTMLElement.call(this, node);\n    if (!OriginalHTMLTemplateElement) {\n      var content = extractContent(node);\n      contentTable.set(this, wrap(content));\n    }\n  }\n  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);\n\n  mixin(HTMLTemplateElement.prototype, {\n    constructor: HTMLTemplateElement,\n    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(unsafeUnwrap(this).content);\n      return contentTable.get(this);\n    },\n\n    // TODO(arv): cloneNode needs to clone content.\n\n  });\n\n  if (OriginalHTMLTemplateElement)\n    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);\n\n  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLMediaElement = window.HTMLMediaElement;\n\n  if (!OriginalHTMLMediaElement) return;\n\n  function HTMLMediaElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,\n                  document.createElement('audio'));\n\n  scope.wrappers.HTMLMediaElement = HTMLMediaElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLAudioElement = window.HTMLAudioElement;\n\n  if (!OriginalHTMLAudioElement) return;\n\n  function HTMLAudioElement(node) {\n    HTMLMediaElement.call(this, node);\n  }\n  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);\n\n  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,\n                  document.createElement('audio'));\n\n  function Audio(src) {\n    if (!(this instanceof Audio)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('audio'));\n    HTMLMediaElement.call(this, node);\n    rewrap(node, this);\n\n    node.setAttribute('preload', 'auto');\n    if (src !== undefined)\n      node.setAttribute('src', src);\n  }\n\n  Audio.prototype = HTMLAudioElement.prototype;\n\n  scope.wrappers.HTMLAudioElement = HTMLAudioElement;\n  scope.wrappers.Audio = Audio;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var rewrap = scope.rewrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLOptionElement = window.HTMLOptionElement;\n\n  function trimText(s) {\n    return s.replace(/\\s+/g, ' ').trim();\n  }\n\n  function HTMLOptionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLOptionElement.prototype, {\n    get text() {\n      return trimText(this.textContent);\n    },\n    set text(value) {\n      this.textContent = trimText(String(value));\n    },\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,\n                  document.createElement('option'));\n\n  function Option(text, value, defaultSelected, selected) {\n    if (!(this instanceof Option)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('option'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (text !== undefined)\n      node.text = text;\n    if (value !== undefined)\n      node.setAttribute('value', value);\n    if (defaultSelected === true)\n      node.setAttribute('selected', '');\n    node.selected = selected === true;\n  }\n\n  Option.prototype = HTMLOptionElement.prototype;\n\n  scope.wrappers.HTMLOptionElement = HTMLOptionElement;\n  scope.wrappers.Option = Option;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLSelectElement = window.HTMLSelectElement;\n\n  function HTMLSelectElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLSelectElement.prototype, {\n    add: function(element, before) {\n      if (typeof before === 'object')  // also includes null\n        before = unwrap(before);\n      unwrap(this).add(unwrap(element), before);\n    },\n\n    remove: function(indexOrNode) {\n      // Spec only allows index but implementations allow index or node.\n      // remove() is also allowed which is same as remove(undefined)\n      if (indexOrNode === undefined) {\n        HTMLElement.prototype.remove.call(this);\n        return;\n      }\n\n      if (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\n\n      unwrap(this).remove(indexOrNode);\n    },\n\n    get form() {\n      return wrap(unwrap(this).form);\n    }\n  });\n\n  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,\n                  document.createElement('select'));\n\n  scope.wrappers.HTMLSelectElement = HTMLSelectElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n\n  var OriginalHTMLTableElement = window.HTMLTableElement;\n\n  function HTMLTableElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableElement.prototype, {\n    get caption() {\n      return wrap(unwrap(this).caption);\n    },\n    createCaption: function() {\n      return wrap(unwrap(this).createCaption());\n    },\n\n    get tHead() {\n      return wrap(unwrap(this).tHead);\n    },\n    createTHead: function() {\n      return wrap(unwrap(this).createTHead());\n    },\n\n    createTFoot: function() {\n      return wrap(unwrap(this).createTFoot());\n    },\n    get tFoot() {\n      return wrap(unwrap(this).tFoot);\n    },\n\n    get tBodies() {\n      return wrapHTMLCollection(unwrap(this).tBodies);\n    },\n    createTBody: function() {\n      return wrap(unwrap(this).createTBody());\n    },\n\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,\n                  document.createElement('table'));\n\n  scope.wrappers.HTMLTableElement = HTMLTableElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;\n\n  function HTMLTableSectionElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableSectionElement.prototype, {\n    constructor: HTMLTableSectionElement,\n    get rows() {\n      return wrapHTMLCollection(unwrap(this).rows);\n    },\n    insertRow: function(index) {\n      return wrap(unwrap(this).insertRow(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,\n                  document.createElement('thead'));\n\n  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var wrapHTMLCollection = scope.wrapHTMLCollection;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;\n\n  function HTMLTableRowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLTableRowElement.prototype, {\n    get cells() {\n      return wrapHTMLCollection(unwrap(this).cells);\n    },\n\n    insertCell: function(index) {\n      return wrap(unwrap(this).insertCell(index));\n    }\n  });\n\n  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,\n                  document.createElement('tr'));\n\n  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n\n  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;\n\n  function HTMLUnknownElement(node) {\n    switch (node.localName) {\n      case 'content':\n        return new HTMLContentElement(node);\n      case 'shadow':\n        return new HTMLShadowElement(node);\n      case 'template':\n        return new HTMLTemplateElement(node);\n    }\n    HTMLElement.call(this, node);\n  }\n  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);\n  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);\n  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerObject = scope.registerObject;\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var svgTitleElement = document.createElementNS(SVG_NS, 'title');\n  var SVGTitleElement = registerObject(svgTitleElement);\n  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;\n\n  // IE11 does not have classList for SVG elements. The spec says that classList\n  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving\n  // SVGElement without a classList property. We therefore move the accessor for\n  // IE11.\n  if (!('classList' in svgTitleElement)) {\n    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');\n    Object.defineProperty(HTMLElement.prototype, 'classList', descr);\n    delete Element.prototype.classList;\n  }\n\n  scope.wrappers.SVGElement = SVGElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGUseElement = window.SVGUseElement;\n\n  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses\n  // SVGGraphicsElement. Use the <g> element to get the right prototype.\n\n  var SVG_NS = 'http://www.w3.org/2000/svg';\n  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));\n  var useElement = document.createElementNS(SVG_NS, 'use');\n  var SVGGElement = gWrapper.constructor;\n  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);\n  var parentInterface = parentInterfacePrototype.constructor;\n\n  function SVGUseElement(impl) {\n    parentInterface.call(this, impl);\n  }\n\n  SVGUseElement.prototype = Object.create(parentInterfacePrototype);\n\n  // Firefox does not expose instanceRoot.\n  if ('instanceRoot' in useElement) {\n    mixin(SVGUseElement.prototype, {\n      get instanceRoot() {\n        return wrap(unwrap(this).instanceRoot);\n      },\n      get animatedInstanceRoot() {\n        return wrap(unwrap(this).animatedInstanceRoot);\n      },\n    });\n  }\n\n  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);\n\n  scope.wrappers.SVGUseElement = SVGUseElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var wrap = scope.wrap;\n\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n  if (!OriginalSVGElementInstance)\n    return;\n\n  function SVGElementInstance(impl) {\n    EventTarget.call(this, impl);\n  }\n\n  SVGElementInstance.prototype = Object.create(EventTarget.prototype);\n  mixin(SVGElementInstance.prototype, {\n    /** @type {SVGElement} */\n    get correspondingElement() {\n      return wrap(unsafeUnwrap(this).correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(unsafeUnwrap(this).correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(unsafeUnwrap(this).parentNode);\n    },\n\n    /** @type {SVGElementInstanceList} */\n    get childNodes() {\n      throw new Error('Not implemented');\n    },\n\n    /** @type {SVGElementInstance} */\n    get firstChild() {\n      return wrap(unsafeUnwrap(this).firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(unsafeUnwrap(this).lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(unsafeUnwrap(this).previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(unsafeUnwrap(this).nextSibling);\n    }\n  });\n\n  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);\n\n  scope.wrappers.SVGElementInstance = SVGElementInstance;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n\n  function CanvasRenderingContext2D(impl) {\n    setWrapper(impl, this);\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n\n  // IE10 does not have WebGL.\n  if (!OriginalWebGLRenderingContext)\n    return;\n\n  function WebGLRenderingContext(impl) {\n    setWrapper(impl, this);\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(unsafeUnwrap(this).canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);\n    }\n  });\n\n  // Blink/WebKit has broken DOM bindings. Usually we would create an instance\n  // of the object and pass it into registerWrapper as a \"blueprint\" but\n  // creating WebGL contexts is expensive and might fail so we use a dummy\n  // object with dummy instance properties for these broken browsers.\n  var instanceProperties = /WebKit/.test(navigator.userAgent) ?\n      {drawingBufferHeight: null, drawingBufferWidth: null} : {};\n\n  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,\n      instanceProperties);\n\n  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalRange = window.Range;\n\n  function Range(impl) {\n    setWrapper(impl, this);\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(unsafeUnwrap(this).startContainer);\n    },\n    get endContainer() {\n      return wrap(unsafeUnwrap(this).endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(unsafeUnwrap(this).commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(unsafeUnwrap(this).extractContents());\n    },\n    cloneContents: function() {\n      return wrap(unsafeUnwrap(this).cloneContents());\n    },\n    insertNode: function(node) {\n      unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(unsafeUnwrap(this).cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(unsafeUnwrap(this).createContextualFragment(html));\n    };\n  }\n\n  registerWrapper(window.Range, Range, document.createRange());\n\n  scope.wrappers.Range = Range;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var mixin = scope.mixin;\n  var registerObject = scope.registerObject;\n\n  var DocumentFragment = registerObject(document.createDocumentFragment());\n  mixin(DocumentFragment.prototype, ParentNodeInterface);\n  mixin(DocumentFragment.prototype, SelectorsInterface);\n  mixin(DocumentFragment.prototype, GetElementsByInterface);\n\n  var Comment = registerObject(document.createComment(''));\n\n  scope.wrappers.Comment = Comment;\n  scope.wrappers.DocumentFragment = DocumentFragment;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var DocumentFragment = scope.wrappers.DocumentFragment;\n  var TreeScope = scope.TreeScope;\n  var elementFromPoint = scope.elementFromPoint;\n  var getInnerHTML = scope.getInnerHTML;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var rewrap = scope.rewrap;\n  var setInnerHTML = scope.setInnerHTML;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n\n  var shadowHostTable = new WeakMap();\n  var nextOlderShadowTreeTable = new WeakMap();\n\n  var spaceCharRe = /[ \\t\\n\\r\\f]/;\n\n  function ShadowRoot(hostWrapper) {\n    var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());\n    DocumentFragment.call(this, node);\n\n    // createDocumentFragment associates the node with a wrapper\n    // DocumentFragment instance. Override that.\n    rewrap(node, this);\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\n\n    this.treeScope_ =\n        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));\n\n    shadowHostTable.set(this, hostWrapper);\n  }\n  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);\n  mixin(ShadowRoot.prototype, {\n    constructor: ShadowRoot,\n\n    get innerHTML() {\n      return getInnerHTML(this);\n    },\n    set innerHTML(value) {\n      setInnerHTML(this, value);\n      this.invalidateShadowRenderer();\n    },\n\n    get olderShadowRoot() {\n      return nextOlderShadowTreeTable.get(this) || null;\n    },\n\n    get host() {\n      return shadowHostTable.get(this) || null;\n    },\n\n    invalidateShadowRenderer: function() {\n      return shadowHostTable.get(this).invalidateShadowRenderer();\n    },\n\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this.ownerDocument, x, y);\n    },\n\n    getElementById: function(id) {\n      if (spaceCharRe.test(id))\n        return null;\n      return this.querySelector('[id=\"' + id + '\"]');\n    }\n  });\n\n  scope.wrappers.ShadowRoot = ShadowRoot;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var Element = scope.wrappers.Element;\n  var HTMLContentElement = scope.wrappers.HTMLContentElement;\n  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;\n  var Node = scope.wrappers.Node;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var assert = scope.assert;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var oneOf = scope.oneOf;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    scope.originalInsertBefore.call(parentNode, newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    scope.originalRemoveChild.call(parentNode, node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        var parentRenderer = this.parentRenderer;\n        if (parentRenderer)\n          parentRenderer.invalidate();\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAllSubtrees(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      this.resetAllSubtrees(node);\n    },\n\n    resetAllSubtrees: function(node) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      unsafeUnwrap(node).polymerShadowRenderer_ = this;\n    }\n  };\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm\n  function poolPopulation(node) {\n    var pool = [];\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      if (isInsertionPoint(child)) {\n        pool.push.apply(pool, getDistributedNodes(child));\n      } else {\n        pool.push(child);\n      }\n    }\n    return pool;\n  }\n\n  function getShadowInsertionPoint(node) {\n    if (node instanceof HTMLShadowElement)\n      return node;\n    if (node instanceof HTMLContentElement)\n      return null;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      var res = getShadowInsertionPoint(child);\n      if (res)\n        return res;\n    }\n    return null;\n  }\n\n  function destributeNodeInto(child, insertionPoint) {\n    getDistributedNodes(insertionPoint).push(child);\n    var points = destinationInsertionPointsTable.get(child);\n    if (!points)\n      destinationInsertionPointsTable.set(child, [insertionPoint]);\n    else\n      points.push(insertionPoint);\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return destinationInsertionPointsTable.get(node);\n  }\n\n  function resetDestinationInsertionPoints(node) {\n    // IE11 crashes when delete is used.\n    destinationInsertionPointsTable.set(node, undefined);\n  }\n\n  // AllowedSelectors :\n  //   TypeSelector\n  //   *\n  //   ClassSelector\n  //   IDSelector\n  //   AttributeSelector\n  //   negation\n  var selectorStartCharRe = /^(:not\\()?[*.#[a-zA-Z_|]/;\n\n  function matches(node, contentElement) {\n    var select = contentElement.getAttribute('select');\n    if (!select)\n      return true;\n\n    // Here we know the select attribute is a non empty string.\n    select = select.trim();\n    if (!select)\n      return true;\n\n    if (!(node instanceof Element))\n      return false;\n\n    if (!selectorStartCharRe.test(select))\n      return false;\n\n    try {\n      return node.matches(select);\n    } catch (ex) {\n      // Invalid selector.\n      return false;\n    }\n  }\n\n  function isFinalDestination(insertionPoint, node) {\n    var points = getDestinationInsertionPoints(node);\n    return points && points[points.length - 1] === insertionPoint;\n  }\n\n  function isInsertionPoint(node) {\n    return node instanceof HTMLContentElement ||\n           node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\n  // Returns the shadow trees as an array, with the youngest tree at the\n  // beginning of the array.\n  function getShadowTrees(host) {\n    var trees = [];\n\n    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {\n      trees.push(tree);\n    }\n    return trees;\n  }\n\n  function render(host) {\n    new ShadowRenderer(host).render();\n  };\n\n  // Need to rerender shadow host when:\n  //\n  // - a direct child to the ShadowRoot is added or removed\n  // - a direct child to the host is added or removed\n  // - a new shadow root is created\n  // - a direct child to a content/shadow element is added or removed\n  // - a sibling to a content/shadow element is added or removed\n  // - content[select] is changed\n  // - an attribute in a direct child to a host is modified\n\n  /**\n   * This gets called when a node was added or removed to it.\n   */\n  Node.prototype.invalidateShadowRenderer = function(force) {\n    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;\n    if (renderer) {\n      renderer.invalidate();\n      return true;\n    }\n\n    return false;\n  };\n\n  HTMLContentElement.prototype.getDistributedNodes =\n  HTMLShadowElement.prototype.getDistributedNodes = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedNodes(this);\n  };\n\n  Element.prototype.getDestinationInsertionPoints = function() {\n    renderAllPending();\n    return getDestinationInsertionPoints(this) || [];\n  };\n\n  HTMLContentElement.prototype.nodeIsInserted_ =\n  HTMLShadowElement.prototype.nodeIsInserted_ = function() {\n    // Invalidate old renderer if any.\n    this.invalidateShadowRenderer();\n\n    var shadowRoot = getShadowRootAncestor(this);\n    var renderer;\n    if (shadowRoot)\n      renderer = getRendererForShadowRoot(shadowRoot);\n    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;\n    if (renderer)\n      renderer.invalidate();\n  };\n\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.renderAllPending = renderAllPending;\n\n  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;\n\n  // Exposed for testing\n  scope.visual = {\n    insertBefore: insertBefore,\n    remove: remove,\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var assert = scope.assert;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  var elementsWithFormProperty = [\n    'HTMLButtonElement',\n    'HTMLFieldSetElement',\n    'HTMLInputElement',\n    'HTMLKeygenElement',\n    'HTMLLabelElement',\n    'HTMLLegendElement',\n    'HTMLObjectElement',\n    // HTMLOptionElement is handled in HTMLOptionElement.js\n    'HTMLOutputElement',\n    // HTMLSelectElement is handled in HTMLSelectElement.js\n    'HTMLTextAreaElement',\n  ];\n\n  function createWrapperConstructor(name) {\n    if (!window[name])\n      return;\n\n    // Ensure we are not overriding an already existing constructor.\n    assert(!scope.wrappers[name]);\n\n    var GeneratedWrapper = function(node) {\n      // At this point all of them extend HTMLElement.\n      HTMLElement.call(this, node);\n    }\n    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);\n    mixin(GeneratedWrapper.prototype, {\n      get form() {\n        return wrap(unwrap(this).form);\n      },\n    });\n\n    registerWrapper(window[name], GeneratedWrapper,\n        document.createElement(name.slice(4, -7)));\n    scope.wrappers[name] = GeneratedWrapper;\n  }\n\n  elementsWithFormProperty.forEach(createWrapperConstructor);\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2014 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalSelection = window.Selection;\n\n  function Selection(impl) {\n    setWrapper(impl, this);\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(unsafeUnwrap(this).anchorNode);\n    },\n    get focusNode() {\n      return wrap(unsafeUnwrap(this).focusNode);\n    },\n    addRange: function(range) {\n      unsafeUnwrap(this).addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(unsafeUnwrap(this).getRangeAt(index));\n    },\n    removeRange: function(range) {\n      unsafeUnwrap(this).removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      unsafeUnwrap(this).selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return unsafeUnwrap(this).toString();\n    }\n  };\n\n  // WebKit extensions. Not implemented.\n  // readonly attribute Node baseNode;\n  // readonly attribute long baseOffset;\n  // readonly attribute Node extentNode;\n  // readonly attribute long extentOffset;\n  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,\n  //                       [Default=Undefined] optional long baseOffset,\n  //                       [Default=Undefined] optional Node extentNode,\n  //                       [Default=Undefined] optional long extentOffset);\n  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,\n  //                  [Default=Undefined] optional long offset);\n\n  registerWrapper(window.Selection, Selection, window.getSelection());\n\n  scope.wrappers.Selection = Selection;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var GetElementsByInterface = scope.GetElementsByInterface;\n  var Node = scope.wrappers.Node;\n  var ParentNodeInterface = scope.ParentNodeInterface;\n  var Selection = scope.wrappers.Selection;\n  var SelectorsInterface = scope.SelectorsInterface;\n  var ShadowRoot = scope.wrappers.ShadowRoot;\n  var TreeScope = scope.TreeScope;\n  var cloneNode = scope.cloneNode;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var elementFromPoint = scope.elementFromPoint;\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var matchesNames = scope.matchesNames;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var rewrap = scope.rewrap;\n  var setWrapper = scope.setWrapper;\n  var unsafeUnwrap = scope.unsafeUnwrap;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrapEventTargetMethods = scope.wrapEventTargetMethods;\n  var wrapNodeList = scope.wrapNodeList;\n\n  var implementationTable = new WeakMap();\n\n  function Document(node) {\n    Node.call(this, node);\n    this.treeScope_ = new TreeScope(this, null);\n  }\n  Document.prototype = Object.create(Node.prototype);\n\n  defineWrapGetter(Document, 'documentElement');\n\n  // Conceptually both body and head can be in a shadow but suporting that seems\n  // overkill at this point.\n  defineWrapGetter(Document, 'body');\n  defineWrapGetter(Document, 'head');\n\n  // document cannot be overridden so we override a bunch of its methods\n  // directly on the instance.\n\n  function wrapMethod(name) {\n    var original = document[name];\n    Document.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  [\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'getElementById'\n  ].forEach(wrapMethod);\n\n  var originalAdoptNode = document.adoptNode;\n\n  function adoptNodeNoRemove(node, doc) {\n    originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));\n    adoptSubtree(node, doc);\n  }\n\n  function adoptSubtree(node, doc) {\n    if (node.shadowRoot)\n      doc.adoptNode(node.shadowRoot);\n    if (node instanceof ShadowRoot)\n      adoptOlderShadowRoots(node, doc);\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      adoptSubtree(child, doc);\n    }\n  }\n\n  function adoptOlderShadowRoots(shadowRoot, doc) {\n    var oldShadowRoot = shadowRoot.olderShadowRoot;\n    if (oldShadowRoot)\n      doc.adoptNode(oldShadowRoot);\n  }\n\n  var originalGetSelection = document.getSelection;\n\n  mixin(Document.prototype, {\n    adoptNode: function(node) {\n      if (node.parentNode)\n        node.parentNode.removeChild(node);\n      adoptNodeNoRemove(node, this);\n      return node;\n    },\n    elementFromPoint: function(x, y) {\n      return elementFromPoint(this, this, x, y);\n    },\n    importNode: function(node, deep) {\n      return cloneNode(node, deep, unsafeUnwrap(this));\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n    getElementsByName: function(name) {\n      return SelectorsInterface.querySelectorAll.call(this,\n          '[name=' + JSON.stringify(String(name)) + ']');\n    }\n  });\n\n  if (document.registerElement) {\n    var originalRegisterElement = document.registerElement;\n    Document.prototype.registerElement = function(tagName, object) {\n      var prototype, extendsOption;\n      if (object !== undefined) {\n        prototype = object.prototype;\n        extendsOption = object.extends;\n      }\n\n      if (!prototype)\n        prototype = Object.create(HTMLElement.prototype);\n\n\n      // If we already used the object as a prototype for another custom\n      // element.\n      if (scope.nativePrototypeTable.get(prototype)) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // Find first object on the prototype chain that already have a native\n      // prototype. Keep track of all the objects before that so we can create\n      // a similar structure for the native case.\n      var proto = Object.getPrototypeOf(prototype);\n      var nativePrototype;\n      var prototypes = [];\n      while (proto) {\n        nativePrototype = scope.nativePrototypeTable.get(proto);\n        if (nativePrototype)\n          break;\n        prototypes.push(proto);\n        proto = Object.getPrototypeOf(proto);\n      }\n\n      if (!nativePrototype) {\n        // TODO(arv): DOMException\n        throw new Error('NotSupportedError');\n      }\n\n      // This works by creating a new prototype object that is empty, but has\n      // the native prototype as its proto. The original prototype object\n      // passed into register is used as the wrapper prototype.\n\n      var newPrototype = Object.create(nativePrototype);\n      for (var i = prototypes.length - 1; i >= 0; i--) {\n        newPrototype = Object.create(newPrototype);\n      }\n\n      // Add callbacks if present.\n      // Names are taken from:\n      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156\n      // and not from the spec since the spec is out of date.\n      [\n        'createdCallback',\n        'attachedCallback',\n        'detachedCallback',\n        'attributeChangedCallback',\n      ].forEach(function(name) {\n        var f = prototype[name];\n        if (!f)\n          return;\n        newPrototype[name] = function() {\n          // if this element has been wrapped prior to registration,\n          // the wrapper is stale; in this case rewrap\n          if (!(wrap(this) instanceof CustomElementConstructor)) {\n            rewrap(this);\n          }\n          f.apply(wrap(this), arguments);\n        };\n      });\n\n      var p = {prototype: newPrototype};\n      if (extendsOption)\n        p.extends = extendsOption;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (extendsOption) {\n            return document.createElement(extendsOption, tagName);\n          } else {\n            return document.createElement(tagName);\n          }\n        }\n        setWrapper(node, this);\n      }\n      CustomElementConstructor.prototype = prototype;\n      CustomElementConstructor.prototype.constructor = CustomElementConstructor;\n\n      scope.constructorTable.set(newPrototype, CustomElementConstructor);\n      scope.nativePrototypeTable.set(prototype, newPrototype);\n\n      // registration is synchronous so do it last\n      var nativeConstructor = originalRegisterElement.call(unwrap(this),\n          tagName, p);\n      return CustomElementConstructor;\n    };\n\n    forwardMethodsToWrapper([\n      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    ], [\n      'registerElement',\n    ]);\n  }\n\n  // We also override some of the methods on document.body and document.head\n  // for convenience.\n  forwardMethodsToWrapper([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n    window.HTMLHtmlElement,\n  ], [\n    'appendChild',\n    'compareDocumentPosition',\n    'contains',\n    'getElementsByClassName',\n    'getElementsByTagName',\n    'getElementsByTagNameNS',\n    'insertBefore',\n    'querySelector',\n    'querySelectorAll',\n    'removeChild',\n    'replaceChild',\n  ].concat(matchesNames));\n\n  forwardMethodsToWrapper([\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n  ], [\n    'adoptNode',\n    'importNode',\n    'contains',\n    'createComment',\n    'createDocumentFragment',\n    'createElement',\n    'createElementNS',\n    'createEvent',\n    'createEventNS',\n    'createRange',\n    'createTextNode',\n    'elementFromPoint',\n    'getElementById',\n    'getElementsByName',\n    'getSelection',\n  ]);\n\n  mixin(Document.prototype, GetElementsByInterface);\n  mixin(Document.prototype, ParentNodeInterface);\n  mixin(Document.prototype, SelectorsInterface);\n\n  mixin(Document.prototype, {\n    get implementation() {\n      var implementation = implementationTable.get(this);\n      if (implementation)\n        return implementation;\n      implementation =\n          new DOMImplementation(unwrap(this).implementation);\n      implementationTable.set(this, implementation);\n      return implementation;\n    },\n\n    get defaultView() {\n      return wrap(unwrap(this).defaultView);\n    }\n  });\n\n  registerWrapper(window.Document, Document,\n      document.implementation.createHTMLDocument(''));\n\n  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has\n  // one Document interface and IE implements the standard correctly.\n  if (window.HTMLDocument)\n    registerWrapper(window.HTMLDocument, Document);\n\n  wrapEventTargetMethods([\n    window.HTMLBodyElement,\n    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument\n    window.HTMLHeadElement,\n  ]);\n\n  function DOMImplementation(impl) {\n    setWrapper(impl, this);\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(unsafeUnwrap(this), arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(unsafeUnwrap(this), arguments);\n    };\n  }\n\n  wrapImplMethod(DOMImplementation, 'createDocumentType');\n  wrapImplMethod(DOMImplementation, 'createDocument');\n  wrapImplMethod(DOMImplementation, 'createHTMLDocument');\n  forwardImplMethod(DOMImplementation, 'hasFeature');\n\n  registerWrapper(window.DOMImplementation, DOMImplementation);\n\n  forwardMethodsToWrapper([\n    window.DOMImplementation,\n  ], [\n    'createDocumentType',\n    'createDocument',\n    'createHTMLDocument',\n    'hasFeature',\n  ]);\n\n  scope.adoptNodeNoRemove = adoptNodeNoRemove;\n  scope.wrappers.DOMImplementation = DOMImplementation;\n  scope.wrappers.Document = Document;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var Selection = scope.wrappers.Selection;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var renderAllPending = scope.renderAllPending;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n\n  var OriginalWindow = window.Window;\n  var originalGetComputedStyle = window.getComputedStyle;\n  var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;\n  var originalGetSelection = window.getSelection;\n\n  function Window(impl) {\n    EventTarget.call(this, impl);\n  }\n  Window.prototype = Object.create(EventTarget.prototype);\n\n  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {\n    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);\n  };\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      return wrap(this || window).getDefaultComputedStyle(\n          unwrapIfNeeded(el), pseudo);\n    };\n  }\n\n  OriginalWindow.prototype.getSelection = function() {\n    return wrap(this || window).getSelection();\n  };\n\n  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n  delete window.getComputedStyle;\n  delete window.getDefaultComputedStyle;\n  delete window.getSelection;\n\n  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(\n      function(name) {\n        OriginalWindow.prototype[name] = function() {\n          var w = wrap(this || window);\n          return w[name].apply(w, arguments);\n        };\n\n        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065\n        delete window[name];\n      });\n\n  mixin(Window.prototype, {\n    getComputedStyle: function(el, pseudo) {\n      renderAllPending();\n      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),\n                                           pseudo);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\n    },\n\n    get document() {\n      return wrap(unwrap(this).document);\n    }\n  });\n\n  // Mozilla proprietary extension.\n  if (originalGetDefaultComputedStyle) {\n    Window.prototype.getDefaultComputedStyle = function(el, pseudo) {\n      renderAllPending();\n      return originalGetDefaultComputedStyle.call(unwrap(this),\n          unwrapIfNeeded(el),pseudo);\n    };\n  }\n\n  registerWrapper(OriginalWindow, Window, window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  if (OriginalDataTransferSetDragImage) {\n    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n    };\n  }\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var registerWrapper = scope.registerWrapper;\n  var setWrapper = scope.setWrapper;\n  var unwrap = scope.unwrap;\n\n  var OriginalFormData = window.FormData;\n  if (!OriginalFormData) return;\n\n  function FormData(formElement) {\n    var impl;\n    if (formElement instanceof OriginalFormData) {\n      impl = formElement;\n    } else {\n      impl = new OriginalFormData(formElement && unwrap(formElement));\n    }\n    setWrapper(impl, this);\n  }\n\n  registerWrapper(OriginalFormData, FormData, new OriginalFormData());\n\n  scope.wrappers.FormData = FormData;\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var originalSend = XMLHttpRequest.prototype.send;\n\n  // Since we only need to adjust XHR.send, we just patch it instead of wrapping\n  // the entire object. This happens when FormData is passed.\n  XMLHttpRequest.prototype.send = function(obj) {\n    return originalSend.call(this, unwrapIfNeeded(obj));\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // convenient global\n  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;\n  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;\n\n  // users may want to customize other types\n  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but\n  // I've left this code here in case we need to temporarily patch another\n  // type\n  /*\n  (function() {\n    var elts = {HTMLButtonElement: 'button'};\n    for (var c in elts) {\n      window[c] = function() { throw 'Patched Constructor'; };\n      window[c].prototype = Object.getPrototypeOf(\n          document.createElement(elts[c]));\n    }\n  })();\n  */\n\n  // patch in prefixed name\n  Object.defineProperty(Element.prototype, 'webkitShadowRoot',\n      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));\n\n  var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n  Element.prototype.createShadowRoot = function() {\n    var root = originalCreateShadowRoot.call(this);\n    CustomElements.watchShadow(this);\n    return root;\n  };\n\n  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;\n\n  function queryShadow(node, selector) {\n    var m, el = node.firstElementChild;\n    var shadows, sr, i;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for(i = shadows.length - 1; i >= 0; i--) {\n      m = shadows[i].querySelector(selector);\n      if (m) {\n        return m;\n      }\n    }\n    while(el) {\n      m = queryShadow(el, selector);\n      if (m) {\n        return m;\n      }\n      el = el.nextElementSibling;\n    }\n    return null;\n  }\n\n  function queryAllShadows(node, selector, results) {\n    var el = node.firstElementChild;\n    var temp, sr, shadows, i, j;\n    shadows = [];\n    sr = node.shadowRoot;\n    while(sr) {\n      shadows.push(sr);\n      sr = sr.olderShadowRoot;\n    }\n    for (i = shadows.length - 1; i >= 0; i--) {\n      temp = shadows[i].querySelectorAll(selector);\n      for(j = 0; j < temp.length; j++) {\n        results.push(temp[j]);\n      }\n    }\n    while (el) {\n      queryAllShadows(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\n  }\n\n  scope.queryAllShadows = function(node, selector, all) {\n    if (all) {\n      return queryAllShadows(node, selector, []);\n    } else {\n      return queryShadow(node, selector);\n    }\n  };\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertShadowDOMSelectors(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert combinators like ::shadow and pseudo-elements like ::content\n   * by replacing with space.\n  */\n  convertShadowDOMSelectors: function(cssText) {\n    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {\n      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {\n          cssText += this.scopeSelector(rule.selectorText, scopeSelector, \n            this.strictStyling) + ' {\\n\\t';\n          cssText += this.propertiesFromRule(rule) + '\\n}\\n\\n';\n        } else if (rule.type === CSSRule.MEDIA_RULE) {\n          cssText += '@media ' + rule.media.mediaText + ' {\\n';\n          cssText += this.scopeRules(rule.cssRules, scopeSelector);\n          cssText += '\\n}\\n\\n';\n        } else {\n          // KEYFRAMES_RULE in IE throws when we query cssText\n          // when it contains a -webkit- property.\n          // if this happens, we fallback to constructing the rule\n          // from the CSSRuleSet\n          // https://connect.microsoft.com/IE/feedbackdetail/view/955703/accessing-csstext-of-a-keyframe-rule-that-contains-a-webkit-property-via-cssom-generates-exception\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            if (rule.type === CSSRule.KEYFRAMES_RULE && rule.cssRules) {\n              cssText += this.ieSafeCssTextFromKeyFrameRule(rule);\n            }\n          }\n        }\n      }, this);\n    }\n    return cssText;\n  },\n  ieSafeCssTextFromKeyFrameRule: function(rule) {\n    var cssText = '@keyframes ' + rule.name + ' {';\n    Array.prototype.forEach.call(rule.cssRules, function(rule) {\n      cssText += ' ' + rule.keyText + ' {' + rule.style.cssText + '}';\n    });\n    cssText += ' }';\n    return cssText;\n  },\n  scopeSelector: function(selector, scopeSelector, strict) {\n    var r = [], parts = selector.split(',');\n    parts.forEach(function(p) {\n      p = p.trim();\n      if (this.selectorNeedsScoping(p, scopeSelector)) {\n        p = (strict && !p.match(polyfillHostNoCombinator)) ? \n            this.applyStrictSelectorScope(p, scopeSelector) :\n            this.applySelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\n    if (Array.isArray(scopeSelector)) {\n      return true;\n    }\n    var re = this.makeScopeMatcher(scopeSelector);\n    return !selector.match(re);\n  },\n  makeScopeMatcher: function(scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[/g, '\\\\[').replace(/\\[/g, '\\\\]');\n    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');\n  },\n  applySelectorScope: function(selector, selectorScope) {\n    return Array.isArray(selectorScope) ?\n        this.applySelectorScopeList(selector, selectorScope) :\n        this.applySimpleSelectorScope(selector, selectorScope);\n  },\n  // apply an array of selectors\n  applySelectorScopeList: function(selector, scopeSelectorList) {\n    var r = [];\n    for (var i=0, s; (s=scopeSelectorList[i]); i++) {\n      r.push(this.applySimpleSelectorScope(selector, s));\n    }\n    return r.join(', ');\n  },\n  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*?['\"](.*?)['\"][;\\s]*}([^{]*?){/gim,  \n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*['\"](.*?)['\"])[;\\s]*[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    shadowDOMSelectorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g,\n      /::content/g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = Array.prototype.slice.call(style.sheet.cssRules, 0);\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = elt.__resource;\n        }\n        // relay on HTMLImports for path fixup\n        HTMLImports.path.resolveUrlsInStyle(style);\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            this.addElementToDocument(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n        this.parseNext();\n      }\n\n      var hasResource = HTMLImports.parser.hasResource;\n      HTMLImports.parser.hasResource = function(node) {\n        if (node.localName === 'link' && node.rel === 'stylesheet' &&\n            node.hasAttribute(SHIM_ATTRIBUTE)) {\n          return (node.__resource);\n        } else {\n          return hasResource.call(this, node);\n        }\n      }\n\n    }\n  });\n}\n\n// exports\nscope.ShadowCSS = ShadowCSS;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n  window.wrap = window.unwrap = function(n){\n    return n;\n  }\n\n  addEventListener('DOMContentLoaded', function() {\n    if (CustomElements.useNative === false) {\n      var originalCreateShadowRoot = Element.prototype.createShadowRoot;\n      Element.prototype.createShadowRoot = function() {\n        var root = originalCreateShadowRoot.call(this);\n        CustomElements.watchShadow(this);\n        return root;\n      };\n    }\n  });\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  // Copy over the static methods\n  var OriginalURL = scope.URL;\n  if (OriginalURL) {\n    jURL.createObjectURL = function(blob) {\n      // IE extension allows a second optional options argument.\n      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx\n      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n    };\n    jURL.revokeObjectURL = function(url) {\n      OriginalURL.revokeObjectURL(url);\n    };\n  }\n\n  scope.URL = jURL;\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// Old versions of iOS do not have bind.\n\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function(scope) {\n    var self = this;\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function() {\n      var args2 = args.slice();\n      args2.push.apply(args2, arguments);\n      return self.apply(scope, args2);\n    };\n  };\n}\n\n})(window.Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(global) {\n\n  var registrationsTable = new WeakMap();\n\n  // We use setImmediate or postMessage for our future callback.\n  var setImmediate = window.msSetImmediate;\n\n  // Use post message to emulate setImmediate.\n  if (!setImmediate) {\n    var setImmediateQueue = [];\n    var sentinel = String(Math.random());\n    window.addEventListener('message', function(e) {\n      if (e.data === sentinel) {\n        var queue = setImmediateQueue;\n        setImmediateQueue = [];\n        queue.forEach(function(func) {\n          func();\n        });\n      }\n    });\n    setImmediate = function(func) {\n      setImmediateQueue.push(func);\n      window.postMessage(sentinel, '*');\n    };\n  }\n\n  // This is used to ensure that we never schedule 2 callas to setImmediate\n  var isScheduled = false;\n\n  // Keep track of observers that needs to be notified next time.\n  var scheduledObservers = [];\n\n  /**\n   * Schedules |dispatchCallback| to be called in the future.\n   * @param {MutationObserver} observer\n   */\n  function scheduleCallback(observer) {\n    scheduledObservers.push(observer);\n    if (!isScheduled) {\n      isScheduled = true;\n      setImmediate(dispatchCallbacks);\n    }\n  }\n\n  function wrapIfNeeded(node) {\n    return window.ShadowDOMPolyfill &&\n        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\n        node;\n  }\n\n  function dispatchCallbacks() {\n    // http://dom.spec.whatwg.org/#mutation-observers\n\n    isScheduled = false; // Used to allow a new setImmediate call above.\n\n    var observers = scheduledObservers;\n    scheduledObservers = [];\n    // Sort observers based on their creation UID (incremental).\n    observers.sort(function(o1, o2) {\n      return o1.uid_ - o2.uid_;\n    });\n\n    var anyNonEmpty = false;\n    observers.forEach(function(observer) {\n\n      // 2.1, 2.2\n      var queue = observer.takeRecords();\n      // 2.3. Remove all transient registered observers whose observer is mo.\n      removeTransientObserversFor(observer);\n\n      // 2.4\n      if (queue.length) {\n        observer.callback_(queue, observer);\n        anyNonEmpty = true;\n      }\n    });\n\n    // 3.\n    if (anyNonEmpty)\n      dispatchCallbacks();\n  }\n\n  function removeTransientObserversFor(observer) {\n    observer.nodes_.forEach(function(node) {\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      registrations.forEach(function(registration) {\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      });\n    });\n  }\n\n  /**\n   * This function is used for the \"For each registered observer observer (with\n   * observer's options as options) in target's list of registered observers,\n   * run these substeps:\" and the \"For each ancestor ancestor of target, and for\n   * each registered observer observer (with options options) in ancestor's list\n   * of registered observers, run these substeps:\" part of the algorithms. The\n   * |options.subtree| is checked to ensure that the callback is called\n   * correctly.\n   *\n   * @param {Node} target\n   * @param {function(MutationObserverInit):MutationRecord} callback\n   */\n  function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n    for (var node = target; node; node = node.parentNode) {\n      var registrations = registrationsTable.get(node);\n\n      if (registrations) {\n        for (var j = 0; j < registrations.length; j++) {\n          var registration = registrations[j];\n          var options = registration.options;\n\n          // Only target ignores subtree.\n          if (node !== target && !options.subtree)\n            continue;\n\n          var record = callback(options);\n          if (record)\n            registration.enqueue(record);\n        }\n      }\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function JsMutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n  }\n\n  JsMutationObserver.prototype = {\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      // 1.1\n      if (!options.childList && !options.attributes && !options.characterData ||\n\n          // 1.2\n          options.attributeOldValue && !options.attributes ||\n\n          // 1.3\n          options.attributeFilter && options.attributeFilter.length &&\n              !options.attributes ||\n\n          // 1.4\n          options.characterDataOldValue && !options.characterData) {\n\n        throw new SyntaxError();\n      }\n\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      // 2\n      // If target's list of registered observers already includes a registered\n      // observer associated with the context object, replace that registered\n      // observer's options with options.\n      var registration;\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          registration.removeListeners();\n          registration.options = options;\n          break;\n        }\n      }\n\n      // 3.\n      // Otherwise, add a new registered observer to target's list of registered\n      // observers with the context object as the observer and options as the\n      // options, and add target to context object's list of nodes on which it\n      // is registered.\n      if (!registration) {\n        registration = new Registration(this, target, options);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n\n      registration.addListeners();\n    },\n\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registration.removeListeners();\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = [];\n    this.removedNodes = [];\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  function copyMutationRecord(original) {\n    var record = new MutationRecord(original.type, original.target);\n    record.addedNodes = original.addedNodes.slice();\n    record.removedNodes = original.removedNodes.slice();\n    record.previousSibling = original.previousSibling;\n    record.nextSibling = original.nextSibling;\n    record.attributeName = original.attributeName;\n    record.attributeNamespace = original.attributeNamespace;\n    record.oldValue = original.oldValue;\n    return record;\n  };\n\n  // We keep track of the two (possibly one) records used in a single mutation.\n  var currentRecord, recordWithOldValue;\n\n  /**\n   * Creates a record without |oldValue| and caches it as |currentRecord| for\n   * later use.\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecord(type, target) {\n    return currentRecord = new MutationRecord(type, target);\n  }\n\n  /**\n   * Gets or creates a record with |oldValue| based in the |currentRecord|\n   * @param {string} oldValue\n   * @return {MutationRecord}\n   */\n  function getRecordWithOldValue(oldValue) {\n    if (recordWithOldValue)\n      return recordWithOldValue;\n    recordWithOldValue = copyMutationRecord(currentRecord);\n    recordWithOldValue.oldValue = oldValue;\n    return recordWithOldValue;\n  }\n\n  function clearRecords() {\n    currentRecord = recordWithOldValue = undefined;\n  }\n\n  /**\n   * @param {MutationRecord} record\n   * @return {boolean} Whether the record represents a record from the current\n   * mutation event.\n   */\n  function recordRepresentsCurrentMutation(record) {\n    return record === recordWithOldValue || record === currentRecord;\n  }\n\n  /**\n   * Selects which record, if any, to replace the last record in the queue.\n   * This returns |null| if no record should be replaced.\n   *\n   * @param {MutationRecord} lastRecord\n   * @param {MutationRecord} newRecord\n   * @param {MutationRecord}\n   */\n  function selectRecord(lastRecord, newRecord) {\n    if (lastRecord === newRecord)\n      return lastRecord;\n\n    // Check if the the record we are adding represents the same record. If\n    // so, we keep the one with the oldValue in it.\n    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\n      return recordWithOldValue;\n\n    return null;\n  }\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverInit} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    enqueue: function(record) {\n      var records = this.observer.records_;\n      var length = records.length;\n\n      // There are cases where we replace the last record with the new record.\n      // For example if the record represents the same mutation we need to use\n      // the one with the oldValue. If we get same record (this can happen as we\n      // walk up the tree) we ignore the new record.\n      if (records.length > 0) {\n        var lastRecord = records[length - 1];\n        var recordToReplaceLast = selectRecord(lastRecord, record);\n        if (recordToReplaceLast) {\n          records[length - 1] = recordToReplaceLast;\n          return;\n        }\n      } else {\n        scheduleCallback(this.observer);\n      }\n\n      records[length] = record;\n    },\n\n    addListeners: function() {\n      this.addListeners_(this.target);\n    },\n\n    addListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.addEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.addEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.addEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.addEventListener('DOMNodeRemoved', this, true);\n    },\n\n    removeListeners: function() {\n      this.removeListeners_(this.target);\n    },\n\n    removeListeners_: function(node) {\n      var options = this.options;\n      if (options.attributes)\n        node.removeEventListener('DOMAttrModified', this, true);\n\n      if (options.characterData)\n        node.removeEventListener('DOMCharacterDataModified', this, true);\n\n      if (options.childList)\n        node.removeEventListener('DOMNodeInserted', this, true);\n\n      if (options.childList || options.subtree)\n        node.removeEventListener('DOMNodeRemoved', this, true);\n    },\n\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.addListeners_(node);\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      transientObservedNodes.forEach(function(node) {\n        // Transient observers are never added to the target.\n        this.removeListeners_(node);\n\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          if (registrations[i] === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n    },\n\n    handleEvent: function(e) {\n      // Stop propagation since we are managing the propagation manually.\n      // This means that other mutation events on the page will not work\n      // correctly but that is by design.\n      e.stopImmediatePropagation();\n\n      switch (e.type) {\n        case 'DOMAttrModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\n\n          var name = e.attrName;\n          var namespace = e.relatedNode.namespaceURI;\n          var target = e.target;\n\n          // 1.\n          var record = new getRecord('attributes', target);\n          record.attributeName = name;\n          record.attributeNamespace = namespace;\n\n          // 2.\n          var oldValue =\n              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.attributes)\n              return;\n\n            // 3.2, 4.3\n            if (options.attributeFilter && options.attributeFilter.length &&\n                options.attributeFilter.indexOf(name) === -1 &&\n                options.attributeFilter.indexOf(namespace) === -1) {\n              return;\n            }\n            // 3.3, 4.4\n            if (options.attributeOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.4, 4.5\n            return record;\n          });\n\n          break;\n\n        case 'DOMCharacterDataModified':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\n          var target = e.target;\n\n          // 1.\n          var record = getRecord('characterData', target);\n\n          // 2.\n          var oldValue = e.prevValue;\n\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 3.1, 4.2\n            if (!options.characterData)\n              return;\n\n            // 3.2, 4.3\n            if (options.characterDataOldValue)\n              return getRecordWithOldValue(oldValue);\n\n            // 3.3, 4.4\n            return record;\n          });\n\n          break;\n\n        case 'DOMNodeRemoved':\n          this.addTransientObserver(e.target);\n          // Fall through.\n        case 'DOMNodeInserted':\n          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\n          var target = e.relatedNode;\n          var changedNode = e.target;\n          var addedNodes, removedNodes;\n          if (e.type === 'DOMNodeInserted') {\n            addedNodes = [changedNode];\n            removedNodes = [];\n          } else {\n\n            addedNodes = [];\n            removedNodes = [changedNode];\n          }\n          var previousSibling = changedNode.previousSibling;\n          var nextSibling = changedNode.nextSibling;\n\n          // 1.\n          var record = getRecord('childList', target);\n          record.addedNodes = addedNodes;\n          record.removedNodes = removedNodes;\n          record.previousSibling = previousSibling;\n          record.nextSibling = nextSibling;\n\n          forEachAncestorAndObserverEnqueueRecord(target, function(options) {\n            // 2.1, 3.2\n            if (!options.childList)\n              return;\n\n            // 2.2, 3.3\n            return record;\n          });\n\n      }\n\n      clearRecords();\n    }\n  };\n\n  global.JsMutationObserver = JsMutationObserver;\n\n  if (!global.MutationObserver)\n    global.MutationObserver = JsMutationObserver;\n\n\n})(this);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope) {\r\n\r\nvar hasNative = ('import' in document.createElement('link'));\r\nvar useNative = hasNative;\r\n\r\nisIE = /Trident/.test(navigator.userAgent);\r\n\r\n// TODO(sorvell): SD polyfill intrusion\r\nvar hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);\r\nvar wrap = function(node) {\r\n  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;\r\n};\r\nvar mainDoc = wrap(document);\r\n    \r\n// NOTE: We cannot polyfill document.currentScript because it's not possible\r\n// both to override and maintain the ability to capture the native value;\r\n// therefore we choose to expose _currentScript both when native imports\r\n// and the polyfill are in use.\r\nvar currentScriptDescriptor = {\r\n  get: function() {\r\n    var script = HTMLImports.currentScript || document.currentScript ||\r\n        // NOTE: only works when called in synchronously executing code.\r\n        // readyState should check if `loading` but IE10 is \r\n        // interactive when scripts run so we cheat.\r\n        (document.readyState !== 'complete' ? \r\n        document.scripts[document.scripts.length - 1] : null);\r\n    return wrap(script);\r\n  },\r\n  configurable: true\r\n};\r\n\r\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\r\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\r\n\r\n// call a callback when all HTMLImports in the document at call (or at least\r\n//  document ready) time have loaded.\r\n// 1. ensure the document is in a ready state (has dom), then \r\n// 2. watch for loading of imports and call callback when done\r\nfunction whenImportsReady(callback, doc) {\r\n  doc = doc || mainDoc;\r\n  // if document is loading, wait and try again\r\n  whenDocumentReady(function() {\r\n    watchImportsLoad(callback, doc);\r\n  }, doc);\r\n}\r\n\r\n// call the callback when the document is in a ready state (has dom)\r\nvar requiredReadyState = isIE ? 'complete' : 'interactive';\r\nvar READY_EVENT = 'readystatechange';\r\nfunction isDocumentReady(doc) {\r\n  return (doc.readyState === 'complete' ||\r\n      doc.readyState === requiredReadyState);\r\n}\r\n\r\n// call <callback> when we ensure the document is in a ready state\r\nfunction whenDocumentReady(callback, doc) {\r\n  if (!isDocumentReady(doc)) {\r\n    var checkReady = function() {\r\n      if (doc.readyState === 'complete' || \r\n          doc.readyState === requiredReadyState) {\r\n        doc.removeEventListener(READY_EVENT, checkReady);\r\n        whenDocumentReady(callback, doc);\r\n      }\r\n    };\r\n    doc.addEventListener(READY_EVENT, checkReady);\r\n  } else if (callback) {\r\n    callback();\r\n  }\r\n}\r\n\r\nfunction markTargetLoaded(event) {\r\n  event.target.__loaded = true;\r\n}\r\n\r\n// call <callback> when we ensure all imports have loaded\r\nfunction watchImportsLoad(callback, doc) {\r\n  var imports = doc.querySelectorAll('link[rel=import]');\r\n  var loaded = 0, l = imports.length;\r\n  function checkDone(d) { \r\n    if (loaded == l) {\r\n      callback && callback();\r\n    }\r\n  }\r\n  function loadedImport(e) {\r\n    markTargetLoaded(e);\r\n    loaded++;\r\n    checkDone();\r\n  }\r\n  if (l) {\r\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\r\n      if (isImportLoaded(imp)) {\r\n        loadedImport.call(imp, {target: imp});\r\n      } else {\r\n        imp.addEventListener('load', loadedImport);\r\n        imp.addEventListener('error', loadedImport);\r\n      }\r\n    }\r\n  } else {\r\n    checkDone();\r\n  }\r\n}\r\n\r\n// NOTE: test for native imports loading is based on explicitly watching\r\n// all imports (see below).\r\n// We cannot rely on this entirely without watching the entire document\r\n// for import links. For perf reasons, currently only head is watched.\r\n// Instead, we fallback to checking if the import property is available \r\n// and the document is not itself loading. \r\nfunction isImportLoaded(link) {\r\n  return useNative ? link.__loaded || \r\n      (link.import && link.import.readyState !== 'loading') :\r\n      link.__importParsed;\r\n}\r\n\r\n// TODO(sorvell): Workaround for \r\n// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when\r\n// this bug is addressed.\r\n// (1) Install a mutation observer to see when HTMLImports have loaded\r\n// (2) if this script is run during document load it will watch any existing\r\n// imports for loading.\r\n//\r\n// NOTE: The workaround has restricted functionality: (1) it's only compatible\r\n// with imports that are added to document.head since the mutation observer \r\n// watches only head for perf reasons, (2) it requires this script\r\n// to run before any imports have completed loading.\r\nif (useNative) {\r\n  new MutationObserver(function(mxns) {\r\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\r\n      if (m.addedNodes) {\r\n        handleImports(m.addedNodes);\r\n      }\r\n    }\r\n  }).observe(document.head, {childList: true});\r\n\r\n  function handleImports(nodes) {\r\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\r\n      if (isImport(n)) {\r\n        handleImport(n);  \r\n      }\r\n    }\r\n  }\r\n\r\n  function isImport(element) {\r\n    return element.localName === 'link' && element.rel === 'import';\r\n  }\r\n\r\n  function handleImport(element) {\r\n    var loaded = element.import;\r\n    if (loaded) {\r\n      markTargetLoaded({target: element});\r\n    } else {\r\n      element.addEventListener('load', markTargetLoaded);\r\n      element.addEventListener('error', markTargetLoaded);\r\n    }\r\n  }\r\n\r\n  // make sure to catch any imports that are in the process of loading\r\n  // when this script is run.\r\n  (function() {\r\n    if (document.readyState === 'loading') {\r\n      var imports = document.querySelectorAll('link[rel=import]');\r\n      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {\r\n        handleImport(imp);\r\n      }\r\n    }\r\n  })();\r\n\r\n}\r\n\r\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \r\n// have loaded. This event is required to simulate the script blocking \r\n// behavior of native imports. A main document script that needs to be sure\r\n// imports have loaded should wait for this event.\r\nwhenImportsReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  mainDoc.dispatchEvent(\r\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\r\n  );\r\n});\r\n\r\n// exports\r\nscope.useNative = useNative;\r\nscope.isImportLoaded = isImportLoaded;\r\nscope.whenReady = whenImportsReady;\r\nscope.isIE = isIE;\r\n\r\n// deprecated\r\nscope.whenImportsReady = whenImportsReady;\r\n\r\n})(window.HTMLImports);","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        // If url was redirected, use the redirected location so paths are\n        // calculated relative to that.\n        this.onload(url, p, resource, err, redirectedUrl);\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : locationHeader;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIE = scope.isIE;\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    if (elt.import) {\n      elt.import.__importParsed = true;\n    }\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource && !elt.__error) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    this.addElementToDocument(elt);\n  },\n  rootImportForElement: function(elt) {\n    var n = elt;\n    while (n.ownerDocument.__importLink) {\n      n = n.ownerDocument.__importLink;\n    }\n    return n;\n  },\n  addElementToDocument: function(elt) {\n    var port = this.rootImportForElement(elt.__importElement || elt);\n    var l = port.__insertedElements = port.__insertedElements || 0;\n    var refNode = port.nextElementSibling;\n    for (var i=0; i < l; i++) {\n      refNode = refNode && refNode.nextElementSibling;\n    }\n    port.parentNode.insertBefore(elt, refNode);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIE && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    this.addElementToDocument(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    this._mayParse = [];\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    // use `marParse` list to avoid looping into the same document again\n    // since it could cause an iloop.\n    if (doc && this._mayParse.indexOf(doc) < 0) {\n      this._mayParse.push(doc);\n      var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n      for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n        if (!this.isParsed(n)) {\n          if (this.hasResource(n)) {\n            return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n          } else {\n            return;\n          }\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && (node.import === undefined)) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script);\n  return 'data:text/javascript;charset=utf-8,' + encodeURIComponent(scriptContent);\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\n\n})(HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n (function(scope) {\n\nvar useNative = scope.useNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource, err, redirectedUrl) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      elt.__error = err;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (doc === undefined) {\n          // generate an HTMLDocument from data\n          doc = err ? null : makeDocument(resource, redirectedUrl || url);\n          if (doc) {\n            doc.__importLink = elt;\n            // note, we cannot use MO to detect parsed nodes because\n            // SD polyfill does not report these as mutations.\n            this.bootDocument(doc);\n          }\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n\n  // Polyfill document.baseURI for browsers without it.\n  if (!document.baseURI) {\n    var baseURIDescriptor = {\n      get: function() {\n        var base = document.querySelector('base');\n        return base ? base.href : window.location.href;\n      },\n      configurable: true\n    };\n\n    Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n    Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n  }\n\n  // IE shim for CustomEvent\n  if (typeof window.CustomEvent !== 'function') {\n    window.CustomEvent = function(inType, dictionary) {\n       var e = document.createEvent('HTMLEvents');\n       e.initEvent(inType,\n          dictionary.bubbles === false ? false : true,\n          dictionary.cancelable === false ? false : true,\n          dictionary.detail);\n       return e;\n    };\n  }\n\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// exports\nscope.importer = importer;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.importLoader = importLoader;\n\n\n})(window.HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(){\n\n// bootstrap\n\n// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// no need to bootstrap the polyfill when native imports is available.\nif (!HTMLImports.useNative) {\n  function bootstrap() {\n    HTMLImports.importer.bootDocument(doc);\n  }\n    \n  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added\n  // by the parser. For this reason, we must wait until the dom exists to \n  // bootstrap.\n  if (document.readyState === 'complete' ||\n      (document.readyState === 'interactive' && !window.attachEvent)) {\n    bootstrap();\n  } else {\n    document.addEventListener('DOMContentLoaded', bootstrap);\n  }\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nwindow.CustomElements = window.CustomElements || {flags:{}};","/*\r\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\r\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\r\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\r\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\r\n * Code distributed by Google as part of the polymer project is also\r\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\r\n */\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\n/*\r\nThis method is intended to be called when the document tree (including imports)\r\nhas pending custom elements to upgrade. It can be called multiple times and \r\nshould do nothing if no elements are in need of upgrade.\r\n\r\nNote that the import tree can consume itself and therefore special care\r\nmust be taken to avoid recursion.\r\n*/\r\nvar upgradedDocuments;\r\nfunction upgradeDocumentTree(doc) {\r\n  upgradedDocuments = [];\r\n  _upgradeDocumentTree(doc);\r\n  upgradedDocuments = null;\r\n}\r\n\r\n\r\nfunction _upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  if (upgradedDocuments.indexOf(doc) >= 0) {\r\n    return;\r\n  }\r\n  upgradedDocuments.push(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      _upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * Implements `document.registerElement`\n * @module CustomElements\n*/\n\n/**\n * Polyfilled extensions to the `document` object.\n * @class Document\n*/\n\n(function(scope) {\n\n// imports\n\nif (!scope) {\n  scope = window.CustomElements = {flags:{}};\n}\nvar flags = scope.flags;\n\n// native document.registerElement?\n\nvar hasNative = Boolean(document.registerElement);\n// For consistent timing, use native custom elements only when not polyfilling\n// other key related web components features.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);\n\nif (useNative) {\n\n  // stub\n  var nop = function() {};\n\n  // exports\n  scope.registry = {};\n  scope.upgradeElement = nop;\n\n  scope.watchShadow = nop;\n  scope.upgrade = nop;\n  scope.upgradeAll = nop;\n  scope.upgradeSubtree = nop;\n  scope.observeDocument = nop;\n  scope.upgradeDocument = nop;\n  scope.upgradeDocumentTree = nop;\n  scope.takeRecords = nop;\n  scope.reservedTagList = [];\n\n} else {\n\n  /**\n   * Registers a custom tag name with the document.\n   *\n   * When a registered element is created, a `readyCallback` method is called\n   * in the scope of the element. The `readyCallback` method can be specified on\n   * either `options.prototype` or `options.lifecycle` with the latter taking\n   * precedence.\n   *\n   * @method register\n   * @param {String} name The tag name to register. Must include a dash ('-'),\n   *    for example 'x-component'.\n   * @param {Object} options\n   *    @param {String} [options.extends]\n   *      (_off spec_) Tag name of an element to extend (or blank for a new\n   *      element). This parameter is not part of the specification, but instead\n   *      is a hint for the polyfill because the extendee is difficult to infer.\n   *      Remember that the input prototype must chain to the extended element's\n   *      prototype (or HTMLElement.prototype) regardless of the value of\n   *      `extends`.\n   *    @param {Object} options.prototype The prototype to use for the new\n   *      element. The prototype must inherit from HTMLElement.\n   *    @param {Object} [options.lifecycle]\n   *      Callbacks that fire at important phases in the life of the custom\n   *      element.\n   *\n   * @example\n   *      FancyButton = document.registerElement(\"fancy-button\", {\n   *        extends: 'button',\n   *        prototype: Object.create(HTMLButtonElement.prototype, {\n   *          readyCallback: {\n   *            value: function() {\n   *              console.log(\"a fancy-button was created\",\n   *            }\n   *          }\n   *        })\n   *      });\n   * @return {Function} Constructor for the newly registered type.\n   */\n  function register(name, options) {\n    //console.warn('document.registerElement(\"' + name + '\", ', options, ')');\n    // construct a defintion out of options\n    // TODO(sjmiles): probably should clone options instead of mutating it\n    var definition = options || {};\n    if (!name) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument `name` must not be empty');\n    }\n    if (name.indexOf('-') < 0) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('document.registerElement: first argument (\\'name\\') must contain a dash (\\'-\\'). Argument provided was \\'' + String(name) + '\\'.');\n    }\n    // prevent registering reserved names\n    if (isReservedTag(name)) {\n      throw new Error('Failed to execute \\'registerElement\\' on \\'Document\\': Registration failed for type \\'' + String(name) + '\\'. The type name is invalid.');\n    }\n    // elements may only be registered once\n    if (getRegisteredDefinition(name)) {\n      throw new Error('DuplicateDefinitionError: a type with name \\'' + String(name) + '\\' is already registered');\n    }\n    // must have a prototype, default to an extension of HTMLElement\n    // TODO(sjmiles): probably should throw if no prototype, check spec\n    if (!definition.prototype) {\n      // TODO(sjmiles): replace with more appropriate error (EricB can probably\n      // offer guidance)\n      throw new Error('Options missing required prototype property');\n    }\n    // record name\n    definition.__name = name.toLowerCase();\n    // ensure a lifecycle object so we don't have to null test it\n    definition.lifecycle = definition.lifecycle || {};\n    // build a list of ancestral custom elements (for native base detection)\n    // TODO(sjmiles): we used to need to store this, but current code only\n    // uses it in 'resolveTagName': it should probably be inlined\n    definition.ancestry = ancestry(definition.extends);\n    // extensions of native specializations of HTMLElement require localName\n    // to remain native, and use secondary 'is' specifier for extension type\n    resolveTagName(definition);\n    // some platforms require modifications to the user-supplied prototype\n    // chain\n    resolvePrototypeChain(definition);\n    // overrides to implement attributeChanged callback\n    overrideAttributeApi(definition.prototype);\n    // 7.1.5: Register the DEFINITION with DOCUMENT\n    registerDefinition(definition.__name, definition);\n    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE\n    // 7.1.8. Return the output of the previous step.\n    definition.ctor = generateConstructor(definition);\n    definition.ctor.prototype = definition.prototype;\n    // force our .constructor to be our actual constructor\n    definition.prototype.constructor = definition.ctor;\n    // if initial parsing is complete\n    if (scope.ready) {\n      // upgrade any pre-existing nodes of this type\n      scope.upgradeDocumentTree(document);\n    }\n    return definition.ctor;\n  }\n\n  function isReservedTag(name) {\n    for (var i = 0; i < reservedTagList.length; i++) {\n      if (name === reservedTagList[i]) {\n        return true;\n      }\n    }\n  }\n\n  var reservedTagList = [\n    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',\n    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'\n  ];\n\n  function ancestry(extnds) {\n    var extendee = getRegisteredDefinition(extnds);\n    if (extendee) {\n      return ancestry(extendee.extends).concat([extendee]);\n    }\n    return [];\n  }\n\n  function resolveTagName(definition) {\n    // if we are explicitly extending something, that thing is our\n    // baseTag, unless it represents a custom component\n    var baseTag = definition.extends;\n    // if our ancestry includes custom components, we only have a\n    // baseTag if one of them does\n    for (var i=0, a; (a=definition.ancestry[i]); i++) {\n      baseTag = a.is && a.tag;\n    }\n    // our tag is our baseTag, if it exists, and otherwise just our name\n    definition.tag = baseTag || definition.__name;\n    if (baseTag) {\n      // if there is a base tag, use secondary 'is' specifier\n      definition.is = definition.__name;\n    }\n  }\n\n  function resolvePrototypeChain(definition) {\n    // if we don't support __proto__ we need to locate the native level\n    // prototype for precise mixing in\n    if (!Object.__proto__) {\n      // default prototype\n      var nativePrototype = HTMLElement.prototype;\n      // work out prototype when using type-extension\n      if (definition.is) {\n        var inst = document.createElement(definition.tag);\n        var expectedPrototype = Object.getPrototypeOf(inst);\n        // only set nativePrototype if it will actually appear in the definition's chain\n        if (expectedPrototype === definition.prototype) {\n          nativePrototype = expectedPrototype;\n        }\n      }\n      // ensure __proto__ reference is installed at each point on the prototype\n      // chain.\n      // NOTE: On platforms without __proto__, a mixin strategy is used instead\n      // of prototype swizzling. In this case, this generated __proto__ provides\n      // limited support for prototype traversal.\n      var proto = definition.prototype, ancestor;\n      while (proto && (proto !== nativePrototype)) {\n        ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n      // cache this in case of mixin\n      definition.native = nativePrototype;\n    }\n  }\n\n  // SECTION 4\n\n  function instantiate(definition) {\n    // 4.a.1. Create a new object that implements PROTOTYPE\n    // 4.a.2. Let ELEMENT by this new object\n    //\n    // the custom element instantiation algorithm must also ensure that the\n    // output is a valid DOM element with the proper wrapper in place.\n    //\n    return upgrade(domCreateElement(definition.tag), definition);\n  }\n\n  function upgrade(element, definition) {\n    // some definitions specify an 'is' attribute\n    if (definition.is) {\n      element.setAttribute('is', definition.is);\n    }\n    // make 'element' implement definition.prototype\n    implement(element, definition);\n    // flag as upgraded\n    element.__upgraded__ = true;\n    // lifecycle management\n    created(element);\n    // attachedCallback fires in tree order, call before recursing\n    scope.insertedNode(element);\n    // there should never be a shadow root on element at this point\n    scope.upgradeSubtree(element);\n    // OUTPUT\n    return element;\n  }\n\n  function implement(element, definition) {\n    // prototype swizzling is best\n    if (Object.__proto__) {\n      element.__proto__ = definition.prototype;\n    } else {\n      // where above we can re-acquire inPrototype via\n      // getPrototypeOf(Element), we cannot do so when\n      // we use mixin, so we install a magic reference\n      customMixin(element, definition.prototype, definition.native);\n      element.__proto__ = definition.prototype;\n    }\n  }\n\n  function customMixin(inTarget, inSrc, inNative) {\n    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of\n    // any property. This set should be precalculated. We also need to\n    // consider this for supporting 'super'.\n    var used = {};\n    // start with inSrc\n    var p = inSrc;\n    // The default is HTMLElement.prototype, so we add a test to avoid mixing in\n    // native prototypes\n    while (p !== inNative && p !== HTMLElement.prototype) {\n      var keys = Object.getOwnPropertyNames(p);\n      for (var i=0, k; k=keys[i]; i++) {\n        if (!used[k]) {\n          Object.defineProperty(inTarget, k,\n              Object.getOwnPropertyDescriptor(p, k));\n          used[k] = 1;\n        }\n      }\n      p = Object.getPrototypeOf(p);\n    }\n  }\n\n  function created(element) {\n    // invoke createdCallback\n    if (element.createdCallback) {\n      element.createdCallback();\n    }\n  }\n\n  // attribute watching\n\n  function overrideAttributeApi(prototype) {\n    // overrides to implement callbacks\n    // TODO(sjmiles): should support access via .attributes NamedNodeMap\n    // TODO(sjmiles): preserves user defined overrides, if any\n    if (prototype.setAttribute._polyfilled) {\n      return;\n    }\n    var setAttribute = prototype.setAttribute;\n    prototype.setAttribute = function(name, value) {\n      changeAttribute.call(this, name, value, setAttribute);\n    }\n    var removeAttribute = prototype.removeAttribute;\n    prototype.removeAttribute = function(name) {\n      changeAttribute.call(this, name, null, removeAttribute);\n    }\n    prototype.setAttribute._polyfilled = true;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/\n  // index.html#dfn-attribute-changed-callback\n  function changeAttribute(name, value, operation) {\n    name = name.toLowerCase();\n    var oldValue = this.getAttribute(name);\n    operation.apply(this, arguments);\n    var newValue = this.getAttribute(name);\n    if (this.attributeChangedCallback\n        && (newValue !== oldValue)) {\n      this.attributeChangedCallback(name, oldValue, newValue);\n    }\n  }\n\n  // element registry (maps tag names to definitions)\n\n  var registry = {};\n\n  function getRegisteredDefinition(name) {\n    if (name) {\n      return registry[name.toLowerCase()];\n    }\n  }\n\n  function registerDefinition(name, definition) {\n    registry[name] = definition;\n  }\n\n  function generateConstructor(definition) {\n    return function() {\n      return instantiate(definition);\n    };\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  function createElementNS(namespace, tag, typeExtension) {\n    // NOTE: we do not support non-HTML elements,\n    // just call createElementNS for non HTML Elements\n    if (namespace === HTML_NAMESPACE) {\n      return createElement(tag, typeExtension);\n    } else {\n      return domCreateElementNS(namespace, tag);\n    }\n  }\n\n  function createElement(tag, typeExtension) {\n    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could\n    // error check it, or perhaps there should only ever be one argument\n    var definition = getRegisteredDefinition(typeExtension || tag);\n    if (definition) {\n      if (tag == definition.tag && typeExtension == definition.is) {\n        return new definition.ctor();\n      }\n      // Handle empty string for type extension.\n      if (!typeExtension && !definition.is) {\n        return new definition.ctor();\n      }\n    }\n\n    if (typeExtension) {\n      var element = createElement(tag);\n      element.setAttribute('is', typeExtension);\n      return element;\n    }\n    var element = domCreateElement(tag);\n    // Custom tags should be HTMLElements even if not upgraded.\n    if (tag.indexOf('-') >= 0) {\n      implement(element, HTMLElement);\n    }\n    return element;\n  }\n\n  function upgradeElement(element) {\n    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {\n      var is = element.getAttribute('is');\n      var definition = getRegisteredDefinition(is || element.localName);\n      if (definition) {\n        if (is && definition.tag == element.localName) {\n          return upgrade(element, definition);\n        } else if (!is && !definition.extends) {\n          return upgrade(element, definition);\n        }\n      }\n    }\n  }\n\n  function cloneNode(deep) {\n    // call original clone\n    var n = domCloneNode.call(this, deep);\n    // upgrade the element and subtree\n    scope.upgradeAll(n);\n    // return the clone\n    return n;\n  }\n  // capture native createElement before we override it\n\n  var domCreateElement = document.createElement.bind(document);\n  var domCreateElementNS = document.createElementNS.bind(document);\n\n  // capture native cloneNode before we override it\n\n  var domCloneNode = Node.prototype.cloneNode;\n\n  // exports\n\n  document.registerElement = register;\n  document.createElement = createElement; // override\n  document.createElementNS = createElementNS; // override\n  Node.prototype.cloneNode = cloneNode; // override\n\n  scope.registry = registry;\n\n  /**\n   * Upgrade an element to a custom element. Upgrading an element\n   * causes the custom prototype to be applied, an `is` attribute\n   * to be attached (as needed), and invocation of the `readyCallback`.\n   * `upgrade` does nothing if the element is already upgraded, or\n   * if it matches no registered custom tag name.\n   *\n   * @method ugprade\n   * @param {Element} element The element to upgrade.\n   * @return {Element} The upgraded element.\n   */\n  scope.upgrade = upgradeElement;\n}\n\n// Create a custom 'instanceof'. This is necessary when CustomElements\n// are implemented via a mixin strategy, as for example on IE10.\nvar isInstance;\nif (!Object.__proto__ && !useNative) {\n  isInstance = function(obj, ctor) {\n    var p = obj;\n    while (p) {\n      // NOTE: this is not technically correct since we're not checking if\n      // an object is an instance of a constructor; however, this should\n      // be good enough for the mixin strategy.\n      if (p === ctor.prototype) {\n        return true;\n      }\n      p = p.__proto__;\n    }\n    return false;\n  }\n} else {\n  isInstance = function(obj, base) {\n    return obj instanceof base;\n  }\n}\n\n// exports\nscope.instanceof = isInstance;\nscope.reservedTagList = reservedTagList;\n\n// bc\ndocument.register = document.registerElement;\n\nscope.hasNative = hasNative;\nscope.useNative = useNative;\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n// import\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\n// highlander object for parsing a document tree\n\nvar parser = {\n  selectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']'\n  ],\n  map: {\n    link: 'parseLink'\n  },\n  parse: function(inDocument) {\n    if (!inDocument.__parsed) {\n      // only parse once\n      inDocument.__parsed = true;\n      // all parsable elements in inDocument (depth-first pre-order traversal)\n      var elts = inDocument.querySelectorAll(parser.selectors);\n      // for each parsable node type, call the mapped parsing method\n      forEach(elts, function(e) {\n        parser[parser.map[e.localName]](e);\n      });\n      // upgrade all upgradeable static elements, anything dynamically\n      // created should be caught by observer\n      CustomElements.upgradeDocument(inDocument);\n      // observe document for dom changes\n      CustomElements.observeDocument(inDocument);\n    }\n  },\n  parseLink: function(linkElt) {\n    // imports\n    if (isDocumentLink(linkElt)) {\n      this.parseImport(linkElt);\n    }\n  },\n  parseImport: function(linkElt) {\n    if (linkElt.import) {\n      parser.parse(linkElt.import);\n    }\n  }\n};\n\nfunction isDocumentLink(inElt) {\n  return (inElt.localName === 'link'\n      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);\n}\n\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n// exports\n\nscope.parser = parser;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\n\n})(window.CustomElements);","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n(function(scope){\n\n// bootstrap parsing\nfunction bootstrap() {\n  // parse document\n  CustomElements.parser.parse(document);\n  // one more pass before register is 'live'\n  CustomElements.upgradeDocument(document);\n  // install upgrade hook if HTMLImports are available\n  if (window.HTMLImports) {\n    HTMLImports.__importsParsingHook = function(elt) {\n      CustomElements.parser.parse(elt.import);\n    }\n  }\n  // set internal 'ready' flag, now document.registerElement will trigger \n  // synchronous upgrades\n  CustomElements.ready = true;\n  // async to ensure *native* custom elements upgrade prior to this\n  // DOMContentLoaded can fire before elements upgrade (e.g. when there's\n  // an external script)\n  setTimeout(function() {\n    // capture blunt profiling data\n    CustomElements.readyTime = Date.now();\n    if (window.HTMLImports) {\n      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;\n    }\n    // notify the system that we are bootstrapped\n    document.dispatchEvent(\n      new CustomEvent('WebComponentsReady', {bubbles: true})\n    );\n  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType, params) {\n    params = params || {};\n    var e = document.createEvent('CustomEvent');\n    e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);\n    return e;\n  };\n  window.CustomEvent.prototype = window.Event.prototype;\n}\n\n// When loading at readyState complete time (or via flag), boot custom elements\n// immediately.\n// If relevant, HTMLImports must already be loaded.\nif (document.readyState === 'complete' || scope.flags.eager) {\n  bootstrap();\n// When loading at readyState interactive time, bootstrap only if HTMLImports\n// are not pending. Also avoid IE as the semantics of this state are unreliable.\n} else if (document.readyState === 'interactive' && !window.attachEvent &&\n    (!window.HTMLImports || window.HTMLImports.ready)) {\n  bootstrap();\n// When loading at other readyStates, wait for the appropriate DOM event to \n// bootstrap.\n} else {\n  var loadEvent = window.HTMLImports && !HTMLImports.ready ?\n      'HTMLImportsLoaded' : 'DOMContentLoaded';\n  window.addEventListener(loadEvent, bootstrap);\n}\n\n})(window.CustomElements);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function() {\n\nif (window.ShadowDOMPolyfill) {\n\n  // ensure wrapped inputs for these functions\n  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',\n      'upgradeDocument'];\n\n  // cache originals\n  var original = {};\n  fns.forEach(function(fn) {\n    original[fn] = CustomElements[fn];\n  });\n\n  // override\n  fns.forEach(function(fn) {\n    CustomElements[fn] = function(inNode) {\n      return original[fn](wrap(inNode));\n    };\n  });\n\n}\n\n})();\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill performance.now\n\n  if (!window.performance) {\n    var start = Date.now();\n    // only at millisecond precision\n    window.performance = {now: function(){ return Date.now() - start }};\n  }\n\n  // polyfill for requestAnimationFrame\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = (function() {\n      var nativeRaf = window.webkitRequestAnimationFrame ||\n        window.mozRequestAnimationFrame;\n\n      return nativeRaf ?\n        function(callback) {\n          return nativeRaf(function() {\n            callback(performance.now());\n          });\n        } :\n        function( callback ){\n          return window.setTimeout(callback, 1000 / 60);\n        };\n    })();\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = (function() {\n      return  window.webkitCancelAnimationFrame ||\n        window.mozCancelAnimationFrame ||\n        function(id) {\n          clearTimeout(id);\n        };\n    })();\n  }\n\n  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports\n  // polyfill, scripts in the main document run before imports. That means\n  // if (1) polymer is imported and (2) Polymer() is called in the main document\n  // in a script after the import, 2 occurs before 1. We correct this here\n  // by specfiically patching Polymer(); this is not necessary under native\n  // HTMLImports.\n  var elementDeclarations = [];\n\n  var polymerStub = function(name, dictionary) {\n    if ((typeof name !== 'string') && (arguments.length === 1)) {\n      Array.prototype.push.call(arguments, document._currentScript);\n    }\n    elementDeclarations.push(arguments);\n  };\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.consumeDeclarations = function(callback) {\n    scope.consumeDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    if (callback) {\n      callback(elementDeclarations);\n    }\n    elementDeclarations = null;\n  };\n\n  function installPolymerWarning() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        throw new Error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  if (HTMLImports.useNative) {\n    installPolymerWarning();\n  } else {\n    addEventListener('DOMContentLoaded', installPolymerWarning);\n  }\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n  //\n  // NOTE: position: relative fixes IE's failure to inherit opacity \n  // when a child is not statically positioned.\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden; position: relative;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n"]}
\ No newline at end of file
diff --git a/pkg/web_components/pubspec.yaml b/pkg/web_components/pubspec.yaml
index a61eb21..e38291b 100644
--- a/pkg/web_components/pubspec.yaml
+++ b/pkg/web_components/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.7.0
+version: 0.7.1-dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://www.dartlang.org/polymer-dart/
 description: >
diff --git a/runtime/bin/directory_linux.cc b/runtime/bin/directory_linux.cc
index 99dc1c6..d150bf2 100644
--- a/runtime/bin/directory_linux.cc
+++ b/runtime/bin/directory_linux.cc
@@ -134,7 +134,7 @@
         // the file pointed to.
         struct stat64 entry_info;
         int stat_success;
-        stat_success = NO_RETRY_EXPECTED(
+        stat_success = TEMP_FAILURE_RETRY(
             lstat64(listing->path_buffer().AsString(), &entry_info));
         if (stat_success == -1) {
           return kListError;
@@ -153,7 +153,7 @@
             }
             previous = previous->next;
           }
-          stat_success = NO_RETRY_EXPECTED(
+          stat_success = TEMP_FAILURE_RETRY(
               stat64(listing->path_buffer().AsString(), &entry_info));
           if (stat_success == -1) {
             // Report a broken link as a link, even if follow_links is true.
@@ -235,7 +235,7 @@
   // Do not recurse into links for deletion. Instead delete the link.
   // If it's a file, delete it.
   struct stat64 st;
-  if (NO_RETRY_EXPECTED(lstat64(path->AsString(), &st)) == -1) {
+  if (TEMP_FAILURE_RETRY(lstat64(path->AsString(), &st)) == -1) {
     return false;
   } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
     return (NO_RETRY_EXPECTED(unlink(path->AsString())) == 0);
@@ -283,7 +283,7 @@
         // readdir_r. For those we use lstat to determine the entry
         // type.
         struct stat64 entry_info;
-        if (NO_RETRY_EXPECTED(lstat64(path->AsString(), &entry_info)) == -1) {
+        if (TEMP_FAILURE_RETRY(lstat64(path->AsString(), &entry_info)) == -1) {
           break;
         }
         path->Reset(path_length);
@@ -316,7 +316,7 @@
 
 Directory::ExistsResult Directory::Exists(const char* dir_name) {
   struct stat64 entry_info;
-  int success = NO_RETRY_EXPECTED(stat64(dir_name, &entry_info));
+  int success = TEMP_FAILURE_RETRY(stat64(dir_name, &entry_info));
   if (success == 0) {
     if (S_ISDIR(entry_info.st_mode)) {
       return EXISTS;
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index 657eccda..c770caf 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -112,7 +112,7 @@
 int64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct stat64 st;
-  if (NO_RETRY_EXPECTED(fstat64(handle_->fd(), &st)) == 0) {
+  if (TEMP_FAILURE_RETRY(fstat64(handle_->fd(), &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -122,7 +122,7 @@
 File* File::Open(const char* name, FileOpenMode mode) {
   // Report errors for non-regular files.
   struct stat64 st;
-  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
+  if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
     // Only accept regular files and character devices.
     if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode)) {
       errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT;
@@ -159,7 +159,7 @@
 
 bool File::Exists(const char* name) {
   struct stat64 st;
-  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
+  if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
     return S_ISREG(st.st_mode);
   } else {
     return false;
@@ -235,7 +235,7 @@
   File::Type type = File::GetType(old_path, true);
   if (type == kIsFile) {
     struct stat64 st;
-    if (NO_RETRY_EXPECTED(stat64(old_path, &st)) != 0) {
+    if (TEMP_FAILURE_RETRY(stat64(old_path, &st)) != 0) {
       return false;
     }
     int old_fd = TEMP_FAILURE_RETRY(open64(old_path, O_RDONLY | O_CLOEXEC));
@@ -290,7 +290,7 @@
 
 int64_t File::LengthFromPath(const char* name) {
   struct stat64 st;
-  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
+  if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -305,7 +305,7 @@
 
 void File::Stat(const char* name, int64_t* data) {
   struct stat64 st;
-  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
+  if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
     if (S_ISREG(st.st_mode)) {
       data[kType] = kIsFile;
     } else if (S_ISDIR(st.st_mode)) {
@@ -328,7 +328,7 @@
 
 time_t File::LastModified(const char* name) {
   struct stat64 st;
-  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
+  if (TEMP_FAILURE_RETRY(stat64(name, &st)) == 0) {
     return st.st_mtime;
   }
   return -1;
@@ -337,7 +337,7 @@
 
 char* File::LinkTarget(const char* pathname) {
   struct stat64 link_stats;
-  if (NO_RETRY_EXPECTED(lstat64(pathname, &link_stats)) != 0) return NULL;
+  if (TEMP_FAILURE_RETRY(lstat64(pathname, &link_stats)) != 0) return NULL;
   if (!S_ISLNK(link_stats.st_mode)) {
     errno = ENOENT;
     return NULL;
@@ -385,7 +385,7 @@
 File::StdioHandleType File::GetStdioHandleType(int fd) {
   ASSERT(0 <= fd && fd <= 2);
   struct stat64 buf;
-  int result = NO_RETRY_EXPECTED(fstat64(fd, &buf));
+  int result = TEMP_FAILURE_RETRY(fstat64(fd, &buf));
   if (result == -1) {
     const int kBufferSize = 1024;
     char error_buf[kBufferSize];
@@ -404,9 +404,9 @@
   struct stat64 entry_info;
   int stat_success;
   if (follow_links) {
-    stat_success = NO_RETRY_EXPECTED(stat64(pathname, &entry_info));
+    stat_success = TEMP_FAILURE_RETRY(stat64(pathname, &entry_info));
   } else {
-    stat_success = NO_RETRY_EXPECTED(lstat64(pathname, &entry_info));
+    stat_success = TEMP_FAILURE_RETRY(lstat64(pathname, &entry_info));
   }
   if (stat_success == -1) return File::kDoesNotExist;
   if (S_ISDIR(entry_info.st_mode)) return File::kIsDirectory;
@@ -419,8 +419,8 @@
 File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
   struct stat64 file_1_info;
   struct stat64 file_2_info;
-  if (NO_RETRY_EXPECTED(lstat64(file_1, &file_1_info)) == -1 ||
-      NO_RETRY_EXPECTED(lstat64(file_2, &file_2_info)) == -1) {
+  if (TEMP_FAILURE_RETRY(lstat64(file_1, &file_1_info)) == -1 ||
+      TEMP_FAILURE_RETRY(lstat64(file_2, &file_2_info)) == -1) {
     return File::kError;
   }
   return (file_1_info.st_ino == file_2_info.st_ino &&
diff --git a/runtime/bin/isolate_data.h b/runtime/bin/isolate_data.h
index 3dc0ba2f..eaaa3fb 100644
--- a/runtime/bin/isolate_data.h
+++ b/runtime/bin/isolate_data.h
@@ -20,15 +20,22 @@
 // when the isolate shuts down.
 class IsolateData {
  public:
-  explicit IsolateData(const char* url)
-      : script_url(strdup(url)), udp_receive_buffer(NULL) {
+  explicit IsolateData(const char* url, const char* package_root)
+      : script_url(strdup(url)),
+        package_root(NULL),
+        udp_receive_buffer(NULL) {
+    if (package_root != NULL) {
+      this->package_root = strdup(package_root);
+    }
   }
   ~IsolateData() {
     free(script_url);
+    free(package_root);
     free(udp_receive_buffer);
   }
 
   char* script_url;
+  char* package_root;
   uint8_t* udp_receive_buffer;
 
  private:
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index b96d513..a65592e 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -54,7 +54,7 @@
 // Value of the --package-root flag.
 // (This pointer points into an argv buffer and does not need to be
 // free'd.)
-static const char* package_root = NULL;
+static const char* commandline_package_root = NULL;
 
 
 // Global flag that is used to indicate that we want to compile all the
@@ -136,7 +136,7 @@
   if (*arg == '\0' || *arg == '-') {
     return false;
   }
-  package_root = arg;
+  commandline_package_root = arg;
   return true;
 }
 
@@ -549,11 +549,13 @@
 // Returns true on success, false on failure.
 static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
                                                 const char* main,
-                                                void* data,
+                                                const char* package_root,
                                                 char** error,
                                                 bool* is_compile_error) {
-  Dart_Isolate isolate =
-      Dart_CreateIsolate(script_uri, main, snapshot_buffer, data, error);
+  ASSERT(script_uri != NULL);
+  IsolateData* isolate_data = new IsolateData(script_uri, package_root);
+  Dart_Isolate isolate = Dart_CreateIsolate(
+      script_uri, main, snapshot_buffer, isolate_data, error);
   if (isolate == NULL) {
     return NULL;
   }
@@ -587,10 +589,7 @@
   result = DartUtils::PrepareForScriptLoading(package_root, builtin_lib);
   CHECK_RESULT(result);
 
-  IsolateData* isolate_data = reinterpret_cast<IsolateData*>(data);
-  ASSERT(isolate_data != NULL);
-  ASSERT(isolate_data->script_url != NULL);
-  result = DartUtils::LoadScript(isolate_data->script_url, builtin_lib);
+  result = DartUtils::LoadScript(script_uri, builtin_lib);
   CHECK_RESULT(result);
 
   // Run event-loop and wait for script loading to complete.
@@ -631,24 +630,27 @@
 
 static Dart_Isolate CreateIsolateAndSetup(const char* script_uri,
                                           const char* main,
+                                          const char* package_root,
                                           void* data, char** error) {
+  IsolateData* parent_isolate_data = reinterpret_cast<IsolateData*>(data);
   bool is_compile_error = false;
   if (script_uri == NULL) {
     if (data == NULL) {
       *error = strdup("Invalid 'callback_data' - Unable to spawn new isolate");
       return NULL;
     }
-    IsolateData* parent_isolate_data = reinterpret_cast<IsolateData*>(data);
     script_uri = parent_isolate_data->script_url;
     if (script_uri == NULL) {
       *error = strdup("Invalid 'callback_data' - Unable to spawn new isolate");
       return NULL;
     }
   }
-  IsolateData* isolate_data = new IsolateData(script_uri);
+  if (package_root == NULL) {
+    package_root = parent_isolate_data->package_root;
+  }
   return CreateIsolateAndSetupHelper(script_uri,
                                      main,
-                                     isolate_data,
+                                     package_root,
                                      error,
                                      &is_compile_error);
 }
@@ -664,7 +666,7 @@
 
 static Dart_Isolate CreateServiceIsolate(void* data, char** error) {
   const char* script_uri = DartUtils::kVMServiceLibURL;
-  IsolateData* isolate_data = new IsolateData(script_uri);
+  IsolateData* isolate_data = new IsolateData(script_uri, NULL);
   Dart_Isolate isolate =
       Dart_CreateIsolate(script_uri, "main", snapshot_buffer, isolate_data,
                          error);
@@ -688,7 +690,7 @@
   CHECK_RESULT(builtin_lib);
   // Prepare for script loading by setting up the 'print' and 'timer'
   // closures and setting up 'package root' for URI resolution.
-  result = DartUtils::PrepareForScriptLoading(package_root, builtin_lib);
+  result = DartUtils::PrepareForScriptLoading(NULL, builtin_lib);
   CHECK_RESULT(result);
 
   Dart_ExitScope();
@@ -1025,10 +1027,9 @@
   char* error = NULL;
   bool is_compile_error = false;
   char* isolate_name = BuildIsolateName(script_name, "main");
-  IsolateData* isolate_data = new IsolateData(script_name);
   Dart_Isolate isolate = CreateIsolateAndSetupHelper(script_name,
                                                      "main",
-                                                     isolate_data,
+                                                     commandline_package_root,
                                                      &error,
                                                      &is_compile_error);
   if (isolate == NULL) {
diff --git a/runtime/bin/net/nss.gyp b/runtime/bin/net/nss.gyp
index cbd86a8..48675840 100644
--- a/runtime/bin/net/nss.gyp
+++ b/runtime/bin/net/nss.gyp
@@ -7,7 +7,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file is a modified copy of Chromium's deps/third_party/nss/nss.gyp.
-# Revision 257452 (this should agree with "nss_rev" in DEPS).
+# Revision 291806 (this should agree with "nss_rev" in DEPS).
 {
   # Added by Dart. All Dart comments refer to the following block or line.
   'includes': [
@@ -325,6 +325,14 @@
       },
       # TODO(wtc): suppress C4244 and C4554 in prdtoa.c.
       'msvs_disabled_warnings': [4018, 4244, 4554, 4267,],
+      'variables': {
+        'clang_warning_flags': [
+          # nspr passes "const char*" through "void*".
+          '-Wno-incompatible-pointer-types',
+          # nspr passes "int*" through "unsigned int*".
+          '-Wno-pointer-sign',
+        ],
+      },
       'conditions': [
         ['OS=="mac" or OS=="ios"', {
           'defines': [
@@ -472,16 +480,8 @@
               # nspr uses a bunch of deprecated functions (NSLinkModule etc) in
               # prlink.c on mac.
               '-Wno-deprecated-declarations',
-              # nspr passes "const char*" through "void*".
-              '-Wno-incompatible-pointer-types',
-              # nspr passes "int*" through "unsigned int*".
-              '-Wno-pointer-sign',
             ],
           },
-          'cflags': [
-            '-Wno-incompatible-pointer-types',
-            '-Wno-pointer-sign',
-          ],
         }],
       ],
     },
@@ -601,6 +601,9 @@
         ],
       },
     },
+    # Removed by Dart: the target nss_static_avx_dart.
+    # This is an optimization of AES on 32 bit Windows using new
+    # Intel assembly instructions.  Not enabling it on Dart.
     {
       'target_name': 'nss_static_dart',  # Added by Dart (the _dart postfix)
       'type': 'static_library',
@@ -708,6 +711,7 @@
         '<(nss_directory)/nss/lib/freebl/dsa.c',
         '<(nss_directory)/nss/lib/freebl/ec.c',
         '<(nss_directory)/nss/lib/freebl/ec.h',
+        '<(nss_directory)/nss/lib/freebl/ecdecode.c',
         '<(nss_directory)/nss/lib/freebl/ecl/ec2.h',
         '<(nss_directory)/nss/lib/freebl/ecl/ecl-curve.h',
         '<(nss_directory)/nss/lib/freebl/ecl/ecl-exp.h',
@@ -729,6 +733,7 @@
         '<(nss_directory)/nss/lib/freebl/ecl/ec_naf.c',
         '<(nss_directory)/nss/lib/freebl/gcm.c',
         '<(nss_directory)/nss/lib/freebl/gcm.h',
+        # Changed by Dart: intel-aes assembly language files dropped.
         '<(nss_directory)/nss/lib/freebl/hmacct.c',
         '<(nss_directory)/nss/lib/freebl/hmacct.h',
         '<(nss_directory)/nss/lib/freebl/jpake.c',
@@ -751,6 +756,7 @@
         '<(nss_directory)/nss/lib/freebl/mpi/mp_gf2m.c',
         '<(nss_directory)/nss/lib/freebl/mpi/mp_gf2m.h',
         '<(nss_directory)/nss/lib/freebl/mpi/primes.c',
+        '<(nss_directory)/nss/lib/freebl/nss_build_config_mac.h',
         '<(nss_directory)/nss/lib/freebl/poly1305/poly1305-donna-x64-sse2-incremental-source.c',
         '<(nss_directory)/nss/lib/freebl/poly1305/poly1305.c',
         '<(nss_directory)/nss/lib/freebl/poly1305/poly1305.h',
@@ -1013,7 +1019,6 @@
         '<(nss_directory)/nss/lib/smime/cmsreclist.h',
         '<(nss_directory)/nss/lib/smime/cmst.h',
         '<(nss_directory)/nss/lib/smime/smime.h',
-        '<(nss_directory)/nss/lib/softoken/ecdecode.c',
         '<(nss_directory)/nss/lib/softoken/fipsaudt.c',
         '<(nss_directory)/nss/lib/softoken/fipstest.c',
         '<(nss_directory)/nss/lib/softoken/fipstokn.c',
@@ -1123,6 +1128,7 @@
       ],
       'dependencies': [
         'nspr_dart',  # Added by Dart (the _dart postfix)
+        # Removed by Dart: nss_static_avx target dependency.
         'sqlite.gyp:sqlite_dart',  # Changed by Dart prefix ../sqllite removed _dart postfix added.
       ],
       'export_dependent_settings': [
@@ -1195,6 +1201,20 @@
         ],
       },
       'msvs_disabled_warnings': [4018, 4101, 4267, ],
+      'variables': {
+        'clang_warning_flags': [
+          # nss doesn't explicitly cast between different enum types.
+          '-Wno-conversion',
+          # nss passes "const char*" through "void*".
+          '-Wno-incompatible-pointer-types',
+          # nss prefers `a && b || c` over `(a && b) || c`.
+          '-Wno-logical-op-parentheses',
+          # nss doesn't use exhaustive switches on enums
+          '-Wno-switch',
+          # nss has some `unsigned < 0` checks.
+          '-Wno-tautological-compare',
+        ],
+      },
       'conditions': [
         ['exclude_nss_root_certs==1', {
           'defines': [
@@ -1286,7 +1306,7 @@
             '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
           ],
           'variables': {
-            'forced_include_file': '<(DEPTH)/third_party/nss/nss/lib/freebl/build_config_mac.h',
+            'forced_include_file': 'nss_build_config_mac.h',
           },
           'xcode_settings': {
             'conditions': [
@@ -1338,8 +1358,16 @@
           #       'MP_ASSEMBLY_DIV_2DX1D',
           #       'MP_USE_UINT_DIGIT',
           #       'MP_NO_MP_WORD',
+          # Changed by Dart: 'USE_HW_AES' and 'INTEL_GCM' are not enabled.
+          #       'USE_HW_AES',
+          #       'INTEL_GCM',
           #     ],
           #   }],
+          #   'msvs_settings': {
+          #     'MASM': {
+          #       'UseSafeExceptionHandlers': 'true',
+          #     },
+          #   },
           #   ['target_arch=="x64"', {
           #     'defines': [
           #       'NSS_USE_64',
@@ -1363,29 +1391,6 @@
             '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
           ],
         }],
-        ['clang==1', {
-          'xcode_settings': {
-            'WARNING_CFLAGS': [
-              # nss doesn't explicitly cast between different enum types.
-              '-Wno-conversion',
-              # nss passes "const char*" through "void*".
-              '-Wno-incompatible-pointer-types',
-              # nss prefers `a && b || c` over `(a && b) || c`.
-              '-Wno-logical-op-parentheses',
-              # nss doesn't use exhaustive switches on enums
-              '-Wno-switch',
-              # nss has some `unsigned < 0` checks.
-              '-Wno-tautological-compare',
-            ],
-          },
-          'cflags': [
-            '-Wno-conversion',
-            '-Wno-incompatible-pointer-types',
-            '-Wno-logical-op-parentheses',
-            '-Wno-switch',
-            '-Wno-tautological-compare',
-          ],
-        }],
       ],
     },
   ],
diff --git a/runtime/bin/net/nss_memio.cc b/runtime/bin/net/nss_memio.cc
index 1b24252..f8f4f82 100644
--- a/runtime/bin/net/nss_memio.cc
+++ b/runtime/bin/net/nss_memio.cc
@@ -9,7 +9,7 @@
 
 // This file is a modified copy of Chromium's src/net/base/nss_memio.c.
 // char* has been changed to uint8_t* everywhere, and C++ casts are used.
-// Revision 257452 (this should agree with "nss_rev" in DEPS).
+// Revision 291806 (this should agree with "nss_rev" in DEPS).
 
 
 /* memio is a simple NSPR I/O layer that lets you decouple NSS from
@@ -442,17 +442,21 @@
   }
 }
 
-void memio_GetWriteParams(memio_Private *secret,
+int memio_GetWriteParams(memio_Private *secret,
                           const uint8_t** buf1, unsigned int *len1,
                           const uint8_t** buf2, unsigned int *len2) {
   struct memio_buffer* mb =
       &(reinterpret_cast<PRFilePrivate*>(secret)->writebuf);
   PR_ASSERT(mb->bufsize);
 
+  if (mb->last_err)
+    return mb->last_err;
+
   *buf1 = &mb->buf[mb->head];
   *len1 = memio_buffer_used_contiguous(mb);
   *buf2 = mb->buf;
   *len2 = memio_buffer_wrapped_bytes(mb);
+  return 0;
 }
 
 void memio_PutWriteResult(memio_Private *secret, int bytes_written) {
diff --git a/runtime/bin/net/nss_memio.h b/runtime/bin/net/nss_memio.h
index 0d5f20a..acfd467 100644
--- a/runtime/bin/net/nss_memio.h
+++ b/runtime/bin/net/nss_memio.h
@@ -9,7 +9,7 @@
 
 // This file is a modified copy of Chromium's src/net/base/nss_memio.h.
 // char* has been changed to uint8_t* everywhere, and C++ casts are used.
-// Revision 257452 (this should agree with "nss_rev" in DEPS).
+// Revision 291806 (this should agree with "nss_rev" in DEPS).
 
 #ifndef BIN_NET_NSS_MEMIO_H_
 #define BIN_NET_NSS_MEMIO_H_
@@ -88,12 +88,13 @@
 void memio_PutReadResult(memio_Private *secret, int bytes_read);
 
 /* Ask memio what data it has to send to the network.
- * Returns up to two buffers of data by writing the positions and lengths into
- * |buf1|, |len1| and |buf2|, |len2|.
+ * If there was previous a write error, the NSPR error code is returned.
+ * Otherwise, it returns 0 and provides up to two buffers of data by
+ * writing the positions and lengths into |buf1|, |len1| and |buf2|, |len2|.
  */
-void memio_GetWriteParams(memio_Private *secret,
-                          const uint8_t **buf1, unsigned int *len1,
-                          const uint8_t **buf2, unsigned int *len2);
+int memio_GetWriteParams(memio_Private *secret,
+                         const uint8_t **buf1, unsigned int *len1,
+                         const uint8_t **buf2, unsigned int *len2);
 
 /* Tell memio how many bytes were sent to the network.
  * If bytes_written is < 0, it is treated as an NSPR error code.
diff --git a/runtime/bin/net/sqlite.gyp b/runtime/bin/net/sqlite.gyp
index 082fa8d..bcfc0c7 100644
--- a/runtime/bin/net/sqlite.gyp
+++ b/runtime/bin/net/sqlite.gyp
@@ -7,7 +7,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file is a modified copy of Chromium's src/third_party/sqlite/sqlite.gyp.
-# Revision 257452 (this should agree with "nss_rev" in DEPS).
+# Revision 291806 (this should agree with "nss_rev" in DEPS).
 {
   # Added by Dart. All Dart comments refer to the following block or line.
   'includes': [
@@ -139,6 +139,14 @@
           'msvs_disabled_warnings': [
             4018, 4244, 4267,
           ],
+          'variables': {
+            'clang_warning_flags': [
+              # sqlite does `if (*a++ && *b++);` in a non-buggy way.
+              '-Wno-empty-body',
+              # sqlite has some `unsigned < 0` checks.
+              '-Wno-tautological-compare',
+            ],
+          },
           'conditions': [
             ['OS=="linux"', {
               'link_settings': {
@@ -173,20 +181,6 @@
                 '-Wno-pointer-to-int-cast',
               ],
             }],
-            ['clang==1', {
-              'xcode_settings': {
-                'WARNING_CFLAGS': [
-                  # sqlite does `if (*a++ && *b++);` in a non-buggy way.
-                  '-Wno-empty-body',
-                  # sqlite has some `unsigned < 0` checks.
-                  '-Wno-tautological-compare',
-                ],
-              },
-              'cflags': [
-                '-Wno-empty-body',
-                '-Wno-tautological-compare',
-              ],
-            }],
           ],
         }],
       ],
diff --git a/runtime/bin/net/ssl.gyp b/runtime/bin/net/ssl.gyp
index 2a1cfb7..cb15c0e4 100644
--- a/runtime/bin/net/ssl.gyp
+++ b/runtime/bin/net/ssl.gyp
@@ -7,7 +7,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file is a modified copy of Chromium's src/net/third_party/nss/ssl.gyp.
-# Revision 257452 (this should agree with "nss_rev" in DEPS).
+# Revision 291806 (this should agree with "nss_rev" in DEPS).
 
 # The following modification was made to make sure we have the same
 # xcode_settings on all configurations (otherwise we can't build with ninja):
diff --git a/runtime/bin/net/zlib.gyp b/runtime/bin/net/zlib.gyp
index 1fffcb2..8aa920d 100644
--- a/runtime/bin/net/zlib.gyp
+++ b/runtime/bin/net/zlib.gyp
@@ -7,7 +7,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 # This file is a modified copy of src/third_party/zlib/zlib.gyp from Chromium.
-# Revision 257452 (this should agree with "nss_rev" in DEPS).
+# Revision 291806 (this should agree with "nss_rev" in DEPS).
 {
   # Added by Dart. All Dart comments refer to the following block or line.
   'includes': [
diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc
index 74848e2..350bc64 100644
--- a/runtime/bin/secure_socket.cc
+++ b/runtime/bin/secure_socket.cc
@@ -942,7 +942,10 @@
     unsigned int len1;
     unsigned int len2;
     memio_Private* secret = memio_GetSecret(filter_);
-    memio_GetWriteParams(secret, &buf1, &len1, &buf2, &len2);
+    int status = memio_GetWriteParams(secret, &buf1, &len1, &buf2, &len2);
+    if (status != 0) {
+      return -1;
+    }
     int bytes_to_send =
         dart::Utils::Minimum(len1, static_cast<unsigned>(length));
     if (bytes_to_send > 0) {
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index 1354300..c6e1fe1 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -181,7 +181,7 @@
 
 int Socket::GetType(intptr_t fd) {
   struct stat64 buf;
-  int result = NO_RETRY_EXPECTED(fstat64(fd, &buf));
+  int result = TEMP_FAILURE_RETRY(fstat64(fd, &buf));
   if (result == -1) return -1;
   if (S_ISCHR(buf.st_mode)) return File::kTerminal;
   if (S_ISFIFO(buf.st_mode)) return File::kPipe;
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/observatory/deployed/web/index.html_bootstrap.dart.js
index b8d37aa5..dfc15cc 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/index.html_bootstrap.dart.js
@@ -157,7 +157,7 @@
 "^":"",
 x:function(a){return void 0},
 uM:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-MZ:function(a){var z,y,x,w
+aN:function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -169,23 +169,23 @@
 if(w==null){y=Object.getPrototypeOf(a)
 if(y==null||y===Object.prototype)return C.Sx
 else return C.vB}return w},
-zG:function(a){var z,y,x,w
-z=$.uv
+e1g:function(a){var z,y,x,w
+z=$.AuW
 if(z==null)return
 y=z
 for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
 if(x.n(a,y[w]))return w}return},
-Xr:function(a){var z,y,x
-z=J.zG(a)
+Dc:function(a){var z,y,x
+z=J.e1g(a)
 if(z==null)return
-y=$.uv
+y=$.AuW
 x=z+1
 if(x>=y.length)return H.e(y,x)
 return y[x]},
-YC:function(a,b){var z,y,x
-z=J.zG(a)
+KE:function(a,b){var z,y,x
+z=J.e1g(a)
 if(z==null)return
-y=$.uv
+y=$.AuW
 x=z+2
 if(x>=y.length)return H.e(y,x)
 return y[x][b]},
@@ -213,7 +213,7 @@
 Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
-gbx:function(a){return C.Ho}},
+gbx:function(a){return C.Bc}},
 iCW:{
 "^":"Ue1;"},
 kdQ:{
@@ -227,7 +227,7 @@
 if(b<0||b>=a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
 return a.splice(b,1)[0]},
-aP:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
+xe:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0||b>a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
 a.splice(b,0,c)},
@@ -238,13 +238,13 @@
 for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
 return!0}return!1},
 uk:function(a,b){H.DQ(a,b)},
-ad:function(a,b){return H.VM(new H.U5(a,b),[H.u3(H.VM(new H.TNQ(),[H.u3(a,0)]),0)])},
-yx:[function(a,b){return H.VM(new H.Fm(a,b),[null,null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
+ad:function(a,b){return H.VM(new H.U5(a,b),[H.u3(H.VM(new H.wb(),[H.u3(a,0)]),0)])},
+lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},30],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kY",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},30],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -252,17 +252,17 @@
 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)},
-eR:function(a,b){return H.c1(a,b,null,H.u3(H.VM(new H.TNQ(),[H.u3(a,0)]),0))},
+eR:function(a,b){return H.c1(a,b,null,H.u3(H.VM(new H.wb(),[H.u3(a,0)]),0))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 aM:function(a,b,c){if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))
 if(b===c)return H.VM([],[H.u3(a,0)])
 return H.VM(a.slice(b,c),[H.u3(a,0)])},
-Yc:function(a,b,c){var z=H.VM(new H.TNQ(),[H.u3(a,0)])
-H.K0(a,b,c)
+Yc:function(a,b,c){var z=H.VM(new H.wb(),[H.u3(a,0)])
+H.xF(a,b,c)
 return H.c1(a,b,c,H.u3(z,0))},
-gtH:function(a){if(a.length>0)return a[0]
+gqG:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -280,7 +280,7 @@
 Jd:function(a){return this.GT(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
 OY:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return H.EHn(a,b,a.length-1)},
+Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
 cn:function(a,b){return this.Pk(a,b,null)},
 tg:function(a,b){var z
 for(z=0;z<a.length;++z)if(J.xC(a[z],b))return!0
@@ -294,7 +294,7 @@
 z.fixed$length=init
 return z}},
 br:function(a){return this.tt(a,!0)},
-Oe:function(a){var z=P.fM(null,null,null,H.u3(a,0))
+zH:function(a){var z=P.Ls(null,null,null,H.u3(a,0))
 z.FV(0,a)
 return z},
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)])},
@@ -330,7 +330,7 @@
 return 1}else return-1},
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
-gx8:function(a){return isFinite(a)},
+gzr:function(a){return isFinite(a)},
 JV:function(a,b){return a%b},
 Vy:function(a){return Math.abs(a)},
 yu:function(a){var z
@@ -346,7 +346,7 @@
 if(z.C(b,0)||z.D(b,20))throw H.b(P.KP(b))
 y=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+y
-return y},"$1","gKy",2,0,14,75],
+return y},"$1","gVz",2,0,14,75],
 WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
 return a.toString(b)},
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
@@ -398,20 +398,20 @@
 return a<=b},
 F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return a>=b},
-gbx:function(a){return C.yT},
-$isFK:true,
+gbx:function(a){return C.WU},
+$islf:true,
 static:{"^":"SAz,N6l"}},
 imn:{
 "^":"P;",
 gbx:function(a){return C.yw},
-$isCP:true,
-$isFK:true,
+$isVf:true,
+$islf:true,
 $isKN:true},
 VA7:{
 "^":"P;",
-gbx:function(a){return C.CR},
-$isCP:true,
-$isFK:true},
+gbx:function(a){return C.cz},
+$isVf:true,
+$islf:true},
 O:{
 "^":"Gv;",
 j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
@@ -460,7 +460,7 @@
 if(J.xZ(c,a.length))throw H.b(P.N(c))
 return a.substring(b,c)},
 yn:function(a,b){return this.Nj(a,b,null)},
-DY:function(a){var z,y,x,w,v
+bS:function(a){var z,y,x,w,v
 z=a.trim()
 y=z.length
 if(y===0)return z
@@ -479,7 +479,7 @@
 b=b>>>1
 if(b===0)break
 z+=z}return y},
-LL:function(a,b,c){var z=b-a.length
+YX:function(a,b,c){var z=b-a.length
 if(z<=0)return a
 return this.U(c,z)+a},
 gNq:function(a){return new J.IA(a)},
@@ -517,7 +517,7 @@
 y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
 y^=y>>11
 return 536870911&y+((16383&y)<<15>>>0)},
-gbx:function(a){return C.Gh},
+gbx:function(a){return C.lY},
 gB:function(a){return a.length},
 t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
@@ -534,10 +534,10 @@
 x=a.charCodeAt(y)
 if(x!==32&&x!==13&&!J.Ga(x))break}return b}}},
 IA:{
-"^":"w2Y;Bx",
-gB:function(a){return this.Bx.length},
+"^":"w2Y;vF",
+gB:function(a){return this.vF.length},
 t:function(a,b){var z,y
-z=this.Bx
+z=this.vF
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 y=J.Wx(b)
 if(y.C(b,0))H.vh(P.N(b))
@@ -545,7 +545,7 @@
 return z.charCodeAt(b)},
 $asw2Y:function(){return[P.KN]},
 $asark:function(){return[P.KN]},
-$asE9h:function(){return[P.KN]},
+$aseD:function(){return[P.KN]},
 $asWO:function(){return[P.KN]},
 $asQV:function(){return[P.KN]}}}],["","",,H,{
 "^":"",
@@ -562,15 +562,15 @@
 z.a=b
 y=b}else y=b
 if(!J.x(y).$isWO)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
-y=new H.O2(0,0,1,null,null,null,null,null,null,null,null,null,a)
+y=new H.dl(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.N8(a)
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
 x=P.L5(null,null,null,P.KN,H.HX)
-w=P.fM(null,null,null,P.KN)
+w=P.Ls(null,null,null,P.KN)
 v=new H.HX(0,null,!1)
-u=new H.aX(y,x,w,new I(),v,new H.iV(H.t4()),new H.iV(H.t4()),!1,!1,[],P.fM(null,null,null,null),null,null,!1,!0,P.fM(null,null,null,null))
+u=new H.aX(y,x,w,new I(),v,new H.kuS(H.rp()),new H.kuS(H.rp()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 w.h(0,0)
 u.ac(0,v)
 init.globalState.Nr=u
@@ -596,21 +596,21 @@
 if(y!=null)return y[1]
 throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
 Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=H.BK(b.data)
+z=H.Ln(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.NO=y.t(z,"id")
 x=y.t(z,"functionName")
 w=x==null?init.globalState.w2:init.globalFunctions[x]()
 v=y.t(z,"args")
-u=H.BK(y.t(z,"msg"))
+u=H.Ln(y.t(z,"msg"))
 t=y.t(z,"isSpawnUri")
 s=y.t(z,"startPaused")
-r=H.BK(y.t(z,"replyTo"))
+r=H.Ln(y.t(z,"replyTo"))
 y=init.globalState.Hg++
 q=P.L5(null,null,null,P.KN,H.HX)
-p=P.fM(null,null,null,P.KN)
+p=P.Ls(null,null,null,P.KN)
 o=new H.HX(0,null,!1)
-n=new H.aX(y,q,p,new I(),o,new H.iV(H.t4()),new H.iV(H.t4()),!1,!1,[],P.fM(null,null,null,null),null,null,!1,!0,P.fM(null,null,null,null))
+n=new H.aX(y,q,p,new I(),o,new H.kuS(H.rp()),new H.kuS(H.rp()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 p.h(0,0)
 n.ac(0,o)
 init.globalState.Xz.Rk.B7(0,new H.IY(n,new H.jl3(w,v,u,t,s,r),"worker-start"))
@@ -621,11 +621,11 @@
 case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
 init.globalState.Xz.bL()
 break
-case"close":init.globalState.XC.Rz(0,$.cz().t(0,a))
+case"close":init.globalState.XC.Rz(0,$.qv().t(0,a))
 a.terminate()
 init.globalState.Xz.bL()
 break
-case"log":H.VLM(y.t(z,"msg"))
+case"log":H.Vj(y.t(z,"msg"))
 break
 case"print":if(init.globalState.EF===!0){y=init.globalState.rj
 q=H.GyL(P.EF(["command","print","msg",z],null,null))
@@ -633,7 +633,7 @@
 self.postMessage(q)}else P.FL(y.t(z,"msg"))
 break
 case"error":throw H.b(y.t(z,"msg"))}},"$2","NBB",4,0,null,1,2],
-VLM:function(a){var z,y,x,w
+Vj:function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.rj
 x=H.GyL(P.EF(["command","log","msg",a],null,null))
 y.toString
@@ -645,20 +645,20 @@
 y=z.jO
 $.z7=$.z7+("_"+y)
 $.Mr=$.Mr+("_"+y)
-y=z.D5
+y=z.er
 x=init.globalState.N0.jO
 w=z.Qy
-J.H4(f,["spawned",new H.VU(y,x),w,z.PX])
+J.H4(f,["spawned",new H.Kg(y,x),w,z.PX])
 x=new H.zX(a,b,c,d,z)
-if(e===!0){z.oz(w,w)
+if(e===!0){z.V0(w,w)
 init.globalState.Xz.Rk.B7(0,new H.IY(z,x,"start isolate"))}else x.$0()},
 GyL:function(a){var z
-if(init.globalState.ji===!0){z=new H.RS(0,new H.cx())
+if(init.globalState.ji===!0){z=new H.RS(0,new H.oV())
 z.dZ=new H.m3(null)
-return z.Zo(a)}else{z=new H.fL(new H.cx())
+return z.h7(a)}else{z=new H.fL(new H.oV())
 z.dZ=new H.m3(null)
-return z.Zo(a)}},
-BK:function(a){if(init.globalState.ji===!0)return new H.hq(null).ug(a)
+return z.h7(a)}},
+Ln:function(a){if(init.globalState.ji===!0)return new H.EU(null).QS(a)
 else return a},
 vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
@@ -670,7 +670,7 @@
 "^":"TpZ:76;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
-O2:{
+dl:{
 "^":"a;Hg,NO,hJ,N0,Nr,Xz,Ws,EF,ji,i2<,rj,XC,w2<",
 N8:function(a){var z,y,x
 z=self.window==null
@@ -681,7 +681,10 @@
 else y=!0
 this.ji=y
 this.Ws=z&&!x
-this.Xz=new H.ae(P.NZ2(null,H.IY),0)
+y=H.IY
+x=H.VM(new P.nd(null,0,0,0),[y])
+x.Eo(null,y)
+this.Xz=new H.ae(x,0)
 this.i2=P.L5(null,null,null,P.KN,H.aX)
 this.XC=P.L5(null,null,null,P.KN,null)
 if(this.EF===!0){z=new H.JH()
@@ -690,8 +693,8 @@
 self.dartPrint=self.dartPrint||function(b){return function(c){if(self.console&&self.console.log){self.console.log(c)}else{self.postMessage(b(c))}}}(H.wI)}},
 static:{wI:[function(a){return H.GyL(P.EF(["command","print","msg",a],null,null))},"$1","UB",2,0,null,0]}},
 aX:{
-"^":"a;jO>,A4,fW,En<,D5<,Qy,PX,xF?,UF<,Vp<,lJ,QC,fB,P0,pa,ir",
-oz:function(a,b){if(!this.Qy.n(0,a))return
+"^":"a;jO>,A4,fW,En<,er<,Qy,PX,xF?,UF<,Vp<,lJ,QC,fB,P0,pa,ir",
+V0:function(a,b){if(!this.Qy.n(0,a))return
 if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
 this.CX()},
 NR:function(a){var z,y,x,w,v,u
@@ -726,19 +729,21 @@
 return}y=new H.NYh(a)
 if(z.n(b,2)){init.globalState.Xz.Rk.B7(0,new H.IY(this,y,"ping"))
 return}z=this.fB
-if(z==null){z=P.NZ2(null,null)
+if(z==null){z=H.VM(new P.nd(null,0,0,0),[null])
+z.Eo(null,null)
 this.fB=z}z.B7(0,y)},
 w1:function(a,b){var z,y
 if(!this.PX.n(0,a))return
 z=J.x(b)
 if(!z.n(b,0))y=z.n(b,1)&&!this.P0
 else y=!0
-if(y){this.Pb()
+if(y){this.Dm()
 return}if(z.n(b,2)){z=init.globalState.Xz
 y=this.gIm()
 z.Rk.B7(0,new H.IY(this,y,"kill"))
 return}z=this.fB
-if(z==null){z=P.NZ2(null,null)
+if(z==null){z=H.VM(new P.nd(null,0,0,0),[null])
+z.Eo(null,null)
 this.fB=z}z.B7(0,this.gIm())},
 hk:function(a,b){var z,y
 z=this.ir
@@ -760,13 +765,13 @@
 x=u
 w=new H.oP(v,null)
 this.hk(x,w)
-if(this.pa===!0){this.Pb()
+if(this.pa===!0){this.Dm()
 if(this===init.globalState.Nr)throw v}}finally{this.P0=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
 if(this.fB!=null)for(;u=this.fB,!u.gl0(u);)this.fB.AR().$0()}return y},"$1","gZ2",2,0,77,78],
 Ds:function(a){var z=J.U6(a)
-switch(z.t(a,0)){case"pause":this.oz(z.t(a,1),z.t(a,2))
+switch(z.t(a,0)){case"pause":this.V0(z.t(a,1),z.t(a,2))
 break
 case"resume":this.NR(z.t(a,1))
 break
@@ -789,17 +794,17 @@
 if(z.NZ(0,a))throw H.b(P.eG("Registry: ports must be registered only once."))
 z.u(0,a,b)},
 CX:function(){if(this.A4.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.i2.u(0,this.jO,this)
-else this.Pb()},
-Pb:[function(){var z,y
+else this.Dm()},
+Dm:[function(){var z,y
 z=this.fB
 if(z!=null)z.V1(0)
-for(z=this.A4,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.Hb),y.Oh),[H.u3(y,0),H.u3(y,1)]);y.G();)y.lo.BG()
+for(z=this.A4,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.Hb),y.Oh),[H.u3(y,0),H.u3(y,1)]);y.G();)y.Ff.BG()
 z.V1(0)
 this.fW.V1(0)
 init.globalState.i2.Rz(0,this.jO)
 this.ir.V1(0)
 z=this.QC
-if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.lo,null)
+if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.Ff,null)
 this.QC=null}},"$0","gIm",0,0,17],
 $isaX:true},
 NYh:{
@@ -808,11 +813,11 @@
 $isEH:true},
 ae:{
 "^":"a;Rk>,kv",
-MK:function(){var z=this.Rk
+mj:function(){var z=this.Rk
 if(z.QN===z.Bq)return
 return z.AR()},
-xB:function(){var z,y,x
-z=this.MK()
+d5:function(){var z,y,x
+z=this.mj()
 if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.NZ(0,init.globalState.Nr.jO)&&init.globalState.Ws===!0&&init.globalState.Nr.A4.X5===0)H.vh(P.eG("Program exited with open ReceivePorts."))
 y=init.globalState
 if(y.EF===!0&&y.i2.X5===0&&y.Xz.kv===0){y=y.rj
@@ -821,7 +826,7 @@
 self.postMessage(x)}return!1}J.R1(z)
 return!0},
 nT:function(){if(self.window!=null)new H.Rm(this).$0()
-else for(;this.xB(););},
+else for(;this.d5(););},
 bL:function(){var z,y,x,w,v
 if(init.globalState.EF!==!0)this.nT()
 else try{this.nT()}catch(x){w=H.Ru(x)
@@ -833,7 +838,7 @@
 self.postMessage(v)}}},
 Rm:{
 "^":"TpZ:17;a",
-$0:[function(){if(!this.a.xB())return
+$0:[function(){if(!this.a.d5())return
 P.cH(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
@@ -862,9 +867,9 @@
 $isEH:true},
 Iy4:{
 "^":"a;",
-$isRZ:true,
-$isXY:true},
-VU:{
+$ispW:true,
+$ishq:true},
+Kg:{
 "^":"Iy4;kx,AJ",
 wR:function(a,b){var z,y,x,w,v
 z={}
@@ -876,22 +881,22 @@
 v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
 z.a=b
 if(v)z.a=H.GyL(b)
-if(x.gD5()===w){x.Ds(z.a)
+if(x.ger()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.B7(0,new H.IY(x,new H.cR(z,this,v),w))},
+y.Rk.B7(0,new H.IY(x,new H.Ua(z,this,v),w))},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isVU&&J.xC(this.kx,b.kx)},
-giO:function(a){return J.dv(this.kx)},
-$isVU:true,
-$isRZ:true,
-$isXY:true},
-cR:{
+return!!J.x(b).$isKg&&J.xC(this.kx,b.kx)},
+giO:function(a){return J.Rr(this.kx)},
+$isKg:true,
+$ispW:true,
+$ishq:true},
+Ua:{
 "^":"TpZ:76;a,b,c",
 $0:[function(){var z,y
 z=this.b.kx
 if(!z.geL()){if(this.c){y=this.a
-y.a=H.BK(y.a)}J.pq(z,this.a.a)}},"$0",null,0,0,null,"call"],
+y.a=H.Ln(y.a)}J.Pc(z,this.a.a)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 bM:{
 "^":"Iy4;Bi,ma,AJ",
@@ -903,16 +908,16 @@
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isbM&&J.xC(this.Bi,b.Bi)&&J.xC(this.AJ,b.AJ)&&J.xC(this.ma,b.ma)},
 giO:function(a){var z,y,x
-z=J.lf(this.Bi,16)
-y=J.lf(this.AJ,8)
+z=J.Eh(this.Bi,16)
+y=J.Eh(this.AJ,8)
 x=this.ma
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
 $isbM:true,
-$isRZ:true,
-$isXY:true},
+$ispW:true,
+$ishq:true},
 HX:{
-"^":"a;UL>,Oy,eL<",
+"^":"a;a7>,Oy,eL<",
 mY:function(a){return this.Oy.$1(a)},
 BG:function(){this.eL=!0
 this.Oy=null},
@@ -921,29 +926,29 @@
 this.eL=!0
 this.Oy=null
 z=init.globalState.N0
-y=this.UL
+y=this.a7
 z.A4.Rz(0,y)
 z.fW.Rz(0,y)
 z.CX()},
 yU:function(a,b){if(this.eL)return
 this.mY(b)},
 $isHX:true,
-static:{"^":"v0"}},
+static:{"^":"tye"}},
 RS:{
-"^":"jP1;uP,dZ",
-DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.NO,a.AJ,J.dv(a.kx)]
+"^":"hz;uP,dZ",
+DE:function(a){if(!!a.$isKg)return["sendport",init.globalState.NO,a.AJ,J.Rr(a.kx)]
 if(!!a.$isbM)return["sendport",a.Bi,a.AJ,a.ma]
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return["capability",a.UL]
+yf:function(a){if(!!a.$iskuS)return["capability",a.a7]
 throw H.b("Capability not serializable: "+a.bu(0))}},
 fL:{
 "^":"ooy;dZ",
-DE:function(a){if(!!a.$isVU)return new H.VU(a.kx,a.AJ)
+DE:function(a){if(!!a.$isKg)return new H.Kg(a.kx,a.AJ)
 if(!!a.$isbM)return new H.bM(a.Bi,a.ma,a.AJ)
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return new H.iV(a.UL)
+yf:function(a){if(!!a.$iskuS)return new H.kuS(a.a7)
 throw H.b("Capability not serializable: "+a.bu(0))}},
-hq:{
+EU:{
 "^":"fPc;Bw",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
@@ -954,19 +959,19 @@
 if(v==null)return
 u=v.hV(w)
 if(u==null)return
-return new H.VU(u,x)}else return new H.bM(y,w,x)},
-Op:function(a){return new H.iV(J.UQ(a,1))}},
+return new H.Kg(u,x)}else return new H.bM(y,w,x)},
+Op:function(a){return new H.kuS(J.UQ(a,1))}},
 m3:{
-"^":"a;Vz",
+"^":"a;At",
 t:function(a,b){return b.__MessageTraverser__attached_info__},
-u:function(a,b,c){this.Vz.push(b)
+u:function(a,b,c){this.At.push(b)
 b.__MessageTraverser__attached_info__=c},
-CH:function(a){this.Vz=[]},
+CH:function(a){this.At=[]},
 F4:function(){var z,y,x
-for(z=this.Vz.length,y=0;y<z;++y){x=this.Vz
+for(z=this.At.length,y=0;y<z;++y){x=this.At
 if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.Vz=null}},
-cx:{
+x[y].__MessageTraverser__attached_info__=null}this.At=null}},
+oV:{
 "^":"a;",
 t:function(a,b){return},
 u:function(a,b,c){},
@@ -974,18 +979,18 @@
 F4:function(){}},
 HU5:{
 "^":"a;",
-Zo:function(a){var z
+h7:function(a){var z
 if(H.vM(a))return this.Wp(a)
 this.dZ.CH(0)
 z=null
-try{z=this.GP(a)}finally{this.dZ.F4()}return z},
-GP:function(a){var z
+try{z=this.B3(a)}finally{this.dZ.F4()}return z},
+B3:function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Wp(a)
 z=J.x(a)
 if(!!z.$isWO)return this.wb(a)
-if(!!z.$isT8)return this.pi(a)
-if(!!z.$isRZ)return this.DE(a)
-if(!!z.$isXY)return this.yf(a)
+if(!!z.$isT8)return this.TI(a)
+if(!!z.$ispW)return this.DE(a)
+if(!!z.$ishq)return this.yf(a)
 return this.N1(a)},
 N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 ooy:{
@@ -999,9 +1004,9 @@
 z=Array(x)
 z.fixed$length=init
 this.dZ.u(0,a,z)
-for(w=0;w<x;++w)z[w]=this.GP(y.t(a,w))
+for(w=0;w<x;++w)z[w]=this.B3(y.t(a,w))
 return z},
-pi:function(a){var z,y
+TI:function(a){var z,y
 z={}
 y=this.dZ.t(0,a)
 z.a=y
@@ -1016,9 +1021,9 @@
 RK:{
 "^":"TpZ:81;a,b",
 $2:[function(a,b){var z=this.b
-J.qQ(this.a.a,z.GP(a),z.GP(b))},"$2",null,4,0,null,79,80,"call"],
+J.kW(this.a.a,z.B3(a),z.B3(b))},"$2",null,4,0,null,79,80,"call"],
 $isEH:true},
-jP1:{
+hz:{
 "^":"HU5;",
 Wp:function(a){return a},
 wb:function(a){var z,y
@@ -1027,26 +1032,26 @@
 y=this.uP++
 this.dZ.u(0,a,y)
 return["list",y,this.IP(a)]},
-pi:function(a){var z,y,x
+TI:function(a){var z,y,x
 z=this.dZ.t(0,a)
 if(z!=null)return["ref",z]
 y=this.uP++
 this.dZ.u(0,a,y)
 x=J.RE(a)
-return["map",y,this.IP(J.qA(x.gvc(a))),this.IP(J.qA(x.gUQ(a)))]},
+return["map",y,this.IP(J.Nd(x.gvc(a))),this.IP(J.Nd(x.gUQ(a)))]},
 IP:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
 x=[]
 C.Nm.sB(x,y)
-for(w=0;w<y;++w){v=this.GP(z.t(a,w))
+for(w=0;w<y;++w){v=this.B3(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
 x[w]=v}return x},
 DE:function(a){return H.vh(P.nO(null))},
 yf:function(a){return H.vh(P.nO(null))}},
 fPc:{
 "^":"a;",
-ug:function(a){if(H.ZR(a))return a
+QS:function(a){if(H.ZR(a))return a
 this.Bw=P.YM(null,null,null,null,null)
 return this.H6(a)},
 H6:function(a){var z,y
@@ -1086,12 +1091,12 @@
 return z},
 fp:function(a){throw H.b("Unexpected serialized object")}},
 Oe:{
-"^":"a;zY,TD,Iw",
+"^":"a;bf,TD,Iw",
 Gv:function(){if(self.setTimeout!=null){if(this.TD)throw H.b(P.f("Timer in event loop cannot be canceled."))
 if(this.Iw==null)return
 H.cv()
 var z=this.Iw
-if(this.zY)self.clearTimeout(z)
+if(this.bf)self.clearTimeout(z)
 else self.clearInterval(z)
 this.Iw=null}else throw H.b(P.f("Canceling a timer."))},
 WI:function(a,b){if(self.setTimeout!=null){++init.globalState.Xz.kv
@@ -1107,7 +1112,7 @@
 this.Iw=self.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))},
 static:{cy:function(a,b){var z=new H.Oe(!0,!1,null)
 z.Qa(a,b)
-return z},jW:function(a,b){var z=new H.Oe(!1,!1,null)
+return z},zw:function(a,b){var z=new H.Oe(!1,!1,null)
 z.WI(a,b)
 return z}}},
 Av:{
@@ -1125,10 +1130,10 @@
 "^":"TpZ:76;a,b",
 $0:[function(){this.b.$1(this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
-iV:{
-"^":"a;UL>",
+kuS:{
+"^":"a;a7>",
 giO:function(a){var z,y,x
-z=this.UL
+z=this.a7
 y=J.Wx(z)
 x=y.m(z,0)
 y=y.Z(z,4294967296)
@@ -1141,11 +1146,11 @@
 n:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-if(!!J.x(b).$isiV){z=this.UL
-y=b.UL
+if(!!J.x(b).$iskuS){z=this.a7
+y=b.a7
 return z==null?y==null:z===y}return!1},
-$isiV:true,
-$isXY:true}}],["","",,H,{
+$iskuS:true,
+$ishq:true}}],["","",,H,{
 "^":"",
 Gp:function(a,b){var z
 if(b!=null){z=b.x
@@ -1161,9 +1166,9 @@
 eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-nN:[function(a){throw H.b(P.rr(a,null,null))},"$1","UR",2,0,3],
+rj:[function(a){throw H.b(P.cD(a,null,null))},"$1","kk",2,0,3],
 BU:function(a,b,c){var z,y,x,w,v,u
-if(c==null)c=H.UR()
+if(c==null)c=H.kk()
 if(typeof a!=="string")H.vh(P.u(a))
 z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
 if(b==null){if(z!=null){y=z.length
@@ -1190,10 +1195,10 @@
 return parseInt(a,b)},
 RR:function(a,b){var z,y
 if(typeof a!=="string")H.vh(P.u(a))
-if(b==null)b=H.UR()
+if(b==null)b=H.kk()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
-if(isNaN(z)){y=J.iY(a)
+if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
 return b.$1(a)}return z},
 lh:function(a){var z,y
@@ -1203,7 +1208,7 @@
 return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
 a5:function(a){return"Instance of '"+H.lh(a)+"'"},
 Qn:[function(){return Date.now()},"$0","EY",0,0,4],
-w4:function(){var z,y
+Xe:function(){var z,y
 if($.xG!=null)return
 $.xG=1000
 $.hG=H.EY()
@@ -1226,13 +1231,13 @@
 z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.u3(a,0)]
-for(;y.G();){x=y.lo
+for(;y.G();){x=y.Ff
 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.wG(x-65536,10)&1023))
 z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
-LY:function(a){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
+eT:function(a){var z,y
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.Ff
 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.RF(a)},
@@ -1261,7 +1266,7 @@
 KL:function(a){return a.aL?H.o2(a).getUTCHours()+0:H.o2(a).getHours()+0},
 ch:function(a){return a.aL?H.o2(a).getUTCMinutes()+0:H.o2(a).getMinutes()+0},
 Sw:function(a){return a.aL?H.o2(a).getUTCSeconds()+0:H.o2(a).getSeconds()+0},
-of:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+vA:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 return a[b]},
 wV:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 a[b]=c},
@@ -1306,7 +1311,7 @@
 if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.tM})
 z.name=""}else z.toString=H.tM
 return z},
-tM:[function(){return J.AG(this.dartException)},"$0","nR",0,0,null],
+tM:[function(){return J.AG(this.dartException)},"$0","p3",0,0,null],
 vh:function(a){throw H.b(a)},
 Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=new H.Hk(a)
@@ -1320,11 +1325,11 @@
 if((C.jn.wG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.T3(H.d(y)+" (Error "+w+")",null))
 case 445:case 5007:v=H.d(y)+" (Error "+w+")"
 return z.$1(new H.W0(v,null))}}if(a instanceof TypeError){v=$.WD()
-u=$.bN()
+u=$.Up()
 t=$.PH()
 s=$.D1()
 r=$.BN()
-q=$.Y9()
+q=$.Kr()
 p=$.W6()
 $.PB()
 o=$.eA()
@@ -1407,22 +1412,22 @@
 case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
 default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
 CW:function(a,b,c){var z,y,x,w,v,u
-if(c)return H.na(a,b)
+if(c)return H.Kv(a,b)
 z=b.$stubName
 y=b.length
 x=a[z]
 w=b==null?x==null:b===x
 if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
-if(y===0){w=$.bf
-if(w==null){w=H.Iq("self")
-$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+if(y===0){w=$.mJs
+if(w==null){w=H.B3("self")
+$.mJs=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
 v=$.OK
 $.OK=J.WB(v,1)
 return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
 w="return function("+u+"){return this."
-v=$.bf
-if(v==null){v=H.Iq("self")
-$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+v=$.mJs
+if(v==null){v=H.B3("self")
+$.mJs=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
 $.OK=J.WB(w,1)
 return new Function(v+H.d(w)+"}")()},
@@ -1439,10 +1444,10 @@
 default:return function(e,f,g,h){return function(){h=[g(this)]
 Array.prototype.push.apply(h,arguments)
 return e.apply(f(this),h)}}(d,z,y)}},
-na:function(a,b){var z,y,x,w,v,u,t,s
+Kv:function(a,b){var z,y,x,w,v,u,t,s
 z=H.bO()
 y=$.P4
-if(y==null){y=H.Iq("receiver")
+if(y==null){y=H.B3("receiver")
 $.P4=y}x=b.$stubName
 w=b.length
 v=typeof dart_precompiled=="function"
@@ -1470,16 +1475,16 @@
 eQK:function(a){throw H.b(P.mE("Cyclic initialization for static "+H.d(a)))},
 KT:function(a,b,c){return new H.GN(a,b,c,null)},
 Ogz:function(a,b){var z=a.name
-if(b==null||b.length===0)return new H.Fp(z)
+if(b==null||b.length===0)return new H.tu(z)
 return new H.KEA(z,b,null)},
 G3:function(){return C.Kn},
-t4:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
+rp:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
 Kxv:function(a){return new H.cu(a,null)},
 VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
 return a},
 oX:function(a){if(a==null)return
 return a.$builtinTypeInfo},
-IM:function(a,b){return H.Z9(a["$as"+H.d(b)],H.oX(a))},
+IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
 W8:function(a,b,c){var z=H.IM(a,b)
 return z==null?null:z[c]},
 u3:function(a,b){var z=H.oX(a)
@@ -1501,7 +1506,7 @@
 wO:function(a){var z=J.x(a).constructor.builtin$cls
 if(a==null)return z
 return z+H.ia(a.$builtinTypeInfo,0,null)},
-Z9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+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},
@@ -1510,7 +1515,7 @@
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Z9(y[d],z),c)},
+return H.hv(H.Y9(y[d],z),c)},
 hv:function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
@@ -1542,7 +1547,7 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Z9(t,y),w)},
+return H.hv(H.Y9(t,y),w)},
 Hc:function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
@@ -1684,8 +1689,7 @@
 z.KF(c)
 for(x=0;x<y;++x){w=a[x]
 w=z.IN+=w
-z.IN=w+c}w=z.IN
-return w.charCodeAt(0)==0?w:w}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
+z.IN=w+c}return z.IN}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
 ysD:{
 "^":"a;",
 gl0:function(a){return J.xC(this.gB(this),0)},
@@ -1710,18 +1714,18 @@
 z=this.md
 for(y=0;y<z.length;++y){x=z[y]
 b.$2(x,this.Uf(x))}},
-gvc:function(a){return H.VM(new H.dZ(this),[H.u3(this,0)])},
+gvc:function(a){return H.VM(new H.Ns(this),[H.u3(this,0)])},
 gUQ:function(a){return H.K1(this.md,new H.hY(this),H.u3(this,0),H.u3(this,1))},
 $isyN:true},
 hY:{
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.Uf(a)},"$1",null,2,0,null,79,"call"],
 $isEH:true},
-dZ:{
+Ns:{
 "^":"mW;Nt",
 gA:function(a){return J.mY(this.Nt.md)}},
 LI:{
-"^":"a;r9,yV,Jt,TX,Y2,Ok",
+"^":"a;r9,yl,Jt,TX,Y2,Ok",
 gWa:function(){return this.r9},
 gUA:function(){return this.Jt===0},
 gnd:function(){var z,y,x,w
@@ -1749,7 +1753,7 @@
 v.u(0,new H.tx(t),x[s])}return v},
 static:{"^":"hAw,eHF,De4"}},
 FD:{
-"^":"a;mr,Rn>,xm,Rv,hG,Mo,AM,NE",
+"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
 XL:function(a){var z=this.Rn[a+this.hG+3]
 return init.metadata[z]},
 BX:function(a,b){var z=this.Rv
@@ -1827,7 +1831,7 @@
 x=this.lT
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,xq,Re,fN,GK,rZ,BX,tt,dt,Ai",cM:function(a){var z,y,x,w,v,u
+static:{"^":"lm,k1,Re,fN,GK,rZ,BX,tt,dt,Ai",cM: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)
 if(z==null)z=[]
@@ -1907,7 +1911,7 @@
 Bp:{
 "^":"TpZ;"},
 v:{
-"^":"Bp;tx,J6,lT,N7",
+"^":"Bp;tx,J6,lT,JL",
 n:function(a,b){if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isv)return!1
@@ -1918,9 +1922,9 @@
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.J6))},
 $isv:true,
-static:{"^":"bf,P4",DVi:function(a){return a.tx},HY:function(a){return a.lT},bO:function(){var z=$.bf
-if(z==null){z=H.Iq("self")
-$.bf=z}return z},Iq:function(a){var z,y,x,w,v
+static:{"^":"mJs,P4",DVi:function(a){return a.tx},HY:function(a){return a.lT},bO:function(){var z=$.mJs
+if(z==null){z=H.B3("self")
+$.mJs=z}return z},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
@@ -1932,10 +1936,10 @@
 bu:[function(a){return this.G1},"$0","gCR",0,0,73],
 $isXS:true,
 static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
-rg:{
+bb:{
 "^":"XS;G1>",
 bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gCR",0,0,73],
-static:{S3:function(a){return new H.rg(a)}}},
+static:{S3:function(a){return new H.bb(a)}}},
 lbp:{
 "^":"a;"},
 GN:{
@@ -1984,7 +1988,7 @@
 bu:[function(a){return"dynamic"},"$0","gCR",0,0,73],
 za:function(){return},
 $isi6:true},
-Fp:{
+tu:{
 "^":"lbp;oc>",
 za:function(){var z,y
 z=this.oc
@@ -2001,7 +2005,7 @@
 y=[init.allClasses[z]]
 if(0>=y.length)return H.e(y,0)
 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.u3(z,0)]);z.G();)y.push(z.lo.za())
+for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)y.push(z.Ff.za())
 this.Et=y
 return y},
 bu:[function(a){return H.d(this.oc)+"<"+J.ZG(this.re,", ")+">"},"$0","gCR",0,0,73]},
@@ -2035,13 +2039,13 @@
 gHc:function(){var z=this.HN
 if(z!=null)return z
 z=this.Yr
-z=H.Vq(this.zO,z.multiline,!z.ignoreCase,!0)
+z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
 this.HN=z
 return z},
 gIa:function(){var z=this.mV
 if(z!=null)return z
 z=this.Yr
-z=H.Vq(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
+z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
 this.mV=z
 return z},
 ik:function(a){var z
@@ -2051,7 +2055,7 @@
 return H.yx(this,z)},
 B0:function(a){if(typeof a!=="string")H.vh(P.u(a))
 return this.Yr.test(a)},
-ii:function(a){var z,y
+e5:function(a){var z,y
 z=this.ik(a)
 if(z!=null){y=z.pX
 if(0>=y.length)return H.e(y,0)
@@ -2085,14 +2089,14 @@
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 $iswL:true,
-static:{Vq:function(a,b,c,d){var z,y,x,w,v
+static:{v4:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
 x=d?"g":""
 w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.rr("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
 EK:{
 "^":"a;zO,pX",
 t:function(a,b){var z=this.pX
@@ -2104,17 +2108,17 @@
 z.fw(a,b)
 return z}}},
 KW:{
-"^":"mW;ve,vF,wQ",
-gA:function(a){return new H.Pb(this.ve,this.vF,this.wQ,null)},
+"^":"mW;ve,BZ,wQ",
+gA:function(a){return new H.Pb(this.ve,this.BZ,this.wQ,null)},
 $asmW:function(){return[P.Od]},
 $asQV:function(){return[P.Od]}},
 Pb:{
-"^":"a;UW,vF,XB,Jz",
+"^":"a;UW,BZ,Ij,Jz",
 gl:function(){return this.Jz},
 G:function(){var z,y,x,w,v
-z=this.vF
+z=this.BZ
 if(z==null)return!1
-y=this.XB
+y=this.Ij
 if(y<=z.length){x=this.UW.UZ(z,y)
 if(x!=null){this.Jz=x
 z=x.pX
@@ -2123,9 +2127,9 @@
 w=J.q8(z[0])
 if(typeof w!=="number")return H.s(w)
 v=y+w
-this.XB=z.index===v?v+1:v
+this.Ij=z.index===v?v+1:v
 return!0}}this.Jz=null
-this.vF=null
+this.BZ=null
 return!1}},
 Vo:{
 "^":"a;M,f1,zO",
@@ -2134,7 +2138,7 @@
 $isOd:true}}],["","",,X,{
 "^":"",
 hV:{
-"^":"LPc;IF,Qw,cw,yQ,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"LPc;IF,Qw,cw,oX,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gO9:function(a){return a.IF},
 sO9:function(a,b){a.IF=this.ct(a,C.S4,a.IF,b)},
 gFR:function(a){return a.Qw},
@@ -2143,12 +2147,12 @@
 sFR:function(a,b){a.Qw=this.ct(a,C.AV,a.Qw,b)},
 gph:function(a){return a.cw},
 sph:function(a,b){a.cw=this.ct(a,C.hf,a.cw,b)},
-gih:function(a){return a.yQ},
-sih:function(a,b){a.yQ=this.ct(a,C.mJ,a.yQ,b)},
+gih:function(a){return a.oX},
+sih:function(a,b){a.oX=this.ct(a,C.mJ,a.oX,b)},
 pp:[function(a,b,c,d){var z=a.IF
 if(z===!0)return
 if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
-this.LY(a,null).wM(new X.IB(a))}},"$3","gMN",6,0,84,49,50,85],
+this.LY(a,null).wM(new X.jE(a))}},"$3","gYi",6,0,84,49,50,85],
 static:{zy:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -2158,8 +2162,8 @@
 a.IF=!1
 a.Qw=null
 a.cw="action"
-a.yQ=null
-a.Iy=[]
+a.oX=null
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -2172,10 +2176,10 @@
 LPc:{
 "^":"xc+Pi;",
 $isd3:true},
-IB:{
+jE:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
+z.IF=J.NB(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["","",,G,{
 "^":"",
 m7:[function(a){var z
@@ -2183,23 +2187,23 @@
 z=J.UQ(J.UQ($.Xw(),"google"),"visualization")
 $.BY=z
 return z},"$1","vN",2,0,12,13],
-DU:function(a){var z=$.Vy().getItem(a)
+DUC:function(a){var z=$.Vy().getItem(a)
 if(z==null)return
-return C.xr.kV(z)},
-QX:function(a){if(a==null)return P.t5(null,null,null)
-return W.Kz("/crdptargets/"+H.d(P.Mp(C.yD,a,C.xM,!1)),null,null).ml(new G.KF()).OA(new G.XN())},
-dj:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"},
+return C.xr.iQ(z)},
+n8:function(a){if(a==null)return P.pz(null,null,null)
+return W.Og("/crdptargets/"+P.jW(C.Fa,a,C.xM,!1),null,null).ml(new G.KF()).OA(new G.XN())},
+G0:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"},
 o1:function(a,b){var z
 for(z="";b>1;){--b
 if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
-le:[function(a){var z,y,x
+avE:[function(a){var z,y,x
 z=J.Wx(a)
 if(z.C(a,1000))return z.bu(a)
 y=z.Y(a,1000)
 a=z.Z(a,1000)
 x=G.o1(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.o1(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","nI",2,0,14],
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","OA",2,0,14],
 J8:function(a){var z,y,x,w
 z=C.CD.yu(C.CD.RE(a*1000))
 y=C.jn.BU(z,3600000)
@@ -2210,15 +2214,15 @@
 z=C.jn.Y(z,1000)
 if(y>0)return G.o1(y,2)+":"+G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)
 else return G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)},
-XzS:[function(a){var z=J.Wx(a)
+Xz:[function(a){var z=J.Wx(a)
 if(z.C(a,1024))return H.d(a)+"B"
 else if(z.C(a,1048576))return C.CD.Sy(z.V(a,1024),1)+"KB"
 else if(z.C(a,1073741824))return C.CD.Sy(z.V(a,1048576),1)+"MB"
 else if(z.C(a,1099511627776))return C.CD.Sy(z.V(a,1073741824),1)+"GB"
-else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","RC",2,0,14,15],
-mGl:function(a){var z,y,x,w
+else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","Gt",2,0,14,15],
+M5:function(a){var z,y,x,w
 if(a==null)return"-"
-z=J.NQ(J.vX(a,1000))
+z=J.Dv(J.vX(a,1000))
 y=C.jn.BU(z,3600000)
 z=C.jn.Y(z,3600000)
 x=C.jn.BU(z,60000)
@@ -2228,34 +2232,34 @@
 if(x!==0)return""+x+"m "+w+"s"
 return""+w+"s"},
 mL:{
-"^":"Pi;k5,Ef,Z6,Nv,m2<,bn,HJ,Pv,cC,Vg,ij",
+"^":"Pi;wc,fN,Z6,Nv,m2<,bn,HJ,Pv,cC,Vg,fn",
 gwv:function(a){return this.Nv},
 swv:function(a,b){var z,y
 if(J.xC(this.Nv,b))return
-if(this.Nv!=null){J.U2(this.cC)
-J.tw(this.Nv)}if(b!=null){N.QM("").To("Registering new VM callbacks")
-b.gEH().ml(this.gEX())
+if(this.Nv!=null){J.Z8(this.cC)
+J.of(this.Nv)}if(b!=null){N.QM("").To("Registering new VM callbacks")
+b.gEH().ml(this.gAQ())
 z=J.RE(b)
 z.giG(b).ml(this.gm6())
 y=b.gG2()
-H.VM(new P.rk(y),[H.u3(y,0)]).yI(this.gbf())
-J.HL(z.gRk(b)).yI(this.gfF())
+H.VM(new P.Ik(y),[H.u3(y,0)]).yI(this.gtb())
+J.Sr(z.gRk(b)).yI(this.gR7())
 z=b.gLi()
-H.VM(new P.rk(z),[H.u3(z,0)]).yI(this.geO())}this.Nv=b},
+H.VM(new P.Ik(z),[H.u3(z,0)]).yI(this.geO())}this.Nv=b},
 gvK:function(){return this.cC},
 svK:function(a){this.cC=F.Wi(this,C.c6,this.cC,a)},
-of:function(a){var z,y
+KO:function(a){var z,y
 $.Kh=this
-z=this.k5
+z=this.wc
 z.push(new G.t9(this,null,null,null,null))
 z.push(new G.ki(this,null,null,null,null))
-z.push(new G.lO(this,null,null,null,null))
-z.push(G.b2(this))
+z.push(new G.Sy(this,null,null,null,null))
+z.push(G.Gi(this))
 z.push(new G.by(this,null,null,null,null))
 z=this.Z6
 z.By=this
-y=H.VM(new W.vG(window,"popstate",!1),[null])
-H.VM(new W.Ov(0,y.bi,y.fA,W.Yt(z.gTk()),y.el),[H.u3(y,0)]).DN()
+y=H.VM(new W.RO(window,C.yf.fA,!1),[null])
+H.VM(new W.Ov(0,y.bi,y.fA,W.Yt(z.gnt()),y.el),[H.u3(y,0)]).DN()
 z.VA()},
 pZ:function(a){J.Ei(this.cC,new G.xE(a,new G.cE()))},
 rG:[function(a){var z=J.RE(a)
@@ -2265,28 +2269,28 @@
 case"BreakpointResolved":z.god(a).Xb()
 break
 case"BreakpointReached":case"IsolateInterrupted":case"ExceptionThrown":this.pZ(z.god(a))
-J.dH(this.cC,a)
+J.bi(this.cC,a)
 break
 case"GC":break
-default:N.QM("").YX("Unrecognized event: "+H.d(a))
-break}},"$1","gfF",2,0,86,87],
+default:N.QM("").hh("Unrecognized event: "+H.d(a))
+break}},"$1","gR7",2,0,86,87],
 kj:[function(a){this.Pv=a
-this.aX("error/",null)},"$1","gbf",2,0,88,23],
+this.aX("error/",null)},"$1","gtb",2,0,88,23],
 m0:[function(a){this.Pv=a
 if(J.xC(J.Iz(a),"NetworkException"))this.Z6.bo(0,"#/vm-connect/")
 else this.aX("error/",null)},"$1","geO",2,0,89,90],
 aX:function(a,b){var z,y,x,w,v,u
-z=b==null?P.Fl(null,null):P.WX(b,C.xM)
+z=b==null?P.Fl(null,null):P.Ms(b,C.xM)
 y=J.U6(z)
 if(y.t(z,"trace")!=null){x=y.t(z,"trace")
 y=J.x(x)
-if(y.n(x,"on")){if($.hm==null)$.hm=Z.JQ()}else if(y.n(x,"off")){y=$.hm
+if(y.n(x,"on")){if($.ax==null)$.ax=Z.JQ()}else if(y.n(x,"off")){y=$.ax
 if(y!=null){y.RV.Gv()
-$.hm=null}}}y=$.hm
+$.ax=null}}}y=$.ax
 if(y!=null){y.NP.CH(0)
-J.U2(y.Rk)}y=this.HJ
-if(y!=null)J.La(y,$.hm)
-for(y=this.k5,w=0;w<y.length;++w){v=y[w]
+J.Z8(y.Rk)}y=this.HJ
+if(y!=null)J.La(y,$.ax)
+for(y=this.wc,w=0;w<y.length;++w){v=y[w]
 if(v.VU(a)){this.yN(v)
 y=R.tB(z)
 u=v.fz
@@ -2296,43 +2300,43 @@
 v.Q0(a)
 return}}throw H.b(P.a9())},
 yN:function(a){var z,y,x,w
-if(J.xC(this.Ef,a))return
-if(this.Ef!=null){N.QM("").To("Uninstalling page: "+H.d(this.Ef))
-this.Ef.oV()
+if(J.xC(this.fN,a))return
+if(this.fN!=null){N.QM("").To("Uninstalling page: "+H.d(this.fN))
+this.fN.oV()
 J.Wf(this.bn)}N.QM("").To("Installing page: "+H.d(a))
-try{a.ci()}catch(y){x=H.Ru(y)
+try{a.ak()}catch(y){x=H.Ru(y)
 z=x
-N.QM("").YX("Failed to install page: "+H.d(z))}x=this.bn
+N.QM("").hh("Failed to install page: "+H.d(z))}x=this.bn
 x.appendChild(a.gyF())
 w=W.r3("trace-view",null)
 this.HJ=w
-J.La(w,$.hm)
+J.La(w,$.ax)
 x.appendChild(this.HJ)
 x=a
-w=this.Ef
+w=this.fN
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.RG,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Ef=x},
-vW:function(){J.Ei(this.cC,new G.cw())},
+this.nq(this,w)}this.fN=x},
+vW:function(){J.Ei(this.cC,new G.z5())},
 rY:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)
-this.vW()},"$1","gEX",2,0,91,92],
+this.vW()},"$1","gAQ",2,0,91,92],
 T0:[function(a){var z,y
 if(!J.xC(this.Nv,a))return
 this.swv(0,null)
 z=this.cC
 y=new D.Mk(null,null,null,null,null,null,null,null,null,null,!1,null,null,null,null,null)
 y.eq=F.Wi(y,C.qR,null,"VMDisconnected")
-J.dH(z,y)},"$1","gm6",2,0,91,92],
+J.bi(z,y)},"$1","gm6",2,0,91,92],
 Ty:function(a){var z=this.m2.TY
-z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.Z8),P.L5(null,null,null,P.qU,L.Z8),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 this.swv(0,z)
-this.of(!1)},
-E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A5),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+this.KO(!1)},
+E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A0),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.ZH()
 this.swv(0,z)
-this.of(!0)},
+this.KO(!0)},
 static:{"^":"Kh<"}},
 cE:{
 "^":"TpZ:93;",
@@ -2341,22 +2345,22 @@
 $isEH:true},
 xE:{
 "^":"TpZ:12;a,b",
-$1:[function(a){return J.xC(J.wg(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,94,"call"],
+$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,94,"call"],
 $isEH:true},
-cw:{
+z5:{
 "^":"TpZ:12;",
-$1:[function(a){return J.xC(J.iiZ(a),"VMDisconnected")},"$1",null,2,0,null,94,"call"],
+$1:[function(a){return J.xC(J.Ts(a),"VMDisconnected")},"$1",null,2,0,null,94,"call"],
 $isEH:true},
-eM:{
+Kf:{
 "^":"a;Yb",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gvp:function(a){return this.Yb.nQ("getNumberOfRows")},
 Ai:function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
-QS:function(a,b){var z=[]
+Id:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
 this.Yb.V7("addRow",[H.VM(new P.GD(z),[null])])}},
-qu:{
+yD:{
 "^":"a;vR,bG",
 Am:function(a,b){var z=P.jT(this.bG)
 this.vR.V7("draw",[b.Yb,z])}},
@@ -2381,94 +2385,94 @@
 Cz:function(a,b,c){var z,y,x
 z=J.Vs(c).dA.getAttribute("href")
 y=J.RE(a)
-x=y.gAy(a)
+x=y.gEV(a)
 if(typeof x!=="number")return x.D()
-if(x>0||y.gNl(a)===!0||y.gTu(a)===!0||y.gkA(a)===!0||y.gw4(a)===!0)return
+if(x>0||y.gNl(a)===!0||y.gEX(a)===!0||y.gqx(a)===!0||y.gYK(a)===!0)return
 this.bo(0,z)
-y.TI(a)}},
-OR:{
-"^":"yVe;Zz,By,BE,ro,XY,iS",
+y.e6(a)}},
+ng:{
+"^":"yVe;Zz,By,BE,ro,XY,cU",
 VA:function(){var z=H.d(window.location.hash)
 if(window.location.hash===""||window.location.hash==="#")z="#"+this.Zz
 window.history.pushState(z,document.title,z)
 this.UJ(window.location.hash)},
-fH:[function(a){this.UJ(window.location.hash)},"$1","gTk",2,0,95,13],
+fH:[function(a){this.UJ(window.location.hash)},"$1","gnt",2,0,95,13],
 wa:function(a){return"#"+H.d(a)}},
-MQ:{
+OS:{
 "^":"Pi;i6>,yF<",
 gFL:function(a){return this.yF},
 sFL:function(a,b){this.yF=F.Wi(this,C.GP,this.yF,b)},
 gl6:function(a){return this.fz},
 sl6:function(a,b){this.fz=F.Wi(this,C.Zg,this.fz,b)},
 oV:function(){this.yF=F.Wi(this,C.GP,this.yF,null)},
-$isMQ:true},
+$isOS:true},
 by:{
-"^":"MQ;i6,yF,fz,Vg,ij",
-ci:function(){if(this.yF==null){var z=W.r3("service-view",null)
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("service-view",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){if(J.xC(a,""))return
-this.i6.Nv.cv(a).ml(new G.GL(this)).OA(new G.mo())},
+this.i6.Nv.cv(a).ml(new G.mo(this)).OA(new G.Go5())},
 VU:function(a){return!0}},
-GL:{
+mo:{
 "^":"TpZ:12;a",
 $1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-mo:{
+Go5:{
 "^":"TpZ:12;",
-$1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
+$1:[function(a){N.QM("").hh("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 t9:{
-"^":"MQ;i6,yF,fz,Vg,ij",
-ci:function(){if(this.yF==null){var z=W.r3("class-tree",null)
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("class-tree",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){a=J.ZZ(a,11)
-this.i6.Nv.cv(a).ml(new G.Za(this)).OA(new G.hh())},
+this.i6.Nv.cv(a).ml(new G.Hb(this)).OA(new G.ZaW())},
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"rjk"}},
-Za:{
+Hb:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a.yF
 if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-hh:{
+ZaW:{
 "^":"TpZ:12;",
-$1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
+$1:[function(a){N.QM("").hh("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-lO:{
-"^":"MQ;i6,yF,fz,Vg,ij",
-ci:function(){if(this.yF==null){var z=W.r3("service-view",null)
+Sy:{
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("service-view",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){var z,y
 z=H.Go(this.yF,"$isTi")
 y=this.i6.Pv
-z.Ll=J.Q5(z,C.td,z.Ll,y)},
+z.Ll=J.NB(z,C.td,z.Ll,y)},
 VU:function(a){return J.co(a,"error/")}},
 ki:{
-"^":"MQ;i6,yF,fz,Vg,ij",
-ci:function(){if(this.yF==null){var z=W.r3("vm-connect",null)
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("vm-connect",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){},
 VU:function(a){return J.co(a,"vm-connect/")}},
 JM:{
-"^":"MQ;cX@,K3,i6,yF,fz,Vg,ij",
-ci:function(){if(this.yF==null){var z=W.r3("metrics-page",null)
+"^":"OS;cX@,K3,i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("metrics-page",null)
 z=F.Wi(this,C.GP,this.yF,z)
 this.yF=z
 H.Go(z,"$isqn")
-z.GC=J.Q5(z,C.EP,z.GC,this)}},
+z.GC=J.NB(z,C.EP,z.GC,this)}},
 ZW:function(a,b){var z
 if(b.gmw()!=null){if(J.cj(b.gmw()).gVs()===a)return
-C.Nm.Rz(b.gmw().gfj(),b)
+C.Nm.Rz(b.gmw().gJb(),b)
 b.smw(null)}if(J.xC(a,0))return
 z=this.K3.t(0,a)
-if(z!=null){z.gfj().push(b)
+if(z!=null){z.gJb().push(b)
 b.smw(z)
 return}throw H.b(P.a9())},
 Q0:function(a){var z,y,x
 z=this.i6.Nv
-y=$.Il().ii(a)
+y=$.qL().e5(a)
 x=J.U6(y)
-z.cv(x.Nj(y,0,J.bI(x.gB(y),1))).ml(new G.VP(this))},
+z.cv(x.Nj(y,0,J.bI(x.gB(y),1))).ml(new G.YhF(this))},
 VU:function(a){var z=$.NP().Yr
 if(typeof a!=="string")H.vh(P.u(a))
 return z.test(a)},
@@ -2480,21 +2484,21 @@
 w=new D.W1(w,v,null)
 w.Cb=P.SZ(v,w.gia(w))
 z.u(0,x,w)}},
-static:{"^":"lZ,M2,Bw",b2:function(a){var z=new G.JM(null,P.L5(null,null,null,P.KN,D.W1),a,null,null,null,null)
+static:{"^":"lZ,AX,Bw",Gi:function(a){var z=new G.JM(null,P.L5(null,null,null,P.KN,D.W1),a,null,null,null,null)
 z.LS(a)
 return z}}},
-VP:{
+YhF:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=H.Go(this.a.yF,"$isqn")
-z.OM=J.Q5(z,C.rB,z.OM,a)},"$1",null,2,0,null,97,"call"],
+z.OM=J.NB(z,C.rB,z.OM,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
 V3:{
 "^":"a;IU",
-cv:function(a){return G.DU(this.IU+"."+H.d(a))}},
+cv:function(a){return G.DUC(this.IU+"."+H.d(a))}},
 KF:{
 "^":"TpZ:3;",
 $1:[function(a){var z,y,x,w
-z=C.xr.kV(a)
+z=C.xr.iQ(a)
 if(z==null)return z
 y=J.U6(z)
 x=0
@@ -2507,10 +2511,10 @@
 "^":"TpZ:12;",
 $1:[function(a){},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-uh:{
-"^":"d3;wo,bq>,TY,ro,XY,iS",
+nD:{
+"^":"d3;wo,bq>,TY,ro,XY,cU",
 k6:function(){return"ws://"+H.d(window.location.host)+"/ws"},
-J8:function(a){var z=this.Xk(a)
+TP:function(a){var z=this.Xk(a)
 if(z!=null)return z
 z=new L.Z5(0,!1,null,a)
 z.oc=a
@@ -2542,7 +2546,7 @@
 A7:function(){var z,y,x,w,v
 z=this.bq
 z.V1(z)
-y=G.DU(this.wo.IU+".history")
+y=G.DUC(this.wo.IU+".history")
 if(y==null)return
 x=J.U6(y)
 w=0
@@ -2551,8 +2555,8 @@
 if(!(w<v))break
 x.u(y,w,L.K9(x.t(y,w)));++w}z.FV(0,y)
 this.TV()},
-vs:function(){this.A7()
-var z=this.J8(this.k6())
+lK:function(){this.A7()
+var z=this.TP(this.k6())
 this.TY=z
 this.h(0,z)},
 static:{"^":"lGN"}},
@@ -2562,42 +2566,42 @@
 $isEH:true},
 jQ:{
 "^":"TpZ:99;",
-$2:function(a,b){return J.FW(b.gFH(),a.gFH())},
+$2:function(a,b){return J.FW(b.geX(),a.geX())},
 $isEH:true},
 Y2:{
-"^":"Pi;eT>,yt<,qu>,oH<",
+"^":"Pi;eT>,yt<,ks>,oH<",
 gyX:function(a){return this.PU},
-grm:function(){return this.aZ},
+gty:function(){return this.aZ},
 goE:function(a){return this.Lk},
 soE:function(a,b){var z=J.xC(this.Lk,b)
 this.Lk=b
 if(!z){z=this.PU
 if(b===!0){this.PU=F.Wi(this,C.Ek,z,"\u21b3")
 this.Pz(0)}else{this.PU=F.Wi(this,C.Ek,z,"\u2192")
-this.aY()}}},
+this.cO()}}},
 r8:function(){this.soE(0,this.Lk!==!0)
 return this.Lk},
 k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
 $isY2:true},
 ih:{
-"^":"Pi;vp>,Vg,ij",
-rT:function(a){var z,y
+"^":"Pi;vp>,Vg,fn",
+G7:function(a){var z,y
 z=this.vp
 y=J.w1(z)
 y.V1(z)
 a.Pz(0)
-y.FV(z,a.qu)},
-qU:function(a){var z,y,x
+y.FV(z,a.ks)},
+lo:function(a){var z,y,x
 z=this.vp
 y=J.U6(z)
 x=y.t(z,a)
-if(x.r8()===!0)y.UG(z,y.OY(z,x)+1,J.dd(x))
+if(x.r8()===!0)y.UG(z,y.OY(z,x)+1,J.Mx(x))
 else this.nm(x)},
 nm:function(a){var z,y,x,w,v
 z=J.RE(a)
-y=J.q8(z.gqu(a))
+y=J.q8(z.gks(a))
 if(y===0)return
-for(x=0;x<y;++x)if(J.IL(J.UQ(z.gqu(a),x))===!0)this.nm(J.UQ(z.gqu(a),x))
+for(x=0;x<y;++x)if(J.IL(J.UQ(z.gks(a),x))===!0)this.nm(J.UQ(z.gks(a),x))
 z.soE(a,!1)
 z=this.vp
 w=J.U6(z)
@@ -2605,15 +2609,15 @@
 w.oq(z,v,v+y)}},
 Kt:{
 "^":"a;ph>,xy<",
-static:{mbk:[function(a){return a!=null?J.AG(a):"<null>"},"$1","NZt",2,0,16]}},
-c0:{
+static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,16]}},
+Ni:{
 "^":"a;UQ>",
-$isc0:true},
+$isNi:true},
 Vz:{
-"^":"Pi;oH<,vp>,GD<",
-sn4:function(a){this.pT=a
+"^":"Pi;oH<,vp>,zz<",
+sxp:function(a){this.pT=a
 F.Wi(this,C.JB,0,1)},
-gn4:function(){return this.pT},
+gxp:function(){return this.pT},
 gT3:function(){return this.Rj},
 sT3:function(a){this.Rj=a
 F.Wi(this,C.JB,0,1)},
@@ -2622,19 +2626,19 @@
 return J.UQ(J.hI(z[a]),b)},
 oa:[function(a,b){var z=this.Ey(a,this.pT)
 return J.FW(this.Ey(b,this.pT),z)},"$2","gMG",4,0,100],
-iJ8:[function(a,b){return J.FW(this.Ey(a,this.pT),this.Ey(b,this.pT))},"$2","gfL",4,0,100],
+ws:[function(a,b){return J.FW(this.Ey(a,this.pT),this.Ey(b,this.pT))},"$2","gfL",4,0,100],
 Jd:function(a){var z,y
-H.w4()
+H.Xe()
 $.Ji=$.xG
-new P.VV(null,null).wE(0)
-z=this.GD
+new P.VV(null,null).D5(0)
+z=this.zz
 if(this.Rj){y=this.gMG()
 H.ig(z,y)}else{y=this.gfL()
 H.ig(z,y)}},
 Ai:function(){C.Nm.sB(this.vp,0)
-C.Nm.sB(this.GD,0)},
-QS:function(a,b){var z=this.vp
-this.GD.push(z.length)
+C.Nm.sB(this.zz,0)},
+Id:function(a,b){var z=this.vp
+this.zz.push(z.length)
 z.push(b)},
 Gu:function(a,b){var z,y
 z=this.vp
@@ -2646,25 +2650,25 @@
 ra:[function(a){var z
 if(!J.xC(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.WB(J.ZC(z[a]),"\u2003")}z=this.oH
+return J.WB(J.Yq(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-z=J.ZC(z[a])
+z=J.Yq(z[a])
 return J.WB(z,this.Rj?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,101]}}],["","",,E,{
 "^":"",
 Jz:[function(){var z,y,x
 z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.Wq,new E.wa(),C.ET,new E.Or(),C.BE,new E.YL(),C.WC,new E.wf(),C.hR,new E.Oa(),C.S4,new E.emv(),C.Ro,new E.Lbd(),C.hN,new E.QAa(),C.AV,new E.CvS(),C.bV,new E.edy(),C.C0,new E.waE(),C.eZ,new E.Ore(),C.bk,new E.YLa(),C.lH,new E.wfa(),C.am,new E.Oaa(),C.oE,new E.e0(),C.kG,new E.e1(),C.OI,new E.e2(),C.Wt,new E.e3(),C.I9,new E.e4(),C.To,new E.e5(),C.mM,new E.e6(),C.aw,new E.e7(),C.XA,new E.e8(),C.i4,new E.e9(),C.mJ,new E.e10(),C.qt,new E.e11(),C.p1,new E.e12(),C.yJ,new E.e13(),C.la,new E.e14(),C.yL,new E.e15(),C.nr,new E.e16(),C.bJ,new E.e17(),C.ox,new E.e18(),C.Je,new E.e19(),C.kI,new E.e20(),C.vY,new E.e21(),C.Rs,new E.e22(),C.hJ,new E.e23(),C.yC,new E.e24(),C.Lw,new E.e25(),C.eR,new E.e26(),C.LS,new E.e27(),C.iE,new E.e28(),C.f4,new E.e29(),C.VK,new E.e30(),C.aH,new E.e31(),C.aK,new E.e32(),C.GP,new E.e33(),C.mw,new E.e34(),C.vs,new E.e35(),C.Gr,new E.e36(),C.TU,new E.e37(),C.Fe,new E.e38(),C.tP,new E.e39(),C.yh,new E.e40(),C.Zb,new E.e41(),C.u7,new E.e42(),C.p8,new E.e43(),C.qR,new E.e44(),C.ld,new E.e45(),C.ne,new E.e46(),C.B0,new E.e47(),C.r1,new E.e48(),C.mr,new E.e49(),C.Ek,new E.e50(),C.Pn,new E.e51(),C.YT,new E.e52(),C.h7,new E.e53(),C.R3,new E.e54(),C.cJ,new E.e55(),C.WQ,new E.e56(),C.fV,new E.e57(),C.jU,new E.e58(),C.OO,new E.e59(),C.Mc,new E.e60(),C.FP,new E.e61(),C.kF,new E.e62(),C.UD,new E.e63(),C.Aq,new E.e64(),C.DS,new E.e65(),C.C9,new E.e66(),C.VF,new E.e67(),C.uU,new E.e68(),C.YJ,new E.e69(),C.eF,new E.e70(),C.oI,new E.e71(),C.ST,new E.e72(),C.QH,new E.e73(),C.qX,new E.e74(),C.rE,new E.e75(),C.nf,new E.e76(),C.EI,new E.e77(),C.JB,new E.e78(),C.RY,new E.e79(),C.d4,new E.e80(),C.cF,new E.e81(),C.ft,new E.e82(),C.dr,new E.e83(),C.SI,new E.e84(),C.zS,new E.e85(),C.YA,new E.e86(),C.Ge,new E.e87(),C.A7,new E.e88(),C.He,new E.e89(),C.im,new E.e90(),C.Ss,new E.e91(),C.k6,new E.e92(),C.oj,new E.e93(),C.PJ,new E.e94(),C.Yb,new E.e95(),C.q2,new E.e96(),C.d2,new E.e97(),C.kN,new E.e98(),C.uO,new E.e99(),C.fn,new E.e100(),C.yB,new E.e101(),C.eJ,new E.e102(),C.iG,new E.e103(),C.Py,new E.e104(),C.pC,new E.e105(),C.uu,new E.e106(),C.qs,new E.e107(),C.XH,new E.e108(),C.XJ,new E.e109(),C.tJ,new E.e110(),C.F8,new E.e111(),C.fy,new E.e112(),C.C1,new E.e113(),C.Nr,new E.e114(),C.nL,new E.e115(),C.a0,new E.e116(),C.Yg,new E.e117(),C.bR,new E.e118(),C.ai,new E.e119(),C.ob,new E.e120(),C.dR,new E.e121(),C.MY,new E.e122(),C.Wg,new E.e123(),C.tD,new E.e124(),C.QS,new E.e125(),C.C7,new E.e126(),C.nZ,new E.e127(),C.Of,new E.e128(),C.Vl,new E.e129(),C.pY,new E.e130(),C.XL,new E.e131(),C.LA,new E.e132(),C.Iw,new E.e133(),C.tz,new E.e134(),C.AT,new E.e135(),C.Lk,new E.e136(),C.GS,new E.e137(),C.rB,new E.e138(),C.bz,new E.e139(),C.Jx,new E.e140(),C.b5,new E.e141(),C.z6,new E.e142(),C.SY,new E.e143(),C.Lc,new E.e144(),C.hf,new E.e145(),C.uk,new E.e146(),C.Zi,new E.e147(),C.TN,new E.e148(),C.GI,new E.e149(),C.Wn,new E.e150(),C.ur,new E.e151(),C.VN,new E.e152(),C.EV,new E.e153(),C.VI,new E.e154(),C.eh,new E.e155(),C.SA,new E.e156(),C.uG,new E.e157(),C.kV,new E.e158(),C.vp,new E.e159(),C.cc,new E.e160(),C.DY,new E.e161(),C.Lx,new E.e162(),C.M3,new E.e163(),C.wT,new E.e164(),C.JK,new E.e165(),C.SR,new E.e166(),C.t6,new E.e167(),C.rP,new E.e168(),C.qi,new E.e169(),C.pX,new E.e170(),C.kB,new E.e171(),C.LH,new E.e172(),C.a2,new E.e173(),C.VD,new E.e174(),C.NN,new E.e175(),C.UX,new E.e176(),C.YS,new E.e177(),C.pu,new E.e178(),C.uw,new E.e179(),C.BJ,new E.e180(),C.c6,new E.e181(),C.td,new E.e182(),C.Gn,new E.e183(),C.zO,new E.e184(),C.vg,new E.e185(),C.Yp,new E.e186(),C.YV,new E.e187(),C.If,new E.e188(),C.Ys,new E.e189(),C.zm,new E.e190(),C.EP,new E.e191(),C.nX,new E.e192(),C.BV,new E.e193(),C.xP,new E.e194(),C.XM,new E.e195(),C.Ic,new E.e196(),C.yG,new E.e197(),C.uI,new E.e198(),C.O9,new E.e199(),C.ba,new E.e200(),C.tW,new E.e201(),C.CG,new E.e202(),C.Jf,new E.e203(),C.Wj,new E.e204(),C.vb,new E.e205(),C.UL,new E.e206(),C.AY,new E.e207(),C.QK,new E.e208(),C.AO,new E.e209(),C.Xd,new E.e210(),C.I7,new E.e211(),C.kY,new E.e212(),C.Wm,new E.e213(),C.vK,new E.e214(),C.Tc,new E.e215(),C.GR,new E.e216(),C.KX,new E.e217(),C.ja,new E.e218(),C.mn,new E.e219(),C.Dj,new E.e220(),C.ir,new E.e221(),C.dx,new E.e222(),C.ni,new E.e223(),C.X2,new E.e224(),C.F3,new E.e225(),C.UY,new E.e226(),C.Aa,new E.e227(),C.nY,new E.e228(),C.tg,new E.e229(),C.HD,new E.e230(),C.iU,new E.e231(),C.eN,new E.e232(),C.ue,new E.e233(),C.nh,new E.e234(),C.L2,new E.e235(),C.vm,new E.e236(),C.Gs,new E.e237(),C.bE,new E.e238(),C.YD,new E.e239(),C.PX,new E.e240(),C.N8,new E.e241(),C.EA,new E.e242(),C.oW,new E.e243(),C.KC,new E.e244(),C.tf,new E.e245(),C.da,new E.e246(),C.Jd,new E.e247(),C.Y4,new E.e248(),C.Si,new E.e249(),C.pH,new E.e250(),C.Ve,new E.e251(),C.jM,new E.e252(),C.rd,new E.e253(),C.W5,new E.e254(),C.uX,new E.e255(),C.nt,new E.e256(),C.IT,new E.e257(),C.li,new E.e258(),C.PM,new E.e259(),C.ks,new E.e260(),C.Om,new E.e261(),C.iC,new E.e262(),C.Nv,new E.e263(),C.Wo,new E.e264(),C.FZ,new E.e265(),C.TW,new E.e266(),C.xS,new E.e267(),C.pD,new E.e268(),C.QF,new E.e269(),C.mi,new E.e270(),C.zz,new E.e271(),C.eO,new E.e272(),C.hO,new E.e273(),C.ei,new E.e274(),C.HK,new E.e275(),C.je,new E.e276(),C.Ef,new E.e277(),C.QL,new E.e278(),C.RH,new E.e279(),C.SP,new E.e280(),C.Q1,new E.e281(),C.ID,new E.e282(),C.dA,new E.e283(),C.bc,new E.e284(),C.kw,new E.e285(),C.nE,new E.e286(),C.ep,new E.e287(),C.hB,new E.e288(),C.J2,new E.e289(),C.hx,new E.e290(),C.zU,new E.e291(),C.OU,new E.e292(),C.bn,new E.e293(),C.mh,new E.e294(),C.Fh,new E.e295(),C.yv,new E.e296(),C.LP,new E.e297(),C.jh,new E.e298(),C.zd,new E.e299(),C.Db,new E.e300(),C.aF,new E.e301(),C.l4,new E.e302(),C.fj,new E.e303(),C.xw,new E.e304(),C.zn,new E.e305(),C.RJ,new E.e306(),C.Sk,new E.e307(),C.KS,new E.e308(),C.MA,new E.e309(),C.YE,new E.e310(),C.Uy,new E.e311()],null,null)
 y=P.EF([C.aP,new E.e312(),C.cg,new E.e313(),C.Zg,new E.e314(),C.S4,new E.e315(),C.AV,new E.e316(),C.bk,new E.e317(),C.lH,new E.e318(),C.am,new E.e319(),C.oE,new E.e320(),C.kG,new E.e321(),C.Wt,new E.e322(),C.mM,new E.e323(),C.aw,new E.e324(),C.XA,new E.e325(),C.i4,new E.e326(),C.mJ,new E.e327(),C.yL,new E.e328(),C.nr,new E.e329(),C.bJ,new E.e330(),C.kI,new E.e331(),C.vY,new E.e332(),C.yC,new E.e333(),C.VK,new E.e334(),C.aH,new E.e335(),C.GP,new E.e336(),C.vs,new E.e337(),C.Gr,new E.e338(),C.Fe,new E.e339(),C.tP,new E.e340(),C.yh,new E.e341(),C.Zb,new E.e342(),C.p8,new E.e343(),C.ld,new E.e344(),C.ne,new E.e345(),C.B0,new E.e346(),C.mr,new E.e347(),C.YT,new E.e348(),C.cJ,new E.e349(),C.WQ,new E.e350(),C.jU,new E.e351(),C.OO,new E.e352(),C.Mc,new E.e353(),C.QH,new E.e354(),C.rE,new E.e355(),C.nf,new E.e356(),C.ft,new E.e357(),C.Ge,new E.e358(),C.A7,new E.e359(),C.He,new E.e360(),C.oj,new E.e361(),C.d2,new E.e362(),C.uO,new E.e363(),C.fn,new E.e364(),C.yB,new E.e365(),C.Py,new E.e366(),C.uu,new E.e367(),C.qs,new E.e368(),C.rB,new E.e369(),C.z6,new E.e370(),C.hf,new E.e371(),C.uk,new E.e372(),C.Zi,new E.e373(),C.TN,new E.e374(),C.ur,new E.e375(),C.EV,new E.e376(),C.VI,new E.e377(),C.eh,new E.e378(),C.SA,new E.e379(),C.uG,new E.e380(),C.kV,new E.e381(),C.vp,new E.e382(),C.SR,new E.e383(),C.t6,new E.e384(),C.kB,new E.e385(),C.UX,new E.e386(),C.YS,new E.e387(),C.c6,new E.e388(),C.td,new E.e389(),C.zO,new E.e390(),C.Yp,new E.e391(),C.YV,new E.e392(),C.If,new E.e393(),C.Ys,new E.e394(),C.EP,new E.e395(),C.nX,new E.e396(),C.BV,new E.e397(),C.XM,new E.e398(),C.Ic,new E.e399(),C.O9,new E.e400(),C.tW,new E.e401(),C.Wj,new E.e402(),C.vb,new E.e403(),C.QK,new E.e404(),C.Xd,new E.e405(),C.kY,new E.e406(),C.vK,new E.e407(),C.Tc,new E.e408(),C.GR,new E.e409(),C.KX,new E.e410(),C.ja,new E.e411(),C.Dj,new E.e412(),C.X2,new E.e413(),C.UY,new E.e414(),C.Aa,new E.e415(),C.nY,new E.e416(),C.tg,new E.e417(),C.HD,new E.e418(),C.iU,new E.e419(),C.eN,new E.e420(),C.Gs,new E.e421(),C.bE,new E.e422(),C.YD,new E.e423(),C.PX,new E.e424(),C.tf,new E.e425(),C.Jd,new E.e426(),C.pH,new E.e427(),C.Ve,new E.e428(),C.jM,new E.e429(),C.rd,new E.e430(),C.uX,new E.e431(),C.nt,new E.e432(),C.IT,new E.e433(),C.PM,new E.e434(),C.ks,new E.e435(),C.Om,new E.e436(),C.iC,new E.e437(),C.Nv,new E.e438(),C.FZ,new E.e439(),C.TW,new E.e440(),C.pD,new E.e441(),C.mi,new E.e442(),C.zz,new E.e443(),C.dA,new E.e444(),C.kw,new E.e445(),C.nE,new E.e446(),C.hx,new E.e447(),C.zU,new E.e448(),C.OU,new E.e449(),C.zd,new E.e450(),C.RJ,new E.e451(),C.YE,new E.e452()],null,null)
 x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.XW,C.il,C.kH,C.Mt,C.Lg,C.qJ,C.Bi,C.il,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.uC,C.Mt,C.Wz,C.il,C.Ke,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.mK,C.il,C.IZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.fU,C.Mt,C.pi,C.Mt,C.Fn,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.Mz,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.rC,C.Mt,C.kq,C.Mt,C.Dl,C.Mt,C.Mz,C.qJ,C.Nw,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.R9,C.Mt,C.OZ,C.il,C.il,C.Mt,C.QJ,C.Mt,C.u4,C.Mt,C.X8,C.Mt,C.kt,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.tQ,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.Mz,C.al,C.il],null,null)
-y=O.rH(!1,P.EF([C.K4,P.EF([C.S4,C.aj,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,P.Fl(null,null),C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.XW,P.Fl(null,null),C.kH,P.EF([C.nr,C.BO],null,null),C.Lg,P.EF([C.S4,C.aj,C.AV,C.Qp,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz],null,null),C.Bi,P.Fl(null,null),C.KO,P.EF([C.yh,C.tO],null,null),C.wk,P.EF([C.AV,C.k1,C.eh,C.jO,C.Aa,C.k5,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.aj,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,P.Fl(null,null),C.Az,P.EF([C.WQ,C.on],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.P9],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.bG],null,null),C.uC,P.EF([C.uO,C.KK,C.kY,C.rT],null,null),C.Wz,P.Fl(null,null),C.Ke,P.EF([C.fn,C.Kk],null,null),C.pF,P.Fl(null,null),C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,P.Fl(null,null),C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.xV],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,P.Fl(null,null),C.oG,P.EF([C.jU,C.bw],null,null),C.mK,P.Fl(null,null),C.IZ,P.EF([C.vp,C.o0],null,null),C.FG,P.Fl(null,null),C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,P.Fl(null,null),C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.fz,C.vb,C.Mq,C.UL,C.bG,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.hd,C.zz,C.lS],null,null),C.UJ,P.Fl(null,null),C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,P.Fl(null,null),C.PT,P.EF([C.EV,C.ZQ],null,null),C.fU,P.EF([C.kB,C.nq,C.LH,C.oB,C.EP,C.db],null,null),C.pi,P.EF([C.rB,C.xY,C.kB,C.nq,C.LH,C.oB],null,null),C.Fn,P.EF([C.rB,C.xY,C.bz,C.Bk,C.EP,C.GO,C.tf,C.q6],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.rY],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.rY],null,null),C.vw,P.EF([C.uk,C.rY,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Cg],null,null),C.NW,P.Fl(null,null),C.ms,P.EF([C.cg,C.ll,C.uk,C.rY,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.oh,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.rY],null,null),C.rC,P.EF([C.uO,C.JT,C.td,C.Zk,C.XM,C.Tt,C.tg,C.DC],null,null),C.kq,P.EF([C.td,C.Zk],null,null),C.Dl,P.EF([C.VK,C.lW],null,null),C.Mz,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.aj,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.Bf,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.Df,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.It,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.bp],null,null),C.R9,P.EF([C.kY,C.TO,C.Wm,C.QW],null,null),C.OZ,P.Fl(null,null),C.il,P.EF([C.uu,C.NJ,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.EF([C.B0,C.iH,C.vp,C.Rz],null,null),C.u4,P.EF([C.B0,C.iH,C.SR,C.xR],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.EF([C.nE,C.FM],null,null),C.Y3,P.EF([C.bk,C.NS,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.B0,C.iH,C.rE,C.B7],null,null),C.tQ,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.pD,C.Gz],null,null),C.cK,P.Fl(null,null),C.jK,P.EF([C.yh,C.tO,C.RJ,C.BP],null,null)],null,null),z,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.Wq,"asStringLiteral",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.Wt,"clazz",C.I9,"closeItem",C.To,"closing",C.mM,"closureCtxt",C.aw,"closureFunc",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.nr,"context",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.hJ,"dartMetrics",C.yC,"declaredType",C.Lw,"deleteVm",C.eR,"deoptimizations",C.LS,"description",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.mw,"elements",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.cJ,"fetchInboundReferences",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.ft,"guardClass",C.dr,"guardNullable",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Yb,"id",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.uO,"inboundReferences",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.XJ,"isAbstractType",C.tJ,"isBool",C.F8,"isChromeTarget",C.fy,"isClosure",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.dR,"isFinal",C.MY,"isInlinable",C.Wg,"isInt",C.tD,"isList",C.QS,"isMap",C.C7,"isMirrorReference",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Iw,"isPlainInstance",C.tz,"isSentinel",C.AT,"isStatic",C.Lk,"isString",C.GS,"isWeakProperty",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.z6,"key",C.SY,"keys",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.qi,"max",C.pX,"message",C.kB,"metric",C.LH,"metricChanged",C.a2,"min",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.uw,"nativeFields",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Yp,"owner",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.EP,"page",C.nX,"parent",C.BV,"parentContext",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.vK,"reference",C.Tc,"referent",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.mn,"refreshRateChange",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.vm,"sampleBufferSizeChange",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.KC,"selectMetric",C.tf,"selectedMetric",C.da,"size",C.Jd,"slot",C.Y4,"slotIsArrayIndex",C.Si,"slotIsField",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.rd,"source",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.Nv,"subclass",C.Wo,"subclasses",C.FZ,"superclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.pD,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.eO,"timeStamp",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.dA,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.nE,"tracer",C.ep,"tree",C.hB,"type",C.J2,"typeChecksEnabled",C.hx,"typeClass",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.zd,"value",C.Db,"valueAsString",C.aF,"valueAsStringIsTruncated",C.l4,"values",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Sk,"vmMetrics",C.KS,"vmName",C.MA,"vmType",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),x,y,null)
+y=O.rH(!1,P.EF([C.K4,P.EF([C.S4,C.aj,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,P.Fl(null,null),C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.XW,P.Fl(null,null),C.kH,P.EF([C.nr,C.BO],null,null),C.Lg,P.EF([C.S4,C.aj,C.AV,C.Qp,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz],null,null),C.Bi,P.Fl(null,null),C.KO,P.EF([C.yh,C.tO],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.jO,C.Aa,C.k5,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.aj,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,P.Fl(null,null),C.Az,P.EF([C.WQ,C.on],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.P9],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.bG],null,null),C.uC,P.EF([C.uO,C.KK,C.kY,C.rT],null,null),C.Wz,P.Fl(null,null),C.Ke,P.EF([C.fn,C.Kk],null,null),C.pF,P.Fl(null,null),C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,P.Fl(null,null),C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.xV],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,P.Fl(null,null),C.oG,P.EF([C.jU,C.bw],null,null),C.mK,P.Fl(null,null),C.IZ,P.EF([C.vp,C.o0],null,null),C.FG,P.Fl(null,null),C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,P.Fl(null,null),C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.fz,C.vb,C.Mq,C.UL,C.bG,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.hd,C.zz,C.lS],null,null),C.UJ,P.Fl(null,null),C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,P.Fl(null,null),C.PT,P.EF([C.EV,C.ZQ],null,null),C.fU,P.EF([C.kB,C.nq,C.LH,C.oB,C.EP,C.db],null,null),C.pi,P.EF([C.rB,C.xY,C.kB,C.nq,C.LH,C.oB],null,null),C.Fn,P.EF([C.rB,C.xY,C.bz,C.Bk,C.EP,C.GO,C.tf,C.q6],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.rY],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.rY],null,null),C.vw,P.EF([C.uk,C.rY,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Cg],null,null),C.NW,P.Fl(null,null),C.ms,P.EF([C.cg,C.ll,C.uk,C.rY,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.oh,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.rY],null,null),C.rC,P.EF([C.uO,C.JT,C.td,C.Zk,C.XM,C.Tt,C.tg,C.DC],null,null),C.kq,P.EF([C.td,C.Zk],null,null),C.Dl,P.EF([C.VK,C.lW],null,null),C.Mz,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.aj,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.Bf,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.Df,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.It,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.bp],null,null),C.R9,P.EF([C.kY,C.TO,C.Wm,C.QW],null,null),C.OZ,P.Fl(null,null),C.il,P.EF([C.uu,C.NJ,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.EF([C.B0,C.iH,C.vp,C.Rz],null,null),C.u4,P.EF([C.B0,C.iH,C.SR,C.xR],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.EF([C.nE,C.FM],null,null),C.Y3,P.EF([C.bk,C.NS,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.B0,C.iH,C.rE,C.B7],null,null),C.tQ,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.pD,C.Gz],null,null),C.cK,P.Fl(null,null),C.jK,P.EF([C.yh,C.tO,C.RJ,C.BP],null,null)],null,null),z,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.Wq,"asStringLiteral",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.Wt,"clazz",C.I9,"closeItem",C.To,"closing",C.mM,"closureCtxt",C.aw,"closureFunc",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.nr,"context",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.hJ,"dartMetrics",C.yC,"declaredType",C.Lw,"deleteVm",C.eR,"deoptimizations",C.LS,"description",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.mw,"elements",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.cJ,"fetchInboundReferences",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.ft,"guardClass",C.dr,"guardNullable",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Yb,"id",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.uO,"inboundReferences",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.XJ,"isAbstractType",C.tJ,"isBool",C.F8,"isChromeTarget",C.fy,"isClosure",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.dR,"isFinal",C.MY,"isInlinable",C.Wg,"isInt",C.tD,"isList",C.QS,"isMap",C.C7,"isMirrorReference",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Iw,"isPlainInstance",C.tz,"isSentinel",C.AT,"isStatic",C.Lk,"isString",C.GS,"isWeakProperty",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.z6,"key",C.SY,"keys",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.qi,"max",C.pX,"message",C.kB,"metric",C.LH,"metricChanged",C.a2,"min",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.uw,"nativeFields",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Yp,"owner",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.EP,"page",C.nX,"parent",C.BV,"parentContext",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.vK,"reference",C.Tc,"referent",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.mn,"refreshRateChange",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.vm,"sampleBufferSizeChange",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.KC,"selectMetric",C.tf,"selectedMetric",C.da,"size",C.Jd,"slot",C.Y4,"slotIsArrayIndex",C.Si,"slotIsField",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.rd,"source",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.Nv,"subclass",C.Wo,"subclasses",C.FZ,"superclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.pD,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.eO,"timeStamp",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.dA,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.nE,"tracer",C.ep,"tree",C.hB,"type",C.J2,"typeChecksEnabled",C.hx,"typeClass",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.zd,"value",C.Db,"valueAsString",C.aF,"valueAsStringIsTruncated",C.l4,"values",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Sk,"vmMetrics",C.KS,"vmName",C.MA,"vmType",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),x,y,null)
 $.j8=new O.fH(y)
 $.Yv=new O.bY(y)
 $.qe=new O.ut(y)
 $.M6=[new E.e453(),new E.e454(),new E.e455(),new E.e456(),new E.e457(),new E.e458(),new E.e459(),new E.e460(),new E.e461(),new E.e462(),new E.e463(),new E.e464(),new E.e465(),new E.e466(),new E.e467(),new E.e468(),new E.e469(),new E.e470(),new E.e471(),new E.e472(),new E.e473(),new E.e474(),new E.e475(),new E.e476(),new E.e477(),new E.e478(),new E.e479(),new E.e480(),new E.e481(),new E.e482(),new E.e483(),new E.e484(),new E.e485(),new E.e486(),new E.e487(),new E.e488(),new E.e489(),new E.e490(),new E.e491(),new E.e492(),new E.e493(),new E.e494(),new E.e495(),new E.e496(),new E.e497(),new E.e498(),new E.e499(),new E.e500(),new E.e501(),new E.e502(),new E.e503(),new E.e504(),new E.e505(),new E.e506(),new E.e507(),new E.e508(),new E.e509(),new E.e510(),new E.e511(),new E.e512(),new E.e513(),new E.e514(),new E.e515(),new E.e516(),new E.e517(),new E.e518(),new E.e519(),new E.e520(),new E.e521(),new E.e522(),new E.e523(),new E.e524(),new E.e525(),new E.e526(),new E.e527(),new E.e528(),new E.e529(),new E.e530(),new E.e531(),new E.e532(),new E.e533(),new E.e534(),new E.e535(),new E.e536(),new E.e537(),new E.e538(),new E.e539(),new E.e540(),new E.e541(),new E.e542(),new E.e543(),new E.e544(),new E.e545()]
 $.UG=!0
-F.E2()},"$0","V7A",0,0,17],
+F.E2()},"$0","jk",0,0,17],
 em:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jp9(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Lb:{
 "^":"TpZ:12;",
@@ -2676,11 +2680,11 @@
 $isEH:true},
 Cv:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zC(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.r0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 ed:{
 "^":"TpZ:12;",
-$1:[function(a){return J.H3(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.D8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wa:{
 "^":"TpZ:12;",
@@ -2692,7 +2696,7 @@
 $isEH:true},
 YL:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gUH()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gqZ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wf:{
 "^":"TpZ:12;",
@@ -2700,7 +2704,7 @@
 $isEH:true},
 Oa:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gYZ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gQ1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 emv:{
 "^":"TpZ:12;",
@@ -2708,11 +2712,11 @@
 $isEH:true},
 Lbd:{
 "^":"TpZ:12;",
-$1:[function(a){return J.rS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.aA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 QAa:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gET()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gfj()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 CvS:{
 "^":"TpZ:12;",
@@ -2720,11 +2724,11 @@
 $isEH:true},
 edy:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gbZ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gkV()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 waE:{
 "^":"TpZ:12;",
-$1:[function(a){return J.XB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Wp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Ore:{
 "^":"TpZ:12;",
@@ -2732,23 +2736,23 @@
 $isEH:true},
 YLa:{
 "^":"TpZ:12;",
-$1:[function(a){return J.rp(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.K0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wfa:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jg(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.hn(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Oaa:{
 "^":"TpZ:12;",
-$1:[function(a){return J.LL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.HP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e0:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ze(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e1:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Hd(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yz(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e2:{
 "^":"TpZ:12;",
@@ -2760,11 +2764,11 @@
 $isEH:true},
 e4:{
 "^":"TpZ:12;",
-$1:[function(a){return J.us(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.RC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e5:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gmy()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gaP()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e6:{
 "^":"TpZ:12;",
@@ -2776,15 +2780,15 @@
 $isEH:true},
 e8:{
 "^":"TpZ:12;",
-$1:[function(a){return J.L6(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.E3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e9:{
 "^":"TpZ:12;",
-$1:[function(a){return J.tX(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Nk(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e10:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yI(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e11:{
 "^":"TpZ:12;",
@@ -2796,7 +2800,7 @@
 $isEH:true},
 e13:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ad(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.dw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e14:{
 "^":"TpZ:12;",
@@ -2812,11 +2816,11 @@
 $isEH:true},
 e17:{
 "^":"TpZ:12;",
-$1:[function(a){return J.xk(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.OT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e18:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Okq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ok(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e19:{
 "^":"TpZ:12;",
@@ -2828,7 +2832,7 @@
 $isEH:true},
 e21:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yW(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jr(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e22:{
 "^":"TpZ:12;",
@@ -2848,11 +2852,11 @@
 $isEH:true},
 e26:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gOs()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.guh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e27:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gQZ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gGB()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e28:{
 "^":"TpZ:12;",
@@ -2864,15 +2868,15 @@
 $isEH:true},
 e30:{
 "^":"TpZ:12;",
-$1:[function(a){return J.CNb(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.GF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e31:{
 "^":"TpZ:12;",
-$1:[function(a){return J.NC(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.BT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e32:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Nx(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.H2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e33:{
 "^":"TpZ:12;",
@@ -2880,7 +2884,7 @@
 $isEH:true},
 e34:{
 "^":"TpZ:12;",
-$1:[function(a){return J.BB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Hg(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e35:{
 "^":"TpZ:12;",
@@ -2888,11 +2892,11 @@
 $isEH:true},
 e36:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yr(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.rw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e37:{
 "^":"TpZ:12;",
-$1:[function(a){return J.MV(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.wt(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e38:{
 "^":"TpZ:12;",
@@ -2912,15 +2916,15 @@
 $isEH:true},
 e42:{
 "^":"TpZ:12;",
-$1:[function(a){return J.nEe(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.kv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e43:{
 "^":"TpZ:12;",
-$1:[function(a){return J.qf(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.a3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e44:{
 "^":"TpZ:12;",
-$1:[function(a){return J.iiZ(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ts(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e45:{
 "^":"TpZ:12;",
@@ -2936,7 +2940,7 @@
 $isEH:true},
 e48:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ak(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Gl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e49:{
 "^":"TpZ:12;",
@@ -2944,15 +2948,15 @@
 $isEH:true},
 e50:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ur(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.nb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e51:{
 "^":"TpZ:12;",
-$1:[function(a){return a.grm()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gty()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e52:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ua(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.IR(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e53:{
 "^":"TpZ:12;",
@@ -2960,15 +2964,15 @@
 $isEH:true},
 e54:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gq2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gki()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e55:{
 "^":"TpZ:12;",
-$1:[function(a){return J.E1(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.LY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e56:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Nb(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.pm(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e57:{
 "^":"TpZ:12;",
@@ -2976,19 +2980,19 @@
 $isEH:true},
 e58:{
 "^":"TpZ:12;",
-$1:[function(a){return J.vE(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ec(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e59:{
 "^":"TpZ:12;",
-$1:[function(a){return J.tdY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.PK(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e60:{
 "^":"TpZ:12;",
-$1:[function(a){return J.AU(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.YH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e61:{
 "^":"TpZ:12;",
-$1:[function(a){return J.WX7(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.WX(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e62:{
 "^":"TpZ:12;",
@@ -3004,15 +3008,15 @@
 $isEH:true},
 e65:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Oi(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.xo(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e66:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gqE()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gkA()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e67:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gAX()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gGK()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e68:{
 "^":"TpZ:12;",
@@ -3028,11 +3032,11 @@
 $isEH:true},
 e71:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gP3()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gmE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e72:{
 "^":"TpZ:12;",
-$1:[function(a){return J.BT(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.PY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e73:{
 "^":"TpZ:12;",
@@ -3040,7 +3044,7 @@
 $isEH:true},
 e74:{
 "^":"TpZ:12;",
-$1:[function(a){return J.iq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.eU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e75:{
 "^":"TpZ:12;",
@@ -3060,11 +3064,11 @@
 $isEH:true},
 e79:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yf(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e80:{
 "^":"TpZ:12;",
-$1:[function(a){return J.i2U(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.tw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e81:{
 "^":"TpZ:12;",
@@ -3080,7 +3084,7 @@
 $isEH:true},
 e84:{
 "^":"TpZ:12;",
-$1:[function(a){return a.ghR()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gX1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e85:{
 "^":"TpZ:12;",
@@ -3096,7 +3100,7 @@
 $isEH:true},
 e88:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.OB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e89:{
 "^":"TpZ:12;",
@@ -3116,7 +3120,7 @@
 $isEH:true},
 e93:{
 "^":"TpZ:12;",
-$1:[function(a){return J.hW(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.aB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e94:{
 "^":"TpZ:12;",
@@ -3144,15 +3148,15 @@
 $isEH:true},
 e100:{
 "^":"TpZ:12;",
-$1:[function(a){return J.HP(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.fh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e101:{
 "^":"TpZ:12;",
-$1:[function(a){return J.US(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.NDJ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e102:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gtI()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gNI()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e103:{
 "^":"TpZ:12;",
@@ -3188,7 +3192,7 @@
 $isEH:true},
 e111:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ho(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.bL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e112:{
 "^":"TpZ:12;",
@@ -3200,11 +3204,11 @@
 $isEH:true},
 e114:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gRh()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gRs()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e115:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ls(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ix(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e116:{
 "^":"TpZ:12;",
@@ -3212,7 +3216,7 @@
 $isEH:true},
 e117:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gqy()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gcE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e118:{
 "^":"TpZ:12;",
@@ -3228,11 +3232,11 @@
 $isEH:true},
 e121:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Z6(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.EM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e122:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gxL()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gho()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e123:{
 "^":"TpZ:12;",
@@ -3248,7 +3252,7 @@
 $isEH:true},
 e126:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gOC()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gJE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e127:{
 "^":"TpZ:12;",
@@ -3296,11 +3300,11 @@
 $isEH:true},
 e138:{
 "^":"TpZ:12;",
-$1:[function(a){return J.wg(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.aT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e139:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Hq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.KG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e140:{
 "^":"TpZ:12;",
@@ -3308,7 +3312,7 @@
 $isEH:true},
 e141:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gnp()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gEB()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e142:{
 "^":"TpZ:12;",
@@ -3316,7 +3320,7 @@
 $isEH:true},
 e143:{
 "^":"TpZ:12;",
-$1:[function(a){return J.iYM(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.iY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e144:{
 "^":"TpZ:12;",
@@ -3324,11 +3328,11 @@
 $isEH:true},
 e145:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ZC(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Yq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e146:{
 "^":"TpZ:12;",
-$1:[function(a){return J.OH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.MQ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e147:{
 "^":"TpZ:12;",
@@ -3336,7 +3340,7 @@
 $isEH:true},
 e148:{
 "^":"TpZ:12;",
-$1:[function(a){return J.IR(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Kj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e149:{
 "^":"TpZ:12;",
@@ -3348,15 +3352,15 @@
 $isEH:true},
 e151:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gcI()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.ghX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e152:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gpd()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gvU()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e153:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ik(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e154:{
 "^":"TpZ:12;",
@@ -3396,7 +3400,7 @@
 $isEH:true},
 e163:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gbB()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gfJ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e164:{
 "^":"TpZ:12;",
@@ -3404,7 +3408,7 @@
 $isEH:true},
 e165:{
 "^":"TpZ:12;",
-$1:[function(a){return J.HS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.c7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e166:{
 "^":"TpZ:12;",
@@ -3412,15 +3416,15 @@
 $isEH:true},
 e167:{
 "^":"TpZ:12;",
-$1:[function(a){return J.kv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ol(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e168:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yb(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Y7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e169:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jE(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.PR(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e170:{
 "^":"TpZ:12;",
@@ -3432,11 +3436,11 @@
 $isEH:true},
 e172:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Kv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.dj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e173:{
 "^":"TpZ:12;",
-$1:[function(a){return J.LY4(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.GL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e174:{
 "^":"TpZ:12;",
@@ -3448,7 +3452,7 @@
 $isEH:true},
 e176:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Zv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.X6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e177:{
 "^":"TpZ:12;",
@@ -3456,11 +3460,11 @@
 $isEH:true},
 e178:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Cs(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Pf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e179:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gDm()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gbA()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e180:{
 "^":"TpZ:12;",
@@ -3472,7 +3476,7 @@
 $isEH:true},
 e182:{
 "^":"TpZ:12;",
-$1:[function(a){return J.mk(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e183:{
 "^":"TpZ:12;",
@@ -3492,7 +3496,7 @@
 $isEH:true},
 e187:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gP2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gEl()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e188:{
 "^":"TpZ:12;",
@@ -3500,7 +3504,7 @@
 $isEH:true},
 e189:{
 "^":"TpZ:12;",
-$1:[function(a){return J.qN(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.iB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e190:{
 "^":"TpZ:12;",
@@ -3544,15 +3548,15 @@
 $isEH:true},
 e200:{
 "^":"TpZ:12;",
-$1:[function(a){return J.os(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Tm(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e201:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Yd(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e202:{
 "^":"TpZ:12;",
-$1:[function(a){return J.xlH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.L6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e203:{
 "^":"TpZ:12;",
@@ -3564,15 +3568,15 @@
 $isEH:true},
 e205:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Zl(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Tv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e206:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Q0(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.CN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e207:{
 "^":"TpZ:12;",
-$1:[function(a){return J.u5(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ql(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e208:{
 "^":"TpZ:12;",
@@ -3584,7 +3588,7 @@
 $isEH:true},
 e210:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ks(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.id(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e211:{
 "^":"TpZ:12;",
@@ -3596,7 +3600,7 @@
 $isEH:true},
 e213:{
 "^":"TpZ:12;",
-$1:[function(a){return J.xi(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.H1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e214:{
 "^":"TpZ:12;",
@@ -3612,11 +3616,11 @@
 $isEH:true},
 e217:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ph(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.dZ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e218:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Xp(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.GH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e219:{
 "^":"TpZ:12;",
@@ -3624,7 +3628,7 @@
 $isEH:true},
 e220:{
 "^":"TpZ:12;",
-$1:[function(a){return J.n8(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.bS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e221:{
 "^":"TpZ:12;",
@@ -3648,27 +3652,27 @@
 $isEH:true},
 e226:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ma(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.uW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e227:{
 "^":"TpZ:12;",
-$1:[function(a){return J.W2H(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.W2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e228:{
 "^":"TpZ:12;",
-$1:[function(a){return J.nl(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.UT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e229:{
 "^":"TpZ:12;",
-$1:[function(a){return J.I1(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Kd(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e230:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.pU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e231:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jo(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Tg(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e232:{
 "^":"TpZ:12;",
@@ -3676,19 +3680,19 @@
 $isEH:true},
 e233:{
 "^":"TpZ:12;",
-$1:[function(a){return a.geH()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gpF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e234:{
 "^":"TpZ:12;",
-$1:[function(a){return J.x3(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.TY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e235:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gLd()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gGL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e236:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Hm(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.X9(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e237:{
 "^":"TpZ:12;",
@@ -3696,15 +3700,15 @@
 $isEH:true},
 e238:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Fi(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.UP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e239:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zD(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.UA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e240:{
 "^":"TpZ:12;",
-$1:[function(a){return J.fx(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e241:{
 "^":"TpZ:12;",
@@ -3716,35 +3720,35 @@
 $isEH:true},
 e243:{
 "^":"TpZ:12;",
-$1:[function(a){return J.P5(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.uN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e244:{
 "^":"TpZ:12;",
-$1:[function(a){return J.bL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.le(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e245:{
 "^":"TpZ:12;",
-$1:[function(a){return J.wS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.bh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e246:{
 "^":"TpZ:12;",
-$1:[function(a){return J.fY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Y5(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e247:{
 "^":"TpZ:12;",
-$1:[function(a){return J.YH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ue(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e248:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jh(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Cs(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e249:{
 "^":"TpZ:12;",
-$1:[function(a){return J.be(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.dK(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e250:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Cr(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.U8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e251:{
 "^":"TpZ:12;",
@@ -3752,11 +3756,11 @@
 $isEH:true},
 e252:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gV8()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gip()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e253:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.M2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e254:{
 "^":"TpZ:12;",
@@ -3772,19 +3776,19 @@
 $isEH:true},
 e257:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yI(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.fM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e258:{
 "^":"TpZ:12;",
-$1:[function(a){return J.H1(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ay(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e259:{
 "^":"TpZ:12;",
-$1:[function(a){return J.LF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e260:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ff(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.lA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e261:{
 "^":"TpZ:12;",
@@ -3800,7 +3804,7 @@
 $isEH:true},
 e264:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gup()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gLT()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e265:{
 "^":"TpZ:12;",
@@ -3808,7 +3812,7 @@
 $isEH:true},
 e266:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Xa(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.j1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e267:{
 "^":"TpZ:12;",
@@ -3832,11 +3836,11 @@
 $isEH:true},
 e272:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Dc(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Xr(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e273:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gki()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gzg()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e274:{
 "^":"TpZ:12;",
@@ -3844,7 +3848,7 @@
 $isEH:true},
 e275:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gmj()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gvs()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e276:{
 "^":"TpZ:12;",
@@ -3856,15 +3860,15 @@
 $isEH:true},
 e278:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ug(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.PS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e279:{
 "^":"TpZ:12;",
-$1:[function(a){return J.d5(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.As(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e280:{
 "^":"TpZ:12;",
-$1:[function(a){return J.SS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.YG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e281:{
 "^":"TpZ:12;",
@@ -3884,11 +3888,11 @@
 $isEH:true},
 e285:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Kf(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.K2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e286:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ql(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.p6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e287:{
 "^":"TpZ:12;",
@@ -3904,11 +3908,11 @@
 $isEH:true},
 e290:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gQR()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gCY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e291:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Gt(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.un(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e292:{
 "^":"TpZ:12;",
@@ -3936,7 +3940,7 @@
 $isEH:true},
 e298:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gFc()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.ghW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e299:{
 "^":"TpZ:12;",
@@ -3964,7 +3968,7 @@
 $isEH:true},
 e305:{
 "^":"TpZ:12;",
-$1:[function(a){return J.pU(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.NV(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e306:{
 "^":"TpZ:12;",
@@ -3976,7 +3980,7 @@
 $isEH:true},
 e308:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gzz()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gTE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e309:{
 "^":"TpZ:12;",
@@ -3984,11 +3988,11 @@
 $isEH:true},
 e310:{
 "^":"TpZ:12;",
-$1:[function(a){return J.GH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.NC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e311:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gSY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gaU()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e312:{
 "^":"TpZ:81;",
@@ -4016,7 +4020,7 @@
 $isEH:true},
 e318:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.m8(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e319:{
 "^":"TpZ:81;",
@@ -4028,7 +4032,7 @@
 $isEH:true},
 e321:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Kw(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e322:{
 "^":"TpZ:81;",
@@ -4072,7 +4076,7 @@
 $isEH:true},
 e332:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.U8(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e333:{
 "^":"TpZ:81;",
@@ -4080,7 +4084,7 @@
 $isEH:true},
 e334:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Nh(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e335:{
 "^":"TpZ:81;",
@@ -4096,7 +4100,7 @@
 $isEH:true},
 e338:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.AE(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e339:{
 "^":"TpZ:81;",
@@ -4116,7 +4120,7 @@
 $isEH:true},
 e343:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Wy(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e344:{
 "^":"TpZ:81;",
@@ -4152,7 +4156,7 @@
 $isEH:true},
 e352:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.UU(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.MI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e353:{
 "^":"TpZ:81;",
@@ -4244,7 +4248,7 @@
 $isEH:true},
 e375:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.scI(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.shX(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e376:{
 "^":"TpZ:81;",
@@ -4264,7 +4268,7 @@
 $isEH:true},
 e380:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Mh(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e381:{
 "^":"TpZ:81;",
@@ -4288,11 +4292,11 @@
 $isEH:true},
 e386:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.oJ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.o3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e387:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.DF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e388:{
 "^":"TpZ:81;",
@@ -4312,7 +4316,7 @@
 $isEH:true},
 e392:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sP2(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sEl(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e393:{
 "^":"TpZ:81;",
@@ -4364,7 +4368,7 @@
 $isEH:true},
 e405:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.jy(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.J0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e406:{
 "^":"TpZ:81;",
@@ -4388,7 +4392,7 @@
 $isEH:true},
 e411:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Co(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e412:{
 "^":"TpZ:81;",
@@ -4436,7 +4440,7 @@
 $isEH:true},
 e423:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Rx(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.uH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e424:{
 "^":"TpZ:81;",
@@ -4448,7 +4452,7 @@
 $isEH:true},
 e426:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.lF(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.pq(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e427:{
 "^":"TpZ:81;",
@@ -4460,7 +4464,7 @@
 $isEH:true},
 e429:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sV8(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sip(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e430:{
 "^":"TpZ:81;",
@@ -4472,7 +4476,7 @@
 $isEH:true},
 e432:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.xH(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Hn(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e433:{
 "^":"TpZ:81;",
@@ -4492,7 +4496,7 @@
 $isEH:true},
 e437:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.cS(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.o8(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e438:{
 "^":"TpZ:81;",
@@ -4504,7 +4508,7 @@
 $isEH:true},
 e440:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.ix(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.H3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e441:{
 "^":"TpZ:81;",
@@ -4532,7 +4536,7 @@
 $isEH:true},
 e447:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sQR(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sCY(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e448:{
 "^":"TpZ:81;",
@@ -4552,7 +4556,7 @@
 $isEH:true},
 e452:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.tH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e453:{
 "^":"TpZ:76;",
@@ -4928,9 +4932,9 @@
 $isEH:true}},1],["","",,B,{
 "^":"",
 G6:{
-"^":"Vfx;BW,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-grs:function(a){return a.BW},
-srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
+"^":"Vfx;BW,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gjD:function(a){return a.BW},
+sjD:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
 pA:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,19,102],
 static:{KU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -4938,7 +4942,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -4953,43 +4957,43 @@
 $isd3:true}}],["","",,Q,{
 "^":"",
 eW:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{rt:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.YZz.LX(a)
-C.YZz.XI(a)
+C.i3.LX(a)
+C.i3.XI(a)
 return a}}}}],["","",,O,{
 "^":"",
-TY:{
-"^":"Y2;od>,Ru>,eT,yt,qu,oH,PU,aZ,Lk,Vg,ij",
+CZ:{
+"^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,Lk,Vg,fn",
 Pz:function(a){var z,y,x,w,v,u,t
-z=this.qu
+z=this.ks
 if(z.length>0)return
-for(y=this.Ru.gup(),y=y.gA(y),x=this.od,w=this.yt+1;y.G();){v=y.lo
+for(y=this.Ru.gLT(),y=y.gA(y),x=this.od,w=this.yt+1;y.G();){v=y.Ff
 if(v.geh()===!0)continue
 u=[]
 u.$builtinTypeInfo=[G.Y2]
-t=new O.TY(x,v,this,w,u,[],"\u2192","cursor: pointer;",!1,null,null)
+t=new O.CZ(x,v,this,w,u,[],"\u2192","cursor: pointer;",!1,null,null)
 if(!t.Nh()){u=t.aZ
 if(t.gnz(t)&&!J.xC(u,"visibility:hidden;")){u=new T.qI(t,C.Pn,u,"visibility:hidden;")
 u.$builtinTypeInfo=[null]
 t.nq(t,u)}t.aZ="visibility:hidden;"}z.push(t)}},
-aY:function(){},
-Nh:function(){return this.Ru.gup().xN.length>0}},
+cO:function(){},
+Nh:function(){return this.Ru.gLT().XG.length>0}},
 eo:{
-"^":"tuj;CA,Hm=,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"tuj;CA,Hm=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.CA},
 sod:function(a,b){a.CA=this.ct(a,C.rB,a.CA,b)},
 Es:function(a){var z
@@ -4998,46 +5002,46 @@
 a.Hm=new G.ih(z,null,null)
 z=a.CA
 if(z!=null)this.hP(a,z.gDZ())},
-vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","grV",2,0,12,59],
+vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,12,59],
 hP:function(a,b){var z,y,x,w,v,u,t,s,r,q
 try{w=a.CA
 v=H.VM([],[G.Y2])
-u=new O.TY(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
+u=new O.CZ(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
 u.k7(null)
 z=u
-w=J.dd(z)
+w=J.Mx(z)
 v=a.CA
 t=z
 s=H.VM([],[G.Y2])
 r=t!=null?t.gyt()+1:0
-s=new O.TY(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
+s=new O.CZ(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
 s.k7(t)
 w.push(s)
-a.Hm.rT(z)}catch(q){w=H.Ru(q)
+a.Hm.G7(z)}catch(q){w=H.Ru(q)
 y=w
 x=new H.oP(q,null)
-N.QM("").OW("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
+N.QM("").r0("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.lo(0)
 this.ct(a,C.ep,null,a.Hm)},
 Ui:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,103,104],
-ZZ:[function(a,b){return C.Jp[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
 wn:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$isIv)try{w=a.Hm
-v=J.JC(z)
+v=J.IO(z)
 if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
+w.lo(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.oP(u,null)
-N.QM("").OW("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
+N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
 static:{l0:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5056,27 +5060,27 @@
 $isEH:true}}],["","",,Z,{
 "^":"",
 ak:{
-"^":"Vct;Wf,ef,QI,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"Vct;Wf,ef,QI,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRu:function(a){return a.Wf},
 sRu:function(a,b){a.Wf=this.ct(a,C.XA,a.Wf,b)},
 gWt:function(a){return a.ef},
 sWt:function(a,b){a.ef=this.ct(a,C.yB,a.ef,b)},
 gCF:function(a){return a.QI},
 sCF:function(a,b){a.QI=this.ct(a,C.tg,a.QI,b)},
-vV:[function(a,b){return a.Wf.cv("eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
-Be:[function(a,b){return a.Wf.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gPe",2,0,111,112],
-Cq:[function(a,b){return a.Wf.cv("retained").ml(new Z.Rc(a))},"$1","ghN",2,0,111,113],
+vV:[function(a,b){return a.Wf.cv("eval?expr="+P.jW(C.Fa,b,C.xM,!1))},"$1","gZ2",2,0,109,110],
+Be:[function(a,b){return a.Wf.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,111,112],
+zs:[function(a,b){return a.Wf.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,111,113],
 pA:[function(a,b){a.ef=this.ct(a,C.yB,a.ef,null)
 a.QI=this.ct(a,C.tg,a.QI,null)
 J.LE(a.Wf).wM(b)},"$1","gvC",2,0,19,102],
-Da:[function(a,b){J.y9(a.Wf).wM(b)},"$1","gDX",2,0,19,102],
-static:{zB:function(a){var z,y,x,w
+m4:[function(a,b){J.y9(a.Wf).wM(b)},"$1","gDX",2,0,19,102],
+static:{TH:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5092,29 +5096,29 @@
 Ob:{
 "^":"TpZ:114;a",
 $1:[function(a){var z=this.a
-z.ef=J.Q5(z,C.yB,z.ef,a)},"$1",null,2,0,null,96,"call"],
+z.ef=J.NB(z,C.yB,z.ef,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-Rc:{
+SS:{
 "^":"TpZ:115;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(a.gPE(),null,null)
-z.QI=J.Q5(z,C.tg,z.QI,y)},"$1",null,2,0,null,96,"call"],
+z.QI=J.NB(z,C.tg,z.QI,y)},"$1",null,2,0,null,96,"call"],
 $isEH:true}}],["","",,O,{
 "^":"",
 VY:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gtT:function(a){return a.tY},
 Qj:[function(a,b){Q.xI.prototype.Qj.call(this,a,b)
-this.ct(a,C.i4,0,1)},"$1","gBj",2,0,12,59],
+this.ct(a,C.i4,0,1)},"$1","gLe",2,0,12,59],
 static:{E3U:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5126,14 +5130,14 @@
 return a}}}}],["","",,F,{
 "^":"",
 Be:{
-"^":"D13;Xx,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"D13;Xx,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gtT:function(a){return a.Xx},
 stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z).ml(new F.Jr())},
+J.SK(z).ml(new F.fS())},
 pA:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,19,102],
 lE:function(a,b){var z,y,x
 z=J.Vs(b).dA.getAttribute("data-jump-target")
@@ -5148,13 +5152,13 @@
 QT:[function(a,b,c,d){var z=this.lE(a,d)
 if(z==null)return
 J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,116,2,106,107],
-static:{FeK:function(a){var z,y,x,w
+static:{fm:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5167,16 +5171,16 @@
 D13:{
 "^":"uL+Pi;",
 $isd3:true},
-Jr:{
+fS:{
 "^":"TpZ:117;",
 $1:[function(a){a.QW()},"$1",null,2,0,null,85,"call"],
 $isEH:true}}],["","",,T,{
 "^":"",
 uV:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){var z=a.tY
-if(b===!0)J.LE(z).ml(new T.WW(a)).wM(c)
+if(b===!0)J.LE(z).ml(new T.zG(a)).wM(c)
 else{z.sZ3(null)
 c.$0()}},"$2","gus",4,0,118,119,120],
 static:{CvM:function(a){var z,y,x,w
@@ -5185,8 +5189,8 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5196,7 +5200,7 @@
 C.vS.LX(a)
 C.vS.XI(a)
 return a}}},
-WW:{
+zG:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=this.a
@@ -5206,17 +5210,17 @@
 $isEH:true}}],["","",,U,{
 "^":"",
 NY:{
-"^":"WZq;AE,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"WZq;AE,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 geo:function(a){return a.AE},
 seo:function(a,b){a.AE=this.ct(a,C.nr,a.AE,b)},
 pA:[function(a,b){J.LE(a.AE).wM(b)},"$1","gvC",2,0,122,120],
-static:{ui:function(a){var z,y,x,w
+static:{q5n:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5231,9 +5235,9 @@
 $isd3:true}}],["","",,R,{
 "^":"",
 JI:{
-"^":"SaM;GV,uo,nx,oM,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-goE:function(a){return a.GV},
-soE:function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},
+"^":"SaM;tH,uo,nx,oM,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+goE:function(a){return a.tH},
+soE:function(a,b){a.tH=this.ct(a,C.mr,a.tH,b)},
 gO9:function(a){return a.uo},
 sO9:function(a,b){a.uo=this.ct(a,C.S4,a.uo,b)},
 gFR:function(a){return a.nx},
@@ -5243,26 +5247,26 @@
 git:function(a){return a.oM},
 sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
 tn:[function(a,b){var z=a.oM
-a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,19,59],
-WM:[function(a){var z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)
+a.tH=this.ct(a,C.mr,a.tH,z)},"$1","ghy",2,0,19,59],
+Db:[function(a){var z=a.tH
+a.tH=this.ct(a,C.mr,z,z!==!0)
 a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","goJ",0,0,17],
 AZ:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
 if(a.nx!=null){a.uo=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)}},"$3","gDI",6,0,84,49,50,85],
+this.AV(a,a.tH!==!0,this.goJ(a))}else{z=a.tH
+a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,84,49,50,85],
 static:{U9:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.GV=!1
+a.tH=!1
 a.uo=!1
 a.nx=null
 a.oM=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5276,7 +5280,7 @@
 "^":"xc+Pi;",
 $isd3:true}}],["","",,H,{
 "^":"",
-Wp:function(){return new P.lj("No element")},
+DU:function(){return new P.lj("No element")},
 ar:function(){return new P.lj("Too few elements")},
 tb:function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
@@ -5286,7 +5290,8 @@
 if(c>=a.length)return-1
 for(z=c;z<d;++z){if(z>=a.length)return H.e(a,z)
 if(J.xC(a[z],b))return z}return-1},
-EHn:function(a,b,c){var z,y
+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
@@ -5403,9 +5408,9 @@
 for(;y<z;++y){b.$1(this.Zv(0,y))
 if(z!==this.gB(this))throw H.b(P.a4(this))}},
 gl0:function(a){return J.xC(this.gB(this),0)},
-gtH:function(a){if(J.xC(this.gB(this),0))throw H.b(H.Wp())
+gqG:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
 return this.Zv(0,0)},
-grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.Wp())
+grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
 return this.Zv(0,J.bI(this.gB(this),1))},
 tg:function(a,b){var z,y
 z=this.gB(this)
@@ -5431,16 +5436,14 @@
 for(;v<z;++v){w.IN+=b
 u=this.Zv(0,v)
 w.IN+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}y=w.IN
-return y.charCodeAt(0)==0?y:y}else{w=P.p9("")
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.IN}else{w=P.p9("")
 if(typeof z!=="number")return H.s(z)
 v=0
 for(;v<z;++v){u=this.Zv(0,v)
 w.IN+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}y=w.IN
-return y.charCodeAt(0)==0?y:y}},
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.IN}},
 ad:function(a,b){return P.mW.prototype.ad.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"MQ",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},30],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"Uy",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},30],
 es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -5463,8 +5466,8 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=y;++x}return z},
 br:function(a){return this.tt(a,!0)},
-Oe:function(a){var z,y,x
-z=P.fM(null,null,null,H.W8(this,"aL",0))
+zH:function(a){var z,y,x
+z=P.Ls(null,null,null,H.W8(this,"aL",0))
 y=0
 while(!0){x=this.gB(this)
 if(typeof x!=="number")return H.s(x)
@@ -5472,44 +5475,44 @@
 z.h(0,this.Zv(0,y));++y}return z},
 $isyN:true},
 bX:{
-"^":"aL;Hb,bS,Hx",
+"^":"aL;Hb,ay,Hx",
 gUD:function(){var z,y
 z=J.q8(this.Hb)
 y=this.Hx
 if(y==null||J.xZ(y,z))return z
 return y},
-gAs:function(){var z,y
+gdM:function(){var z,y
 z=J.q8(this.Hb)
-y=this.bS
+y=this.ay
 if(J.xZ(y,z))return z
 return y},
 gB:function(a){var z,y,x
 z=J.q8(this.Hb)
-y=this.bS
+y=this.ay
 if(J.J5(y,z))return 0
 x=this.Hx
 if(x==null||J.J5(x,z))return J.bI(z,y)
 return J.bI(x,y)},
-Zv:function(a,b){var z=J.WB(this.gAs(),b)
+Zv:function(a,b){var z=J.WB(this.gdM(),b)
 if(J.u6(b,0)||J.J5(z,this.gUD()))throw H.b(P.TE(b,0,this.gB(this)))
 return J.i9(this.Hb,z)},
 eR:function(a,b){var z,y
 if(J.u6(b,0))throw H.b(P.N(b))
-z=J.WB(this.bS,b)
+z=J.WB(this.ay,b)
 y=this.Hx
 if(y!=null&&J.J5(z,y)){y=new H.MB()
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y}return H.c1(this.Hb,z,y,H.u3(this,0))},
-qZ:function(a,b){var z,y,x
+rh:function(a,b){var z,y,x
 if(b<0)throw H.b(P.N(b))
 z=this.Hx
-y=this.bS
+y=this.ay
 if(z==null)return H.c1(this.Hb,y,J.WB(y,b),H.u3(this,0))
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
 return H.c1(this.Hb,y,x,H.u3(this,0))}},
 Hd:function(a,b,c,d){var z,y,x
-z=this.bS
+z=this.ay
 y=J.Wx(z)
 if(y.C(z,0))throw H.b(P.N(z))
 x=this.Hx
@@ -5519,17 +5522,17 @@
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
-"^":"a;Hb,SW,QX,lo",
-gl:function(){return this.lo},
+"^":"a;Hb,bd,QX,Ff",
+gl:function(){return this.Ff},
 G:function(){var z,y,x,w
 z=this.Hb
 y=J.U6(z)
 x=y.gB(z)
-if(!J.xC(this.SW,x))throw H.b(P.a4(z))
+if(!J.xC(this.bd,x))throw H.b(P.a4(z))
 w=this.QX
 if(typeof x!=="number")return H.s(x)
-if(w>=x){this.lo=null
-return!1}this.lo=y.Zv(z,w);++this.QX
+if(w>=x){this.Ff=null
+return!1}this.Ff=y.Zv(z,w);++this.QX
 return!0}},
 i1:{
 "^":"mW;Hb,Oh",
@@ -5539,8 +5542,8 @@
 return z},
 gB:function(a){return J.q8(this.Hb)},
 gl0:function(a){return J.FN(this.Hb)},
-gtH:function(a){return this.Mi(J.Es(this.Hb))},
-grZ:function(a){return this.Mi(J.OH(this.Hb))},
+gqG:function(a){return this.Mi(J.bT(this.Hb))},
+grZ:function(a){return this.Mi(J.MQ(this.Hb))},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 static:{K1:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
@@ -5549,13 +5552,13 @@
 "^":"i1;Hb,Oh",
 $isyN:true},
 MH:{
-"^":"Anv;lo,CL,Oh",
+"^":"Anv;Ff,CL,Oh",
 Mi:function(a){return this.Oh.$1(a)},
 G:function(){var z=this.CL
-if(z.G()){this.lo=this.Mi(z.gl())
-return!0}this.lo=null
+if(z.G()){this.Ff=this.Mi(z.gl())
+return!0}this.Ff=null
 return!1},
-gl:function(){return this.lo},
+gl:function(){return this.Ff},
 $asAnv:function(a,b){return[b]}},
 A8:{
 "^":"aL;ON,Oh",
@@ -5568,47 +5571,47 @@
 $isyN:true},
 U5:{
 "^":"mW;Hb,Oh",
-gA:function(a){var z=new H.Mo(J.mY(this.Hb),this.Oh)
+gA:function(a){var z=new H.vG(J.mY(this.Hb),this.Oh)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
-Mo:{
+vG:{
 "^":"Anv;CL,Oh",
 Mi:function(a){return this.Oh.$1(a)},
 G:function(){for(var z=this.CL;z.G();)if(this.Mi(z.gl())===!0)return!0
 return!1},
 gl:function(){return this.CL.gl()}},
-Fm:{
+oA:{
 "^":"mW;Hb,Oh",
-gA:function(a){var z=new H.P8(J.mY(this.Hb),this.Oh,C.MS,null)
+gA:function(a){var z=new H.yY(J.mY(this.Hb),this.Oh,C.MS,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]}},
-P8:{
-"^":"a;CL,Oh,Qc,lo",
+yY:{
+"^":"a;CL,Oh,WL,Ff",
 Mi:function(a){return this.Oh.$1(a)},
-gl:function(){return this.lo},
+gl:function(){return this.Ff},
 G:function(){var z,y
-z=this.Qc
+z=this.WL
 if(z==null)return!1
-for(y=this.CL;!z.G();){this.lo=null
-if(y.G()){this.Qc=null
+for(y=this.CL;!z.G();){this.Ff=null
+if(y.G()){this.WL=null
 z=J.mY(this.Mi(y.gl()))
-this.Qc=z}else return!1}this.lo=this.Qc.gl()
+this.WL=z}else return!1}this.Ff=this.WL.gl()
 return!0}},
 AM:{
 "^":"mW;Hb,u3",
 eR:function(a,b){if(b<0)throw H.b(P.N(b))
-return H.p6(this.Hb,this.u3+b,H.u3(this,0))},
+return H.ke(this.Hb,this.u3+b,H.u3(this,0))},
 gA:function(a){var z=this.Hb
-z=new H.Lh(z.gA(z),this.u3)
+z=new H.b2(z.gA(z),this.u3)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 jb:function(a,b,c){if(this.u3<0)throw H.b(P.KP(this.u3))},
-static:{p6:function(a,b,c){var z
+static:{ke:function(a,b,c){var z
 if(!!a.$isyN){z=H.VM(new H.wB(a,b),[c])
 z.jb(a,b,c)
-return z}return H.Xn(a,b,c)},Xn:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
+return z}return H.GJ(a,b,c)},GJ:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
 z.jb(a,b,c)
 return z}}},
 wB:{
@@ -5619,7 +5622,7 @@
 if(J.J5(y,0))return y
 return 0},
 $isyN:true},
-Lh:{
+b2:{
 "^":"Anv;CL,u3",
 G:function(){var z,y
 for(z=this.CL,y=0;y<this.u3;++y)z.G()
@@ -5632,13 +5635,13 @@
 aN:function(a,b){},
 gl0:function(a){return!0},
 gB:function(a){return 0},
-gtH:function(a){throw H.b(H.Wp())},
-grZ:function(a){throw H.b(H.Wp())},
+gqG:function(a){throw H.b(H.DU())},
+grZ:function(a){throw H.b(H.DU())},
 tg:function(a,b){return!1},
 Vr:function(a,b){return!1},
 zV:function(a,b){return""},
 ad:function(a,b){return this},
-ez:[function(a,b){return C.Ar},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQO",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"MB")},30],
+ez:[function(a,b){return C.Ar},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"MQ",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"MB")},30],
 eR:function(a,b){if(b<0)throw H.b(P.N(b))
 return this},
 tt:function(a,b){var z
@@ -5647,19 +5650,19 @@
 z.fixed$length=init
 z=H.VM(z,[H.u3(this,0)])}return z},
 br:function(a){return this.tt(a,!0)},
-Oe:function(a){return P.fM(null,null,null,H.u3(this,0))},
+zH:function(a){return P.Ls(null,null,null,H.u3(this,0))},
 $isyN:true},
 FuS:{
 "^":"a;",
 G:function(){return!1},
 gl:function(){return}},
-TNQ:{
+wb:{
 "^":"a;",
 static:{bQ:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.lo)},Ck:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.Ff)},Ck:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.Ff)===!0)return!0
 return!1},n3:function(a,b,c){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.lo)
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.Ff)
 return b},DQ:function(a,b){var z,y,x,w,v
 z=[]
 y=a.length
@@ -5670,14 +5673,14 @@
 if(y!==x)throw H.b(P.a4(a))}x=z.length
 if(x===y)return
 C.Nm.sB(a,x)
-for(w=0;w<z.length;++w)C.Nm.u(a,w,z[w])},Sz:function(a,b,c){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
-if(b.$1(y)===!0)return y}throw H.b(H.Wp())},ig:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},K0:function(a,b,c){var z=J.Wx(b)
+for(w=0;w<z.length;++w)C.Nm.u(a,w,z[w])},FU:function(a,b,c){var z,y
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.Ff
+if(b.$1(y)===!0)return y}throw H.b(H.DU())},ig:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},xF: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))},qG:function(a,b,c,d,e){var z,y,x,w
-H.K0(a,b,c)
+H.xF(a,b,c)
 z=J.bI(c,b)
 if(J.xC(z,0))return
 if(J.u6(e,0))throw H.b(P.u(e))
@@ -5706,20 +5709,20 @@
 "^":"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"))},
-aP:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 uk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
 oq:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-ReL:{
+JJ:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
 Mh:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-aP:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
@@ -5736,7 +5739,7 @@
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ark+ReL;",
+"^":"ark+JJ;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -5783,10 +5786,10 @@
 z=H.KT(z,[z,z]).Zg(a)
 if(z)return b.O8(a)
 else return b.cR(a)},
-nd:function(a,b){var z=P.Dt(b)
-P.cH(C.ny,new P.Sv(a,z))
+DJ:function(a,b){var z=P.Dt(b)
+P.cH(C.ny,new P.w4(a,z))
 return z},
-hz:function(a,b){var z,y,x,w,v
+Ne:function(a,b){var z,y,x,w,v
 z={}
 z.a=null
 z.b=null
@@ -5794,7 +5797,7 @@
 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.u3(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
+for(x=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);x.G();)x.Ff.Rx(new P.Tw(z,b,z.c++),y)
 y=z.c
 if(y===0)return P.Ab(C.xD,null)
 w=Array(y)
@@ -5833,7 +5836,7 @@
 $.X3.hk(y,x)}},
 QEz:[function(a){},"$1","yy",2,0,19,20],
 Z0:[function(a,b){$.X3.hk(a,b)},function(a){return P.Z0(a,null)},null,"$2","$1","bx",2,2,21,22,23,24],
-ax:[function(){},"$0","No",0,0,17],
+dL:[function(){},"$0","v3",0,0,17],
 FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
@@ -5844,20 +5847,20 @@
 else b.ZL(c,d)},
 TB:function(a,b){return new P.uR(a,b)},
 Bb:function(a,b,c){var z=a.Gv()
-if(!!J.x(z).$isb8)z.wM(new P.Ry(b,c))
+if(!!J.x(z).$isb8)z.wM(new P.QX(b,c))
 else b.In(c)},
 cH:function(a,b){var z
 if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
 SZ:function(a,b){var z
-if(J.xC($.X3,C.NU))return $.X3.lB(a,b)
+if(J.xC($.X3,C.NU))return $.X3.Ud(a,b)
 z=$.X3
-return z.lB(a,z.rO(b,!0))},
+return z.Ud(a,z.rO(b,!0))},
 YF:function(a,b){var z=a.gVs()
 return H.cy(z<0?0:z,b)},
 dp:function(a,b){var z=a.gVs()
-return H.jW(z<0?0:z,b)},
+return H.zw(z<0?0:z,b)},
 Us:function(a){var z=$.X3
 $.X3=a
 return z},
@@ -5891,8 +5894,8 @@
 z=P.Us(c)
 try{y=d.$2(e,f)
 return y}finally{$.X3=z}},"$6","xd",12,0,33,26,27,28,30,8,9],
-MU:[function(a,b,c,d){return d},"$4","u3Q",8,0,34,26,27,28,30],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,35,26,27,28,30],
+nI:[function(a,b,c,d){return d},"$4","W7",8,0,34,26,27,28,30],
+cQt:[function(a,b,c,d){return d},"$4","H9",8,0,35,26,27,28,30],
 bD:[function(a,b,c,d){return d},"$4","Dk",8,0,36,26,27,28,30],
 ZK:[function(a,b,c,d){var z,y
 if(C.NU!==c)d=c.ce(d)
@@ -5903,18 +5906,18 @@
 $.k8.aw=y
 $.k8=y}},"$4","yA",8,0,37,26,27,28,30],
 h8X:[function(a,b,c,d,e){return P.YF(d,C.NU!==c?c.ce(e):e)},"$5","zci",10,0,38,26,27,28,39,40],
-Gi:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.mS(e):e)},"$5","Uwa",10,0,41,26,27,28,39,40],
+HwS:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.mS(e):e)},"$5","RN",10,0,41,26,27,28,39,40],
 JjS:[function(a,b,c,d){H.qw(H.d(d))},"$4","uy1",8,0,42,26,27,28,43],
 CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,44],
-qc:[function(a,b,c,d,e){var z,y
+E1:[function(a,b,c,d,e){var z,y
 $.oK=P.jt()
-if(d==null)d=C.Qq
+if(d==null)d=C.zb
 else if(!J.x(d).$isyQ)throw H.b(P.u("ZoneSpecifications must be instantiated with the provided constructor."))
 if(e==null)z=!!J.x(c).$ism0?c.gSe():P.YM(null,null,null,null,null)
 else{z=P.YM(null,null,null,null,null)
-z.FV(0,e)}y=new P.FQ(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
-y.Ij(c,d,z)
-return y},"$5","xN",10,0,45,26,27,28,46,47],
+z.FV(0,e)}y=new P.l7(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
+y.bC(c,d,z)
+return y},"$5","OjX",10,0,45,26,27,28,46,47],
 th:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
@@ -5949,10 +5952,10 @@
 static:{Uz:function(a,b){return new P.O6(a,P.HR(a,b))},HR:function(a,b){if(b!=null)return b
 if(!!J.x(a).$isXS)return a.gI4()
 return}}},
-rk:{
+Ik:{
 "^":"u2;BT"},
-JIw:{
-"^":"Bx;ru@,iE@,SJ@,BT,dB,Tv,EU,t9,YM,Qe,LT",
+LR:{
+"^":"Bx;ru@,iE@,SJ@,BT,dB,Tv,EU,t9,YM,Qe,fk",
 gBT:function(){return this.BT},
 uO:function(a){var z=this.ru
 if(typeof z!=="number")return z.i()
@@ -5960,7 +5963,7 @@
 fc:function(){var z=this.ru
 if(typeof z!=="number")return z.w()
 this.ru=z^1},
-ga3:function(){var z=this.ru
+gh0:function(){var z=this.ru
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
 Pa:function(){var z=this.ru
@@ -5971,10 +5974,10 @@
 return(z&4)!==0},
 jy:[function(){},"$0","gb9",0,0,17],
 ie:[function(){},"$0","gxl",0,0,17],
-static:{"^":"E2b,HCK,id"}},
+static:{"^":"E2b,HCK,VCd"}},
 WVu:{
 "^":"a;iE@,SJ@",
-gvq:function(a){var z=new P.rk(this)
+gvq:function(a){var z=new P.Ik(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gUF:function(){return!1},
@@ -5991,13 +5994,13 @@
 a.sSJ(a)
 a.siE(a)},
 MI:function(a,b,c,d){var z,y,x
-if((this.YM&4)!==0){if(c==null)c=P.No()
-z=new P.EM($.X3,0,c)
+if((this.YM&4)!==0){if(c==null)c=P.v3()
+z=new P.to($.X3,0,c)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.q1()
 return z}z=$.X3
 y=d?1:0
-x=new P.JIw(null,null,null,this,null,null,null,z,y,null,null)
+x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
 x.$builtinTypeInfo=this.$builtinTypeInfo
 x.Cy(a,b,c,d,H.u3(this,0))
 x.SJ=x
@@ -6008,14 +6011,14 @@
 y.siE(x)
 this.SJ=x
 x.ru=this.YM&1
-if(this.iE===x)P.ot(this.bA)
+if(this.iE===x)P.ot(this.Ld)
 return x},
 rR:function(a){if(a.giE()===a)return
-if(a.ga3())a.Pa()
+if(a.gh0())a.Pa()
 else{this.pW(a)
 if((this.YM&2)===0&&this.iE===this)this.hg()}return},
-EB:function(a){},
-Mt:function(a){},
+Pm:function(a){},
+Bu:function(a){},
 Pq:function(){if((this.YM&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")},
 h:[function(a,b){if(this.YM>=4)throw H.b(this.Pq())
@@ -6026,14 +6029,14 @@
 if(z>=4)throw H.b(this.Pq())
 this.YM=z|4
 y=this.WH()
-this.Dd()
+this.PS()
 return y},
 Rg:function(a,b){this.MW(b)},
 MR:function(a,b){this.y7(a,b)},
-EC:function(){var z=this.Hz
+AN:function(){var z=this.Hz
 this.Hz=null
 this.YM&=4294967287
-C.bP.tZ(z)},
+C.jN.dS(z)},
 HI:function(a){var z,y,x,w
 z=this.YM
 if((z&2)!==0)throw H.b(P.w("Cannot fire new event. Controller is already firing an event"))
@@ -6057,7 +6060,7 @@
 hg:function(){if((this.YM&4)!==0&&this.Kj.YM===0)this.Kj.Xf(null)
 P.ot(this.Ro)}},
 zW:{
-"^":"WVu;bA,Ro,YM,iE,SJ,Hz,Kj",
+"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
 MW:function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.YM|=2
@@ -6066,39 +6069,39 @@
 if(this.iE===this)this.hg()
 return}this.HI(new P.tK(this,a))},
 y7:function(a,b){if(this.iE===this)return
-this.HI(new P.QG(this,a,b))},
-Dd:function(){if(this.iE!==this)this.HI(new P.Bg(this))
+this.HI(new P.OR(this,a,b))},
+PS:function(){if(this.iE!==this)this.HI(new P.Bg(this))
 else this.Kj.Xf(null)}},
 tK:{
 "^":"TpZ;a,b",
 $1:function(a){a.Rg(0,this.b)},
 $isEH:true,
 $signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
-QG:{
+OR:{
 "^":"TpZ;a,b,c",
 $1:function(a){a.MR(this.b,this.c)},
 $isEH:true,
 $signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 Bg:{
 "^":"TpZ;a",
-$1:function(a){a.EC()},
+$1:function(a){a.AN()},
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Mc",args:[[P.JIw,a]]}},this.a,"zW")}},
+$signature:function(){return H.oZ(function(a){return{func:"GJ",args:[[P.LR,a]]}},this.a,"zW")}},
 DL:{
-"^":"WVu;bA,Ro,YM,iE,SJ,Hz,Kj",
+"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
 MW:function(a){var z,y
-for(z=this.iE;z!==this;z=z.giE()){y=new P.LV(a,null)
+for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
 y.$builtinTypeInfo=[null]
 z.C2(y)}},
 y7:function(a,b){var z
 for(z=this.iE;z!==this;z=z.giE())z.C2(new P.Dn(a,b,null))},
-Dd:function(){var z=this.iE
+PS:function(){var z=this.iE
 if(z!==this)for(;z!==this;z=z.giE())z.C2(C.ZB)
 else this.Kj.Xf(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
-Sv:{
+w4:{
 "^":"TpZ:76;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.In(this.a.$0())}catch(x){w=H.Ru(x)
@@ -6130,17 +6133,17 @@
 if(z.YM!==0)H.vh(P.w("Future already completed"))
 z.Xf(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
-A5:{
+A0:{
 "^":"a;",
-$isA5:true},
+$isA0:true},
 Pf0:{
 "^":"a;",
-$isA5:true},
+$isA0:true},
 Zf:{
 "^":"Pf0;MM",
 j3:[function(a,b){var z=this.MM
 if(z.YM!==0)throw H.b(P.w("Future already completed"))
-z.Xf(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,128,22,20],
+z.Xf(b)},function(a){return this.j3(a,null)},"dS","$1","$0","gv6",0,2,128,22,20],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
@@ -6215,13 +6218,13 @@
 Nk:function(a,b){if(this.YM!==0)H.vh(P.w("Future already completed"))
 this.YM=1
 this.t9.wr(new P.ZL(this,a,b))},
-J9:function(a,b){this.Xf(a)},
 X8:function(a,b,c){this.Nk(a,b)},
+J9:function(a,b){this.Xf(a)},
 $isGc:true,
 $isb8:true,
 static:{"^":"ewM,JE,C3n,oN1,NKU",Dt:function(a){return H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[b])
 z.J9(a,b)
-return z},t5:function(a,b,c){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[c])
+return z},pz:function(a,b,c){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
 return z},k3:function(a,b){b.sKl(!0)
 a.Rx(new P.U7(b),new P.VL(b))},A9:function(a,b){b.sKl(!0)
@@ -6379,11 +6382,11 @@
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
-cb:{
+wS:{
 "^":"a;",
-ad:function(a,b){return H.VM(new P.fk(b,this),[H.W8(this,"cb",0)])},
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.W8(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"bp",ret:P.cb,args:[{func:"Pw",args:[a]}]}},this.$receiver,"cb")},133],
-yx:[function(a,b){return H.VM(new P.Bgk(b,this),[H.W8(this,"cb",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"T6w",ret:P.cb,args:[{func:"ZSr",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},133],
+ad:function(a,b){return H.VM(new P.fk(b,this),[H.W8(this,"wS",0)])},
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.W8(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},133],
+lM:[function(a,b){return H.VM(new P.AE(b,this),[H.W8(this,"wS",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"xv",ret:P.wS,args:[{func:"ZSr",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},133],
 zV:function(a,b){var z,y,x
 z={}
 y=P.Dt(P.qU)
@@ -6396,7 +6399,7 @@
 z={}
 y=P.Dt(P.SQ)
 z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.tG(y),y.gFa())
+z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.DO(y),y.gFa())
 return y},
 aN:function(a,b){var z,y
 z={}
@@ -6408,13 +6411,13 @@
 z={}
 y=P.Dt(P.SQ)
 z.a=null
-z.a=this.KR(new P.Ia(z,this,b,y),!0,new P.BSd(y),y.gFa())
+z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gFa())
 return y},
 gB:function(a){var z,y
 z={}
 y=P.Dt(P.KN)
 z.a=0
-this.KR(new P.B5(z),!0,new P.PI(z,y),y.gFa())
+this.KR(new P.PI(z),!0,new P.hh(z,y),y.gFa())
 return y},
 gl0:function(a){var z,y
 z={}
@@ -6423,32 +6426,32 @@
 z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gFa())
 return y},
 br:function(a){var z,y
-z=H.VM([],[H.W8(this,"cb",0)])
-y=P.Dt([P.WO,H.W8(this,"cb",0)])
+z=H.VM([],[H.W8(this,"wS",0)])
+y=P.Dt([P.WO,H.W8(this,"wS",0)])
 this.KR(new P.lv(this,z),!0,new P.Ul(z,y),y.gFa())
 return y},
-Oe:function(a){var z,y
-z=P.fM(null,null,null,H.W8(this,"cb",0))
-y=P.Dt([P.z5,H.W8(this,"cb",0)])
+zH:function(a){var z,y
+z=P.Ls(null,null,null,H.W8(this,"wS",0))
+y=P.Dt([P.Ol,H.W8(this,"wS",0)])
 this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gFa())
 return y},
 eR:function(a,b){var z=H.VM(new P.pt(b,this),[null])
-z.qI(this,b,null)
+z.mh(this,b,null)
 return z},
-gtH:function(a){var z,y
+gqG:function(a){var z,y
 z={}
-y=P.Dt(H.W8(this,"cb",0))
+y=P.Dt(H.W8(this,"wS",0))
 z.a=null
 z.a=this.KR(new P.lU(z,this,y),!0,new P.xp(y),y.gFa())
 return y},
 grZ:function(a){var z,y
 z={}
-y=P.Dt(H.W8(this,"cb",0))
+y=P.Dt(H.W8(this,"wS",0))
 z.a=null
 z.b=!1
 this.KR(new P.UH(z,this),!0,new P.eI(z,y),y.gFa())
 return y},
-$iscb:true},
+$iswS:true},
 dW3:{
 "^":"TpZ;a,b,c,d,e",
 $1:[function(a){var z,y,x,w,v
@@ -6460,25 +6463,24 @@
 y=new H.oP(w,null)
 P.NX(x.a,this.d,z,y)}},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 QCh:{
 "^":"TpZ:12;f",
 $1:[function(a){this.f.yk(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Lp0:{
 "^":"TpZ:76;UI,bK",
-$0:[function(){var z=this.bK.IN
-this.UI.In(z.charCodeAt(0)==0?z:z)},"$0",null,0,0,null,"call"],
+$0:[function(){this.UI.In(this.bK.IN)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Sd:{
 "^":"TpZ;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.bi(this.c,a),new P.z2(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
+P.FE(new P.LB(this.c,a),new P.z2(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
-bi:{
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+LB:{
 "^":"TpZ:76;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
@@ -6486,20 +6488,20 @@
 "^":"TpZ:135;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-tG:{
+DO:{
 "^":"TpZ:76;bK",
 $0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"TpZ;a,b,c,d",
-$1:[function(a){P.FE(new P.at(this.c,a),new P.mj(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,134,"call"],
+$1:[function(a){P.FE(new P.Rl(this.c,a),new P.at(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
-at:{
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+Rl:{
 "^":"TpZ:76;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
-mj:{
+at:{
 "^":"TpZ:12;",
 $1:function(a){},
 $isEH:true},
@@ -6507,14 +6509,14 @@
 "^":"TpZ:76;UI",
 $0:[function(){this.UI.In(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Ia:{
+Ee:{
 "^":"TpZ;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
 P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 WN:{
 "^":"TpZ:76;e,f",
 $0:function(){return this.e.$1(this.f)},
@@ -6523,15 +6525,15 @@
 "^":"TpZ:135;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-BSd:{
+Ia:{
 "^":"TpZ:76;bK",
 $0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
-B5:{
+PI:{
 "^":"TpZ:12;a",
 $1:[function(a){++this.a.a},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-PI:{
+hh:{
 "^":"TpZ:76;a,b",
 $0:[function(){this.b.In(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -6547,7 +6549,7 @@
 "^":"TpZ;a,b",
 $1:[function(a){this.b.push(a)},"$1",null,2,0,null,124,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
 Ul:{
 "^":"TpZ:76;c,d",
 $0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
@@ -6556,7 +6558,7 @@
 "^":"TpZ;a,b",
 $1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,124,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
 yZ:{
 "^":"TpZ:76;c,d",
 $0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
@@ -6565,11 +6567,11 @@
 "^":"TpZ;a,b,c",
 $1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 xp:{
 "^":"TpZ:76;d",
 $0:[function(){var z,y,x,w
-try{x=H.Wp()
+try{x=H.DU()
 throw H.b(x)}catch(w){x=H.Ru(w)
 z=x
 y=new H.oP(w,null)
@@ -6581,13 +6583,13 @@
 z.b=!0
 z.a=a},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 eI:{
 "^":"TpZ:76;a,c",
 $0:[function(){var z,y,x,w
 x=this.a
 if(x.b){this.c.In(x.a)
-return}try{x=H.Wp()
+return}try{x=H.DU()
 throw H.b(x)}catch(w){x=H.Ru(w)
 z=x
 y=new H.oP(w,null)
@@ -6597,7 +6599,7 @@
 "^":"a;",
 $isyX:true},
 u2:{
-"^":"aN;",
+"^":"ezY;",
 k0:function(a,b,c,d){return this.BT.MI(a,b,c,d)},
 giO:function(a){return(H.eQ(this.BT)^892482866)>>>0},
 n:function(a,b){if(b==null)return!1
@@ -6608,30 +6610,30 @@
 Bx:{
 "^":"KA;BT<",
 cZ:function(){return this.gBT().rR(this)},
-jy:[function(){this.gBT().EB(this)},"$0","gb9",0,0,17],
-ie:[function(){this.gBT().Mt(this)},"$0","gxl",0,0,17]},
+jy:[function(){this.gBT().Pm(this)},"$0","gb9",0,0,17],
+ie:[function(){this.gBT().Bu(this)},"$0","gxl",0,0,17]},
 NOT:{
 "^":"a;"},
 KA:{
-"^":"a;dB,Tv<,EU,t9<,YM,Qe,LT",
+"^":"a;dB,Tv<,EU,t9<,YM,Qe,fk",
 fm:function(a,b){if(b==null)b=P.bx()
 this.Tv=P.VH(b,this.t9)},
 Fv:[function(a,b){var z=this.YM
 if((z&8)!==0)return
 this.YM=(z+128|4)>>>0
 if(b!=null)b.wM(this.gDQ(this))
-if(z<128&&this.LT!=null)this.LT.b7()
-if((z&4)===0&&(this.YM&32)===0)this.uz(this.gb9())},function(a){return this.Fv(a,null)},"zd","$1","$0","gX0",0,2,136,22,137],
+if(z<128&&this.fk!=null)this.fk.IO()
+if((z&4)===0&&(this.YM&32)===0)this.Ge(this.gb9())},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,136,22,137],
 QE:[function(a){var z=this.YM
 if((z&8)!==0)return
 if(z>=128){z-=128
 this.YM=z
-if(z<128){if((z&64)!==0){z=this.LT
+if(z<128){if((z&64)!==0){z=this.fk
 z=!z.gl0(z)}else z=!1
-if(z)this.LT.t2(this)
+if(z)this.fk.t2(this)
 else{z=(this.YM&4294967291)>>>0
 this.YM=z
-if((z&32)===0)this.uz(this.gxl())}}}},"$0","gDQ",0,0,17],
+if((z&32)===0)this.Ge(this.gxl())}}}},"$0","gDQ",0,0,17],
 Gv:function(){var z=(this.YM&4294967279)>>>0
 this.YM=z
 if((z&8)!==0)return this.Qe
@@ -6640,39 +6642,39 @@
 gUF:function(){return this.YM>=128},
 WN:function(){var z=(this.YM|8)>>>0
 this.YM=z
-if((z&64)!==0)this.LT.b7()
-if((this.YM&32)===0)this.LT=null
+if((z&64)!==0)this.fk.IO()
+if((this.YM&32)===0)this.fk=null
 this.Qe=this.cZ()},
 Rg:function(a,b){var z=this.YM
 if((z&8)!==0)return
 if(z<32)this.MW(b)
-else this.C2(H.VM(new P.LV(b,null),[null]))},
+else this.C2(H.VM(new P.fZ(b,null),[null]))},
 MR:function(a,b){var z=this.YM
 if((z&8)!==0)return
 if(z<32)this.y7(a,b)
 else this.C2(new P.Dn(a,b,null))},
-EC:function(){var z=this.YM
+AN:function(){var z=this.YM
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.YM=z
-if(z<32)this.Dd()
+if(z<32)this.PS()
 else this.C2(C.ZB)},
 jy:[function(){},"$0","gb9",0,0,17],
 ie:[function(){},"$0","gxl",0,0,17],
 cZ:function(){return},
 C2:function(a){var z,y
-z=this.LT
+z=this.fk
 if(z==null){z=new P.Qk(null,null,0)
-this.LT=z}z.h(0,a)
+this.fk=z}z.h(0,a)
 y=this.YM
 if((y&64)===0){y=(y|64)>>>0
 this.YM=y
-if(y<128)this.LT.t2(this)}},
+if(y<128)this.fk.t2(this)}},
 MW:function(a){var z=this.YM
 this.YM=(z|32)>>>0
 this.t9.m1(this.dB,a)
 this.YM=(this.YM&4294967263)>>>0
-this.QV((z&4)!==0)},
+this.Iy((z&4)!==0)},
 y7:function(a,b){var z,y
 z=this.YM
 y=new P.x1(this,a,b)
@@ -6681,42 +6683,42 @@
 z=this.Qe
 if(!!J.x(z).$isb8)z.wM(y)
 else y.$0()}else{y.$0()
-this.QV((z&4)!==0)}},
-Dd:function(){var z,y
-z=new P.yP(this)
+this.Iy((z&4)!==0)}},
+PS:function(){var z,y
+z=new P.qB(this)
 this.WN()
 this.YM=(this.YM|16)>>>0
 y=this.Qe
 if(!!J.x(y).$isb8)y.wM(z)
 else z.$0()},
-uz:function(a){var z=this.YM
+Ge:function(a){var z=this.YM
 this.YM=(z|32)>>>0
 a.$0()
 this.YM=(this.YM&4294967263)>>>0
-this.QV((z&4)!==0)},
-QV:function(a){var z,y
-if((this.YM&64)!==0){z=this.LT
+this.Iy((z&4)!==0)},
+Iy:function(a){var z,y
+if((this.YM&64)!==0){z=this.fk
 z=z.gl0(z)}else z=!1
 if(z){z=(this.YM&4294967231)>>>0
 this.YM=z
-if((z&4)!==0)if(z<128){z=this.LT
+if((z&4)!==0)if(z<128){z=this.fk
 z=z==null||z.gl0(z)}else z=!1
 else z=!1
 if(z)this.YM=(this.YM&4294967291)>>>0}for(;!0;a=y){z=this.YM
-if((z&8)!==0){this.LT=null
+if((z&8)!==0){this.fk=null
 return}y=(z&4)!==0
 if(a===y)break
 this.YM=(z^32)>>>0
 if(y)this.jy()
 else this.ie()
 this.YM=(this.YM&4294967263)>>>0}z=this.YM
-if((z&64)!==0&&z<128)this.LT.t2(this)},
+if((z&64)!==0&&z<128)this.fk.t2(this)},
 Cy:function(a,b,c,d,e){var z=this.t9
 this.dB=z.cR(a)
 this.fm(0,b)
-this.EU=z.Al(c==null?P.No():c)},
+this.EU=z.Al(c==null?P.v3():c)},
 $isyX:true,
-static:{"^":"Xx,kMJ,Q9e,Ir9,nav,Dr,JAK,N3S,bsZ",T6:function(a,b,c,d,e){var z,y
+static:{"^":"Xx,kMJ,Q9e,Ir9,nav,lkp,JAK,N3S,bsZ",MG:function(a,b,c,d,e){var z,y
 z=$.X3
 y=d?1:0
 y=H.VM(new P.KA(null,null,null,z,y,null,null),[e])
@@ -6739,7 +6741,7 @@
 else w.m1(u,v)
 z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
-yP:{
+qB:{
 "^":"TpZ:17;a",
 $0:[function(){var z,y
 z=this.a
@@ -6749,15 +6751,15 @@
 z.t9.ww(z.EU)
 z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
-aN:{
-"^":"cb;",
+ezY:{
+"^":"wS;",
 KR:function(a,b,c,d){return this.k0(a,d,c,!0===b)},
 yI:function(a){return this.KR(a,null,null,null)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
-k0:function(a,b,c,d){return P.T6(a,b,c,d,H.u3(this,0))}},
+k0:function(a,b,c,d){return P.MG(a,b,c,d,H.u3(this,0))}},
 fIm:{
 "^":"a;aw@"},
-LV:{
+fZ:{
 "^":"fIm;P>,aw",
 dP:function(a){a.MW(this.P)}},
 Dn:{
@@ -6765,7 +6767,7 @@
 dP:function(a){a.y7(this.kc,this.I4)}},
 yRf:{
 "^":"a;",
-dP:function(a){a.Dd()},
+dP:function(a){a.PS()},
 gaw:function(){return},
 saw:function(a){throw H.b(P.w("No events after a done."))}},
 B3P:{
@@ -6773,17 +6775,17 @@
 t2:function(a){var z=this.YM
 if(z===1)return
 if(z>=1){this.YM=1
-return}P.rb(new P.lg(this,a))
+return}P.rb(new P.CR(this,a))
 this.YM=1},
-b7:function(){if(this.YM===1)this.YM=3}},
-lg:{
+IO:function(){if(this.YM===1)this.YM=3}},
+CR:{
 "^":"TpZ:76;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.YM
 z.YM=0
 if(y===3)return
-z.Ge(this.b)},"$0",null,0,0,null,"call"],
+z.vG(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Qk:{
 "^":"B3P;zR,N6,YM",
@@ -6792,7 +6794,7 @@
 if(z==null){this.N6=b
 this.zR=b}else{z.saw(b)
 this.N6=b}},
-Ge:function(a){var z,y
+vG:function(a){var z,y
 z=this.zR
 y=z.gaw()
 this.zR=y
@@ -6801,25 +6803,26 @@
 V1:function(a){if(this.YM===1)this.YM=3
 this.N6=null
 this.zR=null}},
-EM:{
+to:{
 "^":"a;t9<,YM,EU",
 gUF:function(){return this.YM>=4},
 q1:function(){if((this.YM&2)!==0)return
-this.t9.wr(this.gpx())
+this.t9.wr(this.gKS())
 this.YM=(this.YM|2)>>>0},
 fm:function(a,b){},
 Fv:[function(a,b){this.YM+=4
-if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"zd","$1","$0","gX0",0,2,136,22,137],
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,136,22,137],
 QE:[function(a){var z=this.YM
 if(z>=4){z-=4
 this.YM=z
 if(z<4&&(z&1)===0)this.q1()}},"$0","gDQ",0,0,17],
 Gv:function(){return},
-Dd:[function(){var z=(this.YM&4294967293)>>>0
+PS:[function(){var z=(this.YM&4294967293)>>>0
 this.YM=z
 if(z>=4)return
 this.YM=(z|1)>>>0
-this.t9.ww(this.EU)},"$0","gpx",0,0,17],
+z=this.EU
+if(z!=null)this.t9.ww(z)},"$0","gKS",0,0,17],
 $isyX:true,
 static:{"^":"FkV,ED7,ELg"}},
 ap:{
@@ -6830,12 +6833,12 @@
 "^":"TpZ:138;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
-Ry:{
+QX:{
 "^":"TpZ:76;a,b",
 $0:[function(){return this.a.In(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 og:{
-"^":"cb;",
+"^":"wS;",
 KR:function(a,b,c,d){var z,y,x,w
 b=!0===b
 z=H.W8(this,"og",0)
@@ -6849,29 +6852,29 @@
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
 FC:function(a,b){b.Rg(0,a)},
-$ascb:function(a,b){return[b]}},
+$aswS:function(a,b){return[b]}},
 fB:{
-"^":"KA;HQ,lI,dB,Tv,EU,t9,YM,Qe,LT",
+"^":"KA;m7,lI,dB,Tv,EU,t9,YM,Qe,fk",
 Rg:function(a,b){if((this.YM&2)!==0)return
 P.KA.prototype.Rg.call(this,this,b)},
 MR:function(a,b){if((this.YM&2)!==0)return
 P.KA.prototype.MR.call(this,a,b)},
 jy:[function(){var z=this.lI
 if(z==null)return
-z.zd(0)},"$0","gb9",0,0,17],
+z.WJ(0)},"$0","gb9",0,0,17],
 ie:[function(){var z=this.lI
 if(z==null)return
 z.QE(0)},"$0","gxl",0,0,17],
 cZ:function(){var z=this.lI
 if(z!=null){this.lI=null
 z.Gv()}return},
-Iu:[function(a){this.HQ.FC(a,this)},"$1","gwU",2,0,function(){return H.oZ(function(a,b){return{func:"XJ",void:true,args:[a]}},this.$receiver,"fB")},124],
-wK:[function(a,b){this.MR(a,b)},"$2","gPr",4,0,139,23,24],
-oZ:[function(){this.EC()},"$0","gos",0,0,17],
+Iu:[function(a){this.m7.FC(a,this)},"$1","gwU",2,0,function(){return H.oZ(function(a,b){return{func:"XJ",void:true,args:[a]}},this.$receiver,"fB")},124],
+SW:[function(a,b){this.MR(a,b)},"$2","gPr",4,0,139,23,24],
+oZ:[function(){this.AN()},"$0","gos",0,0,17],
 JC:function(a,b,c,d,e,f,g){var z,y
 z=this.gwU()
 y=this.gPr()
-this.lI=this.HQ.Sb.zC(z,this.gos(),y)},
+this.lI=this.m7.Sb.zC(z,this.gos(),y)},
 $asKA:function(a,b){return[b]},
 $asyX:function(a,b){return[b]}},
 fk:{
@@ -6885,7 +6888,7 @@
 b.MR(y,x)
 return}if(z===!0)J.wx(b,a)},
 $asog:function(a){return[a,a]},
-$ascb:null},
+$aswS:null},
 c9:{
 "^":"og;xj,Sb",
 Eh:function(a){return this.xj.$1(a)},
@@ -6896,11 +6899,11 @@
 x=new H.oP(w,null)
 b.MR(y,x)
 return}J.wx(b,z)}},
-Bgk:{
+AE:{
 "^":"og;yj,Sb",
-hq:function(a){return this.yj.$1(a)},
+bZ:function(a){return this.yj.$1(a)},
 FC:function(a,b){var z,y,x,w,v
-try{for(w=J.mY(this.hq(a));w.G();){z=w.gl()
+try{for(w=J.mY(this.bZ(a));w.G();){z=w.gl()
 J.wx(b,z)}}catch(v){w=H.Ru(v)
 y=w
 x=new H.oP(v,null)
@@ -6910,28 +6913,28 @@
 FC:function(a,b){var z=this.Km
 if(z>0){this.Km=z-1
 return}b.Rg(0,a)},
-qI:function(a,b,c){if(b<0)throw H.b(P.u(b))},
+mh:function(a,b,c){if(b<0)throw H.b(P.u(b))},
 $asog:function(a){return[a,a]},
-$ascb:null},
+$aswS:null},
 kWp:{
 "^":"a;"},
-Ls:{
+Uf:{
 "^":"a;M5,ig>"},
 n7:{
 "^":"a;"},
 yQ:{
-"^":"a;lR,cP,Jl,jH,Ka,Xp,o2,yS,Zqn,ib,JS,nw",
+"^":"a;lR,cP,U1,jH,Ka,Xp,fbF,rb,Zqn,rFb,JS,nw",
 hk:function(a,b){return this.lR.$2(a,b)},
 Gr:function(a){return this.cP.$1(a)},
-FI:function(a,b){return this.Jl.$2(a,b)},
+FI:function(a,b){return this.U1.$2(a,b)},
 mg:function(a,b,c){return this.jH.$3(a,b,c)},
 Al:function(a){return this.Ka.$1(a)},
 cR:function(a){return this.Xp.$1(a)},
-O8:function(a){return this.o2.$1(a)},
-wr:function(a){return this.yS.$1(a)},
-RK:function(a,b){return this.yS.$2(a,b)},
+O8:function(a){return this.fbF.$1(a)},
+wr:function(a){return this.rb.$1(a)},
+RK:function(a,b){return this.rb.$2(a,b)},
 uN:function(a,b){return this.Zqn.$2(a,b)},
-lB:function(a,b){return this.ib.$2(a,b)},
+Ud:function(a,b){return this.rFb.$2(a,b)},
 Ch:function(a,b){return this.JS.$1(b)},
 iT:function(a){return this.nw.$1$specification(a)},
 $isyQ:true},
@@ -6949,8 +6952,8 @@
 "^":"a;",
 fC:function(a){return this.gF7()===a.gF7()},
 $ism0:true},
-FQ:{
-"^":"m0;JY<,W7<,HG<,O5<,kX<,c5<,Of<,x6<,Jy<,kP<,Gt<,pB<,ye,eT>,Se<",
+l7:{
+"^":"m0;JY<,vr<,HG<,Tr<,kX<,c5<,Of<,x6<,Jy<,kP<,uI<,pB<,ye,eT>,Se<",
 gyL:function(){var z=this.ye
 if(z!=null)return z
 z=new P.Id(this)
@@ -6980,12 +6983,12 @@
 else return new P.Yn(this,z)},
 ce:function(a){return this.xi(a,!0)},
 rO:function(a,b){var z=this.cR(a)
-if(b)return new P.CN(this,z)
-else return new P.eP(this,z)},
+if(b)return new P.eP(this,z)
+else return new P.aQ(this,z)},
 mS:function(a){return this.rO(a,!0)},
 PT:function(a,b){var z=this.O8(a)
 if(b)return new P.N9(this,z)
-else return new P.aR(this,z)},
+else return new P.lHf(this,z)},
 t:function(a,b){var z,y,x,w
 z=this.Se
 y=z.t(0,b)
@@ -7000,13 +7003,13 @@
 x=P.Cw(y)
 return z.ig.$5(y,x,this,a,b)},
 c6:function(a,b){var z,y,x
-z=this.Gt
+z=this.uI
 y=z.M5
 x=P.Cw(y)
 return z.ig.$5(y,x,this,a,b)},
 iT:function(a){return this.c6(a,null)},
 Gr:function(a){var z,y,x
-z=this.W7
+z=this.vr
 y=z.M5
 x=P.Cw(y)
 return z.ig.$4(y,x,this,a)},
@@ -7021,7 +7024,7 @@
 x=P.Cw(y)
 return z.ig.$6(y,x,this,a,b,c)},
 Al:function(a){var z,y,x
-z=this.O5
+z=this.Tr
 y=z.M5
 x=P.Cw(y)
 return z.ig.$4(y,x,this,a)},
@@ -7045,7 +7048,7 @@
 y=z.M5
 x=P.Cw(y)
 return z.ig.$5(y,x,this,a,b)},
-lB:function(a,b){var z,y,x
+Ud:function(a,b){var z,y,x
 z=this.Jy
 y=z.M5
 x=P.Cw(y)
@@ -7055,20 +7058,20 @@
 y=z.M5
 x=P.Cw(y)
 return z.ig.$4(y,x,this,b)},
-Ij:function(a,b,c){var z
-this.W7=this.eT.gW7()
+bC:function(a,b,c){var z
+this.vr=this.eT.gvr()
 this.JY=this.eT.gJY()
 this.HG=this.eT.gHG()
 z=b.Ka
-this.O5=z!=null?new P.Ls(this,z):this.eT.gO5()
+this.Tr=z!=null?new P.Uf(this,z):this.eT.gTr()
 z=b.Xp
-this.kX=z!=null?new P.Ls(this,z):this.eT.gkX()
+this.kX=z!=null?new P.Uf(this,z):this.eT.gkX()
 this.c5=this.eT.gc5()
 this.Of=this.eT.gOf()
 this.x6=this.eT.gx6()
 this.Jy=this.eT.gJy()
 this.kP=this.eT.gkP()
-this.Gt=this.eT.gGt()
+this.uI=this.eT.guI()
 this.pB=this.eT.gpB()}},
 OJ:{
 "^":"TpZ:76;a,b",
@@ -7078,11 +7081,11 @@
 "^":"TpZ:76;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
-CN:{
+eP:{
 "^":"TpZ:12;a,b",
 $1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
-eP:{
+aQ:{
 "^":"TpZ:12;c,d",
 $1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
@@ -7090,7 +7093,7 @@
 "^":"TpZ:81;a,b",
 $2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true},
-aR:{
+lHf:{
 "^":"TpZ:81;c,d",
 $2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true},
@@ -7100,20 +7103,20 @@
 $isEH:true},
 R81:{
 "^":"m0;",
-gW7:function(){return C.lk},
+gvr:function(){return C.lk},
 gJY:function(){return C.Yl},
 gHG:function(){return C.Gu},
-gO5:function(){return C.pj},
-gkX:function(){return C.pm},
+gTr:function(){return C.pj},
+gkX:function(){return C.F6},
 gc5:function(){return C.Xk},
 gOf:function(){return C.Zc},
 gx6:function(){return C.Sq},
-gJy:function(){return C.rj},
+gJy:function(){return C.NA},
 gkP:function(){return C.uo},
-gGt:function(){return C.mc},
+guI:function(){return C.mc},
 gpB:function(){return C.Rt},
 geT:function(a){return},
-gSe:function(){return $.wb()},
+gSe:function(){return $.OL()},
 gyL:function(){var z=$.Cb
 if(z!=null)return z
 z=new P.Id(this)
@@ -7147,11 +7150,11 @@
 rO:function(a,b){if(b)return new P.pQ(this,a)
 else return new P.Ky(this,a)},
 mS:function(a){return this.rO(a,!0)},
-PT:function(a,b){if(b)return new P.SJ(this,a)
-else return new P.Ze(this,a)},
+PT:function(a,b){if(b)return new P.Ze(this,a)
+else return new P.dM(this,a)},
 t:function(a,b){return},
 hk:function(a,b){return P.CK(null,null,this,a,b)},
-c6:function(a,b){return P.qc(null,null,this,a,b)},
+c6:function(a,b){return P.E1(null,null,this,a,b)},
 iT:function(a){return this.c6(a,null)},
 Gr:function(a){if($.X3===C.NU)return a.$0()
 return P.Ki(null,null,this,a)},
@@ -7164,7 +7167,7 @@
 O8:function(a){return a},
 wr:function(a){P.ZK(null,null,this,a)},
 uN:function(a,b){return P.YF(a,b)},
-lB:function(a,b){return P.dp(a,b)},
+Ud:function(a,b){return P.dp(a,b)},
 Ch:function(a,b){H.qw(b)},
 static:{"^":"ln,Cb"}},
 hj:{
@@ -7183,25 +7186,25 @@
 "^":"TpZ:12;c,d",
 $1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
-SJ:{
+Ze:{
 "^":"TpZ:81;a,b",
 $2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true},
-Ze:{
+dM:{
 "^":"TpZ:81;c,d",
 $2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true}}],["","",,P,{
 "^":"",
 EF:function(a,b,c){return H.dJ(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-Ou4:[function(a,b){return J.xC(a,b)},"$2","bUo",4,0,48,49,50],
+TQ:[function(a,b){return J.xC(a,b)},"$2","fc",4,0,48,49,50],
 T9:[function(a){return J.v1(a)},"$1","py",2,0,51,49],
 YM:function(a,b,c,d,e){var z
 if(a==null){z=new P.bA(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
 return z}b=P.py()
 return P.uP(a,b,c,d,e)},
-l1:function(a,b,c,d){return H.VM(new P.Rr(0,null,null,null,null),[d])},
+l1:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
 B4:function(a,b,c){var z,y
 if(P.nH(a)){if(b==="("&&c===")")return"(...)"
 return b+"..."+c}z=[]
@@ -7211,8 +7214,7 @@
 y.pop()}y=P.p9(b)
 y.We(z,", ")
 y.KF(c)
-y=y.IN
-return y.charCodeAt(0)==0?y:y},
+return y.IN},
 WE:function(a,b,c){var z,y
 if(P.nH(a))return b+"..."+c
 z=P.p9(b)
@@ -7220,8 +7222,7 @@
 y.push(a)
 try{z.We(a,", ")}finally{if(0>=y.length)return H.e(y,0)
 y.pop()}z.KF(c)
-y=z.gIN()
-return y.charCodeAt(0)==0?y:y},
+return z.gIN()},
 nH:function(a){var z,y
 for(z=0;y=$.Ex(),z<y.length;++z)if(a===y[z])return!0
 return!1},
@@ -7258,13 +7259,9 @@
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
 b.push(v)},
-L5:function(a,b,c,d,e){var z=new P.YB(0,null,null,null,null,null,0)
-z.$builtinTypeInfo=[d,e]
-return z},
-fM:function(a,b,c,d){var z=new P.D0(0,null,null,null,null,null,0)
-z.$builtinTypeInfo=[d]
-return z},
-fd:function(a,b,c){var z,y,x,w,v
+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.D0(0,null,null,null,null,null,0),[d])},
+Vi:function(a,b,c){var z,y,x,w,v
 z=[]
 y=J.U6(a)
 x=y.gB(a)
@@ -7282,8 +7279,7 @@
 J.Me(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.Ex()
 if(0>=z.length)return H.e(z,0)
-z.pop()}z=y.gIN()
-return z.charCodeAt(0)==0?z:z},
+z.pop()}return y.gIN()},
 bA:{
 "^":"a;X5,Mb,cG,Cs,MV",
 gB:function(a){return this.X5},
@@ -7298,7 +7294,7 @@
 KY:function(a){var z=this.Cs
 if(z==null)return!1
 return this.DF(z[this.rk(a)],a)>=0},
-FV:function(a,b){J.Me(b,new P.DJ(this))},
+FV:function(a,b){J.Me(b,new P.ef(this))},
 t:function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null)y=null
@@ -7329,11 +7325,6 @@
 if(w>=0)x[w+1]=b
 else{x.push(a,b);++this.X5
 this.MV=null}}},
-to:function(a,b,c){var z
-if(this.NZ(0,b))return this.t(0,b)
-z=c.$0()
-this.u(0,b,z)
-return z},
 Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.Mb,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.cG,b)
 else return this.qg(b)},
@@ -7399,7 +7390,7 @@
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
-DJ:{
+ef:{
 "^":"TpZ;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true,
@@ -7623,12 +7614,12 @@
 return!1}else{this.fD=z.gv8(z)
 this.Qx=this.Qx.gtL()
 return!0}}}},
-Rr:{
+jg:{
 "^":"u3T;X5,Mb,cG,Cs,vw",
-iL:function(){var z=new P.Rr(0,null,null,null,null)
+iL:function(){var z=new P.jg(0,null,null,null,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gA:function(a){var z=new P.cN(this,this.Ed(),0,null)
+gA:function(a){var z=new P.cN(this,this.ij(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gB:function(a){return this.X5},
@@ -7645,8 +7636,8 @@
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
-return this.Ix(a)},
-Ix:function(a){var z,y,x
+return this.GP(a)},
+GP:function(a){var z,y,x
 z=this.Cs
 if(z==null)return
 y=z[this.rk(a)]
@@ -7667,7 +7658,7 @@
 x=y}return this.bQ(x,b)}else return this.B7(0,b)},
 B7:function(a,b){var z,y,x
 z=this.Cs
-if(z==null){z=P.Ym()
+if(z==null){z=P.yT()
 this.Cs=z}y=this.rk(b)
 x=z[y]
 if(x==null)z[y]=[b]
@@ -7694,7 +7685,7 @@
 this.cG=null
 this.Mb=null
 this.X5=0}},
-Ed:function(){var z,y,x,w,v,u,t,s,r,q,p,o
+ij:function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.vw
 if(z!=null)return z
 y=Array(this.X5)
@@ -7726,11 +7717,11 @@
 z=a.length
 for(y=0;y<z;++y)if(J.xC(a[y],b))return y
 return-1},
-$isz5:true,
+$isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{Ym:function(){var z=Object.create(null)
+static:{yT:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
@@ -7770,21 +7761,21 @@
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
-else return this.Ix(a)},
-Ix:function(a){var z,y,x
+else return this.GP(a)},
+GP:function(a){var z,y,x
 z=this.Cs
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
 if(x<0)return
-return J.JU(J.UQ(y,x))},
+return J.Nq(J.UQ(y,x))},
 aN:function(a,b){var z,y
 z=this.HH
 y=this.HU
 for(;z!=null;){b.$1(z.gGc(z))
 if(y!==this.HU)throw H.b(P.a4(this))
 z=z.gtL()}},
-gtH:function(a){var z=this.HH
+gqG:function(a){var z=this.HH
 if(z==null)throw H.b(P.w("No elements"))
 return z.gGc(z)},
 grZ:function(a){var z=this.Nz
@@ -7868,9 +7859,9 @@
 DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.xC(J.JU(a[y]),b))return y
+for(y=0;y<z;++y)if(J.xC(J.Nq(a[y]),b))return y
 return-1},
-$isz5:true,
+$isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -7898,14 +7889,14 @@
 return z[b]}},
 u3T:{
 "^":"Vj5;",
-Oe:function(a){var z=this.iL()
+zH:function(a){var z=this.iL()
 z.FV(0,this)
 return z}},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.W8(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"xPo",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
+ez:[function(a,b){return H.K1(this,b,H.W8(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQO",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
 ad:function(a,b){return H.VM(new H.U5(this,b),[H.W8(this,"mW",0)])},
-yx:[function(a,b){return H.VM(new H.Fm(this,b),[H.W8(this,"mW",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Uj",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.W8(this,"mW",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Uj",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
@@ -7919,14 +7910,13 @@
 y.IN+=x}while(z.G())}else{y.KF(H.d(z.gl()))
 for(;z.G();){y.IN+=b
 x=H.d(z.gl())
-y.IN+=x}}x=y.IN
-return x.charCodeAt(0)==0?x:x},
+y.IN+=x}}return y.IN},
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
 tt:function(a,b){return P.F(this,b,H.W8(this,"mW",0))},
 br:function(a){return this.tt(a,!0)},
-Oe:function(a){var z=P.fM(null,null,null,H.W8(this,"mW",0))
+zH:function(a){var z=P.Ls(null,null,null,H.W8(this,"mW",0))
 z.FV(0,this)
 return z},
 gB:function(a){var z,y
@@ -7935,13 +7925,13 @@
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-eR:function(a,b){return H.p6(this,b,H.W8(this,"mW",0))},
-gtH:function(a){var z=this.gA(this)
-if(!z.G())throw H.b(H.Wp())
+eR:function(a,b){return H.ke(this,b,H.W8(this,"mW",0))},
+gqG:function(a){var z=this.gA(this)
+if(!z.G())throw H.b(H.DU())
 return z.gl()},
 grZ:function(a){var z,y
 z=this.gA(this)
-if(!z.G())throw H.b(H.Wp())
+if(!z.G())throw H.b(H.DU())
 do y=z.gl()
 while(z.G())
 return y},
@@ -7955,8 +7945,8 @@
 $isQV:true,
 $asQV:null},
 ark:{
-"^":"E9h;"},
-E9h:{
+"^":"eD;"},
+eD:{
 "^":"a+lD;",
 $isWO:true,
 $asWO:null,
@@ -7973,7 +7963,7 @@
 if(z!==this.gB(a))throw H.b(P.a4(a))}},
 gl0:function(a){return this.gB(a)===0},
 gor:function(a){return!this.gl0(a)},
-gtH:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
+gqG:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
 return this.t(a,0)},
 grZ:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
 return this.t(a,this.gB(a)-1)},
@@ -7985,15 +7975,14 @@
 z=this.gB(a)
 for(y=0;y<z;++y){if(b.$1(this.t(a,y))===!0)return!0
 if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
-zV:function(a,b){var z,y
+zV:function(a,b){var z
 if(this.gB(a)===0)return""
 z=P.p9("")
 z.We(a,b)
-y=z.IN
-return y.charCodeAt(0)==0?y:y},
+return z.IN},
 ad:function(a,b){return H.VM(new H.U5(a,b),[H.W8(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kYt",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
-yx:[function(a,b){return H.VM(new H.Fm(a,b),[H.W8(a,"lD",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"nf",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"xPo",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
+lM:[function(a,b){return H.VM(new H.oA(a,b),[H.W8(a,"lD",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"nf",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
 eR:function(a,b){return H.c1(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.W8(a,"lD",0)])
@@ -8003,15 +7992,15 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=y}return z},
 br:function(a){return this.tt(a,!0)},
-Oe:function(a){var z,y
-z=P.fM(null,null,null,H.W8(a,"lD",0))
+zH:function(a){var z,y
+z=P.Ls(null,null,null,H.W8(a,"lD",0))
 for(y=0;y<this.gB(a);++y)z.h(0,this.t(a,y))
 return z},
 h:function(a,b){var z=this.gB(a)
 this.sB(a,z+1)
 this.u(a,z,b)},
 FV:function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.lo
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.Ff
 x=this.gB(a)
 this.sB(a,x+1)
 this.u(a,x,y)}},
@@ -8019,7 +8008,7 @@
 for(z=0;z<this.gB(a);++z)if(J.xC(this.t(a,z),b)){this.YW(a,z,this.gB(a)-1,a,z+1)
 this.sB(a,this.gB(a)-1)
 return!0}return!1},
-uk:function(a,b){P.fd(a,b,!1)},
+uk:function(a,b){P.Vi(a,b,!1)},
 V1:function(a){this.sB(a,0)},
 GT:function(a,b){if(b==null)b=P.n4()
 H.ZE(a,0,this.gB(a)-1,b)},
@@ -8067,7 +8056,7 @@
 for(z=c;z>=0;--z)if(J.xC(this.t(a,z),b))return z
 return-1},
 cn:function(a,b){return this.Pk(a,b,null)},
-aP:function(a,b,c){if(b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
+xe:function(a,b,c){if(b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
 if(b===this.gB(a)){this.h(a,c)
 return}this.sB(a,this.gB(a)+1)
 this.YW(a,b+1,this.gB(a),a,b)
@@ -8107,11 +8096,11 @@
 gB:function(a){return J.q8(this.gvc(this))},
 gl0:function(a){return J.FN(this.gvc(this))},
 gor:function(a){return J.pO(this.gvc(this))},
-gUQ:function(a){return H.VM(new P.NV(this),[H.W8(this,"Yk",1)])},
+gUQ:function(a){return H.VM(new P.wU(this),[H.W8(this,"Yk",1)])},
 bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isT8:true,
 $asT8:null},
-NV:{
+wU:{
 "^":"mW;ZD",
 gB:function(a){var z=this.ZD
 return J.q8(z.gvc(z))},
@@ -8119,10 +8108,10 @@
 return J.FN(z.gvc(z))},
 gor:function(a){var z=this.ZD
 return J.pO(z.gvc(z))},
-gtH:function(a){var z=this.ZD
-return z.t(0,J.Es(z.gvc(z)))},
+gqG:function(a){var z=this.ZD
+return z.t(0,J.bT(z.gvc(z)))},
 grZ:function(a){var z=this.ZD
-return z.t(0,J.OH(z.gvc(z)))},
+return z.t(0,J.MQ(z.gvc(z)))},
 gA:function(a){var z=this.ZD
 z=new P.Uq(J.mY(z.gvc(z)),z,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -8176,9 +8165,9 @@
 z.KF(": ")
 z.KF(b)},"$2",null,4,0,null,141,66,"call"],
 $isEH:true},
-Fw:{
+nd:{
 "^":"mW;E3,QN,Bq,Z1",
-gA:function(a){var z=new P.KG(this,this.Bq,this.Z1,this.QN,null)
+gA:function(a){var z=new P.fO(this,this.Bq,this.Z1,this.QN,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 aN:function(a,b){var z,y,x
@@ -8189,16 +8178,16 @@
 if(z!==this.Z1)H.vh(P.a4(this))}},
 gl0:function(a){return this.QN===this.Bq},
 gB:function(a){return(this.Bq-this.QN&this.E3.length-1)>>>0},
-gtH:function(a){var z,y
+gqG:function(a){var z,y
 z=this.QN
-if(z===this.Bq)throw H.b(H.Wp())
+if(z===this.Bq)throw H.b(H.DU())
 y=this.E3
 if(z>=y.length)return H.e(y,z)
 return y[z]},
 grZ:function(a){var z,y,x
 z=this.QN
 y=this.Bq
-if(z===y)throw H.b(H.Wp())
+if(z===y)throw H.b(H.DU())
 z=this.E3
 x=z.length
 y=(y-1&x-1)>>>0
@@ -8260,7 +8249,7 @@
 bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
 AR:function(){var z,y,x,w
 z=this.QN
-if(z===this.Bq)throw H.b(H.Wp());++this.Z1
+if(z===this.Bq)throw H.b(H.DU());++this.Z1
 y=this.E3
 x=y.length
 if(z>=x)return H.e(y,z)
@@ -8331,14 +8320,12 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"TNe",NZ2:function(a,b){var z=H.VM(new P.Fw(null,0,0,0),[b])
-z.Eo(a,b)
-return z},uay:function(a){var z
+static:{"^":"TNe",uay: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}}}},
-KG:{
+fO:{
 "^":"a;dk,pP,Z1,Dc,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
@@ -8360,7 +8347,7 @@
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(0,z.gl())},
 Ex:function(a){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.lo)},
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.Ff)},
 uk:function(a,b){var z,y,x
 z=[]
 for(y=this.gA(this);y.G();){x=y.gl()
@@ -8374,12 +8361,12 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=w}return z},
 br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"UyD",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kYt",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
 bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
 ad:function(a,b){var z=new H.U5(this,b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-yx:[function(a,b){return H.VM(new H.Fm(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gba",ret:P.QV,args:[{func:"hTl",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gba",ret:P.QV,args:[{func:"hTl",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
 zV:function(a,b){var z,y,x
@@ -8390,22 +8377,21 @@
 y.IN+=x}while(z.G())}else{y.KF(H.d(z.gl()))
 for(;z.G();){y.IN+=b
 x=H.d(z.gl())
-y.IN+=x}}x=y.IN
-return x.charCodeAt(0)==0?x:x},
+y.IN+=x}}return y.IN},
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
-eR:function(a,b){return H.p6(this,b,H.u3(this,0))},
-gtH:function(a){var z=this.gA(this)
-if(!z.G())throw H.b(H.Wp())
+eR:function(a,b){return H.ke(this,b,H.u3(this,0))},
+gqG:function(a){var z=this.gA(this)
+if(!z.G())throw H.b(H.DU())
 return z.gl()},
 grZ:function(a){var z,y
 z=this.gA(this)
-if(!z.G())throw H.b(H.Wp())
+if(!z.G())throw H.b(H.DU())
 do y=z.gl()
 while(z.G())
 return y},
-$isz5:true,
+$isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -8417,7 +8403,7 @@
 jp:{
 "^":"oz;P*,nl,Bb,T8",
 $asoz:function(a,b){return[a]}},
-Xt:{
+vX1:{
 "^":"a;",
 oB:function(a){var z,y,x,w,v,u,t,s
 z=this.VR
@@ -8477,7 +8463,7 @@
 a.Bb=y.Bb
 y.Bb=null}this.VR=a}},
 Ba:{
-"^":"Xt;V2s,z4,VR,fu,hm,Z1,wq",
+"^":"vX1;V2s,z4,VR,fu,hm,Z1,wq",
 L4:function(a,b){return this.V2s.$2(a,b)},
 Bc:function(a){return this.z4.$1(a)},
 R2:function(a,b){return this.L4(a,b)},
@@ -8495,13 +8481,13 @@
 z=this.oB(b)
 if(J.xC(z,0)){this.VR.P=c
 return}this.Oa(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
-FV:function(a,b){H.bQ(b,new P.pn(this))},
+FV:function(a,b){H.bQ(b,new P.QG(this))},
 gl0:function(a){return this.VR==null},
 gor:function(a){return this.VR!=null},
 aN:function(a,b){var z,y,x
 z=H.u3(this,0)
 y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.Z1,this.wq,null),[z])
-y.ls(this,[P.oz,z])
+y.Dd(this,[P.oz,z])
 for(;y.G();){x=y.gl()
 z=J.RE(x)
 b.$2(z.gnl(x),z.gP(x))}},
@@ -8515,7 +8501,7 @@
 return z},
 bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isBa:true,
-$asXt:function(a,b){return[a]},
+$asvX1:function(a,b){return[a]},
 $asT8:null,
 $isT8:true,
 static:{GV:function(a,b,c,d){var z,y
@@ -8527,7 +8513,7 @@
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
-pn:{
+QG:{
 "^":"TpZ;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
@@ -8541,7 +8527,7 @@
 for(z=this.x5;a!=null;){z.push(a)
 a=a.Bb}},
 G:function(){var z,y,x
-z=this.xp
+z=this.OC
 if(this.Z1!==z.Z1)throw H.b(P.a4(z))
 y=this.x5
 if(y.length===0){this.Ju=null
@@ -8554,16 +8540,16 @@
 this.Ju=z
 this.Zq(z.T8)
 return!0},
-ls:function(a,b){this.Zq(a.VR)}},
+Dd:function(a,b){this.Zq(a.VR)}},
 nF:{
-"^":"mW;xp",
-gB:function(a){return this.xp.hm},
-gl0:function(a){return this.xp.hm===0},
+"^":"mW;OC",
+gB:function(a){return this.OC.hm},
+gl0:function(a){return this.OC.hm===0},
 gA:function(a){var z,y
-z=this.xp
+z=this.OC
 y=new P.DN(z,H.VM([],[P.oz]),z.Z1,z.wq,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.ls(z,H.u3(this,0))
+y.Dd(z,H.u3(this,0))
 return y},
 $isyN:true},
 JO:{
@@ -8574,20 +8560,20 @@
 z=this.ZD
 y=new P.ZM(z,H.VM([],[P.oz]),z.Z1,z.wq,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.ls(z,H.u3(this,1))
+y.Dd(z,H.u3(this,1))
 return y},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 $isyN:true},
 DN:{
-"^":"S6B;xp,x5,Z1,wq,Ju",
+"^":"S6B;OC,x5,Z1,wq,Ju",
 Gf:function(a){return a.nl}},
 ZM:{
-"^":"S6B;xp,x5,Z1,wq,Ju",
+"^":"S6B;OC,x5,Z1,wq,Ju",
 Gf:function(a){return a.P},
 $asS6B:function(a,b){return[b]}},
 HW:{
-"^":"S6B;xp,x5,Z1,wq,Ju",
+"^":"S6B;OC,x5,Z1,wq,Ju",
 Gf:function(a){return a},
 $asS6B:function(a){return[[P.oz,a]]}}}],["","",,P,{
 "^":"",
@@ -8604,7 +8590,7 @@
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.rr(String(y),null,null))}if(b==null)return P.KH(z)
+throw H.b(P.cD(String(y),null,null))}if(b==null)return P.KH(z)
 else return P.VQ(z,b)},
 tp:[function(a){return a.Lt()},"$1","Jn",2,0,52,0],
 f1:{
@@ -8642,16 +8628,16 @@
 gvc:function(a){var z
 if(this.LK==null){z=this.Mq
 return z.gvc(z)}z=this.oD()
-return H.c1(z,0,null,H.u3(H.VM(new H.TNQ(),[H.u3(z,0)]),0))},
+return H.c1(z,0,null,H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0))},
 gUQ:function(a){var z
 if(this.LK==null){z=this.Mq
-return z.gUQ(z)}return H.K1(this.oD(),new P.Ni(this),null,null)},
+return z.gUQ(z)}return H.K1(this.oD(),new P.A5(this),null,null)},
 u:function(a,b,c){var z,y
 if(this.LK==null)this.Mq.u(0,b,c)
 else if(this.NZ(0,b)){z=this.LK
 z[b]=c
 y=this.PF
-if(y==null?z!=null:y!==z)y[b]=null}else this.XK().u(0,b,c)},
+if(y==null?z!=null:y!==z)y[b]=null}else this.tZ().u(0,b,c)},
 FV:function(a,b){H.bQ(b,new P.E5(this))},
 NZ:function(a,b){if(this.LK==null)return this.Mq.NZ(0,b)
 if(typeof b!=="string")return!1
@@ -8662,11 +8648,11 @@
 this.u(0,b,z)
 return z},
 Rz:function(a,b){if(this.LK!=null&&!this.NZ(0,b))return
-return this.XK().Rz(0,b)},
+return this.tZ().Rz(0,b)},
 V1:function(a){var z
 if(this.LK==null)this.Mq.V1(0)
 else{z=this.Mq
-if(z!=null)J.U2(z)
+if(z!=null)J.Z8(z)
 this.LK=null
 this.PF=null
 this.Mq=P.Fl(null,null)}},
@@ -8682,7 +8668,7 @@
 oD:function(){var z=this.Mq
 if(z==null){z=Object.keys(this.PF)
 this.Mq=z}return z},
-XK:function(){var z,y,x,w,v
+tZ:function(){var z,y,x,w,v
 if(this.LK==null)return this.Mq
 z=P.Fl(null,null)
 y=this.oD()
@@ -8701,7 +8687,7 @@
 $asFo:function(){return[null,null]},
 $isT8:true,
 $asT8:function(){return[null,null]}},
-Ni:{
+A5:{
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
@@ -8709,41 +8695,41 @@
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
-Ukr:{
+Uk:{
 "^":"a;"},
 wIe:{
 "^":"a;"},
 Ziv:{
-"^":"Ukr;",
-$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
+"^":"Uk;",
+$asUk:function(){return[P.qU,[P.WO,P.KN]]}},
 Ud:{
 "^":"XS;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."},"$0","gCR",0,0,73],
-static:{Gy:function(a,b){return new P.Ud(a,b)}}},
+static:{NM:function(a,b){return new P.Ud(a,b)}}},
 K8:{
 "^":"Ud;Ct,FN",
 bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gCR",0,0,73],
 static:{ko:function(a){return new P.K8(a,null)}}},
 byg:{
-"^":"Ukr;J2<,xq",
-cW:function(a,b){return P.jc(a,this.gJh().J2)},
-kV:function(a){return this.cW(a,null)},
-Co:function(a,b){var z=this.gZE()
+"^":"Uk;Fs<,Ha",
+cW:function(a,b){return P.jc(a,this.gP1().Fs)},
+iQ:function(a){return this.cW(a,null)},
+N7:function(a,b){var z=this.gZE()
 return P.Vg(a,z.Wl,z.UM)},
-KP:function(a){return this.Co(a,null)},
-gZE:function(){return C.Sr},
-gJh:function(){return C.A3},
-$asUkr:function(){return[P.a,P.qU]}},
+KP:function(a){return this.N7(a,null)},
+gZE:function(){return C.cb},
+gP1:function(){return C.A3},
+$asUk:function(){return[P.a,P.qU]}},
 ojF:{
 "^":"wIe;UM,Wl",
 $aswIe:function(){return[P.a,P.qU]}},
-Mx:{
-"^":"wIe;J2<",
+c5:{
+"^":"wIe;Fs<",
 $aswIe:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;xq,qR,SK",
-HT:function(a){return this.xq.$1(a)},
+"^":"a;Ha,qR,SK",
+HT:function(a){return this.Ha.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
@@ -8797,15 +8783,15 @@
 rl:function(a){var z,y,x,w
 if(!this.Jc(a)){this.WD(a)
 try{z=this.HT(a)
-if(!this.Jc(z)){x=P.Gy(a,null)
+if(!this.Jc(z)){x=P.NM(a,null)
 throw H.b(x)}x=this.SK
 if(0>=x.length)return H.e(x,0)
 x.pop()}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.Gy(a,y))}}},
+throw H.b(P.NM(a,y))}}},
 Jc:function(a){var z,y,x,w
 z={}
-if(typeof a==="number"){if(!C.CD.gx8(a))return!1
+if(typeof a==="number"){if(!C.CD.gzr(a))return!1
 this.qR.KF(C.CD.bu(a))
 return!0}else if(a===!0){this.qR.KF("true")
 return!0}else if(a===!1){this.qR.KF("false")
@@ -8833,12 +8819,11 @@
 E5:function(a){var z=this.SK
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"Gsm,hyY,IE,Jyf,fc,HVe,Wk,BLm,vk,i6A,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z,y
+static:{"^":"Gsm,hyY,Ta6,Jyf,No,HVe,Wk,BLm,vk,i6A,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
 b=P.Jn()
 z=P.p9("")
 P.xl(z,b,c).rl(a)
-y=z.IN
-return y.charCodeAt(0)==0?y:y}}},
+return z.IN}}},
 tF:{
 "^":"TpZ:82;a,b",
 $2:[function(a,b){var z,y,x
@@ -8852,19 +8837,21 @@
 z.rl(b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true},
 u5F:{
-"^":"Ziv;ns",
+"^":"Ziv;QA",
 goc:function(a){return"utf-8"},
-gZE:function(){return new P.E3()}},
-E3:{
+gZE:function(){return new P.om()}},
+om:{
 "^":"wIe;",
-WJ:function(a){var z,y,x
+Sw:function(a){var z,y,x
 z=J.U6(a)
 y=J.vX(z.gB(a),3)
-if(typeof y!=="number"||Math.floor(y)!==y)H.vh(P.u("Invalid length "+H.d(y)))
-y=new Uint8Array(y)
+if(typeof y!=="number")return H.s(y)
+y=Array(y)
+y.fixed$length=init
+y=H.VM(y,[P.KN])
 x=new P.Rw(0,0,y)
 if(x.Gx(a,0,z.gB(a))!==z.gB(a))x.O6(z.j(a,J.bI(z.gB(a),1)),0)
-return C.Jm.aM(y,0,x.o9)},
+return C.Nm.aM(y,0,x.o9)},
 $aswIe:function(){return[P.qU,[P.WO,P.KN]]}},
 Rw:{
 "^":"a;UfS,o9,Zj",
@@ -8936,19 +8923,18 @@
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}},
 GY:{
-"^":"wIe;ns",
-WJ:function(a){var z,y,x
+"^":"wIe;QA",
+Sw:function(a){var z,y
 z=P.p9("")
-y=new P.Dd(this.ns,z,!0,0,0,0)
+y=new P.Dd(this.QA,z,!0,0,0,0)
 y.ME(a,0,J.q8(a))
 y.fZ()
-x=z.IN
-return x.charCodeAt(0)==0?x:x},
+return z.IN},
 $aswIe:function(){return[[P.WO,P.KN],P.qU]}},
 Dd:{
-"^":"a;ns,C4,YN,Dp,rw,pt",
+"^":"a;QA,C4,YN,Dp,rw,pt",
 xO:function(a){this.fZ()},
-fZ:function(){if(this.rw>0){if(!this.ns)throw H.b(P.rr("Unfinished UTF-8 octet sequence",null,null))
+fZ:function(){if(this.rw>0){if(this.QA!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence",null,null))
 this.C4.KF(H.mx(65533))
 this.Dp=0
 this.rw=0
@@ -8962,10 +8948,10 @@
 this.pt=0
 w=new P.wh(c)
 v=new P.yn(this,a,b,c)
-$loop$0:for(u=this.C4,t=!this.ns,s=J.U6(a),r=b;!0;r=n){$multibyte$2:{if(y>0){do{if(r===c)break $loop$0
+$loop$0:for(u=this.C4,t=this.QA!==!0,s=J.U6(a),r=b;!0;r=n){$multibyte$2:{if(y>0){do{if(r===c)break $loop$0
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.i(q,192)!==128){if(t)throw H.b(P.rr("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
 this.YN=!1
 p=H.mx(65533)
 u.IN+=p
@@ -8973,10 +8959,10 @@
 break $multibyte$2}else{z=(z<<6|p.i(q,63))>>>0;--y;++r}}while(y>0)
 p=x-1
 if(p<0||p>=4)return H.e(C.Gb,p)
-if(z<=C.Gb[p]){if(t)throw H.b(P.rr("Overlong encoding of 0x"+C.jn.WZ(z,16),null,null))
+if(z<=C.Gb[p]){if(t)throw H.b(P.cD("Overlong encoding of 0x"+C.jn.WZ(z,16),null,null))
 z=65533
 y=0
-x=0}if(z>1114111){if(t)throw H.b(P.rr("Character outside valid Unicode range: 0x"+C.jn.WZ(z,16),null,null))
+x=0}if(z>1114111){if(t)throw H.b(P.cD("Character outside valid Unicode range: 0x"+C.jn.WZ(z,16),null,null))
 z=65533}if(!this.YN||z!==65279){p=H.mx(z)
 u.IN+=p}this.YN=!1}}for(;r<c;r=n){o=w.$2(a,r)
 if(J.xZ(o,0)){this.YN=!1
@@ -8987,7 +8973,7 @@
 r=n}n=r+1
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.C(q,0)){if(t)throw H.b(P.rr("Negative UTF-8 code unit: -0x"+J.u1(p.J(q),16),null,null))
+if(p.C(q,0)){if(t)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+J.u1(p.J(q),16),null,null))
 p=H.mx(65533)
 u.IN+=p}else{if(p.i(q,224)===192){z=p.i(q,31)
 y=1
@@ -8998,7 +8984,7 @@
 continue $loop$0}if(p.i(q,248)===240&&p.C(q,245)){z=p.i(q,7)
 y=3
 x=3
-continue $loop$0}if(t)throw H.b(P.rr("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
 this.YN=!1
 p=H.mx(65533)
 u.IN+=p
@@ -9021,8 +9007,8 @@
 z=a===0&&b===J.q8(this.c)
 y=this.b
 x=this.c
-if(z)y.C4.KF(P.nB(x))
-else y.C4.KF(P.nB(J.Fd(x,a,b)))},
+if(z)y.C4.KF(P.HM(x))
+else y.C4.KF(P.HM(J.Fd(x,a,b)))},
 $isEH:true}}],["","",,P,{
 "^":"",
 Te:function(a){return},
@@ -9044,7 +9030,7 @@
 else{w=H.mx(v)
 w=z.IN+=w}}y=w+"\""
 z.IN=y
-return y.charCodeAt(0)==0?y:y}return"Instance of '"+H.lh(a)+"'"},
+return y}return"Instance of '"+H.lh(a)+"'"},
 eG:function(a){return new P.HG(a)},
 kC:[function(a,b){return a==null?b==null:a===b},"$2","XK",4,0,54],
 xvm:[function(a){return H.CU(a)},"$1","mbf",2,0,55],
@@ -9059,7 +9045,7 @@
 y=$.oK
 if(y==null)H.qw(z)
 else y.$1(z)},
-nB:function(a){return H.LY(a.constructor!==Array?P.F(a,!0,null):a)},
+HM:function(a){return H.eT(a.constructor!==Array?P.F(a,!0,null):a)},
 Y25:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.u(0,a.gOB(a),b)},
@@ -9097,14 +9083,14 @@
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
 else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gCR",0,0,73],
 h:function(a,b){return P.Wu(J.WB(this.rq,b.gVs()),this.aL)},
-gX3:function(){return H.KL(this)},
-gcO:function(){return H.ch(this)},
-gIv:function(){return H.Sw(this)},
+gGt:function(){return H.KL(this)},
+gS6:function(){return H.ch(this)},
+gBM:function(){return H.Sw(this)},
 EK:function(){H.o2(this)},
 RM:function(a,b){if(J.xZ(J.yH(a),8640000000000000))throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"bS,Vp,Eu,p2W,h2,QC3,EQe,NXt,tp1,Gio,zM3,cRS,E03,KeL,Cgd,NrX,bmS,o4I,T3F,ek0,yfk,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("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.Vq("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
+static:{"^":"Oj2,Vp,dfk,p2W,oXf,QC3,EQe,NXt,tp1,Gio,zM3,cRS,E03,KeL,Cgd,NrX,LD,o4I,T3F,ek0,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
 if(z!=null){y=new P.ci()
 x=z.pX
 if(1>=x.length)return H.e(x,1)
@@ -9120,7 +9106,7 @@
 if(6>=x.length)return H.e(x,6)
 r=y.$1(x[6])
 if(7>=x.length)return H.e(x,7)
-q=J.NQ(J.vX(new P.Rq().$1(x[7]),1000))
+q=J.Dv(J.vX(new P.Rq().$1(x[7]),1000))
 if(q===1000){p=!0
 q=999}else p=!1
 o=x.length
@@ -9137,8 +9123,8 @@
 if(typeof l!=="number")return H.s(l)
 s=J.bI(s,n*l)}k=!0}else k=!1
 j=H.fu(w,v,u,t,s,r,q,k)
-if(j==null)throw H.b(P.rr("Time out of range",a,null))
-return P.Wu(p?j+1:j,k)}else throw H.b(P.rr("Invalid date format",a,null))},Wu:function(a,b){var z=new P.iP(a,b)
+if(j==null)throw H.b(P.cD("Time out of range",a,null))
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD("Invalid date format",a,null))},Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
 return z},Gq:function(a){var z,y
 z=Math.abs(a)
@@ -9160,9 +9146,9 @@
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
-CP:{
-"^":"FK;",
-$isCP:true},
+Vf:{
+"^":"lf;",
+$isVf:true},
 "+double":0,
 a6:{
 "^":"a;m5<",
@@ -9194,7 +9180,7 @@
 Vy:function(a){return P.ii(0,0,Math.abs(this.m5),0,0,0)},
 J:function(a){return P.ii(0,0,-this.m5,0,0,0)},
 $isa6:true,
-static:{"^":"Bp7,S4d,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,Wr,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"Bp7,zi,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,VkA,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
 "^":"TpZ:14;",
 $1:function(a){if(a>=100000)return H.d(a)
@@ -9240,7 +9226,7 @@
 if(x<0)return H.e(y,x)
 u=P.hl(y[x])
 v.IN+=typeof u==="string"?u:H.d(u)}this.ae.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+this.vI.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+H.d(z.a)+"]"},"$0","gCR",0,0,73],
+return"NoSuchMethodError : method not found: '"+this.vI.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.IN+"]"},"$0","gCR",0,0,73],
 $isJS:true,
 static:{lr:function(a,b,c,d,e){return new P.JS(a,b,c,d,e)}}},
 ub:{
@@ -9324,7 +9310,7 @@
 l=""}k=z.Nj(w,n,o)
 if(typeof n!=="number")return H.s(n)
 return y+m+k+l+"\n"+C.yo.U(" ",x-n+m.length)+"^\n"},"$0","gCR",0,0,73],
-static:{rr:function(a,b,c){return new P.oe(a,b,c)}}},
+static:{cD:function(a,b,c){return new P.oe(a,b,c)}}},
 eV:{
 "^":"a;",
 bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gCR",0,0,73],
@@ -9332,13 +9318,13 @@
 qo:{
 "^":"a;oc>",
 bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gCR",0,0,73],
-t:function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.V2())},
-u:function(a,b,c){var z=H.of(b,"expando$values")
+t:function(a,b){var z=H.vA(b,"expando$values")
+return z==null?null:H.vA(z,this.V2())},
+u:function(a,b,c){var z=H.vA(b,"expando$values")
 if(z==null){z=new P.a()
 H.wV(b,"expando$values",z)}H.wV(z,this.V2(),c)},
 V2:function(){var z,y
-z=H.of(this,"expando$key")
+z=H.vA(this,"expando$key")
 if(z==null){y=$.Km
 $.Km=y+1
 z="expando$key$"+y
@@ -9348,7 +9334,7 @@
 "^":"a;",
 $isEH:true},
 KN:{
-"^":"FK;",
+"^":"lf;",
 $isKN:true},
 "+int":0,
 QV:{
@@ -9373,9 +9359,9 @@
 "^":"a;",
 bu:[function(a){return"null"},"$0","gCR",0,0,73]},
 "+Null":0,
-FK:{
+lf:{
 "^":"a;",
-$isFK:true},
+$islf:true},
 "+num":0,
 a:{
 "^":";",
@@ -9388,15 +9374,15 @@
 Od:{
 "^":"a;",
 $isOd:true},
-z5:{
+Ol:{
 "^":"mW;",
-$isz5:true,
+$isOl:true,
 $isyN:true},
 BpP:{
 "^":"a;"},
 VV:{
 "^":"a;n2,Mw",
-wE:function(a){var z,y
+D5:function(a){var z,y
 z=this.n2==null
 if(!z&&this.Mw==null)return
 y=$.hG
@@ -9418,17 +9404,17 @@
 "^":"a;",
 $isqU:true},
 "+String":0,
-Kg:{
-"^":"a;Y4,R7,So,ft",
+hM:{
+"^":"a;Y4,R0,So,ft",
 gl:function(){return this.ft},
 G:function(){var z,y,x,w,v,u
 z=this.So
-this.R7=z
+this.R0=z
 y=this.Y4
 x=J.U6(y)
 if(z===x.gB(y)){this.ft=null
-return!1}w=x.j(y,this.R7)
-v=this.R7+1
+return!1}w=x.j(y,this.R0)
+v=this.R0+1
 if((w&64512)===55296&&v<x.gB(y)){u=x.j(y,v)
 if((u&64512)===56320){this.So=v+1
 this.ft=65536+((w&1023)<<10>>>0)+(u&1023)
@@ -9450,8 +9436,7 @@
 y=z.gl()
 this.IN+=typeof y==="string"?y:H.d(y)}}},
 V1:function(a){this.IN=""},
-bu:[function(a){var z=this.IN
-return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,73],
+bu:[function(a){return this.IN},"$0","gCR",0,0,73],
 PD:function(a){if(typeof a==="string")this.IN=a
 else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
@@ -9464,27 +9449,23 @@
 "^":"a;",
 $isLz:true},
 q5:{
-"^":"a;Kk,Ni,Ee,Fi,ku,xu,ys,o6,nO",
-gJf:function(a){var z,y
-z=this.Kk
+"^":"a;Kk,QB,Ee,Fi,ku,xu,ys,o6,nO",
+gJf:function(a){var z=this.Kk
 if(z==null)return""
-y=J.Qe(z)
-if(y.nC(z,"["))return y.Nj(z,1,J.bI(y.gB(z),1))
+if(J.Qe(z).nC(z,"["))return C.yo.Nj(z,1,z.length-1)
 return z},
-gtp:function(a){var z=this.Ni
-if(z==null)return P.SN(this.Fi)
+gtp:function(a){var z=this.QB
+if(z==null)return P.Co(this.Fi)
 return z},
 gIi:function(a){return this.Ee},
-Bs:function(a,b){var z=J.x(a)
-if(z.n(a,""))return"/"+H.d(b)
-return z.Nj(a,0,z.cn(a,"/")+1)+H.d(b)},
-jI:function(a){var z=J.U6(a)
-if(J.xZ(z.gB(a),0)&&z.j(a,0)===58)return!0
-return z.OY(a,"/.")!==-1},
-mE:function(a){var z,y,x,w,v
+pi:function(a,b){if(a==="")return"/"+b
+return C.yo.Nj(a,0,C.yo.cn(a,"/")+1)+b},
+jI:function(a){if(a.length>0&&C.yo.j(a,0)===58)return!0
+return C.yo.OY(a,"/.")!==-1},
+jn:function(a){var z,y,x,w,v
 if(!this.jI(a))return a
 z=[]
-for(y=J.BQ(a,"/"),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(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.u3(y,0)]),x=!1;y.G();){w=y.Ff
 if(J.xC(w,"..")){v=z.length
 if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
 v=!J.xC(z[0],"")}else v=!0
@@ -9500,38 +9481,38 @@
 if(""!==y){z.KF(y)
 z.KF(":")}x=this.Kk
 w=x==null
-if(!w||J.co(this.Ee,"//")||y==="file"){z.KF("//")
+if(!w||C.yo.nC(this.Ee,"//")||y==="file"){z.KF("//")
 y=this.ku
-if(J.pO(y)){z.KF(y)
+if(C.yo.gor(y)){z.KF(y)
 z.KF("@")}if(!w)z.KF(x)
-y=this.Ni
+y=this.QB
 if(y!=null){z.KF(":")
 z.KF(y)}}z.KF(this.Ee)
 y=this.xu
 if(y!=null){z.KF("?")
 z.KF(y)}y=this.ys
 if(y!=null){z.KF("#")
-z.KF(y)}y=z.IN
-return y.charCodeAt(0)==0?y:y},"$0","gCR",0,0,73],
+z.KF(y)}return z.IN},"$0","gCR",0,0,73],
 n:function(a,b){var z,y,x,w
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isq5)return!1
-if(this.Fi===b.Fi)if(this.Kk!=null===(b.Kk!=null))if(J.xC(this.ku,b.ku))if(J.xC(this.gJf(this),z.gJf(b))){y=this.gtp(this)
+if(this.Fi===b.Fi)if(this.Kk!=null===(b.Kk!=null))if(this.ku===b.ku){y=this.gJf(this)
+x=z.gJf(b)
+if(y==null?x==null:y===x){y=this.gtp(this)
 z=z.gtp(b)
-if(y==null?z==null:y===z)if(J.xC(this.Ee,b.Ee)){z=this.xu
+if(y==null?z==null:y===z)if(this.Ee===b.Ee){z=this.xu
 y=z==null
 x=b.xu
 w=x==null
 if(!y===!w){if(y)z=""
-if(J.xC(z,w?"":x)){z=this.ys
+if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.ys
 y=z==null
 x=b.ys
 w=x==null
 if(!y===!w){if(y)z=""
-z=J.xC(z,w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
-else z=!1}else z=!1
-else z=!1
+z=z==null?(w?"":x)==null:z===(w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
+else z=!1}else z=!1}else z=!1
 else z=!1
 else z=!1
 return z},
@@ -9544,7 +9525,7 @@
 v=this.ys
 return z.$2(this.Fi,z.$2(this.ku,z.$2(y,z.$2(x,z.$2(this.Ee,z.$2(w,z.$2(v==null?"":v,1)))))))},
 $isq5:true,
-static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,tC,GpR,Q5W,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,OP,Qxt,Vho,WTp,Hiw,H5,zst,VFG,xF,SpW,GPf,JA7,iTk,Uo0,wo,SQU,rvM,fbQ",SN:function(a){if(a==="http")return 80
+static:{"^":"QqF,q7,tvi,uCX,zk,ilf,tC,GpR,Q5W,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,OP,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo,yw1,SQU,rvM,fbQ",Co:function(a){if(a==="http")return 80
 if(a==="https")return 443
 return 0},hK:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z={}
@@ -9565,7 +9546,7 @@
 x=0
 break}if(u===47){x=v===0?2:1
 y=0
-break}if(u===58){if(v===0)P.Xz(a,0,"Invalid empty scheme")
+break}if(u===58){if(v===0)P.iV(a,0,"Invalid empty scheme")
 z.a=P.iy(a,v);++v
 if(v===w){z.f=-1
 x=0}else{if(v>=w)H.vh(P.N(v))
@@ -9590,69 +9571,73 @@
 if(u===63||u===35)break
 z.f=-1}s=z.a
 r=z.c
-q=P.re(a,y,z.e,null,r!=null,s==="file")
+q=P.qd(a,y,z.e,null,r!=null,s==="file")
 s=z.f
 if(s===63){p=C.yo.XU(a,"#",z.e+1)
 s=z.e+1
 if(p<0){o=P.AN(a,s,w,null)
 n=null}else{o=P.AN(a,s,p,null)
-n=P.o6(a,p+1,w)}}else{n=s===35?P.o6(a,z.e+1,w):null
+n=P.jr(a,p+1,w)}}else{n=s===35?P.jr(a,z.e+1,w):null
 o=null}w=z.a
 s=z.b
-return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},Xz:function(a,b,c){throw H.b(P.rr(c,a,b))},Ec:function(a,b){if(a!=null&&a===P.SN(b))return
+return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},iV:function(a,b,c){throw H.b(P.cD(c,a,b))},JF:function(a,b){if(a!=null&&a===P.Co(b))return
 return a},L7:function(a,b,c,d){var z,y
 if(a==null)return
 if(b===c)return""
 if(C.yo.j(a,b)===91){z=c-1
-if(C.yo.j(a,z)!==93)P.Xz(a,b,"Missing end `]` to match `[` in host")
+if(C.yo.j(a,z)!==93)P.iV(a,b,"Missing end `]` to match `[` in host")
 P.eg(a,b+1,z)
 return C.yo.Nj(a,b,c).toLowerCase()}if(!d)for(z=a.length,y=b;y<c;++y){if(y<0)H.vh(P.N(y))
 if(y>=z)H.vh(P.N(y))
 if(a.charCodeAt(y)===58){P.eg(a,b,c)
-return"["+a+"]"}}return P.WU(a,b,c)},WU:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
-for(z=a.length,y=b,x=y,w=null,v=!0;y<c;){if(y<0)H.vh(P.N(y))
-if(y>=z)H.vh(P.N(y))
-u=a.charCodeAt(y)
-if(u===37){t=P.Yi(a,y,!0)
-s=t==null
-if(s&&v){y+=3
-continue}if(w==null){w=new P.Rn("")
-w.IN=""}r=C.yo.Nj(a,x,y)
-if(!v)r=r.toLowerCase()
-w.IN=w.IN+r
-if(s){t=C.yo.Nj(a,y,y+3)
-q=3}else if(t==="%"){t="%25"
-q=1}else q=3
-w.IN+=t
-y+=q
-x=y
-v=!0}else{if(u<127){s=u>>>4
-if(s>=8)return H.e(C.aa,s)
-s=(C.aa[s]&C.jn.iK(1,u&15))!==0}else s=!1
-if(s){if(v&&65<=u&&90>=u){if(w==null){w=new P.Rn("")
-w.IN=""}if(x<y){s=C.yo.Nj(a,x,y)
-w.IN=w.IN+s
-x=y}v=!1}++y}else{if(u<=93){s=u>>>4
-if(s>=8)return H.e(C.rz,s)
-s=(C.rz[s]&C.jn.iK(1,u&15))!==0}else s=!1
-if(s)P.Xz(a,y,"Invalid character")
-else{if((u&64512)===55296&&y+1<c){s=y+1
-if(s<0)H.vh(P.N(s))
-if(s>=z)H.vh(P.N(s))
-p=a.charCodeAt(s)
+return"["+a+"]"}}return P.cq(a,b,c)},cq:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+for(z=b,y=z,x=null,w=!0;z<c;){a.toString
+if(z<0)H.vh(P.N(z))
+v=a.length
+if(z>=v)H.vh(P.N(z))
+u=a.charCodeAt(z)
+if(u===37){t=P.Yi(a,z,!0)
+v=t==null
+if(v&&w){z+=3
+continue}if(x==null){x=new P.Rn("")
+x.IN=""}s=C.yo.Nj(a,y,z)
+if(!w)s=s.toLowerCase()
+x.toString
+x.IN=x.IN+s
+if(v){t=C.yo.Nj(a,z,z+3)
+r=3}else if(t==="%"){t="%25"
+r=1}else r=3
+x.IN+=t
+z+=r
+y=z
+w=!0}else{if(u<127){q=u>>>4
+if(q>=8)return H.e(C.aa,q)
+q=(C.aa[q]&C.jn.iK(1,u&15))!==0}else q=!1
+if(q){if(w&&65<=u&&90>=u){if(x==null){x=new P.Rn("")
+x.IN=""}if(y<z){v=C.yo.Nj(a,y,z)
+x.toString
+x.IN=x.IN+v
+y=z}w=!1}++z}else{if(u<=93){q=u>>>4
+if(q>=8)return H.e(C.rz,q)
+q=(C.rz[q]&C.jn.iK(1,u&15))!==0}else q=!1
+if(q)P.iV(a,z,"Invalid character")
+else{if((u&64512)===55296&&z+1<c){q=z+1
+if(q<0)H.vh(P.N(q))
+if(q>=v)H.vh(P.N(q))
+p=a.charCodeAt(q)
 if((p&64512)===56320){u=(65536|(u&1023)<<10|p&1023)>>>0
-q=2}else q=1}else q=1
-if(w==null){w=new P.Rn("")
-w.IN=""}r=C.yo.Nj(a,x,y)
-if(!v)r=r.toLowerCase()
-w.IN=w.IN+r
-s=P.xo(u)
-w.IN+=s
-y+=q
-x=y}}}}if(w==null)return C.yo.Nj(a,b,c)
-if(x<c){r=C.yo.Nj(a,x,c)
-w.KF(!v?r.toLowerCase():r)}z=w.IN
-return z.charCodeAt(0)==0?z:z},iy:function(a,b){var z,y,x,w,v,u,t,s
+r=2}else r=1}else r=1
+if(x==null){x=new P.Rn("")
+x.IN=""}s=C.yo.Nj(a,y,z)
+if(!w)s=s.toLowerCase()
+x.toString
+x.IN=x.IN+s
+v=P.mC(u)
+x.IN+=v
+z+=r
+y=z}}}}if(x==null)return J.Nj(a,b,c)
+if(y<c){s=J.Nj(a,y,c)
+x.KF(!w?s.toLowerCase():s)}return x.bu(0)},iy:function(a,b){var z,y,x,w,v,u,t,s
 if(b===0)return""
 a.toString
 z=a.length
@@ -9661,22 +9646,21 @@
 x=y>=97
 if(!(x&&y<=122))w=y>=65&&y<=90
 else w=!0
-if(!w)P.Xz(a,0,"Scheme not starting with alphabetic character")
+if(!w)P.iV(a,0,"Scheme not starting with alphabetic character")
 for(w=97<=y,v=122>=y,u=0;u<b;++u){if(u>=z)H.vh(P.N(u))
 t=a.charCodeAt(u)
 if(t<128){s=t>>>4
-if(s>=8)return H.e(C.mKy,s)
-s=(C.mKy[s]&C.jn.iK(1,t&15))!==0}else s=!1
-if(!s)P.Xz(a,u,"Illegal scheme character")
+if(s>=8)return H.e(C.qq,s)
+s=(C.qq[s]&C.jn.iK(1,t&15))!==0}else s=!1
+if(!s)P.iV(a,u,"Illegal scheme character")
 if(w&&v)x=!1}a=J.Nj(a,0,b)
 return!x?a.toLowerCase():a},ua:function(a,b,c){if(a==null)return""
-return P.Xc(a,b,c,C.jx)},re:function(a,b,c,d,e,f){var z,y
+return P.Xc(a,b,c,C.jx)},qd:function(a,b,c,d,e,f){var z,y
 z=a==null
 if(z&&!0)return f?"/":""
 z=!z
-if(z);y=z?P.Xc(a,b,c,C.ZJ):C.bP.ez(d,new P.Kd()).zV(0,"/")
-z=J.U6(y)
-if(z.gl0(y)===!0){if(f)return"/"}else if((f||e)&&z.j(y,0)!==47)return"/"+H.d(y)
+if(z);y=z?P.Xc(a,b,c,C.ZJ):C.jN.ez(d,new P.UU()).zV(0,"/")
+if(C.yo.gl0(y)){if(f)return"/"}else if((f||e)&&C.yo.j(y,0)!==47)return"/"+y
 return y},AN:function(a,b,c,d){var z,y,x
 z={}
 y=a==null
@@ -9685,9 +9669,8 @@
 if(y);if(y)return P.Xc(a,b,c,C.o5)
 x=P.p9("")
 z.a=!0
-C.bP.aN(d,new P.Ue(z,x))
-z=x.IN
-return z.charCodeAt(0)==0?z:z},o6:function(a,b,c){if(a==null)return
+C.jN.aN(d,new P.Sz(z,x))
+return x.IN},jr:function(a,b,c){if(a==null)return
 return P.Xc(a,b,c,C.o5)},qr:function(a){if(57>=a)return 48<=a
 a|=32
 return 97<=a&&102>=a},RD:function(a){if(57>=a)return a-48
@@ -9696,6 +9679,7 @@
 y=a.length
 if(z>=y)return"%"
 x=b+1
+a.toString
 if(x<0)H.vh(P.N(x))
 if(x>=y)H.vh(P.N(x))
 w=a.charCodeAt(x)
@@ -9707,8 +9691,8 @@
 if(z>=8)return H.e(C.B2,z)
 z=(C.B2[z]&C.jn.iK(1,u&15))!==0}else z=!1
 if(z)return H.mx(c&&65<=u&&90>=u?(u|32)>>>0:u)
-if(w>=97||v>=97)return C.yo.Nj(a,b,b+3).toUpperCase()
-return},xo:function(a){var z,y,x,w,v,u,t,s
+if(w>=97||v>=97)return J.Nj(a,b,b+3).toUpperCase()
+return},mC:function(a){var z,y,x,w,v,u,t,s
 if(a<128){z=Array(3)
 z.fixed$length=init
 z[0]=37
@@ -9734,44 +9718,46 @@
 t="0123456789ABCDEF".charCodeAt(u&15)
 if(s>=y)return H.e(z,s)
 z[s]=t
-v+=3}}return H.LY(z)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
-for(z=a.length,y=b,x=y,w=null;y<c;){if(y<0)H.vh(P.N(y))
-if(y>=z)H.vh(P.N(y))
-v=a.charCodeAt(y)
+v+=3}}return H.eT(z)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+for(z=b,y=z,x=null;z<c;){a.toString
+if(z<0)H.vh(P.N(z))
+w=a.length
+if(z>=w)H.vh(P.N(z))
+v=a.charCodeAt(z)
 if(v<127){u=v>>>4
 if(u>=8)return H.e(d,u)
 u=(d[u]&C.jn.iK(1,v&15))!==0}else u=!1
-if(u)++y
-else{if(v===37){t=P.Yi(a,y,!1)
-if(t==null){y+=3
+if(u)++z
+else{if(v===37){t=P.Yi(a,z,!1)
+if(t==null){z+=3
 continue}if("%"===t){t="%25"
 s=1}else s=3}else{if(v<=93){u=v>>>4
 if(u>=8)return H.e(C.rz,u)
 u=(C.rz[u]&C.jn.iK(1,v&15))!==0}else u=!1
-if(u){P.Xz(a,y,"Invalid character")
+if(u){P.iV(a,z,"Invalid character")
 t=null
-s=null}else{if((v&64512)===55296){u=y+1
+s=null}else{if((v&64512)===55296){u=z+1
 if(u<c){if(u<0)H.vh(P.N(u))
-if(u>=z)H.vh(P.N(u))
+if(u>=w)H.vh(P.N(u))
 r=a.charCodeAt(u)
 if((r&64512)===56320){v=(65536|(v&1023)<<10|r&1023)>>>0
 s=2}else s=1}else s=1}else s=1
-t=P.xo(v)}}if(w==null){w=new P.Rn("")
-w.IN=""}u=C.yo.Nj(a,x,y)
-w.IN=w.IN+u
-w.IN+=typeof t==="string"?t:H.d(t)
+t=P.mC(v)}}if(x==null){x=new P.Rn("")
+x.IN=""}w=C.yo.Nj(a,y,z)
+x.toString
+x.IN=x.IN+w
+x.IN+=typeof t==="string"?t:H.d(t)
 if(typeof s!=="number")return H.s(s)
-y+=s
-x=y}}if(w==null)return C.yo.Nj(a,b,c)
-if(x<c)w.KF(C.yo.Nj(a,x,c))
-z=w.IN
-return z.charCodeAt(0)==0?z:z},WX:function(a,b){return H.n3(J.BQ(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
+z+=s
+y=z}}if(x==null)return J.Nj(a,b,c)
+if(y<c)x.KF(J.Nj(a,y,c))
+return x.bu(0)},Ms:function(a,b){return H.n3(J.BQ(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
 z=new P.JV()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.to(z)),[null,null]).br(0)},eg:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+return H.VM(new H.A8(y,new P.C9P(z)),[null,null]).br(0)},eg:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 if(c==null)c=J.q8(a)
-z=new P.kZ(a)
+z=new P.x8(a)
 y=new P.ZN(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
 x=[]
@@ -9782,32 +9768,34 @@
 if(typeof s!=="number")return H.s(s)
 if(!(u<s))break
 s=a
+s.toString
 if(u<0)H.vh(P.N(u))
 r=J.q8(s)
 if(typeof r!=="number")return H.s(r)
 if(u>=r)H.vh(P.N(u))
 if(s.charCodeAt(u)===58){if(u===b){++u
 s=a
+s.toString
 if(u<0)H.vh(P.N(u))
 if(u>=J.q8(s))H.vh(P.N(u))
 if(s.charCodeAt(u)!==58)z.$2("invalid start colon.",u)
 w=u}if(u===w){if(t)z.$2("only one wildcard `::` is allowed",u)
-J.dH(x,-1)
-t=!0}else J.dH(x,y.$2(w,u))
+J.bi(x,-1)
+t=!0}else J.bi(x,y.$2(w,u))
 w=u+1}++u}if(J.q8(x)===0)z.$1("too few parts")
 q=J.xC(w,c)
-p=J.xC(J.OH(x),-1)
+p=J.xC(J.MQ(x),-1)
 if(q&&!p)z.$2("expected a part after last `:`",c)
-if(!q)try{J.dH(x,y.$2(w,c))}catch(o){H.Ru(o)
+if(!q)try{J.bi(x,y.$2(w,c))}catch(o){H.Ru(o)
 try{v=P.Dy(J.Nj(a,w,c))
-s=J.lf(J.UQ(v,0),8)
+s=J.Eh(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
-J.dH(x,(s|r)>>>0)
-r=J.lf(J.UQ(v,2),8)
+J.bi(x,(s|r)>>>0)
+r=J.Eh(J.UQ(v,2),8)
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
-J.dH(x,(r|s)>>>0)}catch(o){H.Ru(o)
+J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
 z.$2("invalid end of IPv6 address.",w)}}if(t){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 n=Array(16)
 n.$builtinTypeInfo=[P.KN]
@@ -9831,20 +9819,20 @@
 s=s.i(l,255)
 if(r>=16)return H.e(n,r)
 n[r]=s
-m+=2}++u}return n},Mp:function(a,b,c,d){var z,y,x,w,v,u,t
+m+=2}++u}return n},jW:function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
-x=c.gZE().WJ(b)
-for(w=x.length,v=0;v<w;++v){u=x[v]
-if(u<128){t=u>>>4
+x=c.gZE().Sw(b)
+for(w=0;w<x.length;++w){v=x[w]
+u=J.Wx(v)
+if(u.C(v,128)){t=u.m(v,4)
 if(t>=8)return H.e(a,t)
-t=(a[t]&C.jn.iK(1,u&15))!==0}else t=!1
-if(t){t=H.mx(u)
-y.IN+=t}else if(d&&u===32){t=H.mx(43)
-y.IN+=t}else{t=H.mx(37)
-y.IN+=t
-z.$2(u,y)}}z=y.IN
-return z.charCodeAt(0)==0?z:z},tN:function(a,b){var z,y,x,w
+t=(a[t]&C.jn.iK(1,u.i(v,15)))!==0}else t=!1
+if(t){u=H.mx(v)
+y.IN+=u}else if(d&&u.n(v,32)){u=H.mx(43)
+y.IN+=u}else{u=H.mx(37)
+y.IN+=u
+z.$2(v,y)}}return y.IN},tN:function(a,b){var z,y,x,w
 for(z=J.Qe(a),y=0,x=0;x<2;++x){w=z.j(a,b+x)
 if(48<=w&&w<=57)y=y*16+w-48
 else{w|=32
@@ -9871,8 +9859,8 @@
 if(x+3>w)throw H.b(P.u("Truncated URI"))
 u.push(P.tN(a,x+1))
 x+=2}else if(c&&v===43)u.push(32)
-else u.push(v);++x}}t=b.ns
-return new P.GY(t).WJ(u)}}},
+else u.push(v);++x}}t=b.QA
+return new P.GY(t).Sw(u)}}},
 hP2:{
 "^":"TpZ:147;",
 $1:function(a){a.C(0,128)
@@ -9905,49 +9893,47 @@
 y=t+1}if(u>=0){o=u+1
 if(o<z.e)for(n=0;o<z.e;++o){if(o>=w)H.vh(P.N(o))
 m=x.charCodeAt(o)
-if(48>m||57<m)P.Xz(x,o,"Invalid port number")
+if(48>m||57<m)P.iV(x,o,"Invalid port number")
 n=n*10+(m-48)}else n=null
-z.d=P.Ec(n,z.a)
+z.d=P.JF(n,z.a)
 p=u}z.c=P.L7(x,y,p,!0)
 s=z.e
 if(s<w)z.f=C.yo.j(x,s)},
 $isEH:true},
-Kd:{
+UU:{
 "^":"TpZ:12;",
-$1:function(a){return P.Mp(C.jr,a,C.xM,!1)},
+$1:function(a){return P.jW(C.yk,a,C.xM,!1)},
 $isEH:true},
-Ue:{
+Sz:{
 "^":"TpZ:81;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
 z=this.b
-z.KF(P.Mp(C.B2,a,C.xM,!0))
+z.KF(P.jW(C.B2,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.Mp(C.B2,b,C.xM,!0))},
+z.KF(P.jW(C.B2,b,C.xM,!0))},
 $isEH:true},
 XZ:{
 "^":"TpZ:148;",
-$2:function(a,b){var z=J.v1(a)
-if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},
+$2:function(a,b){return b*31+J.v1(a)&1073741823},
 $isEH:true},
 qz:{
 "^":"TpZ:81;a",
 $2:function(a,b){var z,y,x,w
 z=J.U6(b)
 y=z.OY(b,"=")
-if(y===-1){if(!z.n(b,""))J.qQ(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
+if(y===-1){if(!z.n(b,""))J.kW(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
 w=z.yn(b,y+1)
 z=this.a
-J.qQ(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
+J.kW(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
 $isEH:true},
 JV:{
 "^":"TpZ:44;",
-$1:function(a){throw H.b(P.rr("Illegal IPv4 address, "+a,null,null))},
+$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a,null,null))},
 $isEH:true},
-to:{
+C9P:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=H.BU(a,null,null)
@@ -9955,16 +9941,16 @@
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
 return z},"$1",null,2,0,null,149,"call"],
 $isEH:true},
-kZ:{
+x8:{
 "^":"TpZ:150;a",
-$2:function(a,b){throw H.b(P.rr("Illegal IPv6 address, "+a,this.a,b))},
+$2:function(a,b){throw H.b(P.cD("Illegal IPv6 address, "+a,this.a,b))},
 $1:function(a){return this.$2(a,null)},
 $isEH:true},
 ZN:{
 "^":"TpZ:100;b,c",
 $2:function(a,b){var z,y
 if(b-a>4)this.c.$2("an IPv6 part can only contain a maximum of 4 hex digits",a)
-z=H.BU(C.yo.Nj(this.b,a,b),16,null)
+z=H.BU(J.Nj(this.b,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.c.$2("each part must be in the range of `0x0..0xFFFF`",a)
 return z},
@@ -9983,25 +9969,25 @@
 if(typeof y!=="string"){y=d
 y=typeof y==="number"}else y=!0}else y=!0
 else y=!0
-if(y)try{d=P.jl(d)
+if(y)try{d=P.pf(d)
 J.z7Y(z,a,b,c,d)}catch(x){H.Ru(x)
 J.z7Y(z,a,b,c,null)}else J.z7Y(z,a,b,c,null)
 return z},
 r3:function(a,b){return document.createElement(a)},
-Kz:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
+Og:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
 lt:function(a,b,c,d,e,f,g,h){var z,y,x
-z=W.O7
+z=W.fJ
 y=H.VM(new P.Zf(P.Dt(z)),[z])
 x=new XMLHttpRequest()
 C.W3.i3(x,"GET",a,!0)
-z=H.VM(new W.vG(x,"load",!1),[null])
+z=H.VM(new W.RO(x,C.LF.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new W.bU(y,x)),z.el),[H.u3(z,0)]).DN()
-z=H.VM(new W.vG(x,"error",!1),[null])
+z=H.VM(new W.RO(x,C.JN.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(y.gYJ()),z.el),[H.u3(z,0)]).DN()
 x.send()
 return y.MM},
-Ws:function(a){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(a),2))},
-D7:function(a,b){var z,y
+Ws:function(a){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.Iq(a),2))},
+P0:function(a,b){var z,y
 z=typeof a!=="string"
 if((!z||a==null)&&!0)return new WebSocket(a)
 y=H.RB(b,"$isWO",[P.qU],"$asWO")
@@ -10010,39 +9996,39 @@
 z=!z||a==null
 if(z)return new WebSocket(a,b)
 throw H.b(P.u("Incorrect number or type of arguments"))},
-Zm:function(a,b){a=536870911&a+b
+VC:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
 Pv:function(a){if(a==null)return
 return W.P1(a)},
-xj:function(a){var z
+qc:function(a){var z
 if(a==null)return
 if("postMessage" in a){z=W.P1(a)
-if(!!J.x(z).$isFU)return z
+if(!!J.x(z).$isPZ)return z
 return}else return a},
-Pd:function(a){if(!!J.x(a).$isSy)return a
+Pd:function(a){if(!!J.x(a).$isYN)return a
 return P.o7(a,!0)},
-Rl:function(a,b){return new W.uY(a,b)},
+v8:function(a,b){return new W.uY(a,b)},
 z9:[function(a){return J.N1(a)},"$1","b4",2,0,12,56],
-Hx:[function(a){return J.qq(a)},"$1","HM",2,0,12,56],
-Hw:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","NB",8,0,57,56,58,59,60],
-wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
-z=J.Xr(d)
+IV:[function(a){return J.o6(a)},"$1","hb",2,0,12,56],
+Hw:[function(a,b,c,d){return J.L1(a,b,c,d)},"$4","SN",8,0,57,56,58,59,60],
+Ct:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
+z=J.Dc(d)
 if(z==null)throw H.b(P.u(d))
 y=z.prototype
-x=J.YC(d,"created")
+x=J.KE(d,"created")
 if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.MZ(W.r3("article",null))
+J.aN(W.r3("article",null))
 w=z.$nativeSuperclassTag
 if(w==null)throw H.b(P.u(d))
 v=e==null
 if(v){if(!J.xC(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
 u=a[w]
 t={}
-t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Rl(x,y),1))}
+t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.v8(x,y),1))}
 t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.b4(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.HM(),1))}
-t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.NB(),4))}
+t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.hb(),1))}
+t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.SN(),4))}
 s=Object.create(u.prototype,t)
 r=H.Va(y)
 Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
@@ -10050,8 +10036,9 @@
 if(!v)q.extends=e
 b.registerElement(c,q)},
 Yt:function(a){if(J.xC($.X3,C.NU))return a
+if(a==null)return
 return $.X3.rO(a,!0)},
-K2:function(a){if(J.xC($.X3,C.NU))return a
+Iq:function(a){if(J.xC($.X3,C.NU))return a
 return $.X3.PT(a,!0)},
 Bo:{
 "^":"h4;",
@@ -10059,34 +10046,34 @@
 Yyn:{
 "^":"Gv;",
 $isWO:true,
-$asWO:function(){return[W.M5K]},
+$asWO:function(){return[W.QI]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[W.M5K]},
+$asQV:function(){return[W.QI]},
 "%":"EntryArray"},
 Ps:{
-"^":"Bo;N:target%,t5:type=,LU:href%,A8:protocol=",
+"^":"Bo;N:target%,t5:type=,mH:href%,aB:protocol=",
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"HTMLAnchorElement"},
-fYK:{
-"^":"Bo;N:target%,LU:href%,A8:protocol=",
+fY:{
+"^":"Bo;N:target%,mH:href%,aB:protocol=",
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"HTMLAreaElement"},
 rZg:{
-"^":"Bo;LU:href%,N:target%",
+"^":"Bo;mH:href%,N:target%",
 "%":"HTMLBaseElement"},
 O4:{
-"^":"Gv;ky:size=,t5:type=",
+"^":"Gv;yT:size=,t5:type=",
 $isO4:true,
 "%":";Blob"},
 QPB:{
 "^":"Bo;",
-$isFU:true,
+$isPZ:true,
 "%":"HTMLBodyElement"},
-IFv:{
+Ox:{
 "^":"Bo;oc:name%,t5:type=,P:value%",
 "%":"HTMLButtonElement"},
-Nu:{
+Ny9:{
 "^":"Bo;fg:height%,R:width}",
 gVE:function(a){return a.getContext("2d")},
 "%":"HTMLCanvasElement"},
@@ -10095,7 +10082,7 @@
 "%":";CanvasRenderingContext"},
 Gcw:{
 "^":"Y5K;",
-kN:function(a,b,c,d,e,f,g,h){var z
+A8:function(a,b,c,d,e,f,g,h){var z
 if(g!=null)z=!0
 else z=!1
 if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
@@ -10106,17 +10093,18 @@
 "%":"Comment;CharacterData"},
 BI:{
 "^":"ea;tT:code=",
+$isBI:true,
 "%":"CloseEvent"},
 y4f:{
 "^":"w6O;Rn:data=",
 "%":"CompositionEvent"},
-Rb:{
+DG4:{
 "^":"ea;NJ:_dartDetail}",
 gey:function(a){var z=a._dartDetail
 if(z!=null)return z
 return P.o7(a.detail,!0)},
 GM:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
-$isRb:true,
+$isDG4:true,
 "%":"CustomEvent"},
 vHT:{
 "^":"Bo;bG:options=",
@@ -10129,66 +10117,66 @@
 "^":"Bo;",
 TR:function(a,b){return a.open.$1(b)},
 "%":"HTMLDialogElement"},
-Sy:{
+YN:{
 "^":"KV;",
 JP:function(a){return a.createDocumentFragment()},
 Kb:function(a,b){return a.getElementById(b)},
-ek:function(a,b,c){return a.importNode(b,c)},
-Wk:function(a,b){return a.querySelector(b)},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isSy:true,
+d2:function(a,b,c){return a.importNode(b,c)},
+XT:function(a,b){return a.querySelector(b)},
+VG:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+$isYN:true,
 "%":"XMLDocument;Document"},
 hsw:{
 "^":"KV;",
-gqu:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.P0(a,new W.OB(a)),[null])
+gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
 return a._docChildren},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Wk:function(a,b){return a.querySelector(b)},
+VG:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+XT:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
 cmJ:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
-Nh:{
+BK:{
 "^":"Gv;G1:message=",
 goc:function(a){var z=a.name
 if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
 if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
 return z},
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
-$isNh:true,
+$isBK:true,
 "%":"DOMException"},
 h4:{
-"^":"KV;ka:title},xr:className%,jO:id=,q5:tagName=,ke:nextElementSibling=",
+"^":"KV;mk:title},xr:className%,jO:id=,ns:tagName=,ke:nextElementSibling=",
 gQg:function(a){return new W.E9(a)},
-gqu:function(a){return new W.VG(a,a.children)},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+gks:function(a){return new W.VG(a,a.children)},
+VG:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
 gD7:function(a){return P.T7(C.CD.yu(C.CD.RE(a.offsetLeft)),C.CD.yu(C.CD.RE(a.offsetTop)),C.CD.yu(C.CD.RE(a.offsetWidth)),C.CD.yu(C.CD.RE(a.offsetHeight)),null)},
 Es:function(a){},
-dQ:function(a){},
-aC:function(a,b,c,d){},
+Lx:function(a){},
+wN:function(a,b,c,d){},
 gqn:function(a){return a.localName},
 gKD:function(a){return a.namespaceURI},
 bu:[function(a){return a.localName},"$0","gCR",0,0,73],
-WO:function(a,b){if(!!a.matches)return a.matches(b)
+xZ:function(a,b){if(!!a.matches)return a.matches(b)
 else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
 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"))},
-jn:function(a,b){var z=a
-do{if(J.YN(z,b))return!0
+X3:function(a,b){var z=a
+do{if(J.wK(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
-er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
+TL:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
 PN:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
-Wk:function(a,b){return a.querySelector(b)},
-gVY:function(a){return H.VM(new W.eu(a,"mousedown",!1),[null])},
-gf0:function(a){return H.VM(new W.eu(a,"mousemove",!1),[null])},
+XT:function(a,b){return a.querySelector(b)},
+gVY:function(a){return H.VM(new W.Cqa(a,C.Whw.fA,!1),[null])},
+gf0:function(a){return H.VM(new W.Cqa(a,C.Kq.fA,!1),[null])},
 LX:function(a){},
 $ish4:true,
-$isFU:true,
+$isPZ:true,
 "%":";Element"},
 fC:{
 "^":"Bo;fg:height%,oc:name%,t5:type=,R:width}",
@@ -10198,17 +10186,17 @@
 "%":"ErrorEvent"},
 ea:{
 "^":"Gv;dl:_selector},Ii:path=,Ea:timeStamp=,t5:type=",
-gXQ:function(a){return W.xj(a.currentTarget)},
-gN:function(a){return W.xj(a.target)},
-TI:function(a){return a.preventDefault()},
+gF0:function(a){return W.qc(a.currentTarget)},
+gN:function(a){return W.qc(a.target)},
+e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
-FU:{
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
+PZ:{
 "^":"Gv;",
 On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-jR:function(a,b){return a.dispatchEvent(b)},
+Ph:function(a,b){return a.dispatchEvent(b)},
 Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isFU:true,
+$isPZ:true,
 "%":";EventTarget"},
 Ao:{
 "^":"Bo;P9:elements=,oc:name%,t5:type=",
@@ -10217,22 +10205,22 @@
 "^":"O4;oc:name=",
 $ishH:true,
 "%":"File"},
-AaI:{
+QU:{
 "^":"cmJ;tT:code=",
 "%":"FileError"},
 H05:{
-"^":"FU;kc:error=",
+"^":"PZ;kc:error=",
 gyG:function(a){var z=a.result
-if(!!J.x(z).$isaI)return H.GG(z,0,null)
+if(!!J.x(z).$isaI)return H.z4(z,0,null)
 return z},
 "%":"FileReader"},
-YuD:{
+jH:{
 "^":"Bo;B:length=,oc:name%,N:target%",
 "%":"HTMLFormElement"},
 iGN:{
 "^":"Bo;ih:color%",
 "%":"HTMLHRElement"},
-UT:{
+us:{
 "^":"Gv;B:length=",
 "%":"History"},
 xnd:{
@@ -10243,7 +10231,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gtH:function(a){if(a.length>0)return a[0]
+gqG:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -10258,20 +10246,20 @@
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 Vbi:{
-"^":"Sy;",
+"^":"YN;",
 gQr:function(a){return a.head},
-ska:function(a,b){a.title=b},
+smk:function(a,b){a.title=b},
 "%":"HTMLDocument"},
-O7:{
+fJ:{
 "^":"waV;il:responseText=,pf:status=",
 gn9:function(a){return W.Pd(a.response)},
 Yh:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
 i3:function(a,b,c,d){return a.open(b,c,d)},
 wR:function(a,b){return a.send(b)},
-$isO7:true,
+$isfJ:true,
 "%":"XMLHttpRequest"},
 waV:{
-"^":"FU;",
+"^":"PZ;",
 "%":";XMLHttpRequestEventTarget"},
 tbE:{
 "^":"Bo;fg:height%,oc:name%,R:width}",
@@ -10285,53 +10273,53 @@
 j3:function(a,b){return a.complete.$1(b)},
 "%":"HTMLImageElement"},
 Sc:{
-"^":"Bo;d4:checked%,fg:height%,jx:list=,A5:max=,Bp:min=,oc:name%,ky:size=,t5:type=,P:value%,R:width}",
+"^":"Bo;d4:checked%,fg:height%,jx:list=,A5:max=,Bp:min=,oc:name%,yT:size=,t5:type=,P:value%,R:width}",
 RR:function(a,b){return a.accept.$1(b)},
 $isSc:true,
 $ish4:true,
-$isFU:true,
+$isPZ:true,
 $isKV:true,
 "%":"HTMLInputElement"},
 AD:{
-"^":"w6O;w4:altKey=,Tu:ctrlKey=,Nl:metaKey=,kA:shiftKey=",
+"^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 "%":"KeyboardEvent"},
 In:{
 "^":"Bo;oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-pL:{
+wPF:{
 "^":"Bo;P:value%",
 "%":"HTMLLIElement"},
 Ogt:{
-"^":"Bo;LU:href%,t5:type=",
+"^":"Bo;mH:href%,t5:type=",
 "%":"HTMLLinkElement"},
 u8r:{
-"^":"Gv;LU:href=,A8:protocol=",
+"^":"Gv;mH:href=,aB:protocol=",
 VD:function(a){return a.reload()},
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"Location"},
-M6O:{
+jJ:{
 "^":"Bo;oc:name%",
 "%":"HTMLMapElement"},
 ftg:{
 "^":"Bo;kc:error=",
 xW:function(a){return a.load()},
-zd:[function(a){return a.pause()},"$0","gX0",0,0,17],
+WJ:[function(a){return a.pause()},"$0","gX0",0,0,17],
 "%":"HTMLAudioElement;HTMLMediaElement",
 static:{"^":"dZ5<"}},
 mCi:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
-Y7:{
+Wyx:{
 "^":"Gv;tT:code=",
 "%":"MediaKeyError"},
-wq:{
+aBv:{
 "^":"ea;G1:message=",
 "%":"MediaKeyEvent"},
 fJn:{
 "^":"ea;G1:message=",
 "%":"MediaKeyMessageEvent"},
 D80:{
-"^":"FU;jO:id=,ph:label=",
+"^":"PZ;jO:id=,ph:label=",
 "%":"MediaStream"},
 VhH:{
 "^":"ea;vq:stream=",
@@ -10339,7 +10327,8 @@
 cxu:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
-gFF:function(a){return W.xj(a.source)},
+gFF:function(a){return W.qc(a.source)},
+$iscxu:true,
 "%":"MessageEvent"},
 EeC:{
 "^":"Bo;rz:content=,oc:name%",
@@ -10347,28 +10336,33 @@
 QbE:{
 "^":"Bo;A5:max=,Bp:min=,P:value%",
 "%":"HTMLMeterElement"},
+PGY:{
+"^":"ea;",
+$isPGY:true,
+"%":"MIDIConnectionEvent"},
 F3S:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bnE:{
 "^":"Imr;",
-LV:function(a,b,c){return a.send(b,c)},
+EZ:function(a,b,c){return a.send(b,c)},
 wR:function(a,b){return a.send(b)},
 "%":"MIDIOutput"},
 Imr:{
-"^":"FU;jO:id=,oc:name=,t5:type=,Ye:version=",
-giG:function(a){return H.VM(new W.vG(a,"disconnect",!1),[null])},
+"^":"PZ;jO:id=,oc:name=,t5:type=,Ye:version=",
+giG:function(a){return H.VM(new W.RO(a,C.iw.fA,!1),[null])},
 "%":"MIDIInput;MIDIPort"},
-v3:{
-"^":"w6O;w4:altKey=,Ay:button=,Tu:ctrlKey=,Nl:metaKey=,kA:shiftKey=",
+N2:{
+"^":"w6O;YK:altKey=,EV:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 gD7:function(a){var z,y
 if(!!a.offsetX)return H.VM(new P.hL(a.offsetX,a.offsetY),[null])
-else{if(!J.x(W.xj(a.target)).$ish4)throw H.b(P.f("offsetX is only supported on elements"))
-z=W.xj(a.target)
-y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.Yq(J.mB(z)))
+else{if(!J.x(W.qc(a.target)).$ish4)throw H.b(P.f("offsetX is only supported on elements"))
+z=W.qc(a.target)
+y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.nN(J.tG(z)))
 return H.VM(new P.hL(J.XHl(y.x),J.XHl(y.y)),[null])}},
+$isN2:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-H9:{
+x76:{
 "^":"Gv;",
 je:function(a){return a.disconnect()},
 jh:function(a,b,c,d,e,f,g,h,i){var z,y
@@ -10392,16 +10386,16 @@
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
-"^":"FU;NL:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,Ad:parentNode=,a4:textContent%",
-gdH:function(a){return new W.OB(a)},
+"^":"PZ;NL:firstChild=,uD:nextSibling=,J8:ownerDocument=,eT:parentElement=,Ad:parentNode=,a4:textContent%",
+gUN:function(a){return new W.wi(a)},
 wg:function(a){var z=a.parentNode
 if(z!=null)z.removeChild(a)},
-YP:function(a,b){var z,y
+Tk:function(a,b){var z,y
 try{z=a.parentNode
-J.jk(z,b,a)}catch(y){H.Ru(y)}return a},
+J.LW(z,b,a)}catch(y){H.Ru(y)}return a},
 aD:function(a,b,c){var z,y,x
 z=J.x(b)
-if(!!z.$isOB){z=b.uR
+if(!!z.$iswi){z=b.uR
 if(z===a)throw H.b(P.u(b))
 for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},
 D4:function(a){var z
@@ -10410,8 +10404,8 @@
 return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gCR",0,0,73],
 mx:function(a,b){return a.appendChild(b)},
 tg:function(a,b){return a.contains(b)},
-mK:function(a,b,c){return a.insertBefore(b,c)},
-OP:function(a,b,c){return a.replaceChild(b,c)},
+FO:function(a,b,c){return a.insertBefore(b,c)},
+AS:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
 BH3:{
@@ -10422,7 +10416,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gtH:function(a){if(a.length>0)return a[0]
+gqG:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -10445,11 +10439,11 @@
 l9:{
 "^":"Bo;ph:label%",
 "%":"HTMLOptGroupElement"},
-Qlt:{
+lq:{
 "^":"Bo;vH:index=,ph:label%,P:value%",
-$isQlt:true,
+$islq:true,
 "%":"HTMLOptionElement"},
-wL2:{
+Xp:{
 "^":"Bo;oc:name%,t5:type=,P:value%",
 "%":"HTMLOutputElement"},
 HDy:{
@@ -10457,6 +10451,7 @@
 "%":"HTMLParamElement"},
 niR:{
 "^":"ea;",
+$isniR:true,
 "%":"PopStateEvent"},
 S8:{
 "^":"Gv;tT:code=,G1:message=",
@@ -10469,6 +10464,7 @@
 "%":"HTMLProgressElement"},
 ew7:{
 "^":"ea;ox:loaded=",
+$isew7:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 bXi:{
 "^":"ew7;O3:url=",
@@ -10476,12 +10472,12 @@
 j24:{
 "^":"Bo;t5:type=",
 "%":"HTMLScriptElement"},
-zk:{
-"^":"Bo;B:length%,oc:name%,Mj:selectedIndex},ky:size=,t5:type=,P:value%",
+bs:{
+"^":"Bo;B:length%,oc:name%,Mj:selectedIndex},yT:size=,t5:type=,P:value%",
 gbG:function(a){var z=W.vD(a.querySelectorAll("option"),null)
 z=z.ad(z,new W.xv())
 return H.VM(new P.Ui(P.F(z,!0,H.W8(z,"mW",0))),[null])},
-$iszk:true,
+$isbs:true,
 "%":"HTMLSelectElement"},
 I0:{
 "^":"hsw;",
@@ -10494,18 +10490,18 @@
 zD9:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
-r5:{
+y0:{
 "^":"ea;Cf:results=",
 "%":"SpeechRecognitionEvent"},
 vKL:{
 "^":"Gv;V5:isFinal=,B:length=",
 "%":"SpeechRecognitionResult"},
-KKC:{
+er:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
 AsS:{
 "^":"Gv;",
-FV:function(a,b){H.bQ(b,new W.lN(a))},
+FV:function(a,b){H.bQ(b,new W.AA(a))},
 NZ:function(a,b){return a.getItem(b)!=null},
 t:function(a,b){return a.getItem(b)},
 u:function(a,b,c){a.setItem(b,c)},
@@ -10521,7 +10517,7 @@
 this.aN(a,new W.wQ(z))
 return z},
 gUQ:function(a){var z=[]
-this.aN(a,new W.We(z))
+this.aN(a,new W.rs(z))
 return z},
 gB:function(a){return a.length},
 gl0:function(a){return a.key(0)==null},
@@ -10544,7 +10540,7 @@
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.Iv])},
 "%":"HTMLTableElement"},
 Iv:{
-"^":"Bo;Cw:rowIndex=",
+"^":"Bo;RH:rowIndex=",
 iF:function(a,b){return a.insertCell(b)},
 $isIv:true,
 "%":"HTMLTableRowElement"},
@@ -10552,13 +10548,13 @@
 "^":"Bo;",
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.Iv])},
 "%":"HTMLTableSectionElement"},
-yY:{
+OH:{
 "^":"Bo;rz:content=",
-$isyY:true,
-"%":";HTMLTemplateElement;GLL|k5d|G0"},
-kJ:{
+$isOH:true,
+"%":";HTMLTemplateElement;GLL|k5d|hg"},
+Un:{
 "^":"nx;",
-$iskJ:true,
+$isUn:true,
 "%":"CDATASection|Text"},
 FBi:{
 "^":"Bo;oc:name%,vp:rows=,t5:type=,P:value%",
@@ -10567,7 +10563,7 @@
 "^":"w6O;Rn:data=",
 "%":"TextEvent"},
 y6:{
-"^":"w6O;w4:altKey=,Tu:ctrlKey=,Nl:metaKey=,kA:shiftKey=",
+"^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 "%":"TouchEvent"},
 RHt:{
 "^":"Bo;fY:kind=,ph:label%",
@@ -10580,14 +10576,14 @@
 "^":"ftg;fg:height%,R:width}",
 "%":"HTMLVideoElement"},
 EKW:{
-"^":"FU;A8:protocol=,O3:url=",
+"^":"PZ;aB:protocol=,O3:url=",
 XW:function(a,b,c){return a.close(b,c)},
 xO:function(a){return a.close()},
 wR:function(a,b){return a.send(b)},
 "%":"WebSocket"},
 K5:{
-"^":"FU;bq:history=,oc:name%,pf:status%",
-ne:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
+"^":"PZ;bq:history=,oc:name%,pf:status%",
+rK:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
 Wq:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
 for(var y=0;y<z.length&&!b.requestAnimationFrame;++y){b.requestAnimationFrame=b[z[y]+'RequestAnimationFrame']
 b.cancelAnimationFrame=b[z[y]+'CancelAnimationFrame']||b[z[y]+'CancelRequestAnimationFrame']}if(b.requestAnimationFrame&&b.cancelAnimationFrame)return
@@ -10595,14 +10591,14 @@
 b.cancelAnimationFrame=function(c){clearTimeout(c)}})(a)},
 geT:function(a){return W.Pv(a.parent)},
 xO:function(a){return a.close()},
-xc:function(a,b,c,d){a.postMessage(P.jl(b),c)
+xc:function(a,b,c,d){a.postMessage(P.pf(b),c)
 return},
 X6:function(a,b,c){return this.xc(a,b,c,null)},
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 $isK5:true,
-$isFU:true,
+$isPZ:true,
 "%":"DOMWindow|Window"},
-UM:{
+U3:{
 "^":"KV;oc:name=,P:value%",
 "%":"Attr"},
 FR:{
@@ -10627,19 +10623,19 @@
 y=J.v1(a.top)
 x=J.v1(a.width)
 w=J.v1(a.height)
-w=W.Zm(W.Zm(W.Zm(W.Zm(0,z),y),x),w)
+w=W.VC(W.VC(W.VC(W.VC(0,z),y),x),w)
 v=536870911&w+((67108863&w)<<3>>>0)
 v^=v>>>11
 return 536870911&v+((16383&v)<<15>>>0)},
-gSR:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
+gTt:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
 $istn:true,
 $astn:function(){return[null]},
 "%":"ClientRect|DOMRect"},
 NfA:{
 "^":"Bo;",
-$isFU:true,
+$isPZ:true,
 "%":"HTMLFrameSetElement"},
-rhM:{
+Cy:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -10647,7 +10643,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gtH:function(a){if(a.length>0)return a[0]
+gqG:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -10669,7 +10665,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gtH:function(a){if(a.length>0)return a[0]
+gqG:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -10700,22 +10696,22 @@
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.dA;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.dA;z.G();)y.appendChild(z.Ff)},
 GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
 Jd:function(a){return this.GT(a,null)},
 uk:function(a,b){this.aO(b,!1)},
 aO:function(a,b){var z,y,x
 z=this.dA
-if(b){z=J.dd(z)
-y=z.ad(z,new W.dz(a))}else{z=J.dd(z)
-y=z.ad(z,a)}for(z=H.VM(new H.Mo(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),x=z.CL;z.G();)J.Rv(x.gl())},
+if(b){z=J.Mx(z)
+y=z.ad(z,new W.dz(a))}else{z=J.Mx(z)
+y=z.ad(z,a)}for(z=H.VM(new H.vG(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),x=z.CL;z.G();)J.Mp(x.gl())},
 YW:function(a,b,c,d,e){throw H.b(P.nO(null))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 Rz:function(a,b){var z
 if(!!J.x(b).$ish4){z=this.dA
 if(b.parentNode===z){z.removeChild(b)
 return!0}}return!1},
-aP:function(a,b,c){var z,y,x
+xe:function(a,b,c){var z,y,x
 if(b>this.jS.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.jS
 y=z.length
@@ -10725,17 +10721,17 @@
 x.insertBefore(c,z[b])}},
 Mh:function(a,b,c){throw H.b(P.nO(null))},
 V1:function(a){J.Wf(this.dA)},
-f4:function(a){var z=this.grZ(this)
-this.dA.removeChild(z)
+mv:function(a){var z=this.grZ(this)
+if(z!=null)this.dA.removeChild(z)
 return z},
-gtH:function(a){var z=this.dA.firstElementChild
+gqG:function(a){var z=this.dA.firstElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 grZ:function(a){var z=this.dA.lastElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 $asark:function(){return[W.h4]},
-$asE9h:function(){return[W.h4]},
+$aseD:function(){return[W.h4]},
 $asWO:function(){return[W.h4]},
 $asQV:function(){return[W.h4]}},
 dz:{
@@ -10743,19 +10739,19 @@
 $1:function(a){return this.a.$1(a)!==!0},
 $isEH:true},
 wz:{
-"^":"ark;mk,xa",
-gB:function(a){return this.mk.length},
-t:function(a,b){var z=this.mk
+"^":"ark;jt,xa",
+gB:function(a){return this.jt.length},
+t:function(a,b){var z=this.jt
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot modify list"))},
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
 GT:function(a,b){throw H.b(P.f("Cannot sort list"))},
 Jd:function(a){return this.GT(a,null)},
-gtH:function(a){return C.z0.gtH(this.mk)},
-grZ:function(a){return C.z0.grZ(this.mk)},
-gDD:function(a){return W.Uk(this.xa)},
-S8:function(a,b){var z=C.z0.ad(this.mk,new W.ty())
+gqG:function(a){return C.t5.gqG(this.jt)},
+grZ:function(a){return C.t5.grZ(this.jt)},
+gDD:function(a){return W.or(this.xa)},
+S8:function(a,b){var z=C.t5.ad(this.jt,new W.ty())
 this.xa=P.F(z,!0,H.W8(z,"mW",0))},
 $isWO:true,
 $asWO:null,
@@ -10769,7 +10765,7 @@
 "^":"TpZ:12;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
-M5K:{
+QI:{
 "^":"Gv;"},
 RAp:{
 "^":"Gv+lD;",
@@ -10787,7 +10783,7 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"TpZ:12;",
-$1:[function(a){return J.CA(a)},"$1",null,2,0,null,151,"call"],
+$1:[function(a){return J.lN(a)},"$1",null,2,0,null,151,"call"],
 $isEH:true},
 bU2:{
 "^":"TpZ:81;a",
@@ -10809,9 +10805,9 @@
 "^":"TpZ:81;a",
 $2:function(a,b){if(b!=null)this.a[a]=b},
 $isEH:true},
-OB:{
+wi:{
 "^":"ark;uR",
-gtH:function(a){var z=this.uR.firstChild
+gqG:function(a){var z=this.uR.firstChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 grZ:function(a){var z=this.uR.lastChild
@@ -10819,8 +10815,8 @@
 return z},
 h:function(a,b){this.uR.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.uR;z.G();)y.appendChild(z.lo)},
-aP:function(a,b,c){var z,y,x
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.uR;z.G();)y.appendChild(z.Ff)},
+xe:function(a,b,c){var z,y,x
 if(b>this.uR.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.uR
 y=z.childNodes
@@ -10832,7 +10828,7 @@
 z=this.uR
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
+J.r5(z,c,y[b])},
 Mh:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
 Rz:function(a,b){var z
 if(!J.x(b).$isKV)return!1
@@ -10852,7 +10848,7 @@
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
 z.replaceChild(c,y[b])},
-gA:function(a){return C.z0.gA(this.uR.childNodes)},
+gA:function(a){return C.t5.gA(this.uR.childNodes)},
 GT:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
 Jd:function(a){return this.GT(a,null)},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},
@@ -10862,9 +10858,9 @@
 t:function(a,b){var z=this.uR.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-$isOB:true,
+$iswi:true,
 $asark:function(){return[W.KV]},
-$asE9h:function(){return[W.KV]},
+$aseD:function(){return[W.KV]},
 $asWO:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
 nNL:{
@@ -10883,9 +10879,9 @@
 $asQV:function(){return[W.KV]}},
 xv:{
 "^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$isQlt},
+$1:function(a){return!!J.x(a).$islq},
 $isEH:true},
-lN:{
+AA:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.setItem(a,b)},
 $isEH:true},
@@ -10893,7 +10889,7 @@
 "^":"TpZ:81;a",
 $2:function(a,b){return this.a.push(a)},
 $isEH:true},
-We:{
+rs:{
 "^":"TpZ:81;a",
 $2:function(a,b){return this.a.push(b)},
 $isEH:true},
@@ -10927,11 +10923,11 @@
 $asQV:function(){return[W.vKL]}},
 a7B:{
 "^":"a;",
-FV:function(a,b){J.Me(b,new W.ZcQ(this))},
+FV:function(a,b){J.Me(b,new W.Za(this))},
 V1:function(a){var z
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.lo)},
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.Ff)},
 aN:function(a,b){var z,y
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 b.$2(y,this.t(0,y))}},
 gvc:function(a){var z,y,x,w
 z=this.dA.attributes
@@ -10949,7 +10945,7 @@
 gor:function(a){return this.gB(this)!==0},
 $isT8:true,
 $asT8:function(){return[P.qU,P.qU]}},
-ZcQ:{
+Za:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
@@ -10966,25 +10962,25 @@
 gB:function(a){return this.gvc(this).length},
 O2:function(a){return a.namespaceURI==null}},
 nFk:{
-"^":"As3;a7,AL",
-DG:function(){var z=P.fM(null,null,null,P.qU)
-this.AL.aN(0,new W.pd(z))
+"^":"As3;RN,AL",
+DG:function(){var z=P.Ls(null,null,null,P.qU)
+this.AL.aN(0,new W.jL(z))
 return z},
 p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.a7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.fm(y.lo,z)},
+for(y=this.RN,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.Pw(y.Ff,z)},
 H9:function(a){this.AL.aN(0,new W.uS(a))},
-Rz:function(a,b){return this.Fm(new W.FcD(b))},
-Fm:function(a){return this.AL.es(0,!1,new W.cf(a))},
-b1:function(a){this.AL=H.VM(new H.A8(P.F(this.a7,!0,null),new W.Zu()),[null,null])},
-static:{Uk:function(a){var z=new W.nFk(a,null)
+Rz:function(a,b){return this.jA(new W.FcD(b))},
+jA:function(a){return this.AL.es(0,!1,new W.hD(a))},
+b1:function(a){this.AL=H.VM(new H.A8(P.F(this.RN,!0,null),new W.FK()),[null,null])},
+static:{or:function(a){var z=new W.nFk(a,null)
 z.b1(a)
 return z}}},
-Zu:{
+FK:{
 "^":"TpZ:12;",
 $1:[function(a){return new W.I4(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-pd:{
+jL:{
 "^":"TpZ:12;a",
 $1:function(a){return this.a.FV(0,a.DG())},
 $isEH:true},
@@ -10996,38 +10992,40 @@
 "^":"TpZ:12;a",
 $1:function(a){return J.V1(a,this.a)},
 $isEH:true},
-cf:{
+hD:{
 "^":"TpZ:81;a",
 $2:function(a,b){return this.a.$1(b)===!0||a===!0},
 $isEH:true},
 I4:{
 "^":"As3;dA",
 DG:function(){var z,y,x
-z=P.fM(null,null,null,P.qU)
-for(y=J.ufU(this.dA).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.iY(y.lo)
+z=P.Ls(null,null,null,P.qU)
+for(y=J.uf(this.dA).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.rr(y.Ff)
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
-J.fm(this.dA,a.zV(0," "))}},
-vG:{
-"^":"cb;bi,fA,el",
+J.Pw(this.dA,a.zV(0," "))}},
+FkO:{
+"^":"a;fA"},
+RO:{
+"^":"wS;bi,fA,el",
 KR:function(a,b,c,d){var z=new W.Ov(0,this.bi,this.fA,W.Yt(a),this.el)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.DN()
 return z},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)}},
-eu:{
-"^":"vG;bi,fA,el",
-WO:function(a,b){var z=H.VM(new P.fk(new W.ie(b),this),[H.W8(this,"cb",0)])
-return H.VM(new P.c9(new W.tS(b),z),[H.W8(z,"cb",0),null])},
-$iscb:true},
+Cqa:{
+"^":"RO;bi,fA,el",
+xZ:function(a,b){var z=H.VM(new P.fk(new W.ie(b),this),[H.W8(this,"wS",0)])
+return H.VM(new P.c9(new W.tS(b),z),[H.W8(z,"wS",0),null])},
+$iswS:true},
 ie:{
 "^":"TpZ:12;a",
-$1:function(a){return J.vI(J.l2(a),this.a)},
+$1:function(a){return J.tPf(J.l2(a),this.a)},
 $isEH:true},
 tS:{
 "^":"TpZ:12;b",
-$1:[function(a){J.A6(a,this.b)
+$1:[function(a){J.A6L(a,this.b)
 return a},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Ov:{
@@ -11039,14 +11037,14 @@
 return},
 Fv:[function(a,b){if(this.bi==null)return;++this.UU
 this.EO()
-if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"zd","$1","$0","gX0",0,2,136,22,137],
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,136,22,137],
 gUF:function(){return this.UU>0},
 QE:[function(a){if(this.bi==null||this.UU<=0)return;--this.UU
 this.DN()},"$0","gDQ",0,0,17],
 DN:function(){var z=this.H2
 if(z!=null&&this.UU<=0)J.cZ(this.bi,this.fA,z,this.el)},
 EO:function(){var z=this.H2
-if(z!=null)J.GJ(this.bi,this.fA,z,this.el)}},
+if(z!=null)J.we(this.bi,this.fA,z,this.el)}},
 Gm:{
 "^":"a;",
 gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.W8(a,"Gm",0)])},
@@ -11054,7 +11052,7 @@
 FV:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
 GT:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
 Jd:function(a){return this.GT(a,null)},
-aP:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
 Mh:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
@@ -11068,44 +11066,44 @@
 $isQV:true,
 $asQV:null},
 uB:{
-"^":"ark;HA",
-gA:function(a){return H.VM(new W.Qg(J.mY(this.HA)),[null])},
-gB:function(a){return this.HA.length},
-h:function(a,b){J.dH(this.HA,b)},
-Rz:function(a,b){return J.V1(this.HA,b)},
-V1:function(a){J.U2(this.HA)},
-t:function(a,b){var z=this.HA
+"^":"ark;xN",
+gA:function(a){return H.VM(new W.LV(J.mY(this.xN)),[null])},
+gB:function(a){return this.xN.length},
+h:function(a,b){J.bi(this.xN,b)},
+Rz:function(a,b){return J.V1(this.xN,b)},
+V1:function(a){J.Z8(this.xN)},
+t:function(a,b){var z=this.xN
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.HA
+u:function(a,b,c){var z=this.xN
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},
-sB:function(a,b){J.Vw(this.HA,b)},
-GT:function(a,b){J.uF(this.HA,b)},
+sB:function(a,b){J.wg(this.xN,b)},
+GT:function(a,b){J.uF(this.xN,b)},
 Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.DP(this.HA,b,c)},
+XU:function(a,b,c){return J.DP(this.xN,b,c)},
 OY:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return J.ff(this.HA,b,c)},
+Pk:function(a,b,c){return J.ff(this.xN,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-aP:function(a,b,c){return J.V2(this.HA,b,c)},
-YW:function(a,b,c,d,e){J.L0(this.HA,b,c,d,e)},
+xe:function(a,b,c){return J.Vk(this.xN,b,c)},
+YW:function(a,b,c,d,e){J.CP(this.xN,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-oq:function(a,b,c){J.Cz(this.HA,b,c)}},
-Qg:{
-"^":"a;iB",
-G:function(){return this.iB.G()},
-gl:function(){return this.iB.Ff}},
+oq:function(a,b,c){J.Cz(this.xN,b,c)}},
+LV:{
+"^":"a;qD",
+G:function(){return this.qD.G()},
+gl:function(){return this.qD.QZ}},
 W9:{
-"^":"a;NX,bd,G3,Ff",
+"^":"a;NX,vN,G3,QZ",
 G:function(){var z,y
 z=this.G3+1
-y=this.bd
-if(z<y){this.Ff=J.UQ(this.NX,z)
+y=this.vN
+if(z<y){this.QZ=J.UQ(this.NX,z)
 this.G3=z
-return!0}this.Ff=null
+return!0}this.QZ=null
 this.G3=y
 return!1},
-gl:function(){return this.Ff}},
+gl:function(){return this.QZ}},
 uY:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z=H.Va(this.b)
@@ -11118,17 +11116,17 @@
 gbq:function(a){return W.zK(this.uU.history)},
 geT:function(a){return W.P1(this.uU.parent)},
 xO:function(a){return this.uU.close()},
-xc:function(a,b,c,d){this.uU.postMessage(P.jl(b),c)},
+xc:function(a,b,c,d){this.uU.postMessage(P.pf(b),c)},
 X6:function(a,b,c){return this.xc(a,b,c,null)},
 On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-$isFU:true,
+$isPZ:true,
 static:{P1:function(a){if(a===window)return a
 else return new W.dW(a)}}},
-IV:{
-"^":"a;nAT",
+VP:{
+"^":"a;nA",
 static:{zK:function(a){if(a===window.history)return a
-else return new W.IV(a)}}}}],["","",,P,{
+else return new W.VP(a)}}}}],["","",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -11136,10 +11134,10 @@
 "%":"IDBKeyRange"}}],["","",,P,{
 "^":"",
 Y0Y:{
-"^":"tpr;N:target=,LU:href=",
+"^":"tpr;N:target=,mH:href=",
 "%":"SVGAElement"},
 ZJQ:{
-"^":"dh;LU:href=",
+"^":"Rc;mH:href=",
 "%":"SVGAltGlyphElement"},
 jwG:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
@@ -11147,13 +11145,13 @@
 lvr:{
 "^":"d5G;t5:type=,UQ:values=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
-vA:{
+pfc:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
-pyf:{
+lF:{
 "^":"d5G;xS:operator=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFECompositeElement"},
-B3:{
+EfE:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
@@ -11169,7 +11167,7 @@
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
 meI:{
-"^":"d5G;fg:height=,yG:result=,x=,y=,LU:href=",
+"^":"d5G;fg:height=,yG:result=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
 oBW:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
@@ -11183,57 +11181,57 @@
 Ubr:{
 "^":"d5G;x=,y=",
 "%":"SVGFEPointLightElement"},
-zu:{
+bMB:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
 HAk:{
 "^":"d5G;x=,y=",
 "%":"SVGFESpotLightElement"},
-Qya:{
+Rg:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFETileElement"},
 juM:{
 "^":"d5G;t5:type=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 OE5:{
-"^":"d5G;fg:height=,x=,y=,LU:href=",
+"^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGFilterElement"},
 l6:{
 "^":"tpr;fg:height=,x=,y=",
 "%":"SVGForeignObjectElement"},
-d0D:{
+en:{
 "^":"tpr;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 tpr:{
 "^":"d5G;",
 "%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 rEM:{
-"^":"tpr;fg:height=,x=,y=,LU:href=",
+"^":"tpr;fg:height=,x=,y=,mH:href=",
 "%":"SVGImageElement"},
 NBZ:{
 "^":"d5G;fg:height=,x=,y=",
 "%":"SVGMaskElement"},
 Gr5:{
-"^":"d5G;fg:height=,x=,y=,LU:href=",
+"^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-fQ:{
-"^":"d0D;fg:height=,x=,y=",
+NJ3:{
+"^":"en;fg:height=,x=,y=",
 "%":"SVGRectElement"},
 qIR:{
-"^":"d5G;t5:type=,LU:href=",
+"^":"d5G;t5:type=,mH:href=",
 "%":"SVGScriptElement"},
 EUL:{
 "^":"d5G;t5:type=",
-ska:function(a,b){a.title=b},
+smk:function(a,b){a.title=b},
 "%":"SVGStyleElement"},
 d5G:{
 "^":"h4;",
-gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.Ci(a)
+gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
 return a._cssClassSet},
-gqu:function(a){return H.VM(new P.P0(a,new W.OB(a)),[W.h4])},
-gVY:function(a){return H.VM(new W.eu(a,"mousedown",!1),[null])},
-gf0:function(a){return H.VM(new W.eu(a,"mousemove",!1),[null])},
-$isFU:true,
+gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
+gVY:function(a){return H.VM(new W.Cqa(a,C.Whw.fA,!1),[null])},
+gf0:function(a){return H.VM(new W.Cqa(a,C.Kq.fA,!1),[null])},
+$isPZ:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
 static:{"^":"SHk<"}},
 hy:{
@@ -11245,24 +11243,24 @@
 "^":"tpr;",
 "%":";SVGTextContentElement"},
 Rk4:{
-"^":"mHq;LU:href=",
+"^":"mHq;mH:href=",
 "%":"SVGTextPathElement"},
-dh:{
+Rc:{
 "^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
-pyk:{
-"^":"tpr;fg:height=,x=,y=,LU:href=",
+o4:{
+"^":"tpr;fg:height=,x=,y=,mH:href=",
 "%":"SVGUseElement"},
 cuU:{
-"^":"d5G;LU:href=",
+"^":"d5G;mH:href=",
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-Ci:{
+O7:{
 "^":"As3;LO",
 DG:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
-y=P.fM(null,null,null,P.qU)
+y=P.Ls(null,null,null,P.qU)
 if(z==null)return y
-for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.iY(x.lo)
+for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.rr(x.Ff)
 if(w.length!==0)y.h(0,w)}return y},
 p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["","",,P,{
 "^":"",
@@ -11270,9 +11268,9 @@
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["","",,P,{
 "^":"",
-XY:{
+hq:{
 "^":"a;",
-$isXY:true}}],["","",,P,{
+$ishq:true}}],["","",,P,{
 "^":"",
 z8:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
@@ -11338,7 +11336,7 @@
 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())},kW:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
+return P.ND(new x())},XY:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
 return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(H.VM(new P.PL(0,null,null,null,null),[null,null])).$1(a)}}},
 Xb:{
 "^":"TpZ:12;a",
@@ -11364,7 +11362,7 @@
 $isr7:true,
 static:{mt:function(a){return new P.r7(P.z8(a,!0))}}},
 GD:{
-"^":"F6;S1",
+"^":"WkF;S1",
 t:function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
 else z=!1
@@ -11379,9 +11377,9 @@
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
 h:function(a,b){this.V7("push",[b])},
 FV:function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},
-aP:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
+xe:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
 this.V7("splice",[b,0,c])},
-oq:function(a,b,c){P.UP(b,c,this.gB(this))
+oq:function(a,b,c){P.ze(b,c,this.gB(this))
 this.V7("splice",[b,c-b])},
 YW:function(a,b,c,d,e){var z,y,x
 z=this.gB(this)
@@ -11391,14 +11389,14 @@
 if(y===0)return
 if(e<0)throw H.b(P.u(e))
 x=[b,y]
-C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
+C.Nm.FV(x,J.Ld(d,e).rh(0,y))
 this.V7("splice",x)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 GT:function(a,b){this.V7("sort",[])},
 Jd:function(a){return this.GT(a,null)},
-static:{UP:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
+static:{ze:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
 if(b<a||b>c)throw H.b(P.TE(b,a,c))}}},
-F6:{
+WkF:{
 "^":"E4+lD;",
 $isWO:true,
 $asWO:null,
@@ -11428,10 +11426,10 @@
 $1:function(a){return new P.E4(a)},
 $isEH:true}}],["","",,P,{
 "^":"",
-VC:function(a,b){a=536870911&a+b
+Zm:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
-Up:function(a){a=536870911&a+((67108863&a)<<3>>>0)
+xk:function(a){a=536870911&a+((67108863&a)<<3>>>0)
 a^=a>>>11
 return 536870911&a+((16383&a)<<15>>>0)},
 J:function(a,b){var z
@@ -11458,7 +11456,7 @@
 return Math.random()*a>>>0}},
 kh:{
 "^":"a;xx,vz",
-xv:function(){var z,y,x,w,v,u
+SR:function(){var z,y,x,w,v,u
 z=this.xx
 y=4294901760*z
 x=(y&4294967295)>>>0
@@ -11471,19 +11469,19 @@
 j1:function(a){var z,y,x
 if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.xv()
-return(this.xx&z)>>>0}do{this.xv()
+if((a&z)===0){this.SR()
+return(this.xx&z)>>>0}do{this.SR()
 y=this.xx
 x=y%a}while(y-x+a>=4294967296)
 return x},
-FO:function(a){var z,y,x,w,v,u,t,s
+mK:function(a){var z,y,x,w,v,u,t,s
 z=J.u6(a,0)?-1:0
 do{y=J.Wx(a)
 x=y.i(a,4294967295)
-a=J.Ts(y.W(a,x),4294967296)
+a=J.Cl(y.W(a,x),4294967296)
 y=J.Wx(a)
 w=y.i(a,4294967295)
-a=J.Ts(y.W(a,w),4294967296)
+a=J.Cl(y.W(a,w),4294967296)
 v=((~x&4294967295)>>>0)+(x<<21>>>0)
 u=(v&4294967295)>>>0
 w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.BU(v-u,4294967296)&4294967295
@@ -11506,12 +11504,12 @@
 this.xx=(t^u)>>>0
 this.vz=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
 if(this.vz===0&&this.xx===0)this.xx=23063
-this.xv()
-this.xv()
-this.xv()
-this.xv()},
-static:{"^":"dK,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
-z.FO(a)
+this.SR()
+this.SR()
+this.SR()
+this.SR()},
+static:{"^":"tgM,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
+z.mK(a)
 return z}}},
 hL:{
 "^":"a;x>,y>",
@@ -11529,7 +11527,7 @@
 giO:function(a){var z,y
 z=J.v1(this.x)
 y=J.v1(this.y)
-return P.Up(P.VC(P.VC(0,z),y))},
+return P.xk(P.Zm(P.Zm(0,z),y))},
 g:function(a,b){var z,y,x,w
 z=this.x
 y=J.RE(b)
@@ -11579,8 +11577,8 @@
 z=y===z.gG6(b)&&this.Bb+this.R===z.gT8(b)&&y+this.fg===z.gQG(b)}else z=!1
 return z},
 giO:function(a){var z=this.G6
-return P.Up(P.VC(P.VC(P.VC(P.VC(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Bb+this.R&0x1FFFFFFF),z+this.fg&0x1FFFFFFF))},
-gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
+return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Bb+this.R&0x1FFFFFFF),z+this.fg&0x1FFFFFFF))},
+gTt:function(a){var z=new P.hL(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 tn:{
@@ -11595,7 +11593,7 @@
 moY:{
 "^":"a;JH",
 static:{"^":"aRn,aLE,Rwl"}},
-Wy:{
+V2:{
 "^":"a;",
 $isAS:true}}],["","",,H,{
 "^":"",
@@ -11606,14 +11604,14 @@
 return a},
 aRu:function(a){a.toString
 return a},
-GG:function(a,b,c){H.Hj(a,b,c)
+z4:function(a,b,c){H.Hj(a,b,c)
 return new Uint8Array(a,b)},
-WZ:{
+bf:{
 "^":"Gv;H3:byteLength=",
-gbx:function(a){return C.E0},
+gbx:function(a){return C.uh},
 kq:function(a,b,c){H.Hj(a,b,c)
 return new DataView(a,b)},
-$isWZ:true,
+$isbf:true,
 $isaI:true,
 "%":"ArrayBuffer"},
 eH:{
@@ -11629,10 +11627,10 @@
 return c},
 $iseH:true,
 $isAS:true,
-"%":";ArrayBufferView;we|ObS|GVy|Dg|fjp|Ipv|Pg"},
+"%":";ArrayBufferView;b0B|ObS|Ip|Dg|fjp|GVy|Pg"},
 dfL:{
 "^":"eH;",
-gbx:function(a){return C.T1},
+gbx:function(a){return C.nW},
 mt:function(a,b,c){throw H.b(P.f("Uint64 accessor not supported by dart2js."))},
 $isAS:true,
 "%":"DataView"},
@@ -11641,20 +11639,20 @@
 gbx:function(a){return C.ra},
 $isAS:true,
 $isWO:true,
-$asWO:function(){return[P.CP]},
+$asWO:function(){return[P.Vf]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]},
+$asQV:function(){return[P.Vf]},
 "%":"Float32Array"},
 K8Q:{
 "^":"Dg;",
-gbx:function(a){return C.Ev},
+gbx:function(a){return C.nC},
 $isAS:true,
 $isWO:true,
-$asWO:function(){return[P.CP]},
+$asWO:function(){return[P.Vf]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]},
+$asQV:function(){return[P.Vf]},
 "%":"Float64Array"},
 xja:{
 "^":"Pg;",
@@ -11671,7 +11669,7 @@
 "%":"Int16Array"},
 dE5:{
 "^":"Pg;",
-gbx:function(a){return C.J0},
+gbx:function(a){return C.QP},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11684,7 +11682,7 @@
 "%":"Int32Array"},
 Zc5:{
 "^":"Pg;",
-gbx:function(a){return C.qB},
+gbx:function(a){return C.laj},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11695,9 +11693,9 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Int8Array"},
-wfF:{
+pd:{
 "^":"Pg;",
-gbx:function(a){return C.M5},
+gbx:function(a){return C.u9},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11708,7 +11706,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Uint16Array"},
-N2:{
+Pqh:{
 "^":"Pg;",
 gbx:function(a){return C.Vh},
 t:function(a,b){var z=a.length
@@ -11723,7 +11721,7 @@
 "%":"Uint32Array"},
 eEV:{
 "^":"Pg;",
-gbx:function(a){return C.hD},
+gbx:function(a){return C.YZ},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
@@ -11735,9 +11733,9 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"CanvasPixelArray|Uint8ClampedArray"},
-V6a:{
+V6:{
 "^":"Pg;",
-gbx:function(a){return C.HC},
+gbx:function(a){return C.Wr},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
@@ -11750,7 +11748,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":";Uint8Array"},
-we:{
+b0B:{
 "^":"eH;",
 gB:function(a){return a.length},
 SM:function(a,b,c,d,e){var z,y,x
@@ -11766,7 +11764,7 @@
 a.set(d,b)},
 $isXj:true},
 Dg:{
-"^":"GVy;",
+"^":"Ip;",
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11778,16 +11776,16 @@
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true},
 ObS:{
-"^":"we+lD;",
+"^":"b0B+lD;",
 $isWO:true,
-$asWO:function(){return[P.CP]},
+$asWO:function(){return[P.Vf]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]}},
-GVy:{
+$asQV:function(){return[P.Vf]}},
+Ip:{
 "^":"ObS+SU7;"},
 Pg:{
-"^":"Ipv;",
+"^":"GVy;",
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 a[b]=c},
@@ -11801,13 +11799,13 @@
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 fjp:{
-"^":"we+lD;",
+"^":"b0B+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
-Ipv:{
+GVy:{
 "^":"fjp+SU7;"}}],["","",,H,{
 "^":"",
 qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
@@ -11817,27 +11815,27 @@
 return}throw"Unable to print message: "+String(a)}}],["","",,G,{
 "^":"",
 Tk:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{aMd:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{oo:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.vo.LX(a)
-C.vo.XI(a)
+C.BB.LX(a)
+C.BB.XI(a)
 return a}}}}],["","",,F,{
 "^":"",
 ZP:{
-"^":"pva;Ew,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"pva;Ew,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gkc:function(a){return a.Ew},
 skc:function(a,b){a.Ew=this.ct(a,C.yh,a.Ew,b)},
 static:{Yw:function(a){var z,y,x,w
@@ -11846,7 +11844,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -11861,9 +11859,9 @@
 $isd3:true}}],["","",,L,{
 "^":"",
 nJ:{
-"^":"cda;fn,Ek,Ln,y4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-ga4:function(a){return a.fn},
-sa4:function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},
+"^":"cda;a3,Ek,Ln,y4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+ga4:function(a){return a.a3},
+sa4:function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},
 gdu:function(a){return a.Ek},
 sdu:function(a,b){a.Ek=this.ct(a,C.eh,a.Ek,b)},
 gFR:function(a){return a.Ln},
@@ -11875,19 +11873,19 @@
 hE:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isSc").value
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
-if(J.xC(z,"1-line")){z=J.JA(a.fn,"\n"," ")
-a.fn=this.ct(a,C.mi,a.fn,z)}},"$3","gxb",6,0,116,2,106,107],
-jc:[function(a,b,c,d){var z,y,x
-J.jD(b)
-z=a.fn
-a.fn=this.ct(a,C.mi,z,"")
+if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,116,2,106,107],
+kk:[function(a,b,c,d){var z,y,x
+J.fD(b)
+z=a.a3
+a.a3=this.ct(a,C.mi,z,"")
 if(a.Ln!=null){y=P.Fl(null,null)
 x=R.tB(y)
-J.qQ(x,"expr",z)
-J.V2(a.y4,0,x)
+J.kW(x,"expr",z)
+J.Vk(a.y4,0,x)
 this.LY(a,z).ml(new L.YW(x))}},"$3","gZ2",6,0,116,2,106,107],
-o5:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.fn=this.ct(a,C.mi,a.fn,z)},"$1","gHo",2,0,152,2],
+o5:[function(a,b){var z=J.VU(J.l2(b),"expr")
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,152,2],
 static:{Rpj:function(a){var z,y,x,w,v
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -11897,26 +11895,26 @@
 v=P.Fl(null,null)
 a.Ek="1-line"
 a.y4=z
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.GhT.LX(a)
-C.GhT.XI(a)
+C.Jh.LX(a)
+C.Jh.XI(a)
 return a}}},
 cda:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
 "^":"TpZ:12;a",
-$1:[function(a){J.qQ(this.a,"value",a)},"$1",null,2,0,null,121,"call"],
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,R,{
 "^":"",
 Eg:{
-"^":"KAf;fe,l1,bY,jv,oy,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"KAf;fe,l1,bY,jv,oy,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gO9:function(a){return a.fe},
 sO9:function(a,b){a.fe=this.ct(a,C.S4,a.fe,b)},
 gph:function(a){return a.l1},
@@ -11933,7 +11931,7 @@
 if(z===!0)return
 if(a.bY!=null){a.fe=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Ou(a)).wM(new R.VO(a))}},"$3","gDf",6,0,84,49,50,85],
+this.LY(a,a.jv).ml(new R.Kz(a)).wM(new R.uv(a))}},"$3","gDf",6,0,84,49,50,85],
 static:{Ola:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11945,40 +11943,40 @@
 a.bY=null
 a.jv=""
 a.oy=null
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.qL.LX(a)
-C.qL.XI(a)
+C.lQ.LX(a)
+C.lQ.XI(a)
 return a}}},
 KAf:{
 "^":"xc+Pi;",
 $isd3:true},
-Ou:{
+Kz:{
 "^":"TpZ:153;a",
 $1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,96,"call"],
+z.oy=J.NB(z,C.UY,z.oy,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-VO:{
+uv:{
 "^":"TpZ:76;b",
 $0:[function(){var z=this.b
-z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
+z.fe=J.NB(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["","",,D,{
 "^":"",
 i7:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{hSW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -11990,7 +11988,7 @@
 return a}}}}],["","",,A,{
 "^":"",
 Gk:{
-"^":"waa;KV,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"waa;KV,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
 pA:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,19,102],
@@ -12000,22 +11998,22 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.D4.LX(a)
-C.D4.XI(a)
+C.LTI.LX(a)
+C.LTI.XI(a)
 return a}}},
 waa:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,X,{
 "^":"",
 J3:{
-"^":"V10;DC,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V10;DC,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
 pA:[function(a,b){J.LE(a.DC).wM(b)},"$1","gvC",2,0,19,102],
@@ -12025,45 +12023,45 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.N3.LX(a)
-C.N3.XI(a)
+C.n0.LX(a)
+C.n0.XI(a)
 return a}}},
 V10:{
 "^":"uL+Pi;",
 $isd3:true},
 MJ:{
-"^":"V11;Zc,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gng:function(a){return a.Zc},
-sng:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
+"^":"V11;Zc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gQR:function(a){return a.Zc},
+sQR:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
 static:{IfX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Hb.LX(a)
-C.Hb.XI(a)
+C.ls6.LX(a)
+C.ls6.XI(a)
 return a}}},
 V11:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,U,{
 "^":"",
 DK:{
-"^":"T53;PQ,Vg,ij,tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"T53;PQ,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gU4:function(a){return a.PQ},
 sU4:function(a,b){a.PQ=this.ct(a,C.QK,a.PQ,b)},
 static:{v9:function(a){var z,y,x,w
@@ -12073,8 +12071,8 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.PQ=!0
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12089,18 +12087,18 @@
 $isd3:true}}],["","",,N,{
 "^":"",
 BS:{
-"^":"V12;P6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V12;P6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
 pA:[function(a,b){J.LE(a.P6).wM(b)},"$1","gvC",2,0,19,102],
-Da:[function(a,b){J.y9(a.P6).wM(b)},"$1","gDX",2,0,19,102],
+m4:[function(a,b){J.y9(a.P6).wM(b)},"$1","gDX",2,0,19,102],
 static:{nz:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12132,9 +12130,9 @@
 if(typeof z!=="number")return H.s(z)
 return new O.Hz(a,(y*x+z)*4)}}},
 x2:{
-"^":"a;Yu<,ky>"},
+"^":"a;Yu<,yT>"},
 Vb:{
-"^":"V13;N2,WC,rn,Tl,GE,Cv,PA,oj,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V13;N2,WC,rn,Tl,GE,Cv,PA,oj,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gpf:function(a){return a.PA},
 spf:function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},
 gyw:function(a){return a.oj},
@@ -12145,10 +12143,10 @@
 a.N2=z
 z=J.Q9(z)
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(this.gL2(a)),z.el),[H.u3(z,0)]).DN()
-z=J.PQ(a.N2)
+z=J.GW(a.N2)
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(this.gok(a)),z.el),[H.u3(z,0)]).DN()},
 Zt:function(a,b){var z,y,x
-for(z=J.mY(b),y=0;z.G();){x=z.lo
+for(z=J.mY(b),y=0;z.G();){x=z.Ff
 if(typeof x!=="number")return H.s(x)
 y=y*256+x}return y},
 OU:function(a,b,c,d){var z=J.BQ(c,"@")
@@ -12159,7 +12157,7 @@
 DO:function(a,b,c){var z,y,x,w,v,u,t,s,r
 for(z=J.mY(J.UQ(b,"members")),y=a.Cv,x=a.Tl,w=a.GE;z.G();){v=z.gl()
 if(!J.x(v).$isdy){N.QM("").To(H.d(v))
-continue}u=H.BU(C.Nm.grZ(J.BQ(v.r0,"/")),null,null)
+continue}u=H.BU(C.Nm.grZ(J.BQ(v.TU,"/")),null,null)
 t=u==null?C.Xh:P.n2(u)
 s=[t.j1(128),t.j1(128),t.j1(128),255]
 r=J.BQ(v.bN,"@")
@@ -12167,7 +12165,7 @@
 y.u(0,u,r[0])
 x.u(0,u,s)
 w.u(0,this.Zt(a,s),u)}this.OU(a,c,"Free",$.R2())
-this.OU(a,0,"",$.vl())},
+this.OU(a,0,"",$.Qg())},
 Tm:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.rn
 y=J.eY(a.WC)
@@ -12203,15 +12201,15 @@
 bD:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y=this.Tm(a,z.gD7(b))
-x=H.d(y.ky)+"B @ 0x"+J.u1(y.Yu,16)
+x=H.d(y.yT)+"B @ 0x"+J.u1(y.Yu,16)
 z=z.gD7(b)
 z=O.x6(a.WC,z)
 w=z.y5
 v=a.Cv.t(0,a.GE.t(0,this.Zt(a,C.yp.Yc(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
 a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gL2",2,0,152,87],
-Vq:[function(a,b){var z=J.u1(this.Tm(a,J.op(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.wg(a.oj)))+"/address/"+z},"$1","gok",2,0,152,87],
+qM:[function(a,b){var z=J.u1(this.Tm(a,J.op(b)).Yu,16)
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gok",2,0,152,87],
 UV:function(a){var z,y,x,w,v
 z=a.oj
 if(z==null||a.N2==null)return
@@ -12220,19 +12218,19 @@
 z=a.N2.parentElement
 z.toString
 x=P.T7(C.CD.yu(C.CD.RE(z.clientLeft)),C.CD.yu(C.CD.RE(z.clientTop)),C.CD.yu(C.CD.RE(z.clientWidth)),C.CD.yu(C.CD.RE(z.clientHeight)),null).R
-z=J.Ts(J.Ts(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
+z=J.Cl(J.Cl(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
 if(typeof z!=="number")return H.s(z)
 z=4+z
 a.rn=z
 w=J.q8(y)
 if(typeof w!=="number")return H.s(w)
 v=P.J(z*w,6000)
-w=P.f9(J.rN(a.N2).createImageData(x,v))
+w=P.f9(J.Ry(a.N2).createImageData(x,v))
 a.WC=w
 J.vP(a.N2,J.eY(w))
-J.OE(a.N2,J.Jv(a.WC))
-this.JX(a,0)},
-JX:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+J.OE(a.N2,J.OB(a.WC))
+this.Ky(a,0)},
+Ky:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z=J.UQ(a.oj,"pages")
 y=J.U6(z)
 x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
@@ -12243,7 +12241,7 @@
 v=w+x
 x=y.gB(z)
 if(typeof x!=="number")return H.s(x)
-if(!(b>=x)){x=J.Jv(a.WC)
+if(!(b>=x)){x=J.OB(a.WC)
 if(typeof x!=="number")return H.s(x)
 x=v>x}else x=!0
 if(x)return
@@ -12273,18 +12271,18 @@
 l=C.CD.Z(x,l)
 new P.hL(m,l).$builtinTypeInfo=[null]
 if(!(l<v))break
-x=$.vl()
+x=$.Qg()
 m=y+4
 C.yp.zB(n.gRn(r),y,m,x)
-u=new O.Hz(r,m)}y=J.rN(a.N2)
+u=new O.Hz(r,m)}y=J.Ry(a.N2)
 x=a.WC
-J.nb(y,x,0,0,0,w,J.eY(x),v)
-P.nd(new O.nW(a,b),null)},
+J.kZ(y,x,0,0,0,w,J.eY(x),v)
+P.DJ(new O.R5(a,b),null)},
 pA:[function(a,b){var z=a.oj
 if(z==null)return
-J.wg(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).wM(b)},"$1","gvC",2,0,19,102],
-YS7:[function(a,b){P.nd(new O.oc(a),null)},"$1","gRs",2,0,19,59],
-static:{"^":"nK,dg,SoT,WBO",dF:function(a){var z,y,x,w,v,u,t
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.pM()).wM(b)},"$1","gvC",2,0,19,102],
+YS7:[function(a,b){P.DJ(new O.oc(a),null)},"$1","gRh",2,0,19,59],
+static:{"^":"nK,Os,SoT,WBO",teo:function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
@@ -12296,7 +12294,7 @@
 a.Tl=z
 a.GE=y
 a.Cv=x
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=w
@@ -12309,32 +12307,32 @@
 V13:{
 "^":"uL+Pi;",
 $isd3:true},
-nW:{
+R5:{
 "^":"TpZ:76;a,b",
-$0:function(){J.tE(this.a,this.b+1)},
+$0:function(){J.AC(this.a,this.b+1)},
 $isEH:true},
 aG:{
 "^":"TpZ:114;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,155,"call"],
+z.oj=J.NB(z,C.QH,z.oj,a)},"$1",null,2,0,null,155,"call"],
 $isEH:true},
-z4:{
+pM:{
 "^":"TpZ:81;",
 $2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,156,"call"],
 $isEH:true},
 oc:{
 "^":"TpZ:76;a",
-$0:function(){J.J2g(this.a)},
+$0:function(){J.oO(this.a)},
 $isEH:true}}],["","",,K,{
 "^":"",
 UC:{
-"^":"Vz;oH,vp,GD,pT,Rj,Vg,ij",
+"^":"Vz;oH,vp,zz,pT,Rj,Vg,fn",
 Ey:function(a,b){var z
 if(b===0){z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 return J.DA(J.UQ(J.hI(z[a]),b))}return G.Vz.prototype.Ey.call(this,a,b)}},
 Ly:{
-"^":"V14;MF,uY,Xe,JN,FX,qD,Rp,Na,Ol,Sk,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V14;MF,uY,Xe,jF,FX,Uv,Rp,Na,Ol,Sk,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gYt:function(a){return a.MF},
 sYt:function(a,b){a.MF=this.ct(a,C.TN,a.MF,b)},
 gcH:function(a){return a.uY},
@@ -12348,15 +12346,15 @@
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.qu(null,P.L5(null,null,null,null,null))
+y=new G.yD(null,P.L5(null,null,null,null,null))
 y.vR=P.zV(J.UQ($.BY,"PieChart"),[z])
-a.JN=y
+a.jF=y
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.qu(null,P.L5(null,null,null,null,null))
+z=new G.yD(null,P.L5(null,null,null,null,null))
 z.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-a.qD=z
+a.Uv=z
 a.Na=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
-Qf:function(a){var z,y,x,w
+Y1:function(a){var z,y,x,w
 for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 x=J.U6(y)
 w=x.t(y,"class")
@@ -12376,28 +12374,28 @@
 s=y.gxQ().gEJ().wf
 r=y.gxQ().gl().wY
 q=y.gxQ().gl().wf
-J.Ip(a.Rp,new G.c0([y,"",x,w,v,u,"",t,s,r,q]))}J.zq(a.Rp)},
-lD:function(a,b,c){var z,y,x,w,v,u
-z=J.UQ(J.x3(a.Rp),c)
+J.an(a.Rp,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.II(a.Rp)},
+As:function(a,b,c){var z,y,x,w,v,u
+z=J.UQ(J.TY(a.Rp),c)
 y=J.RE(b)
 x=J.RE(z)
-J.PP(J.UQ(J.dd(J.UQ(y.gqu(b),0)),0),J.UQ(x.gUQ(z),0))
+J.PP(J.UQ(J.Mx(J.UQ(y.gks(b),0)),0),J.UQ(x.gUQ(z),0))
 w=1
 while(!0){v=J.q8(x.gUQ(z))
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
-c$0:{if(C.Nm.tg(C.jb,w))break c$0
-u=J.UQ(y.gqu(b),w)
+c$0:{if(C.Nm.tg(C.Q5,w))break c$0
+u=J.UQ(y.gks(b),w)
 v=J.RE(u)
-v.ska(u,J.AG(J.UQ(x.gUQ(z),w)))
+v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
 v.sa4(u,a.Rp.Gu(c,w))}++w}},
 ya:function(a){var z,y,x,w,v,u,t,s
-z=J.dd(a.Na)
-if(z.gB(z)>a.Rp.gGD().length){z=J.dd(a.Na)
-y=z.gB(z)-a.Rp.gGD().length
-for(x=0;x<y;++x)J.dd(a.Na).f4(0)}else{z=J.dd(a.Na)
-if(z.gB(z)<a.Rp.gGD().length){z=a.Rp.gGD().length
-w=J.dd(a.Na)
+z=J.Mx(a.Na)
+if(z.gB(z)>a.Rp.gzz().length){z=J.Mx(a.Na)
+y=z.gB(z)-a.Rp.gzz().length
+for(x=0;x<y;++x)J.Mx(a.Na).mv(0)}else{z=J.Mx(a.Na)
+if(z.gB(z)<a.Rp.gzz().length){z=a.Rp.gzz().length
+w=J.Mx(a.Na)
 v=z-w.gB(w)
 for(x=0;x<v;++x){u=document.createElement("tr",null)
 z=J.RE(u)
@@ -12416,42 +12414,42 @@
 z.iF(u,-1)
 z.iF(u,-1)
 z.iF(u,-1)
-J.dd(a.Na).h(0,u)}}}for(x=0;x<a.Rp.gGD().length;++x){z=a.Rp.gGD()
+J.Mx(a.Na).h(0,u)}}}for(x=0;x<a.Rp.gzz().length;++x){z=a.Rp.gzz()
 if(x>=z.length)return H.e(z,x)
 s=z[x]
-this.lD(a,J.dd(a.Na).t(0,x),s)}},
+this.As(a,J.Mx(a.Na).t(0,x),s)}},
 BB:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.Rp.gn4()
+if(!!J.x(d).$isv6){z=a.Rp.gxp()
 y=d.cellIndex
 x=a.Rp
-if(z==null?y!=null:z!==y){x.sn4(y)
+if(z==null?y!=null:z!==y){x.sxp(y)
 a.Rp.sT3(!0)}else x.sT3(!x.gT3())
-J.zq(a.Rp)
+J.II(a.Rp)
 this.ya(a)}},"$3","gQq",6,0,105,2,106,107],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.wg(z).cv("/allocationprofile").ml(this.gbM(a)).wM(b)},"$1","gvC",2,0,19,102],
+J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).wM(b)},"$1","gvC",2,0,19,102],
 zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.wg(z).cv("/allocationprofile?gc=full").ml(this.gbM(a)).wM(b)},"$1","gzH",2,0,19,102],
+J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).wM(b)},"$1","gyW",2,0,19,102],
 eJ8:[function(a,b){var z=a.Ol
 if(z==null)return
-J.wg(z).cv("/allocationprofile?reset=true").ml(this.gbM(a)).wM(b)},"$1","gNb",2,0,19,102],
-un:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gbM",2,0,157,158],
+J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).wM(b)},"$1","gNb",2,0,19,102],
+Ed:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,157,158],
 n1:[function(a,b){var z,y,x,w,v
 z=a.Ol
 if(z==null)return
-z=J.wg(z)
+z=J.aT(z)
 z=this.ct(a,C.rB,a.Sk,z)
 a.Sk=z
-z.WU(J.UQ(a.Ol,"heaps"))
+z.Bs(J.UQ(a.Ol,"heaps"))
 y=H.BU(J.UQ(a.Ol,"dateLastAccumulatorReset"),null,null)
 if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
 a.uY=this.ct(a,C.Zi,a.uY,z)}y=H.BU(J.UQ(a.Ol,"dateLastServiceGC"),null,null)
 if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
 a.MF=this.ct(a,C.TN,a.MF,z)}z=a.Xe.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-x=J.wg(a.Ol)
+x=J.aT(a.Ol)
 z=a.Xe
 w=x.gUY().gSU()
 z=z.Yb
@@ -12459,7 +12457,7 @@
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
 v=a.Xe
-z=J.bI(x.gUY().gbZ(),x.gUY().gSU())
+z=J.bI(x.gUY().gkV(),x.gUY().gSU())
 v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
@@ -12479,7 +12477,7 @@
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
 v=a.FX
-z=J.bI(x.gxQ().gbZ(),x.gxQ().gSU())
+z=J.bI(x.gxQ().gkV(),x.gxQ().gSU())
 v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
@@ -12490,42 +12488,42 @@
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
 w.V7("addRow",[H.VM(new P.GD(z),[null])])
-this.Qf(a)
+this.Y1(a)
 this.FS(a)
 this.ya(a)
-a.JN.Am(0,a.Xe)
-a.qD.Am(0,a.FX)
+a.jF.Am(0,a.Xe)
+a.Uv.Am(0,a.FX)
 this.ct(a,C.Aq,0,1)
 this.ct(a,C.ST,0,1)
-this.ct(a,C.DS,0,1)},"$1","gwh",2,0,19,59],
+this.ct(a,C.DS,0,1)},"$1","gd0",2,0,19,59],
 ps:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,159,160],
+return C.CD.Sy(J.L9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,159,160],
 NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gBo",2,0,159,160],
+return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,159,160],
 o7:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
 return J.cI((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,159,160],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.Xe=new G.eM(z)
+a.Xe=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
 a.Xe.Yb.V7("addColumn",["number","Size"])
 z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.FX=new G.eM(z)
+a.FX=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
 a.FX.Yb.V7("addColumn",["number","Size"])
-z=H.VM([],[G.c0])
-z=this.ct(a,C.kG,a.Rp,new K.UC([new G.Kt("Class",G.NZt()),new G.Kt("",G.NZt()),new G.Kt("Accumulated Size (New)",G.RC()),new G.Kt("Accumulated Instances",G.nI()),new G.Kt("Current Size",G.RC()),new G.Kt("Current Instances",G.nI()),new G.Kt("",G.NZt()),new G.Kt("Accumulator Size (Old)",G.RC()),new G.Kt("Accumulator Instances",G.nI()),new G.Kt("Current Size",G.RC()),new G.Kt("Current Instances",G.nI())],z,[],0,!0,null,null))
+z=H.VM([],[G.Ni])
+z=this.ct(a,C.kG,a.Rp,new K.UC([new G.Kt("Class",G.Tp()),new G.Kt("",G.Tp()),new G.Kt("Accumulated Size (New)",G.Gt()),new G.Kt("Accumulated Instances",G.OA()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.OA()),new G.Kt("",G.Tp()),new G.Kt("Accumulator Size (Old)",G.Gt()),new G.Kt("Accumulator Instances",G.OA()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.OA())],z,[],0,!0,null,null))
 a.Rp=z
-z.sn4(2)},
+z.sxp(2)},
 static:{EDe:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12534,7 +12532,7 @@
 w=P.Fl(null,null)
 a.MF="---"
 a.uY="---"
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12549,19 +12547,19 @@
 "^":"uL+Pi;",
 $isd3:true}}],["","",,P,{
 "^":"",
-jl:function(a){var z,y
+pf:function(a){var z,y
 z=[]
-y=new P.Tm(new P.wF([],z),new P.rG(z),new P.Os(z)).$1(a)
+y=new P.kd(new P.wF([],z),new P.rG(z),new P.yhO(z)).$1(a)
 new P.Qa().$0()
 return y},
 o7:function(a,b){var z=[]
-return new P.xL(b,new P.GW([],z),new P.D6(z),new P.m5(z)).$1(a)},
+return new P.xL(b,new P.CA([],z),new P.D6(z),new P.m5(z)).$1(a)},
 f9:function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},
-QO:function(a){if(!!J.x(a).$isqS)return{data:a.Rn,height:a.fg,width:a.R}
+y.BYTES_PER_ELEMENT=1}return a}return new P.nl(a.data,a.height,a.width)},
+QO:function(a){if(!!J.x(a).$isnl)return{data:a.Rn,height:a.fg,width:a.R}
 return a},
 F7:function(){var z=$.R6
 if(z==null){z=$.Qz
@@ -12584,7 +12582,7 @@
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
-Os:{
+yhO:{
 "^":"TpZ:162;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
@@ -12594,7 +12592,7 @@
 "^":"TpZ:76;",
 $0:function(){},
 $isEH:true},
-Tm:{
+kd:{
 "^":"TpZ:12;f,UI,bK",
 $1:function(a){var z,y,x,w,v,u
 z={}
@@ -12607,9 +12605,8 @@
 if(!!y.$iswL)throw H.b(P.nO("structured clone of RegExp"))
 if(!!y.$ishH)return a
 if(!!y.$isO4)return a
-if(!!y.$isXV)return a
 if(!!y.$isSg)return a
-if(!!y.$isWZ)return a
+if(!!y.$isbf)return a
 if(!!y.$iseH)return a
 if(!!y.$isT8){x=this.f.$1(a)
 w=this.UI.$1(x)
@@ -12633,7 +12630,7 @@
 "^":"TpZ:81;a,Gq",
 $2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true},
-GW:{
+CA:{
 "^":"TpZ:51;a,b",
 $1:function(a){var z,y,x,w
 z=this.a
@@ -12669,7 +12666,7 @@
 if(y!=null)return y
 y=P.Fl(null,null)
 this.bK.$2(z,y)
-for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
+for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.Ff
 y.u(0,w,this.$1(a[w]))}return y}if(a instanceof Array){z=this.f.$1(a)
 y=this.UI.$1(z)
 if(y!=null)return y
@@ -12683,9 +12680,9 @@
 for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
 return y}return a},
 $isEH:true},
-qS:{
+nl:{
 "^":"a;Rn>,fg>,R>",
-$isqS:true,
+$isnl:true,
 $isSg:true},
 As3:{
 "^":"a;",
@@ -12700,8 +12697,8 @@
 return H.VM(new H.xy(z,b),[H.u3(z,0),null])},"$1","gIr",2,0,163,30],
 ad:function(a,b){var z=this.DG()
 return H.VM(new H.U5(z,b),[H.u3(z,0)])},
-yx:[function(a,b){var z=this.DG()
-return H.VM(new H.Fm(z,b),[H.u3(z,0),null])},"$1","git",2,0,164,30],
+lM:[function(a,b){var z=this.DG()
+return H.VM(new H.oA(z,b),[H.u3(z,0),null])},"$1","git",2,0,164,30],
 Vr:function(a,b){return this.DG().Vr(0,b)},
 gl0:function(a){return this.DG().X5===0},
 gor:function(a){return this.DG().X5!==0},
@@ -12717,7 +12714,7 @@
 return y},
 FV:function(a,b){this.H9(new P.rl(b))},
 uk:function(a,b){this.H9(new P.Jg(b))},
-gtH:function(a){var z=this.DG().HH
+gqG:function(a){var z=this.DG().HH
 if(z==null)H.vh(P.w("No elements"))
 return z.gGc(z)},
 grZ:function(a){var z=this.DG().Nz
@@ -12725,27 +12722,27 @@
 return z.gGc(z)},
 tt:function(a,b){return this.DG().tt(0,b)},
 br:function(a){return this.tt(a,!0)},
-Oe:function(a){var z,y
+zH:function(a){var z,y
 z=this.DG()
 y=z.iL()
 y.FV(0,z)
 return y},
 eR:function(a,b){var z=this.DG()
-return H.p6(z,b,H.u3(z,0))},
+return H.ke(z,b,H.u3(z,0))},
 V1:function(a){this.H9(new P.uQ())},
 H9:function(a){var z,y
 z=this.DG()
 y=a.$1(z)
 this.p5(z)
 return y},
-$isz5:true,
-$asz5:function(){return[P.qU]},
+$isOl:true,
+$asOl:function(){return[P.qU]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.qU]}},
 GE:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.dH(a,this.a)},"$1",null,2,0,null,165,"call"],
+$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,165,"call"],
 $isEH:true},
 rl:{
 "^":"TpZ:12;a",
@@ -12757,23 +12754,23 @@
 $isEH:true},
 uQ:{
 "^":"TpZ:12;",
-$1:[function(a){return J.U2(a)},"$1",null,2,0,null,165,"call"],
+$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,165,"call"],
 $isEH:true},
-P0:{
-"^":"ark;im,vN",
-gd3:function(){var z=this.vN
+D7:{
+"^":"ark;im,kG",
+gd3:function(){var z=this.kG
 return P.F(z.ad(z,new P.hT()),!0,W.h4)},
 aN:function(a,b){H.bQ(this.gd3(),b)},
 u:function(a,b,c){var z=this.gd3()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.vR(z[b],c)},
+J.DG(z[b],c)},
 sB:function(a,b){var z=this.gd3().length
 if(b>=z)return
 else if(b<0)throw H.b(P.u("Invalid list length"))
 this.oq(0,b,z)},
-h:function(a,b){this.vN.uR.appendChild(b)},
+h:function(a,b){this.kG.uR.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.vN.uR;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.kG.uR;z.G();)y.appendChild(z.Ff)},
 tg:function(a,b){if(!J.x(b).$ish4)return!1
 return b.parentNode===this.im},
 GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
@@ -12781,22 +12778,22 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 oq:function(a,b,c){H.bQ(C.Nm.aM(this.gd3(),b,c),new P.rK())},
-V1:function(a){J.Wf(this.vN.uR)},
-f4:function(a){var z=this.grZ(this)
-if(z!=null)J.Rv(z)
+V1:function(a){J.Wf(this.kG.uR)},
+mv:function(a){var z=this.grZ(this)
+if(z!=null)J.Mp(z)
 return z},
-aP:function(a,b,c){this.vN.aP(0,b,c)},
+xe:function(a,b,c){this.kG.xe(0,b,c)},
 UG:function(a,b,c){var z,y
-z=this.vN.uR
+z=this.kG.uR
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
+J.r5(z,c,y[b])},
 Rz:function(a,b){var z,y,x
 if(!J.x(b).$ish4)return!1
 for(z=0;z<this.gd3().length;++z){y=this.gd3()
 if(z>=y.length)return H.e(y,z)
 x=y[z]
-if(x===b){J.Rv(x)
+if(x===b){J.Mp(x)
 return!0}}return!1},
 gB:function(a){return this.gd3().length},
 t:function(a,b){var z=this.gd3()
@@ -12810,23 +12807,23 @@
 $isEH:true},
 rK:{
 "^":"TpZ:12;",
-$1:function(a){return J.Rv(a)},
+$1:function(a){return J.Mp(a)},
 $isEH:true}}],["","",,O,{
 "^":"",
 Im:{
-"^":"V15;ee,jw,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V15;ee,jw,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gnv:function(a){return a.ee},
 snv:function(a,b){a.ee=this.ct(a,C.kY,a.ee,b)},
-gnS:function(a){return J.UQ(a.ee,"slot")},
-guh:function(a){var z=J.UQ(a.ee,"slot")
+gV8:function(a){return J.UQ(a.ee,"slot")},
+gyg:function(a){var z=J.UQ(a.ee,"slot")
 return typeof z==="number"},
-gB3:function(a){return!!J.x(J.UQ(a.ee,"slot")).$isvO&&J.xC(J.UQ(J.UQ(a.ee,"slot"),"type"),"@Field")},
+gWk:function(a){return!!J.x(J.UQ(a.ee,"slot")).$isvO&&J.xC(J.UQ(J.UQ(a.ee,"slot"),"type"),"@Field")},
 gFF:function(a){return J.UQ(a.ee,"source")},
 gyK:function(a){return a.jw},
 syK:function(a,b){a.jw=this.ct(a,C.uO,a.jw,b)},
-yg:[function(a,b){return J.wg(J.UQ(a.ee,"source")).cv(J.WB(J.eS(J.UQ(a.ee,"source")),"/inbound_references?limit="+H.d(b))).ml(new O.cCu(a))},"$1","gi0",2,0,111,32],
+rT:[function(a,b){return J.aT(J.UQ(a.ee,"source")).cv(J.WB(J.eS(J.UQ(a.ee,"source")),"/inbound_references?limit="+H.d(b))).ml(new O.cC(a))},"$1","gi0",2,0,111,32],
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-vQ:[function(a,b,c){if(b===!0)this.yg(a,100).ml(new O.qm(a)).wM(c)
+vQ:[function(a,b,c){if(b===!0)this.rT(a,100).ml(new O.qm(a)).wM(c)
 else{a.jw=this.ct(a,C.uO,a.jw,null)
 c.$0()}},"$2","gus",4,0,118,119,120],
 static:{eka:function(a){var z,y,x,w
@@ -12835,7 +12832,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12848,22 +12845,22 @@
 V15:{
 "^":"uL+Pi;",
 $isd3:true},
-cCu:{
+cC:{
 "^":"TpZ:114;a",
 $1:[function(a){var z,y,x
 z=this.a
 y=J.UQ(a,"references")
 x=Q.pT(null,null)
 x.FV(0,y)
-z.jw=J.Q5(z,C.uO,z.jw,x)},"$1",null,2,0,null,155,"call"],
+z.jw=J.NB(z,C.uO,z.jw,x)},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 qm:{
 "^":"TpZ:12;a",
-$1:[function(a){J.Q5(this.a,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
+$1:[function(a){J.NB(this.a,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,B,{
 "^":"",
 pR:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gJp:function(a){var z=a.tY
 if(z!=null)if(J.xC(J.zH(z),"Sentinel"))if(J.xC(J.eS(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.xC(J.eS(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
@@ -12873,42 +12870,42 @@
 return Q.xI.prototype.gJp.call(this,a)},
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){var z=a.tY
-if(b===!0)J.LE(z).ml(new B.Js(a)).wM(c)
+if(b===!0)J.LE(z).ml(new B.tV(a)).wM(c)
 else{z.stJ(null)
-J.vF(z,null)
+J.Z6(z,null)
 c.$0()}},"$2","gus",4,0,118,119,120],
-static:{lu:function(a){var z,y,x,w
+static:{luW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.hM.LX(a)
-C.hM.XI(a)
+C.uRw.LX(a)
+C.uRw.XI(a)
 return a}}},
-Js:{
+tV:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
-if(a.gPE()!=null){J.WI(a,a.gPE())
-a.szz(a.gPE())}z=this.a
+if(a.gPE()!=null){J.DF(a,a.gPE())
+a.sTE(a.gPE())}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.kY,z.tY,a)
 y.ct(z,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,Z,{
 "^":"",
 EZ:{
-"^":"V16;VQ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V16;VQ,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 ghf:function(a){return a.VQ},
 shf:function(a,b){a.VQ=this.ct(a,C.fn,a.VQ,b)},
-vV:[function(a,b){return J.wg(a.VQ).cv(J.WB(J.eS(a.VQ),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
+vV:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
 pA:[function(a,b){J.LE(a.VQ).wM(b)},"$1","gvC",2,0,122,120],
 static:{CoW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -12916,7 +12913,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12931,7 +12928,7 @@
 $isd3:true}}],["","",,E,{
 "^":"",
 L4:{
-"^":"V17;PM,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V17;PM,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
 pA:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,19,102],
@@ -12941,50 +12938,50 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.j1.LX(a)
-C.j1.XI(a)
+C.j1o.LX(a)
+C.j1o.XI(a)
 return a}}},
 V17:{
 "^":"uL+Pi;",
 $isd3:true},
 Mb:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{RVI:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.aj2.LX(a)
-C.aj2.XI(a)
+C.Ag.LX(a)
+C.Ag.XI(a)
 return a}}},
 mO:{
-"^":"V18;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V18;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
-static:{V6:function(a){var z,y,x,w
+static:{Ch:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12998,15 +12995,15 @@
 "^":"uL+Pi;",
 $isd3:true},
 DE:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{lIg:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13017,62 +13014,62 @@
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V19;yR,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V19;yR,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
 pA:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,19,102],
-T9:[function(a){J.LE(a.yR).wM(new E.Jj(a))},"$0","gqw",0,0,17],
+nS:[function(a){J.LE(a.yR).wM(new E.XB(a))},"$0","gqw",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
 if(z!=null){z.Gv()
-a.mZ=null}},
+a.c3=null}},
 static:{TiU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.x4.LX(a)
-C.x4.XI(a)
+C.VLs.LX(a)
+C.VLs.XI(a)
 return a}}},
 V19:{
 "^":"uL+Pi;",
 $isd3:true},
-Jj:{
+XB:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 H8:{
-"^":"V20;OS,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V20;OS,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gPB:function(a){return a.OS},
 sPB:function(a,b){a.OS=this.ct(a,C.yL,a.OS,b)},
 pA:[function(a,b){J.LE(a.OS).wM(b)},"$1","gvC",2,0,19,102],
-T9:[function(a){J.LE(a.OS).wM(new E.uN(a))},"$0","gqw",0,0,17],
+nS:[function(a){J.LE(a.OS).wM(new E.cP(a))},"$0","gqw",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
 if(z!=null){z.Gv()
-a.mZ=null}},
+a.c3=null}},
 static:{ZhX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13085,51 +13082,51 @@
 V20:{
 "^":"uL+Pi;",
 $isd3:true},
-uN:{
+cP:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 WS:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{jS:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{l5s:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Ug.LX(a)
-C.Ug.XI(a)
+C.bP.LX(a)
+C.bP.XI(a)
 return a}}},
 qh:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{cua:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.wK.LX(a)
-C.wK.XI(a)
+C.IXz.LX(a)
+C.IXz.XI(a)
 return a}}},
 oF:{
-"^":"V21;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V21;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
@@ -13139,7 +13136,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13153,7 +13150,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Q6:{
-"^":"V22;uv,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V22;uv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
 pA:[function(a,b){J.LE(a.uv).wM(b)},"$1","gvC",2,0,19,102],
@@ -13163,7 +13160,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13177,36 +13174,36 @@
 "^":"uL+Pi;",
 $isd3:true},
 uE:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{egu:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.js.LX(a)
-C.js.XI(a)
+C.Fw.LX(a)
+C.Fw.XI(a)
 return a}}},
 Zn:{
-"^":"V23;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V23;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
-static:{n0:function(a){var z,y,x,w
+static:{kf:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13220,9 +13217,9 @@
 "^":"uL+Pi;",
 $isd3:true},
 n5:{
-"^":"V24;h1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gyW:function(a){return a.h1},
-syW:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
+"^":"V24;h1,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gHy:function(a){return a.h1},
+sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
 pA:[function(a,b){J.LE(a.h1).wM(b)},"$1","gvC",2,0,19,102],
 static:{iOo:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -13230,7 +13227,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13244,7 +13241,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ma:{
-"^":"V25;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V25;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
@@ -13254,7 +13251,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13268,15 +13265,15 @@
 "^":"uL+Pi;",
 $isd3:true},
 wN:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{wZ7:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{ML:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13287,25 +13284,25 @@
 C.RVQ.XI(a)
 return a}}},
 ds:{
-"^":"V26;wT,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V26;wT,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
 pA:[function(a,b){J.LE(a.wT).wM(b)},"$1","gvC",2,0,19,102],
-O7:[function(a){J.LE(a.wT).wM(new E.As(a))},"$0","gyT",0,0,17],
+O7:[function(a){J.LE(a.wT).wM(new E.mj(a))},"$0","gdH",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gyT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gdH(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
 if(z!=null){z.Gv()
-a.mZ=null}},
+a.c3=null}},
 static:{pIf:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13318,23 +13315,23 @@
 V26:{
 "^":"uL+Pi;",
 $isd3:true},
-As:{
+mj:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.Y5(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.Nb(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 qM:{
-"^":"V27;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V27;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
-static:{TEI:function(a){var z,y,x,w
+static:{tX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13348,7 +13345,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 av:{
-"^":"ZzR;CB,Vg,ij,tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"ZzR;CB,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gEQ:function(a){return a.CB},
 sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
 static:{R7:function(a){var z,y,x,w
@@ -13358,41 +13355,41 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.CB=!1
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Wa.LX(a)
-C.Wa.XI(a)
+C.OkI.LX(a)
+C.OkI.XI(a)
 return a}}},
 ZzR:{
 "^":"xI+Pi;",
 $isd3:true},
 uz:{
-"^":"V28;RX,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V28;RX,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gpE:function(a){return a.RX},
 Fn:function(a){return this.gpE(a).$0()},
 spE:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
 pA:[function(a,b){J.LE(a.RX).wM(b)},"$1","gvC",2,0,19,102],
-O7:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","gyT",0,0,17],
+O7:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","gdH",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gyT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gdH(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
 if(z!=null){z.Gv()
-a.mZ=null}},
+a.c3=null}},
 static:{z1:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13408,40 +13405,40 @@
 Cc:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.Y5(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.Nb(z))},"$0",null,0,0,null,"call"],
 $isEH:true}}],["","",,X,{
 "^":"",
 Se:{
-"^":"Y2;B1>,X1,H,Zn<,mj<,ki<,Vh<,ZX<,eT,yt,qu,oH,PU,aZ,Lk,Vg,ij",
-gtT:function(a){return J.tX(this.H)},
-Pz:function(a){var z,y,x,w,v,u,t,s,r
+"^":"Y2;B1>,SF,H,Zn<,vs<,zg<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,Lk,Vg,fn",
+gtT:function(a){return J.Nk(this.H)},
+Pz:function(a){var z,y,x,w,v,u,t,s
 z=this.B1
 y=J.UQ(z,"threshold")
-x=this.qu
+x=this.ks
 if(x.length>0)return
-for(w=this.H,v=J.mY(J.dd(w)),u=this.X1,t=u.Av;v.G();){s=v.gl()
-r=J.X9(s.gAv(),w.gAv())
+for(w=this.H,v=J.mY(J.Mx(w)),u=this.SF;v.G();){t=v.gl()
+s=J.L9(t.gAv(),w.gAv())
 if(typeof y!=="number")return H.s(y)
-if(!(r>y||J.X9(J.tX(s).gDu(),t)>y))continue
-x.push(X.i3(z,u,s,this))}},
-aY:function(){},
-Nh:function(){return J.q8(J.dd(this.H))>0},
+if(!(s>y||J.L9(J.Nk(t).gDu(),u.Av)>y))continue
+x.push(X.SJ(z,u,t,this))}},
+cO:function(){},
+Nh:function(){return J.q8(J.Mx(this.H))>0},
 mW:function(a,b,c,d){var z,y
 z=this.H
 this.Vh=H.d(z.gAv())
-this.ZX=G.J8(J.X9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
+this.ZX=G.J8(J.L9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
 y=J.RE(z)
-if(J.xC(J.Iz(y.gtT(z)),C.oA)){this.Zn="Tag (category)"
-if(d==null)this.mj=G.dj(z.gAv(),this.X1.Av)
-else this.mj=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(z.gAv(),this.X1.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.AA))this.Zn="Garbage Collected Code"
+if(J.xC(J.Iz(y.gtT(z)),C.Z7)){this.Zn="Tag (category)"
+if(d==null)this.vs=G.G0(z.gAv(),this.SF.Av)
+else this.vs=G.G0(z.gAv(),d.H.gAv())
+this.zg=G.G0(z.gAv(),this.SF.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
 else this.Zn=H.d(J.Iz(y.gtT(z)))+" (Function)"
-if(d==null)this.mj=G.dj(z.gAv(),this.X1.Av)
-else this.mj=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(y.gtT(z).gDu(),this.X1.Av)}z=this.oH
-z.push(this.mj)
-z.push(this.ki)},
-static:{i3:function(a,b,c,d){var z,y
+if(d==null)this.vs=G.G0(z.gAv(),this.SF.Av)
+else this.vs=G.G0(z.gAv(),d.H.gAv())
+this.zg=G.G0(y.gtT(z).gDu(),this.SF.Av)}z=this.oH
+z.push(this.vs)
+z.push(this.zg)},
+static:{SJ:function(a,b,c,d){var z,y
 z=H.VM([],[G.Y2])
 y=d!=null?d.yt+1:0
 z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
@@ -13449,7 +13446,7 @@
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V29;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,Xg,Hm=,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V29;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,Xg,Hm=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gB1:function(a){return a.oi},
 sB1:function(a,b){a.oi=this.ct(a,C.vb,a.oi,b)},
 gPL:function(a){return a.TH},
@@ -13458,16 +13455,16 @@
 sLW:function(a,b){a.WT=this.ct(a,C.Gs,a.WT,b)},
 gUo:function(a){return a.Uw},
 sUo:function(a,b){a.Uw=this.ct(a,C.Dj,a.Uw,b)},
-gEl:function(a){return a.Ik},
-sEl:function(a,b){a.Ik=this.ct(a,C.YD,a.Ik,b)},
+gP2:function(a){return a.Ik},
+sP2:function(a,b){a.Ik=this.ct(a,C.YD,a.Ik,b)},
 gnZ:function(a){return a.oo},
 snZ:function(a,b){a.oo=this.ct(a,C.bE,a.oo,b)},
 gNG:function(a){return a.fE},
 sNG:function(a,b){a.fE=this.ct(a,C.aH,a.fE,b)},
 gQl:function(a){return a.ev},
 sQl:function(a,b){a.ev=this.ct(a,C.zz,a.ev,b)},
-gXc:function(a){return a.TM},
-sXc:function(a,b){a.TM=this.ct(a,C.TW,a.TM,b)},
+gZA:function(a){return a.TM},
+sZA:function(a,b){a.TM=this.ct(a,C.TW,a.TM,b)},
 n1:[function(a,b){var z,y,x,w,v
 z=a.oi
 if(z==null)return
@@ -13484,14 +13481,14 @@
 if(typeof w!=="number")return H.s(w)
 z=C.CD.Sy(1000000/w,0)
 a.Ik=this.ct(a,C.YD,a.Ik,z)
-z=G.mGl(J.UQ(a.oi,"timeSpan"))
+z=G.M5(J.UQ(a.oi,"timeSpan"))
 a.ev=this.ct(a,C.zz,a.ev,z)
 z=a.XX
 v=C.YI.bu(z*100)+"%"
 a.fE=this.ct(a,C.aH,a.fE,v)
-J.wg(a.oi).f9(a.oi)
-J.qQ(a.oi,"threshold",z)
-this.Zb(a)},"$1","gwh",2,0,19,59],
+J.aT(a.oi).N3(a.oi)
+J.kW(a.oi,"threshold",z)
+this.Zb(a)},"$1","gd0",2,0,19,59],
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
@@ -13499,31 +13496,31 @@
 this.Zb(a)},
 ov:[function(a,b){this.pA(a,null)},"$1","gb6",2,0,19,59],
 pA:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.wg(a.oi).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,19,102],
+J.aT(a.oi).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,19,102],
 Zb:function(a){if(a.oi==null)return
 this.FG(a)},
 FG:function(a){var z,y,x,w,v
-z=J.wg(a.oi).gqo()
+z=J.aT(a.oi).gqo()
 if(z==null)return
-try{a.Hm.rT(X.i3(a.oi,z,z,null))}catch(w){v=H.Ru(w)
+try{a.Hm.G7(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
 y=v
 x=new H.oP(w,null)
-N.QM("").OW("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
+N.QM("").r0("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.lo(0)
 this.ct(a,C.ep,null,a.Hm)},
 Ui:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,103,104],
-ZZ:[function(a,b){return C.Jp[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
 wn:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$isIv)try{w=a.Hm
-v=J.JC(z)
+v=J.IO(z)
 if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
+w.lo(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.oP(u,null)
-N.QM("").OW("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
-static:{"^":"B6",CM:function(a){var z,y,x,w
+N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
+static:{"^":"B6",jD:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -13538,7 +13535,7 @@
 a.XX=0.0002
 a.TM="uv"
 a.Xg="#tableTree"
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13554,19 +13551,19 @@
 Xy:{
 "^":"TpZ:114;a",
 $1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,166,"call"],
+z.oi=J.NB(z,C.vb,z.oi,a)},"$1",null,2,0,null,166,"call"],
 $isEH:true}}],["","",,N,{
 "^":"",
 oa:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{Zgg:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13578,7 +13575,7 @@
 return a}}}}],["","",,D,{
 "^":"",
 St:{
-"^":"V30;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V30;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{N5:function(a){var z,y,x,w
@@ -13587,7 +13584,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13601,25 +13598,25 @@
 "^":"uL+Pi;",
 $isd3:true},
 IW:{
-"^":"V31;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V31;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return J.Ag(a.ow)},"$1","gX0",2,0,167,13],
+Fv:[function(a,b){return J.Ho(a.ow)},"$1","gX0",2,0,167,13],
 qW:[function(a,b){$.Kh.pZ(a.ow)
 return J.df(a.ow)},"$1","gDQ",2,0,167,13],
 PyB:[function(a,b){$.Kh.pZ(a.ow)
-return J.v7(a.ow)},"$1","gLc",2,0,167,13],
-lMu:[function(a,b){$.Kh.pZ(a.ow)
-return J.J1(a.ow)},"$1","gqF",2,0,167,13],
+return J.UR(a.ow)},"$1","gLc",2,0,167,13],
+XQ:[function(a,b){$.Kh.pZ(a.ow)
+return J.MU(a.ow)},"$1","gqF",2,0,167,13],
 Cx:[function(a,b){$.Kh.pZ(a.ow)
 return J.Fy(a.ow)},"$1","gZp",2,0,167,13],
-static:{v8:function(a){var z,y,x,w
+static:{dmb:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13633,7 +13630,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Qh:{
-"^":"V32;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V32;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{Qj:function(a){var z,y,x,w
@@ -13642,7 +13639,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13656,7 +13653,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Oz:{
-"^":"V33;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V33;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{TSH:function(a){var z,y,x,w
@@ -13665,7 +13662,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13678,10 +13675,10 @@
 V33:{
 "^":"uL+Pi;",
 $isd3:true},
-OD:{
-"^":"a;Y0,ZF",
+vT:{
+"^":"a;NK,aF",
 eC:function(a){var z,y,x,w,v,u
-z=this.Y0.Yb
+z=this.NK.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Name"])
 z.V7("addColumn",["number","Value"])}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 for(y=J.RE(a),x=J.mY(y.gvc(a));x.G();){w=x.gl()
@@ -13693,28 +13690,28 @@
 u.$builtinTypeInfo=[null]
 z.V7("addRow",[u])}}},
 Z4:{
-"^":"V34;wd,iw,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V34;wd,iw,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gXE:function(a){return a.wd},
 sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
 o4:[function(a,b){var z,y,x
 if(a.wd==null)return
-if($.Ib().MM.YM!==0&&a.iw==null)a.iw=new D.OD(new G.eM(P.zV(J.UQ($.BY,"DataTable"),null)),null)
+if($.Ib().MM.YM!==0&&a.iw==null)a.iw=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
 z=a.iw
 if(z==null)return
 z.eC(a.wd)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
 if(y!=null){z=a.iw
-x=z.ZF
-if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
+x=z.aF
+if(x==null){x=new G.yD(null,P.L5(null,null,null,null,null))
 x.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-z.ZF=x}x.Am(0,z.Y0)}},"$1","ghU",2,0,19,59],
+z.aF=x}x.Am(0,z.NK)}},"$1","ghU",2,0,19,59],
 static:{d7:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13729,14 +13726,14 @@
 $isd3:true}}],["","",,L,{
 "^":"",
 Lr:{
-"^":"a;Yi,S2",
+"^":"a;KK,S2",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.Yi.Yb
+z=this.KK.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
-for(y=J.mY(a.gfJ());y.G();){x=y.lo
+for(y=J.mY(a.gaf());y.G();){x=y.Ff
 if(J.xC(x,"Idle"))continue
 z.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-w=J.za(a.gfJ(),"Idle")
+w=J.Q0(a.gaf(),"Idle")
 v=a.gvh()
 for(u=0;u<a.gFw().length;++u){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
@@ -13761,29 +13758,29 @@
 if(u>=y.length)return H.e(y,u)
 y=y[u].XE
 if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.X9(y[q],r)*100))}++q}}y=[]
+s.push(C.CD.yu(J.L9(y[q],r)*100))}++q}}y=[]
 C.Nm.FV(y,C.Nm.ez(s,P.En()))
 y=new P.GD(y)
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}}},
 qk:{
-"^":"V35;TO,pF,e6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V35;TO,Cn,LR,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.TO},
 sod:function(a,b){a.TO=this.ct(a,C.rB,a.TO,b)},
 vV:[function(a,b){var z=a.TO
-return z.cv(J.WB(J.eS(z.gVc()),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
-Pd:[function(a){a.TO.m7().ml(new L.LX(a))},"$0","gxD",0,0,17],
+return z.cv(J.WB(J.eS(z.gVc()),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+Pd:[function(a){a.TO.xB().ml(new L.LX(a))},"$0","gxD",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.pF=P.cH(P.ii(0,0,0,0,0,1),this.gxD(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.pF
+a.Cn=P.cH(P.ii(0,0,0,0,0,1),this.gxD(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.Cn
 if(z!=null){z.Gv()
-a.pF=null}},
+a.Cn=null}},
 pA:[function(a,b){J.LE(a.TO).wM(b)},"$1","gvC",2,0,19,102],
-Da:[function(a,b){J.y9(a.TO).wM(b)},"$1","gDX",2,0,19,102],
+m4:[function(a,b){J.y9(a.TO).wM(b)},"$1","gDX",2,0,19,102],
 Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,167,13],
-qW:[function(a,b){return a.TO.cv("resume").ml(new L.CZ(a))},"$1","gDQ",2,0,167,13],
+qW:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,167,13],
 static:{Qtp:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -13791,16 +13788,16 @@
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 w=P.Fl(null,null)
 v=P.Fl(null,null)
-a.e6=new L.Lr(new G.eM(z),null)
-a.Iy=[]
+a.LR=new L.Lr(new G.Kf(z),null)
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.Xe.LX(a)
-C.Xe.XI(a)
+C.hys.LX(a)
+C.hys.XI(a)
 return a}}},
 V35:{
 "^":"uL+Pi;",
@@ -13809,29 +13806,29 @@
 "^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
-y=z.e6
+y=z.LR
 y.eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null){if(y.S2==null){w=P.L5(null,null,null,null,null)
-v=new G.qu(null,w)
+v=new G.yD(null,w)
 v.vR=P.zV(J.UQ($.BY,"SteppedAreaChart"),[x])
 y.S2=v
 w.u(0,"isStacked",!0)
 y.S2.bG.u(0,"connectSteps",!1)
-y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.Am(0,y.Yi)}if(z.pF!=null)z.pF=P.cH(P.ii(0,0,0,0,0,1),J.vc(z))},"$1",null,2,0,null,168,"call"],
+y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.Am(0,y.KK)}if(z.Cn!=null)z.Cn=P.cH(P.ii(0,0,0,0,0,1),J.vc(z))},"$1",null,2,0,null,168,"call"],
 $isEH:true},
 CV:{
 "^":"TpZ:12;a",
 $1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-CZ:{
+Vq:{
 "^":"TpZ:12;a",
 $1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,Z,{
 "^":"",
 xh:{
 "^":"a;ue,GO",
-Qp:function(a,b){var z,y,x,w,v,u,t,s
+KW:function(a,b){var z,y,x,w,v,u,t,s
 z=this.GO
 if(z.tg(0,a))return
 z.h(0,a)
@@ -13842,7 +13839,7 @@
 w.IN+=s
 s="\""+H.d(u)+"\": {\n"
 w.IN+=s
-this.Qp(t,v)
+this.KW(t,v)
 s=C.yo.U("  ",b)
 s=w.IN+=s
 w.IN=s+"}\n"}else if(!!s.$isWO){s=C.yo.U("  ",b)
@@ -13866,7 +13863,7 @@
 if(!!u.$isT8){u=C.yo.U("  ",b)
 u=x.IN+=u
 x.IN=u+"{\n"
-this.Qp(v,w)
+this.KW(v,w)
 u=C.yo.U("  ",b)
 u=x.IN+=u
 x.IN=u+"}\n"}else if(!!u.$isWO){u=C.yo.U("  ",b)
@@ -13880,7 +13877,7 @@
 u=x.IN+=typeof v==="string"?v:H.d(v)
 x.IN=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V36;Ly,cs,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V36;Ly,cs,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gIr:function(a){return a.Ly},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
@@ -13888,22 +13885,21 @@
 slp:function(a,b){a.cs=this.ct(a,C.t6,a.cs,b)},
 oC:[function(a,b){var z,y,x
 z=P.p9("")
-y=P.fM(null,null,null,null)
+y=P.Ls(null,null,null,null)
 x=a.Ly
 z.IN=""
 z.KF("{\n")
-new Z.xh(z,y).Qp(x,0)
+new Z.xh(z,y).KW(x,0)
 z.KF("}\n")
 z=z.IN
-z=z.charCodeAt(0)==0?z:z
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","gWF",2,0,19,59],
+a.cs=this.ct(a,C.t6,a.cs,z)},"$1","gLU",2,0,19,59],
 static:{mA:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13918,15 +13914,15 @@
 $isd3:true}}],["","",,R,{
 "^":"",
 LU:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{Le:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{bUN:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13938,34 +13934,34 @@
 return a}}}}],["","",,M,{
 "^":"",
 CX:{
-"^":"V37;a1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gHt:function(a){return a.a1},
-sHt:function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},
-vV:[function(a,b){return J.wg(a.a1).cv(J.WB(J.eS(a.a1),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
-pA:[function(a,b){J.LE(a.a1).wM(b)},"$1","gvC",2,0,19,102],
-Da:[function(a,b){J.y9(a.a1).wM(b)},"$1","gDX",2,0,19,102],
-static:{ec:function(a){var z,y,x,w
+"^":"V37;px,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gHt:function(a){return a.px},
+sHt:function(a,b){a.px=this.ct(a,C.EV,a.px,b)},
+vV:[function(a,b){return J.aT(a.px).cv(J.WB(J.eS(a.px),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+pA:[function(a,b){J.LE(a.px).wM(b)},"$1","gvC",2,0,19,102],
+m4:[function(a,b){J.y9(a.px).wM(b)},"$1","gDX",2,0,19,102],
+static:{SPd:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.MG.LX(a)
-C.MG.XI(a)
+C.fQ.LX(a)
+C.fQ.XI(a)
 return a}}},
 V37:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,N,{
 "^":"",
 TJ:{
-"^":"a;oc>,eT>,cK,Zm>,qu>,z3",
+"^":"a;oc>,eT>,cK,Zm>,ks>,z3",
 gB8:function(){var z,y,x
 z=this.eT
 y=z==null||J.xC(J.DA(z),"")
@@ -13993,18 +13989,18 @@
 v=J.Lp(v)}else N.QM("").js(w)}},
 X2A:function(a,b,c){return this.Y6(C.EkO,a,b,c)},
 kS:function(a){return this.X2A(a,null,null)},
-TF:function(a,b,c){return this.Y6(C.R5,a,b,c)},
-Ny:function(a){return this.TF(a,null,null)},
+TF:function(a,b,c){return this.Y6(C.t4,a,b,c)},
+J4:function(a){return this.TF(a,null,null)},
 DH:function(a,b,c){return this.Y6(C.IF,a,b,c)},
 To:function(a){return this.DH(a,null,null)},
-OW:function(a,b,c){return this.Y6(C.nT,a,b,c)},
-j2:function(a){return this.OW(a,null,null)},
+r0:function(a,b,c){return this.Y6(C.nT,a,b,c)},
+j2:function(a){return this.r0(a,null,null)},
 WB:function(a,b,c){return this.Y6(C.cd,a,b,c)},
-YX:function(a){return this.WB(a,null,null)},
+hh:function(a){return this.WB(a,null,null)},
 qX:function(){if($.RL||this.eT==null){var z=this.z3
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.z3=z}z.toString
-return H.VM(new P.rk(z),[H.u3(z,0)])}else return N.QM("").qX()},
+return H.VM(new P.Ik(z),[H.u3(z,0)])}else return N.QM("").qX()},
 js:function(a){var z=this.z3
 if(z!=null){if(z.YM>=4)H.vh(z.Pq())
 z.MW(a)}},
@@ -14047,7 +14043,7 @@
 giO:function(a){return this.P},
 bu:[function(a){return this.oc},"$0","gCR",0,0,73],
 $isNg:true,
-static:{"^":"V7K,tmj,Enk,LkO,reI,kH8,hlK,MHK,Uu,lDu,uxc"}},
+static:{"^":"V7K,tmj,Enk,LkO,reI,kH8,hlK,MHK,Uu,wC,uxc"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"$0","gCR",0,0,73],
@@ -14076,13 +14072,13 @@
 "^":"TpZ:12;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
-try{A.Ok()}catch(y){x=H.Ru(y)
+try{A.Zw()}catch(y){x=H.Ru(y)
 z=x
-N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
+N.QM("").hh("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
 $isEH:true}}],["","",,N,{
 "^":"",
 qn:{
-"^":"V38;GC,OM,zv,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V38;GC,OM,zv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 guc:function(a){return a.GC},
 suc:function(a,b){a.GC=this.ct(a,C.EP,a.GC,b)},
 god:function(a){return a.OM},
@@ -14093,24 +14089,24 @@
 if(a.zv!=null)return
 if(a.OM!=null){z=a.GC
 z=z!=null&&z.gcX()!=null}else z=!1
-if(z){z=a.OM.gpG().tf.t(0,a.GC.gcX())
+if(z){z=a.OM.gpG().LL.t(0,a.GC.gcX())
 z=this.ct(a,C.tf,a.zv,z)
 a.zv=z
-if(z==null){z=a.OM.gSn().tf.t(0,a.GC.gcX())
-a.zv=this.ct(a,C.tf,a.zv,z)}}if(a.zv==null&&a.OM!=null){z=a.OM.gpG().tf
+if(z==null){z=a.OM.gSn().LL.t(0,a.GC.gcX())
+a.zv=this.ct(a,C.tf,a.zv,z)}}if(a.zv==null&&a.OM!=null){z=a.OM.gpG().LL
 y=z.gUQ(z)
-z=y.gtH(y)
+z=y.gqG(y)
 a.zv=this.ct(a,C.tf,a.zv,z)}},
 Es:function(a){this.Sd(a)},
 vD:[function(a,b){var z=a.OM
-if(z!=null)z.VT().ml(new N.QI(a))},"$1","grV",2,0,19,59],
+if(z!=null)z.VT().ml(new N.FQ(a))},"$1","guz",2,0,19,59],
 pA:[function(a,b){a.OM.VT().wM(b)},"$1","gvC",2,0,19,102],
 Cd9:[function(a,b,c,d){var z,y,x
 z=J.Vs(d).dA.getAttribute("data-id")
-y=a.OM.gpG().tf.t(0,z)
+y=a.OM.gpG().LL.t(0,z)
 y=this.ct(a,C.tf,a.zv,y)
 a.zv=y
-if(y==null){y=a.OM.gSn().tf.t(0,z)
+if(y==null){y=a.OM.gSn().LL.t(0,z)
 y=this.ct(a,C.tf,a.zv,y)
 a.zv=y}x=a.GC
 if(y!=null)x.scX(z)
@@ -14122,7 +14118,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14135,16 +14131,16 @@
 V38:{
 "^":"uL+Pi;",
 $isd3:true},
-QI:{
+FQ:{
 "^":"TpZ:12;a",
 $1:[function(a){J.O8(this.a)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 I2:{
-"^":"V39;GC,YE,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V39;GC,on,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 guc:function(a){return a.GC},
 suc:function(a,b){a.GC=this.ct(a,C.EP,a.GC,b)},
-gbe:function(a){return a.YE},
-sbe:function(a,b){a.YE=this.ct(a,C.kB,a.YE,b)},
+gbe:function(a){return a.on},
+sbe:function(a,b){a.on=this.ct(a,C.kB,a.on,b)},
 jV:function(a,b,c){var z,y
 if(b==null)return
 for(z=J.RE(b),y=0;y<J.q8(z.gbG(b));++y)if(J.xC(H.BU(J.Vm(J.UQ(z.gbG(b),y)),null,null),c))return y
@@ -14152,21 +14148,21 @@
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 this.hB(a)},
 hB:function(a){var z,y
-if(a.YE==null)return
+if(a.on==null)return
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#refreshrate")
 if(z==null)return
-J.yi(z,this.jV(a,z,a.YE.gmw()!=null?J.cj(a.YE.gmw()).gVs():0))
+J.yi(z,this.jV(a,z,a.on.gmw()!=null?J.cj(a.on.gmw()).gVs():0))
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#buffersize")
-J.yi(y,this.jV(a,y,a.YE.ghM()))},
+J.yi(y,this.jV(a,y,a.on.ghM()))},
 y3q:[function(a,b){this.hB(a)},"$1","gyZ",2,0,12,59],
-tC:[function(a,b,c,d){var z,y
-z=H.BU(H.Go(d,"$iszk").value,null,null)
-y=a.YE
+rm:[function(a,b,c,d){var z,y
+z=H.BU(H.Go(d,"$isbs").value,null,null)
+y=a.on
 if(y==null)return
 a.GC.ZW(z,y)},"$3","gIf",6,0,105,2,106,107],
 d7:[function(a,b,c,d){var z,y
-z=H.BU(H.Go(d,"$iszk").value,null,null)
-y=a.YE
+z=H.BU(H.Go(d,"$isbs").value,null,null)
+y=a.on
 if(y==null)return
 y.shM(z)},"$3","gTK",6,0,105,2,106,107],
 static:{rI3:function(a){var z,y,x,w
@@ -14175,7 +14171,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14189,9 +14185,9 @@
 "^":"uL+Pi;",
 $isd3:true},
 FB:{
-"^":"V40;Mu,aF,YE,OM,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gbe:function(a){return a.YE},
-sbe:function(a,b){a.YE=this.ct(a,C.kB,a.YE,b)},
+"^":"V40;lB,qV,on,OM,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gbe:function(a){return a.on},
+sbe:function(a,b){a.on=this.ct(a,C.kB,a.on,b)},
 god:function(a){return a.OM},
 sod:function(a,b){a.OM=this.ct(a,C.rB,a.OM,b)},
 Es:function(a){var z=P.ii(0,0,0,0,0,1)
@@ -14199,23 +14195,23 @@
 Z.uL.prototype.Es.call(this,a)},
 yY:function(a){this.T1(a)},
 T1:function(a){var z,y
-if(a.aF==null){z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#graph")
+if(a.qV==null){z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#graph")
 if(z==null)return
-y=new G.qu(null,P.L5(null,null,null,null,null))
+y=new G.yD(null,P.L5(null,null,null,null,null))
 y.vR=P.zV(J.UQ($.BY,"LineChart"),[z])
-a.aF=y}if(a.YE==null)return
-this.Ta(a)
-a.aF.Am(0,a.Mu)},
-Ta:function(a){var z,y,x,w,v,u,t
-z=a.Mu.Yb
+a.qV=y}if(a.on==null)return
+this.qt(a)
+a.qV.Am(0,a.lB)},
+qt:function(a){var z,y,x,w,v,u,t
+z=a.lB.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-for(y=0;y<a.YE.gJk().xN.length;++y){x=a.YE.gJk().xN
+for(y=0;y<a.on.gJk().XG.length;++y){x=a.on.gJk().XG
 if(y>=x.length)return H.e(x,y)
 w=x[y]
 x=w.gFl()
 v=J.Vm(w)
 u=[]
-C.Nm.FV(u,C.Nm.ez([x.gX3(),x.gcO(),x.gIv()],P.En()))
+C.Nm.FV(u,C.Nm.ez([x.gGt(),x.gS6(),x.gBM()],P.En()))
 t=new P.GD(u)
 t.$builtinTypeInfo=[null]
 x=[]
@@ -14224,10 +14220,10 @@
 x.$builtinTypeInfo=[null]
 z.V7("addRow",[x])}},
 y3q:[function(a,b){var z
-if(!J.xC(b,a.YE)){z=a.Mu.Yb
+if(!J.xC(b,a.on)){z=a.lB.Yb
 z.V7("removeColumns",[0,z.nQ("getNumberOfColumns")])
 z.V7("addColumn",["timeofday","time"])
-z.V7("addColumn",["number",J.DA(a.YE)])}},"$1","gyZ",2,0,12,59],
+z.V7("addColumn",["number",J.DA(a.on)])}},"$1","gyZ",2,0,12,59],
 static:{kUw:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -14235,23 +14231,23 @@
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 w=P.Fl(null,null)
 v=P.Fl(null,null)
-a.Mu=new G.eM(z)
-a.Iy=[]
+a.lB=new G.Kf(z)
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.h1.LX(a)
-C.h1.XI(a)
+C.Mw.LX(a)
+C.Mw.XI(a)
 return a}}},
 V40:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,A,{
 "^":"",
 md:{
-"^":"V41;i4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V41;i4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 giC:function(a){return a.i4},
 siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
 static:{DCi:function(a){var z,y,x,w
@@ -14261,21 +14257,21 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.i4=!0
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.kD.LX(a)
-C.kD.XI(a)
+C.aV.LX(a)
+C.aV.XI(a)
 return a}}},
 V41:{
 "^":"uL+Pi;",
 $isd3:true},
 Bm:{
-"^":"V42;KU,V4,Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V42;KU,V4,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gwp:function(a){return a.V4},
@@ -14291,7 +14287,7 @@
 a.KU="#"
 a.V4="---"
 a.Jo=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14305,12 +14301,12 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ya:{
-"^":"V43;KU,V4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V43;KU,V4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gwp:function(a){return a.V4},
 swp:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-static:{P5Z:function(a){var z,y,x,w
+static:{JR:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -14318,7 +14314,7 @@
 w=P.Fl(null,null)
 a.KU="#"
 a.V4="---"
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14332,29 +14328,29 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":"V44;rU,SB,z2,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V44;rU,SB,Hq,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gFR:function(a){return a.rU},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
 sFR:function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},
 gjl:function(a){return a.SB},
 sjl:function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},
-gph:function(a){return a.z2},
-sph:function(a,b){a.z2=this.ct(a,C.hf,a.z2,b)},
-Kp:[function(a,b,c,d){var z=a.SB
+gph:function(a){return a.Hq},
+sph:function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},
+VV:[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.LY(a,this.gec(a))},"$3","gyr",6,0,116,2,106,107],
-uq:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gec",0,0,17],
-static:{wC:function(a){var z,y,x,w
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,116,2,106,107],
+uq:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,17],
+static:{ZC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.SB=!1
-a.z2="Refresh"
-a.Iy=[]
+a.Hq="Refresh"
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14368,14 +14364,14 @@
 "^":"uL+Pi;",
 $isd3:true},
 ye:{
-"^":"uL;tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"uL;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{mBQ:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14386,17 +14382,17 @@
 C.pl.XI(a)
 return a}}},
 G1:{
-"^":"V45;Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V45;Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{PU:function(a){var z,y,x,w
+static:{Br:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14410,24 +14406,24 @@
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":"V46;Jo,iy,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V46;Jo,iy,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","grV",2,0,19,59],
+vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,19,59],
 gu6:function(a){var z=a.iy
 if(z!=null)return J.Ds(z)
 else return""},
 su6:function(a,b){},
-static:{zf:function(a){var z,y,x,w
+static:{YtF:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14441,7 +14437,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 UK:{
-"^":"V47;VW,Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V47;VW,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gHt:function(a){return a.VW},
 sHt:function(a,b){a.VW=this.ct(a,C.EV,a.VW,b)},
 grZ:function(a){return a.Jo},
@@ -14453,7 +14449,7 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14467,7 +14463,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":"V48;Au,Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V48;Au,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRu:function(a){return a.Au},
 sRu:function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},
 grZ:function(a){return a.Jo},
@@ -14479,7 +14475,7 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14493,16 +14489,16 @@
 "^":"uL+Pi;",
 $isd3:true},
 NK:{
-"^":"V49;rv,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V49;rv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
-static:{kR:function(a){var z,y,x,w
+static:{Xii:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14516,27 +14512,27 @@
 "^":"uL+Pi;",
 $isd3:true},
 Zx:{
-"^":"V50;rv,Wx,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V50;rv,Wx,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
-gMl:function(a){return a.Wx},
-sMl:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
-qW:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
-return J.df(J.wg(a.Wx))},"$1","gDQ",2,0,167,13],
-PyB:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
-return J.v7(J.wg(a.Wx))},"$1","gLc",2,0,167,13],
-lMu:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
-return J.J1(J.wg(a.Wx))},"$1","gqF",2,0,167,13],
-Cx:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
-return J.Fy(J.wg(a.Wx))},"$1","gZp",2,0,167,13],
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gRN",6,0,171,2,106,107],
+gBk:function(a){return a.Wx},
+sBk:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
+qW:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.df(J.aT(a.Wx))},"$1","gDQ",2,0,167,13],
+PyB:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.UR(J.aT(a.Wx))},"$1","gLc",2,0,167,13],
+XQ:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.MU(J.aT(a.Wx))},"$1","gqF",2,0,167,13],
+Cx:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.Fy(J.aT(a.Wx))},"$1","gZp",2,0,167,13],
+cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,171,2,106,107],
 static:{yno:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14551,19 +14547,19 @@
 $isd3:true}}],["","",,L,{
 "^":"",
 qV:{
-"^":"V51;xt,qB,GI,wA,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gWA:function(a){return a.xt},
-sWA:function(a,b){a.xt=this.ct(a,C.td,a.xt,b)},
+"^":"V51;dV,qB,GI,wA,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gWA:function(a){return a.dV},
+sWA:function(a,b){a.dV=this.ct(a,C.td,a.dV,b)},
 gIi:function(a){return a.qB},
 sIi:function(a,b){a.qB=this.ct(a,C.XM,a.qB,b)},
 gyK:function(a){return a.GI},
 syK:function(a,b){a.GI=this.ct(a,C.uO,a.GI,b)},
 gCF:function(a){return a.wA},
 sCF:function(a,b){a.wA=this.ct(a,C.tg,a.wA,b)},
-Cq:[function(a,b){return J.wg(a.xt).cv(J.WB(J.eS(a.xt),"/retained")).ml(new L.uW(a))},"$1","ghN",2,0,111,113],
-Cc:[function(a,b){return J.wg(a.xt).cv(J.WB(J.eS(a.xt),"/retaining_path?limit="+H.d(b))).ml(new L.vT(a))},"$1","gCI",2,0,111,32],
-yg:[function(a,b){return J.wg(a.xt).cv(J.WB(J.eS(a.xt),"/inbound_references?limit="+H.d(b))).ml(new L.C1y(a))},"$1","gi0",2,0,111,32],
-pA:[function(a,b){J.LE(a.xt).wM(b)},"$1","gvC",2,0,122,120],
+zs:[function(a,b){return J.aT(a.dV).cv(J.WB(J.eS(a.dV),"/retained")).ml(new L.rQ(a))},"$1","ghN",2,0,111,113],
+Cc:[function(a,b){return J.aT(a.dV).cv(J.WB(J.eS(a.dV),"/retaining_path?limit="+H.d(b))).ml(new L.ky(a))},"$1","gCI",2,0,111,32],
+rT:[function(a,b){return J.aT(a.dV).cv(J.WB(J.eS(a.dV),"/inbound_references?limit="+H.d(b))).ml(new L.WZ(a))},"$1","gi0",2,0,111,32],
+pA:[function(a,b){J.LE(a.dV).wM(b)},"$1","gvC",2,0,122,120],
 static:{P5f:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -14571,7 +14567,7 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.wA=null
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14584,26 +14580,26 @@
 V51:{
 "^":"uL+Pi;",
 $isd3:true},
-uW:{
+rQ:{
 "^":"TpZ:115;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(a.gPE(),null,null)
-z.wA=J.Q5(z,C.tg,z.wA,y)},"$1",null,2,0,null,96,"call"],
+z.wA=J.NB(z,C.tg,z.wA,y)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-vT:{
+ky:{
 "^":"TpZ:153;a",
 $1:[function(a){var z=this.a
-z.qB=J.Q5(z,C.XM,z.qB,a)},"$1",null,2,0,null,96,"call"],
+z.qB=J.NB(z,C.XM,z.qB,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-C1y:{
+WZ:{
 "^":"TpZ:153;a",
 $1:[function(a){var z=this.a
-z.GI=J.Q5(z,C.uO,z.GI,a)},"$1",null,2,0,null,96,"call"],
+z.GI=J.NB(z,C.uO,z.GI,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true}}],["","",,L,{
 "^":"",
 NT:{
-"^":"V52;R6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V52;R6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gWA:function(a){return a.R6},
 sWA:function(a,b){a.R6=this.ct(a,C.td,a.R6,b)},
 static:{di:function(a){var z,y,x,w
@@ -14612,7 +14608,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14627,28 +14623,28 @@
 $isd3:true}}],["","",,V,{
 "^":"",
 F1:{
-"^":"V53;qC,i6=,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gd0:function(a){return a.qC},
-sd0:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
+"^":"V53;qC,i6=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gz2:function(a){return a.qC},
+sz2:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
 Es:function(a){var z,y,x
 Z.uL.prototype.Es.call(this,a)
-if(a.qC===!0){z=new G.mL(H.VM([],[G.MQ]),null,new G.OR("/vm",null,null,null,null,null),null,null,a,null,null,Q.pT(null,D.Mk),null,null)
+if(a.qC===!0){z=new G.mL(H.VM([],[G.OS]),null,new G.ng("/vm",null,null,null,null,null),null,null,a,null,null,Q.pT(null,D.Mk),null,null)
 z.E0(a)
-a.i6=z}else{z=H.VM([],[G.MQ])
+a.i6=z}else{z=H.VM([],[G.OS])
 y=Q.pT(null,D.Mk)
-x=new G.uh(new G.V3("targetManager"),Q.pT(null,null),null,null,null,null)
-x.vs()
-y=new G.mL(z,null,new G.OR("/vm",null,null,null,null,null),null,x,a,null,null,y,null,null)
+x=new G.nD(new G.V3("targetManager"),Q.pT(null,null),null,null,null,null)
+x.lK()
+y=new G.mL(z,null,new G.ng("/vm",null,null,null,null,null),null,x,a,null,null,y,null,null)
 y.Ty(a)
 a.i6=y}},
-static:{Lu:function(a){var z,y,x,w
+static:{VO:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.qC=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14663,44 +14659,44 @@
 $isd3:true}}],["","",,Z,{
 "^":"",
 uL:{
-"^":"Xfs;tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"Xfs;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gi6:function(a){return $.Kh},
-guc:function(a){return this.gi6(a).Ef},
-gl6:function(a){return J.H3(this.guc(a))},
+guc:function(a){return this.gi6(a).fN},
+gl6:function(a){return J.D8(this.guc(a))},
 Es:function(a){A.zs.prototype.Es.call(this,a)
 this.U2(a)},
-aC:function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},
-dQ:function(a){A.zs.prototype.dQ.call(this,a)
-this.mv(a)},
+wN:function(a,b,c,d){A.zs.prototype.wN.call(this,a,b,c,d)},
+Lx:function(a){A.zs.prototype.Lx.call(this,a)
+this.yM(a)},
 I9:function(a){A.zs.prototype.I9.call(this,a)},
 gMT:function(a){return a.tB},
 sMT:function(a,b){a.tB=this.ct(a,C.O9,a.tB,b)},
 yY:function(a){},
 JnB:[function(a,b){if(a.tB!=null)this.U2(a)
-else this.mv(a)},"$1","gqA",2,0,19,59],
+else this.yM(a)},"$1","grX",2,0,19,59],
 U2:function(a){var z
 if(a.tB==null)return
-z=a.IO
+z=a.Qf
 if(z!=null)z.Gv()
-a.IO=P.cH(a.tB,this.gPs(a))},
-mv:function(a){var z=a.IO
+a.Qf=P.cH(a.tB,this.gPs(a))},
+yM:function(a){var z=a.Qf
 if(z!=null)z.Gv()
-a.IO=null},
+a.Qf=null},
 Yl:[function(a){var z
 this.yY(a)
 z=a.tB
-if(z==null){this.mv(a)
-return}a.IO=P.cH(z,this.gPs(a))},"$0","gPs",0,0,17],
+if(z==null){this.yM(a)
+return}a.Qf=P.cH(z,this.gPs(a))},"$0","gPs",0,0,17],
 wW:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gCK",6,0,171,87,106,107],
-XD:[function(a,b){this.gi6(a).Z6
+Gxe:[function(a,b){this.gi6(a).Z6
 return"#"+H.d(b)},"$1","gGs",2,0,172,173],
-hA:[function(a,b){return G.mGl(b)},"$1","gSs",2,0,174,175],
-Ze:[function(a,b){return G.XzS(b)},"$1","gbJ",2,0,14,15],
-Zl:[function(a,b){return H.BU(b,null,null)},"$1","gIb",2,0,145,20],
+Qb:[function(a,b){return G.M5(b)},"$1","gSs",2,0,174,175],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,14,15],
+YH:[function(a,b){return H.BU(b,null,null)},"$1","gIb",2,0,145,20],
 Rms:[function(a,b,c){var z,y,x,w
 z=[]
 z.push(C.yo.j("'",0))
-for(y=J.OX(b),y=y.gA(y);y.G();){x=y.lo
+for(y=J.GG(b),y=y.gA(y);y.G();){x=y.Ff
 w=J.x(x)
 if(w.n(x,"\n".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\n"))
 else if(w.n(x,"\r".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\r"))
@@ -14711,25 +14707,25 @@
 else if(w.n(x,"$".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\$"))
 else if(w.n(x,"\\".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\\\"))
 else if(w.n(x,"'".charCodeAt(0)))C.Nm.FV(z,new J.IA("'"))
-else if(w.C(x,32))C.Nm.FV(z,new J.IA("\\u"+C.yo.LL(w.WZ(x,16),4,"0")))
+else if(w.C(x,32))C.Nm.FV(z,new J.IA("\\u"+C.yo.YX(w.WZ(x,16),4,"0")))
 else z.push(x)}if(c===!0)C.Nm.FV(z,new J.IA("..."))
 else z.push(C.yo.j("'",0))
-return P.nB(z)},function(a,b){return this.Rms(a,b,!1)},"hD","$2","$1","gRO",2,2,176,69,20,177],
-static:{LD:function(a){var z,y,x,w
+return P.HM(z)},function(a,b){return this.Rms(a,b,!1)},"hD","$2","$1","gRO",2,2,176,69,20,177],
+static:{ew:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Pfz.LX(a)
-C.Pfz.XI(a)
+C.mk.LX(a)
+C.mk.XI(a)
 return a}}},
 Xfs:{
 "^":"xc+Pi;",
@@ -14747,12 +14743,12 @@
 if(z==null){z=this.gcm(a)
 z=P.bK(this.gym(a),z,!0,null)
 a.Vg=z}z.toString
-return H.VM(new P.rk(z),[H.u3(z,0)])},
-Tr:[function(a){},"$0","gcm",0,0,17],
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
+w37:[function(a){},"$0","gcm",0,0,17],
 dt:[function(a){a.Vg=null},"$0","gym",0,0,17],
 HC:[function(a){var z,y,x
-z=a.ij
-a.ij=null
+z=a.fn
+a.fn=null
 if(this.gnz(a)&&z!=null){y=a.Vg
 x=H.VM(new P.Ui(z),[T.yj])
 if(y.YM>=4)H.vh(y.Pq())
@@ -14765,8 +14761,8 @@
 return z},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
 nq:function(a,b){if(!this.gnz(a))return
-if(a.ij==null){a.ij=[]
-P.rb(this.gDx(a))}a.ij.push(b)},
+if(a.fn==null){a.fn=[]
+P.rb(this.gDx(a))}a.fn.push(b)},
 $isd3:true}}],["","",,T,{
 "^":"",
 yj:{
@@ -14777,7 +14773,7 @@
 bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
 $isqI:true}}],["","",,O,{
 "^":"",
-N0:function(){var z,y,x,w,v,u,t,s,r,q
+X0:function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
 if($.Oo==null)return
 $.Td=!0
@@ -14793,27 +14789,27 @@
 s=J.RE(t)
 if(s.gnz(t)){if(s.HC(t)){if(w)y.push([u,t])
 v=!0}$.Oo.push(t)}}}while(z<1000&&v)
-if(w&&v){w=$.aT()
+if(w&&v){w=$.S5()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.G();){r=s.lo
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.G();){r=s.Ff
 q=J.U6(r)
-w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.dL=$.Oo.length
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.Nc=$.Oo.length
 $.Td=!1},
 Ht:function(){var z={}
 z.a=!1
-z=new O.Nq(z)
-return new P.yQ(null,null,null,null,new O.zI(z),new O.bF(z),null,null,null,null,null,null)},
-Nq:{
+z=new O.YC(z)
+return new P.yQ(null,null,null,null,new O.zI(z),new O.hw(z),null,null,null,null,null,null)},
+YC:{
 "^":"TpZ:178;a",
 $2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.jB(z))},
+a.RK(b,new O.N0(z))},
 $isEH:true},
-jB:{
+N0:{
 "^":"TpZ:76;a",
 $0:[function(){this.a.a=!1
-O.N0()},"$0",null,0,0,null,"call"],
+O.X0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
 "^":"TpZ:29;b",
@@ -14825,18 +14821,18 @@
 $0:[function(){this.c.$2(this.d,this.e)
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
-bF:{
+hw:{
 "^":"TpZ:179;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.f6(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
+return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
-f6:{
+iu:{
 "^":"TpZ:12;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
 return this.w3.$1(a)},"$1",null,2,0,null,180,"call"],
 $isEH:true}}],["","",,G,{
 "^":"",
-LR:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=f-e+1
 y=J.WB(J.bI(c,b),1)
 x=Array(z)
@@ -14872,7 +14868,7 @@
 m=P.J(p+1,m+1)
 if(t>=o)return H.e(n,t)
 n[t]=m}}return x},
-Mw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
 if(0>=z)return H.e(a,0)
@@ -14906,8 +14902,8 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[H.u3(H.VM(new H.TNQ(),[H.u3(u,0)]),0)]).br(0)},
-uf:function(a,b,c){var z,y,x
+x=s}}}return H.VM(new H.iK(u),[H.u3(H.VM(new H.wb(),[H.u3(u,0)]),0)]).br(0)},
+rN:function(a,b,c){var z,y,x
 for(z=J.U6(a),y=0;y<c;++y){x=z.t(a,y)
 if(y>=b.length)return H.e(b,y)
 if(!J.xC(x,b[y]))return y}return c},
@@ -14925,7 +14921,7 @@
 z=J.Wx(c)
 y=P.J(z.W(c,b),f-e)
 x=J.x(b)
-w=x.n(b,0)&&e===0?G.uf(a,d,y):0
+w=x.n(b,0)&&e===0?G.rN(a,d,y):0
 v=z.n(c,J.q8(a))&&f===d.length?G.xU(a,d,y-w):0
 b=x.g(b,w)
 e+=w
@@ -14940,11 +14936,11 @@
 for(;e<f;e=s){z=t.kJ
 s=e+1
 if(e>>>0!==e||e>=d.length)return H.e(d,e)
-C.Nm.h(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
+J.bi(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
 u=[]
 x=new P.Ui(u)
 x.$builtinTypeInfo=[null]
-return[new G.Zq(a,x,u,b,z)]}r=G.Mw(G.LR(a,b,c,d,e,f))
+return[new G.Zq(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
 q=[]
 q.$builtinTypeInfo=[G.Zq]
 for(p=e,o=b,t=null,n=0;n<r.length;++n)switch(r[n]){case 0:if(t!=null){q.push(t)
@@ -14957,7 +14953,7 @@
 o=J.WB(o,1)
 z=t.kJ
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
-C.Nm.h(z,d[p]);++p
+J.bi(z,d[p]);++p
 break
 case 2:if(t==null){u=[]
 z=new P.Ui(u)
@@ -14970,15 +14966,16 @@
 z.$builtinTypeInfo=[null]
 t=new G.Zq(a,z,u,o,0)}z=t.kJ
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
-C.Nm.h(z,d[p]);++p
+J.bi(z,d[p]);++p
 break}if(t!=null)q.push(t)
 return q},
 m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
-x=C.Nm.br(b.gkJ())
+x=J.Nd(b.gkJ())
 w=b.gNg()
+if(w==null)w=0
 v=new P.Ui(x)
 v.$builtinTypeInfo=[null]
 u=new G.Zq(y,v,x,z,w)
@@ -15002,25 +14999,26 @@
 else{o=q.kJ
 if(J.u6(u.Ft,q.Ft)){z=u.HD
 z=z.Yc(z,0,J.bI(q.Ft,u.Ft))
-if(!!o.fixed$length)H.vh(P.f("insertAll"))
+o.toString
+if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
 H.IC(o,0,z)}if(J.xZ(J.WB(u.Ft,u.HD.G4.length),J.WB(q.Ft,q.wF))){z=u.HD
-C.Nm.FV(o,z.Yc(z,J.bI(J.WB(q.Ft,q.wF),u.Ft),u.HD.G4.length))}u.kJ=o
+J.bj(o,z.Yc(z,J.bI(J.WB(q.Ft,q.wF),u.Ft),u.HD.G4.length))}u.kJ=o
 u.HD=q.HD
 if(J.u6(q.Ft,u.Ft))u.Ft=q.Ft
-t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.aP(a,r,u);++r
+t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.xe(a,r,u);++r
 n=J.bI(u.wF,u.HD.G4.length)
 q.Ft=J.WB(q.Ft,n)
 if(typeof n!=="number")return H.s(n)
 s+=n
 t=!0}else t=!1}if(!t)a.push(u)},
-VT:function(a,b){var z,y
+hs:function(a,b){var z,y
 z=H.VM([],[G.Zq])
-for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.G();)G.m1(z,y.lo)
+for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.G();)G.m1(z,y.Ff)
 return z},
 Qi:function(a,b){var z,y,x,w,v,u
 if(b.length<=1)return b
 z=[]
-for(y=G.VT(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.xN;y.G();){w=y.lo
+for(y=G.hs(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.XG;y.G();){w=y.Ff
 if(J.xC(w.gNg(),1)&&w.gRt().G4.length===1){v=w.gRt().G4
 if(0>=v.length)return H.e(v,0)
 v=v[0]
@@ -15041,7 +15039,10 @@
 if(z)return!1
 if(!J.xC(this.wF,this.HD.G4.length))return!0
 return J.u6(a,J.WB(this.Ft,this.wF))},
-bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "+H.d(this.HD)+", addedCount: "+H.d(this.wF)+">"},"$0","gCR",0,0,73],
+bu:[function(a){var z,y
+z="#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "
+y=this.HD
+return z+y.bu(y)+", addedCount: "+H.d(this.wF)+">"},"$0","gCR",0,0,73],
 $isZq:true,
 static:{K6:function(a,b,c,d){var z
 if(d==null)d=[]
@@ -15055,17 +15056,17 @@
 vly:{
 "^":"a;"}}],["","",,F,{
 "^":"",
-kM:[function(){return O.N0()},"$0","Jy",0,0,17],
+kM:[function(){return O.X0()},"$0","Jy",0,0,17],
 Wi:function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.xC(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
 return d},
 d3:{
-"^":"a;R9:ro%,rJ:XY%,me:iS%",
+"^":"a;R9:ro%,rJ:XY%,xt:cU%",
 gqh:function(a){var z
 if(this.gR9(a)==null){z=this.gFW(a)
 this.sR9(a,P.bK(this.gEp(a),z,!0,null))}z=this.gR9(a)
 z.toString
-return H.VM(new P.rk(z),[H.u3(z,0)])},
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
 gnz:function(a){var z,y
 if(this.gR9(a)!=null){z=this.gR9(a)
 y=z.iE
@@ -15075,19 +15076,19 @@
 z=$.Oo
 if(z==null){z=H.VM([],[F.d3])
 $.Oo=z}z.push(a)
-$.dL=$.dL+1
+$.Nc=$.Nc+1
 y=P.L5(null,null,null,P.IN,P.a)
-for(z=this.gbx(a),z=$.II().Me(0,z,new A.rv(!0,!1,!0,C.AP,!1,!1,C.fo,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.DA(z.lo)
-w=$.cp().JE.E4.t(0,x)
-if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+H.d(a)))
+for(z=this.gbx(a),z=$.mX().Me(0,z,new A.rv(!0,!1,!0,C.AP,!1,!1,C.bfK,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.DA(z.Ff)
+w=$.cp().xV.II.t(0,x)
+if(w==null)H.vh(O.Fm("getter \""+H.d(x)+"\" in "+this.bu(a)))
 y.u(0,x,w.$1(a))}this.srJ(a,y)},"$0","gFW",0,0,17],
 dJx:[function(a){if(this.grJ(a)!=null)this.srJ(a,null)},"$0","gEp",0,0,17],
 HC:function(a){var z,y
 z={}
 if(this.grJ(a)==null||!this.gnz(a))return!1
-z.a=this.gme(a)
-this.sme(a,null)
-this.grJ(a).aN(0,new F.X6(z,a))
+z.a=this.gxt(a)
+this.sxt(a,null)
+this.grJ(a).aN(0,new F.D9(z,a))
 if(z.a==null)return!1
 y=this.gR9(a)
 z=H.VM(new P.Ui(z.a),[T.yj])
@@ -15096,14 +15097,14 @@
 return!0},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
 nq:function(a,b){if(!this.gnz(a))return
-if(this.gme(a)==null)this.sme(a,[])
-this.gme(a).push(b)},
+if(this.gxt(a)==null)this.sxt(a,[])
+this.gxt(a).push(b)},
 $isd3:true},
-X6:{
+D9:{
 "^":"TpZ:81;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
-y=$.cp().jD(z,a)
+y=$.cp().Gp(z,a)
 if(!J.xC(b,y)){x=this.a
 w=x.a
 if(w==null){v=[]
@@ -15120,14 +15121,14 @@
 bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.Xq)+">"},"$0","gCR",0,0,73]}}],["","",,Q,{
 "^":"",
 wn:{
-"^":"uFU;lr@,fN,xN,Vg,ij",
-gXF:function(){var z=this.fN
-if(z==null){z=P.bK(new Q.BjH(this),null,!0,null)
-this.fN=z}z.toString
-return H.VM(new P.rk(z),[H.u3(z,0)])},
-gB:function(a){return this.xN.length},
+"^":"uFU;lr@,Mu,XG,Vg,fn",
+gXF:function(){var z=this.Mu
+if(z==null){z=P.bK(new Q.xb(this),null,!0,null)
+this.Mu=z}z.toString
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
+gB:function(a){return this.XG.length},
 sB:function(a,b){var z,y,x,w,v
-z=this.xN
+z=this.XG
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
@@ -15135,10 +15136,10 @@
 w=b===0
 this.ct(this,C.ai,x,w)
 this.ct(this,C.nZ,!x,!w)
-x=this.fN
+x=this.Mu
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)if(b<y){x=new H.TNQ()
+if(x)if(b<y){x=new H.wb()
 x.$builtinTypeInfo=[H.u3(z,0)]
 if(b<0||b>z.length)H.vh(P.TE(b,0,z.length))
 if(y<b||y>z.length)H.vh(P.TE(y,b,z.length))
@@ -15154,14 +15155,14 @@
 x=new P.Ui(v)
 x.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,x,v,y,b-y))}C.Nm.sB(z,b)},
-t:function(a,b){var z=this.xN
+t:function(a,b){var z=this.XG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){var z,y,x,w
-z=this.xN
+z=this.XG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.fN
+x=this.Mu
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x){x=[y]
@@ -15175,42 +15176,42 @@
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.fN
+z=this.Mu
 if(z!=null){x=z.iE
 z=x==null?z!=null:x!==z}else z=!1
-if(z&&y>0){z=this.xN
-x=H.VM(new H.TNQ(),[H.u3(z,0)])
-H.K0(z,b,y)
-this.E2(G.K6(this,b,y,H.c1(z,b,y,H.u3(x,0)).br(0)))}H.h8(this.xN,b,c)},
+if(z&&y>0){z=this.XG
+x=H.VM(new H.wb(),[H.u3(z,0)])
+H.xF(z,b,y)
+this.E2(G.K6(this,b,y,H.c1(z,b,y,H.u3(x,0)).br(0)))}H.h8(this.XG,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.xN
+z=this.XG
 y=z.length
 this.Xy(y,y+1)
-x=this.fN
+x=this.Mu
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)this.E2(G.K6(this,y,1,null))
 C.Nm.h(z,b)},
 FV:function(a,b){var z,y,x,w
-z=this.xN
+z=this.XG
 y=z.length
 C.Nm.FV(z,b)
 this.Xy(y,z.length)
 x=z.length-y
-z=this.fN
+z=this.Mu
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
 if(z&&x>0)this.E2(G.K6(this,y,x,null))},
 Rz:function(a,b){var z,y
-for(z=this.xN,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.oq(0,y,y+1)
+for(z=this.XG,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.oq(0,y,y+1)
 return!0}return!1},
 oq:function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
-if(!z||b>this.xN.length)H.vh(P.TE(b,0,this.gB(this)))
+if(!z||b>this.XG.length)H.vh(P.TE(b,0,this.gB(this)))
 y=!(c<b)
-if(!y||c>this.xN.length)H.vh(P.TE(c,b,this.gB(this)))
+if(!y||c>this.XG.length)H.vh(P.TE(c,b,this.gB(this)))
 x=c-b
-w=this.xN
+w=this.XG
 v=w.length
 u=v-x
 this.ct(this,C.Wn,v,u)
@@ -15218,10 +15219,10 @@
 u=u===0
 this.ct(this,C.ai,t,u)
 this.ct(this,C.nZ,!t,!u)
-u=this.fN
+u=this.Mu
 if(u!=null){t=u.iE
 u=t==null?u!=null:t!==u}else u=!1
-if(u&&x>0){u=new H.TNQ()
+if(u&&x>0){u=new H.wb()
 u.$builtinTypeInfo=[H.u3(w,0)]
 if(!z||b>w.length)H.vh(P.TE(b,0,w.length))
 if(!y||c>w.length)H.vh(P.TE(c,b,w.length))
@@ -15235,24 +15236,24 @@
 y.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,y,z,b,0))}C.Nm.oq(w,b,c)},
 UG:function(a,b,c){var z,y,x,w
-if(b<0||b>this.xN.length)throw H.b(P.TE(b,0,this.gB(this)))
+if(b<0||b>this.XG.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.xN
+z=this.XG
 x=z.length
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
 H.h8(z,b,c)
 this.Xy(x,z.length)
-z=this.fN
+z=this.Mu
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
 if(z&&y>0)this.E2(G.K6(this,b,y,null))},
-aP:function(a,b,c){var z,y,x
-if(b>this.xN.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.xN
+xe:function(a,b,c){var z,y,x
+if(b>this.XG.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.XG
 y=z.length
 if(b===y){this.h(0,c)
 return}C.Nm.sB(z,y+1)
@@ -15260,14 +15261,14 @@
 H.qG(z,b+1,y,this,b)
 y=z.length
 this.Xy(y-1,y)
-y=this.fN
+y=this.Mu
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
 if(y)this.E2(G.K6(this,b,1,null))
 if(b>=z.length)return H.e(z,b)
 z[b]=c},
 E2:function(a){var z,y
-z=this.fN
+z=this.Mu
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
@@ -15284,7 +15285,7 @@
 if(z==null)return!1
 y=G.Qi(this,z)
 this.lr=null
-z=this.fN
+z=this.Mu
 if(z!=null){x=z.iE
 x=x==null?z!=null:x!==z}else x=!1
 if(x&&y.length!==0){x=H.VM(new P.Ui(y),[G.Zq])
@@ -15293,7 +15294,7 @@
 return!0}return!1},"$0","gL6",0,0,131],
 $iswn:true,
 static:{pT:function(a,b){var z=H.VM([],[b])
-return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5p:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+return H.VM(new Q.wn(null,null,z,null,null),[b])},Oi:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(a===b)throw H.b(P.u("can't use same list for previous and current"))
 for(z=J.mY(c),y=J.w1(b);z.G();){x=z.gl()
 w=J.RE(x)
@@ -15326,38 +15327,38 @@
 uFU:{
 "^":"ark+Pi;",
 $isd3:true},
-BjH:{
+xb:{
 "^":"TpZ:76;a",
-$0:function(){this.a.fN=null},
+$0:function(){this.a.Mu=null},
 $isEH:true}}],["","",,V,{
 "^":"",
 ya:{
-"^":"yj;nl>,jL,zZ,Lv,w5",
+"^":"yj;nl>,jL,zZ,aC,w5",
 bu:[function(a){var z
-if(this.Lv)z="insert"
+if(this.aC)z="insert"
 else z=this.w5?"remove":"set"
 return"#<MapChangeRecord "+z+" "+H.d(this.nl)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
 $isya:true},
 qC:{
-"^":"Pi;tf,Vg,ij",
-gvc:function(a){var z=this.tf
+"^":"Pi;LL,Vg,fn",
+gvc:function(a){var z=this.LL
 return z.gvc(z)},
-gUQ:function(a){var z=this.tf
+gUQ:function(a){var z=this.LL
 return z.gUQ(z)},
-gB:function(a){var z=this.tf
+gB:function(a){var z=this.LL
 return z.gB(z)},
-gl0:function(a){var z=this.tf
+gl0:function(a){var z=this.LL
 return z.gB(z)===0},
-gor:function(a){var z=this.tf
+gor:function(a){var z=this.LL
 return z.gB(z)!==0},
-NZ:function(a,b){return this.tf.NZ(0,b)},
-t:function(a,b){return this.tf.t(0,b)},
+NZ:function(a,b){return this.LL.NZ(0,b)},
+t:function(a,b){return this.LL.t(0,b)},
 u:function(a,b,c){var z,y,x,w
 z=this.Vg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
-if(!z){this.tf.u(0,b,c)
-return}z=this.tf
+if(!z){this.LL.u(0,b,c)
+return}z=this.LL
 x=z.gB(z)
 w=z.t(0,b)
 z.u(0,b,c)
@@ -15367,7 +15368,7 @@
 this.nq(this,H.VM(new T.qI(this,C.l4,null,null),[null]))}},
 FV:function(a,b){J.Me(b,new V.zT(this))},
 Rz:function(a,b){var z,y,x,w,v
-z=this.tf
+z=this.LL
 y=z.gB(z)
 x=z.Rz(0,b)
 w=this.Vg
@@ -15377,7 +15378,7 @@
 F.Wi(this,C.Wn,y,z.gB(z))
 this.ld()}return x},
 V1:function(a){var z,y,x,w
-z=this.tf
+z=this.LL
 y=z.gB(z)
 x=this.Vg
 if(x!=null){w=x.iE
@@ -15385,7 +15386,7 @@
 if(x&&y>0){z.aN(0,new V.Lo(this))
 F.Wi(this,C.Wn,y,0)
 this.ld()}z.V1(0)},
-aN:function(a,b){return this.tf.aN(0,b)},
+aN:function(a,b){return this.LL.aN(0,b)},
 bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 ld:function(){this.nq(this,H.VM(new T.qI(this,C.SY,null,null),[null]))
 this.nq(this,H.VM(new T.qI(this,C.l4,null,null),[null]))},
@@ -15409,30 +15410,30 @@
 $isEH:true}}],["","",,Y,{
 "^":"",
 cU:{
-"^":"Ap;nA,he,mD,TW,cl",
+"^":"Ap;Os,he,mD,Wv,XS",
 bl:function(a){return this.he.$1(a)},
-kk:function(a){return this.TW.$1(a)},
+xq:function(a){return this.Wv.$1(a)},
 TR:function(a,b){var z
-this.TW=b
-z=this.bl(J.mu(this.nA,this.giv()))
-this.cl=z
+this.Wv=b
+z=this.bl(J.mu(this.Os,this.gYZ()))
+this.XS=z
 return z},
-ab:[function(a){var z=this.bl(a)
-if(J.xC(z,this.cl))return
-this.cl=z
-return this.kk(z)},"$1","giv",2,0,12,60],
-xO:function(a){var z=this.nA
+pN:[function(a){var z=this.bl(a)
+if(J.xC(z,this.XS))return
+this.XS=z
+return this.xq(z)},"$1","gYZ",2,0,12,60],
+xO:function(a){var z=this.Os
 if(z!=null)J.yd(z)
-this.nA=null
+this.Os=null
 this.he=null
 this.mD=null
-this.TW=null
-this.cl=null},
-gP:function(a){var z=this.bl(J.Vm(this.nA))
-this.cl=z
+this.Wv=null
+this.XS=null},
+gP:function(a){var z=this.bl(J.Vm(this.Os))
+this.XS=z
 return z},
-sP:function(a,b){J.Fc(this.nA,b)},
-fR:function(){return this.nA.fR()}}}],["","",,L,{
+sP:function(a,b){J.Fc(this.Os,b)},
+fR:function(){return this.Os.fR()}}}],["","",,L,{
 "^":"",
 yfW:function(a,b){var z,y,x,w,v
 if(a==null)return
@@ -15444,40 +15445,40 @@
 if(!y){z=a
 y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z)return J.UQ(a,$.vu().JE.fJ.t(0,b))
+if(z)return J.UQ(a,$.vu().xV.af.t(0,b))
 try{z=a
 y=b
-x=$.cp().JE.E4.t(0,y)
-if(x==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+H.d(z)))
+x=$.cp().xV.II.t(0,y)
+if(x==null)H.vh(O.Fm("getter \""+H.d(y)+"\" in "+H.d(z)))
 z=x.$1(z)
 return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.bB(a)
-v=$.II().NW(z,C.OV)
-if(!(v!=null&&v.gUA()&&v.gFo()!==!0))throw w}else throw w}}}z=$.Nd()
+v=$.mX().NW(z,C.OV)
+if(!(v!=null&&v.gUA()&&v.gFo()!==!0))throw w}else throw w}}}z=$.YLt()
 if(z.mL(C.EkO))z.kS("can't get "+H.d(b)+" in "+H.d(a))
 return},
-iu:function(a,b,c){var z,y,x
+EX:function(a,b,c){var z,y,x
 if(a==null)return!1
 z=b
-if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.qQ(a,b,c)
+if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
 return!0}}else if(!!J.x(b).$isIN){z=a
 y=H.RB(z,"$isueT",[P.qU,null],"$asueT")
 if(!y){z=a
 y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z){J.qQ(a,$.vu().JE.fJ.t(0,b),c)
-return!0}try{$.cp().Q1(a,b,c)
+if(z){J.kW(a,$.vu().xV.af.t(0,b),c)
+return!0}try{$.cp().Cq(a,b,c)
 return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.bB(a)
-if(!$.II().UK(z,C.OV))throw x}else throw x}}z=$.Nd()
+if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.YLt()
 if(z.mL(C.EkO))z.kS("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 WR:{
-"^":"ARh;HS,Lq,IE,wN,dR,z7,KZ",
+"^":"ARh;HS,Lq,IE,zo,dR,z7,KZ",
 gIi:function(a){return this.HS},
 sP:function(a,b){var z=this.HS
 if(z!=null)z.rL(this.Lq,b)},
 gDJ:function(){return 2},
 TR:function(a,b){return L.ARh.prototype.TR.call(this,this,b)},
-Ej:function(a){this.IE=L.SE(this,this.Lq)
+Ej:function(a){this.IE=L.KJ(this,this.Lq)
 this.CG(!0)},
 U9:function(){this.z7=null
 this.HS=null
@@ -15492,7 +15493,7 @@
 return!0},
 mX:function(){return this.CG(!1)},
 $isAp:true},
-Tv:{
+Zl:{
 "^":"a;T7",
 gB:function(a){return this.T7.length},
 gl0:function(a){return this.T7.length===0},
@@ -15500,18 +15501,17 @@
 bu:[function(a){var z,y,x,w,v,u
 if(!this.gPu())return"<invalid path>"
 z=P.p9("")
-for(y=this.T7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.G();x=!1){w=y.lo
+for(y=this.T7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.G();x=!1){w=y.Ff
 v=J.x(w)
 if(!!v.$isIN){if(!x)z.IN+="."
-u=$.vu().JE.fJ.t(0,w)
+u=$.vu().xV.af.t(0,w)
 z.IN+=typeof u==="string"?u:H.d(u)}else if(typeof w==="number"&&Math.floor(w)===w){v="["+H.d(w)+"]"
-z.IN+=v}else{v="[\""+H.d(J.JA(v.bu(w),"\"","\\\""))+"\"]"
-z.IN+=v}}y=z.IN
-return y.charCodeAt(0)==0?y:y},"$0","gCR",0,0,73],
+z.IN+=v}else{v="[\""+J.JA(v.bu(w),"\"","\\\"")+"\"]"
+z.IN+=v}}return z.IN},"$0","gCR",0,0,73],
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
-if(!J.x(b).$isTv)return!1
+if(!J.x(b).$isZl)return!1
 if(this.gPu()!==b.gPu())return!1
 z=this.T7
 y=z.length
@@ -15532,7 +15532,7 @@
 return 536870911&x+((16383&x)<<15>>>0)},
 WK:function(a){var z,y
 if(!this.gPu())return
-for(z=this.T7,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+for(z=this.T7,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 if(a==null)return
 a=L.yfW(a,y)}return a},
 rL:function(a,b){var z,y,x
@@ -15542,7 +15542,7 @@
 for(x=0;x<y;++x){if(a==null)return!1
 if(x>=z.length)return H.e(z,x)
 a=L.yfW(a,z[x])}if(y>=z.length)return H.e(z,y)
-return L.iu(a,z[y],b)},
+return L.EX(a,z[y],b)},
 I5:function(a,b){var z,y,x,w
 if(!this.gPu()||this.T7.length===0)return
 z=this.T7
@@ -15553,42 +15553,42 @@
 w=x+1
 if(x>=z.length)return H.e(z,x)
 a=L.yfW(a,z[x])}},
-$isTv:true,
+$isZl:true,
 static:{hk:function(a){var z,y,x,w,v,u,t
 z=J.x(a)
-if(!!z.$isTv)return a
+if(!!z.$isZl)return a
 if(a!=null)z=!!z.$isWO&&z.gl0(a)
 else z=!0
 if(z)a=""
 if(!!J.x(a).$isWO){y=P.F(a,!1,null)
 z=new H.a7(y,y.length,0,null)
 z.$builtinTypeInfo=[H.u3(y,0)]
-for(;z.G();){x=z.lo
-if((typeof x!=="number"||Math.floor(x)!==x)&&typeof x!=="string"&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints, Strings, and Symbols"))}return new L.Tv(y)}z=$.aB()
+for(;z.G();){x=z.Ff
+if((typeof x!=="number"||Math.floor(x)!==x)&&typeof x!=="string"&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints, Strings, and Symbols"))}return new L.Zl(y)}z=$.Nu()
 w=z.t(0,a)
 if(w!=null)return w
-v=new L.Pw([],-1,null,P.EF(["beforePath",P.EF(["ws",["beforePath"],"ident",["inIdent","append"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"inPath",P.EF(["ws",["inPath"],".",["beforeIdent"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"beforeIdent",P.EF(["ws",["beforeIdent"],"ident",["inIdent","append"]],null,null),"inIdent",P.EF(["ident",["inIdent","append"],"0",["inIdent","append"],"number",["inIdent","append"],"ws",["inPath","push"],".",["beforeIdent","push"],"[",["beforeElement","push"],"eof",["afterPath","push"]],null,null),"beforeElement",P.EF(["ws",["beforeElement"],"0",["afterZero","append"],"number",["inIndex","append"],"'",["inSingleQuote","append",""],"\"",["inDoubleQuote","append",""]],null,null),"afterZero",P.EF(["ws",["afterElement","push"],"]",["inPath","push"]],null,null),"inIndex",P.EF(["0",["inIndex","append"],"number",["inIndex","append"],"ws",["afterElement"],"]",["inPath","push"]],null,null),"inSingleQuote",P.EF(["'",["afterElement"],"eof",["error"],"else",["inSingleQuote","append"]],null,null),"inDoubleQuote",P.EF(["\"",["afterElement"],"eof",["error"],"else",["inDoubleQuote","append"]],null,null),"afterElement",P.EF(["ws",["afterElement"],"]",["inPath","push"]],null,null)],null,null)).pI(a)
-if(v==null)return $.O3()
-w=new L.Tv(C.Nm.tt(v,!1))
+v=new L.iF([],-1,null,P.EF(["beforePath",P.EF(["ws",["beforePath"],"ident",["inIdent","append"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"inPath",P.EF(["ws",["inPath"],".",["beforeIdent"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"beforeIdent",P.EF(["ws",["beforeIdent"],"ident",["inIdent","append"]],null,null),"inIdent",P.EF(["ident",["inIdent","append"],"0",["inIdent","append"],"number",["inIdent","append"],"ws",["inPath","push"],".",["beforeIdent","push"],"[",["beforeElement","push"],"eof",["afterPath","push"]],null,null),"beforeElement",P.EF(["ws",["beforeElement"],"0",["afterZero","append"],"number",["inIndex","append"],"'",["inSingleQuote","append",""],"\"",["inDoubleQuote","append",""]],null,null),"afterZero",P.EF(["ws",["afterElement","push"],"]",["inPath","push"]],null,null),"inIndex",P.EF(["0",["inIndex","append"],"number",["inIndex","append"],"ws",["afterElement"],"]",["inPath","push"]],null,null),"inSingleQuote",P.EF(["'",["afterElement"],"eof",["error"],"else",["inSingleQuote","append"]],null,null),"inDoubleQuote",P.EF(["\"",["afterElement"],"eof",["error"],"else",["inDoubleQuote","append"]],null,null),"afterElement",P.EF(["ws",["afterElement"],"]",["inPath","push"]],null,null)],null,null)).pI(a)
+if(v==null)return $.ptP()
+w=new L.Zl(C.Nm.tt(v,!1))
 if(z.X5>=100){u=new P.i5(z)
 u.$builtinTypeInfo=[H.u3(z,0)]
 t=u.gA(u)
-if(!t.G())H.vh(H.Wp())
+if(!t.G())H.vh(H.DU())
 z.Rz(0,t.gl())}z.u(0,a,w)
 return w}}},
 vH:{
-"^":"Tv;T7",
+"^":"Zl;T7",
 gPu:function(){return!1},
-static:{"^":"l7"}},
-MdQ:{
+static:{"^":"HS"}},
+lPa:{
 "^":"TpZ:76;",
-$0:function(){return new H.VR("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",H.Vq("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",!1,!0,!1),null,null)},
+$0:function(){return new H.VR("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",H.v4("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",!1,!0,!1),null,null)},
 $isEH:true},
-Pw:{
-"^":"a;vc>,vH>,nl*,n5",
+iF:{
+"^":"a;vc>,vH>,nl*,ep",
 Xn:function(a){var z
 if(a==null)return"eof"
-switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return H.LY([a])
+switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return H.eT([a])
 case 95:case 36:return"ident"
 case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}if(typeof a!=="number")return H.s(a)
 if(!(97<=a&&a<=122))z=65<=a&&a<=90
@@ -15596,13 +15596,13 @@
 if(z)return"ident"
 if(49<=a&&a<=57)return"number"
 return"else"},
-rX:function(){var z,y,x,w
+rXF:function(){var z,y,x,w
 z=this.nl
 if(z==null)return
-z=$.cD().B0(z)
+z=$.cx().B0(z)
 y=this.vc
 x=this.nl
-if(z)y.push($.vu().JE.T4.t(0,x))
+if(z)y.push($.vu().xV.T4.t(0,x))
 else{w=H.BU(x,10,new L.PD())
 y.push(w!=null?w:this.nl)}this.nl=null},
 mx:function(a,b){var z=this.nl
@@ -15613,142 +15613,142 @@
 if(z>=y)return!1;++z
 if(z<0||z>=y)return H.e(b,z)
 z=b[z]
-x=H.LY([z])
+x=H.eT([z])
 if(!(a==="inSingleQuote"&&x==="'"))z=a==="inDoubleQuote"&&x==="\""
 else z=!0
 if(z){++this.vH
 z=this.nl
 this.nl=z==null?x:H.d(z)+x
 return!0}return!1},
-pI:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=U.LQ(J.OX(a),0,null,65533)
-for(y=this.n5,x=z.length,w="beforePath";w!=null;){v=++this.vH
-if(v>=x)u=null
-else{if(v<0)return H.e(z,v)
-u=z[v]}if(u!=null)v=H.LY([u])==="\\"&&this.jN(w,z)
-else v=!1
-if(v)continue
-t=this.Xn(u)
-if(J.xC(w,"error"))return
-s=y.t(0,w)
-r=s.t(0,t)
-if(r==null)r=s.t(0,"else")
-if(r==null)return
-v=J.U6(r)
-w=v.t(r,0)
-q=v.gB(r)>1?v.t(r,1):null
-p=J.x(q)
-if(p.n(q,"push")&&this.nl!=null)this.rX()
-if(p.n(q,"append")){if(v.gB(r)>2){v.t(r,2)
-p=!0}else p=!1
-if(p)o=v.t(r,2)
-else o=H.LY([u])
-v=this.nl
-this.nl=v==null?o:H.d(v)+H.d(o)}if(w==="afterPath")return this.vc}return}},
+pI:function(a){var z,y,x,w,v,u,t,s,r,q,p
+z=U.LQ(J.GG(a),0,null,65533)
+for(y=z.length,x="beforePath";x!=null;){w=++this.vH
+if(w>=y)v=null
+else{if(w<0)return H.e(z,w)
+v=z[w]}if(v!=null)w=H.eT([v])==="\\"&&this.jN(x,z)
+else w=!1
+if(w)continue
+u=this.Xn(v)
+if(J.xC(x,"error"))return
+t=this.ep.t(0,x)
+s=t.t(0,u)
+if(s==null)s=t.t(0,"else")
+if(s==null)return
+w=J.U6(s)
+x=w.t(s,0)
+r=w.gB(s)>1?w.t(s,1):null
+q=J.x(r)
+if(q.n(r,"push")&&this.nl!=null)this.rXF()
+if(q.n(r,"append")){if(w.gB(s)>2){w.t(s,2)
+q=!0}else q=!1
+if(q)p=w.t(s,2)
+else p=H.eT([v])
+w=this.nl
+this.nl=w==null?p:H.d(w)+H.d(p)}if(x==="afterPath")return this.vc}return}},
 PD:{
 "^":"TpZ:12;",
 $1:function(a){return},
 $isEH:true},
 nQ:{
-"^":"ARh;IE,ds,vl,wN,dR,z7,KZ",
+"^":"ARh;IE,pu,vl,zo,dR,z7,KZ",
 gDJ:function(){return 3},
 TR:function(a,b){return L.ARh.prototype.TR.call(this,this,b)},
 Ej:function(a){var z,y,x,w
 for(z=this.vl,y=z.length,x=0;x<y;x+=2){w=z[x]
-if(w!==C.aZ){z=$.rf
+if(w!==C.zr){z=$.rf
 if(z!=null){y=z.Ou
 y=y==null?w!=null:y!==w}else y=!0
-if(y){z=w==null?null:P.fM(null,null,null,null)
-z=new L.Og(w,z,[],null)
+if(y){z=w==null?null:P.Ls(null,null,null,null)
+z=new L.Js(w,z,[],null)
 $.rf=z}if(z.Ou==null){z.Ou=w
-z.cE=P.fM(null,null,null,null)}z.JD.push(this)
+z.pe=P.Ls(null,null,null,null)}z.JD.push(this)
 this.VC(z.gUu(z))
 this.IE=null
-break}}this.CG(!this.ds)},
+break}}this.CG(!this.pu)},
 U9:function(){var z,y,x,w
-for(z=0;y=this.vl,x=y.length,z<x;z+=2)if(y[z]===C.aZ){w=z+1
+for(z=0;y=this.vl,x=y.length,z<x;z+=2)if(y[z]===C.zr){w=z+1
 if(w>=x)return H.e(y,w)
 J.yd(y[w])}this.vl=null
 this.z7=null},
 WX:function(a,b){var z=this.KZ
-if(z===$.ng||z===$.H2)throw H.b(P.w("Cannot add paths once started."))
+if(z===$.ljh||z===$.ls)throw H.b(P.w("Cannot add paths once started."))
 b=L.hk(b)
 z=this.vl
 z.push(a)
 z.push(b)
-if(!this.ds)return
-J.dH(this.z7,b.WK(a))},
+if(!this.pu)return
+J.bi(this.z7,b.WK(a))},
 ti:function(a){return this.WX(a,null)},
 YU:function(a){var z=this.KZ
-if(z===$.ng||z===$.H2)throw H.b(P.w("Cannot add observers once started."))
+if(z===$.ljh||z===$.ls)throw H.b(P.w("Cannot add observers once started."))
 z=this.vl
-z.push(C.aZ)
+z.push(C.zr)
 z.push(a)
-if(!this.ds)return
-J.dH(this.z7,J.mu(a,new L.bjd(this)))},
+if(!this.pu)return
+J.bi(this.z7,J.mu(a,new L.Zu(this)))},
 VC:function(a){var z,y,x,w,v
 for(z=0;y=this.vl,x=y.length,z<x;z+=2){w=y[z]
-if(w!==C.aZ){v=z+1
+if(w!==C.zr){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isTv").I5(w,a)}}},
+H.Go(y[v],"$isZl").I5(w,a)}}},
 CG:function(a){var z,y,x,w,v,u,t,s,r
-J.Vw(this.z7,C.jn.BU(this.vl.length,2))
+J.wg(this.z7,C.jn.BU(this.vl.length,2))
 for(z=!1,y=null,x=0;w=this.vl,v=w.length,x<v;x+=2){u=w[x]
 t=x+1
 if(t>=v)return H.e(w,t)
 s=w[t]
-if(u===C.aZ){H.Go(s,"$isAp")
-r=this.KZ===$.jq1?s.TR(0,new L.cmp(this)):s.gP(s)}else r=H.Go(s,"$isTv").WK(u)
-if(a){J.qQ(this.z7,C.jn.BU(x,2),r)
+if(u===C.zr){H.Go(s,"$isAp")
+r=this.KZ===$.jq1?s.TR(0,new L.vI(this)):s.gP(s)}else r=H.Go(s,"$isZl").WK(u)
+if(a){J.kW(this.z7,C.jn.BU(x,2),r)
 continue}w=this.z7
 v=C.jn.BU(x,2)
 if(J.xC(r,J.UQ(w,v)))continue
 w=this.dR
 if(typeof w!=="number")return w.F()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.z7,v))}J.qQ(this.z7,v,r)
+y.u(0,v,J.UQ(this.z7,v))}J.kW(this.z7,v,r)
 z=!0}if(!z)return!1
 this.dC(this.z7,y,w)
 return!0},
 mX:function(){return this.CG(!1)},
 $isAp:true},
-bjd:{
+Zu:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.KZ===$.ng)z.fl()
+if(z.KZ===$.ljh)z.fl()
 return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-cmp:{
+vI:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.KZ===$.ng)z.fl()
+if(z.KZ===$.ljh)z.fl()
 return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 iNc:{
 "^":"a;"},
 ARh:{
 "^":"Ap;",
-Yd:function(){return this.wN.$0()},
-d1:function(a){return this.wN.$1(a)},
-qk:function(a,b){return this.wN.$2(a,b)},
-p0:function(a,b,c){return this.wN.$3(a,b,c)},
-gB9:function(){return this.KZ===$.ng},
+Yd:function(){return this.zo.$0()},
+d1:function(a){return this.zo.$1(a)},
+qk:function(a,b){return this.zo.$2(a,b)},
+Tu:function(a,b,c){return this.zo.$3(a,b,c)},
+gB9:function(){return this.KZ===$.ljh},
 TR:function(a,b){var z=this.KZ
-if(z===$.ng||z===$.H2)throw H.b(P.w("Observer has already been opened."))
-if(X.OS(b)>this.gDJ())throw H.b(P.u("callback should take "+this.gDJ()+" or fewer arguments"))
-this.wN=b
-this.dR=P.J(this.gDJ(),X.RI(b))
+if(z===$.ljh||z===$.ls)throw H.b(P.w("Observer has already been opened."))
+if(X.na(b)>this.gDJ())throw H.b(P.u("callback should take "+this.gDJ()+" or fewer arguments"))
+this.zo=b
+this.dR=P.J(this.gDJ(),X.Zpg(b))
 this.Ej(0)
-this.KZ=$.ng
+this.KZ=$.ljh
 return this.z7},
 gP:function(a){this.CG(!0)
 return this.z7},
-xO:function(a){if(this.KZ!==$.ng)return
+xO:function(a){if(this.KZ!==$.ljh)return
 this.U9()
 this.z7=null
-this.wN=null
-this.KZ=$.H2},
-fR:function(){if(this.KZ===$.ng)this.fl()},
+this.zo=null
+this.KZ=$.ls},
+fR:function(){if(this.KZ===$.ljh)this.fl()},
 fl:function(){var z=0
 while(!0){if(!(z<1000&&this.mX()))break;++z}return z>0},
 dC:function(a,b,c){var z,y,x,w
@@ -15758,15 +15758,15 @@
 break
 case 2:this.qk(a,b)
 break
-case 3:this.p0(a,b,c)
+case 3:this.Tu(a,b,c)
 break}}catch(x){w=H.Ru(x)
 z=w
 y=new H.oP(x,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}}},
-Og:{
-"^":"a;Ou,cE,JD,YR",
+Js:{
+"^":"a;Ou,pe,JD,YR",
 zJ:[function(a,b,c){var z=this.Ou
-if(b==null?z==null:b===z)this.cE.h(0,c)
+if(b==null?z==null:b===z)this.pe.h(0,c)
 z=J.x(b)
 if(!!z.$iswn)this.hr(b.gXF())
 if(!!z.$isd3)this.hr(z.gqh(b))},"$2","gUu",4,0,181,96,182],
@@ -15776,22 +15776,22 @@
 b2:function(a){var z,y,x,w
 for(z=J.mY(a);z.G();){y=z.gl()
 x=J.x(y)
-if(!!x.$isqI){if(y.WA!==this.Ou||this.cE.tg(0,y.oc))return!1}else if(!!x.$isZq){x=y.WA
+if(!!x.$isqI){if(y.WA!==this.Ou||this.pe.tg(0,y.oc))return!1}else if(!!x.$isZq){x=y.WA
 w=this.Ou
-if((x==null?w!=null:x!==w)||this.cE.tg(0,y.Ft))return!1}else return!1}return!0},
+if((x==null?w!=null:x!==w)||this.pe.tg(0,y.Ft))return!1}else return!1}return!0},
 F5:[function(a){var z,y,x
 if(this.b2(a))return
-for(z=this.JD,y=C.Nm.tt(z,!1),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
-if(x.gB9())x.VC(this.gUu(this))}for(z=C.Nm.tt(z,!1),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=z.lo
+for(z=this.JD,y=C.Nm.tt(z,!1),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.Ff
+if(x.gB9())x.VC(this.gUu(this))}for(z=C.Nm.tt(z,!1),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=z.Ff
 if(x.gB9())x.mX()}},"$1","gCP",2,0,19,183],
-static:{"^":"rf",SE:function(a,b){var z,y
+static:{"^":"rf",KJ:function(a,b){var z,y
 z=$.rf
 if(z!=null){y=z.Ou
 y=y==null?b!=null:y!==b}else y=!0
-if(y){z=b==null?null:P.fM(null,null,null,null)
-z=new L.Og(b,z,[],null)
+if(y){z=b==null?null:P.Ls(null,null,null,null)
+z=new L.Js(b,z,[],null)
 $.rf=z}if(z.Ou==null){z.Ou=b
-z.cE=P.fM(null,null,null,null)}z.JD.push(a)
+z.pe=P.Ls(null,null,null,null)}z.JD.push(a)
 a.VC(z.gUu(z))}}}}],["","",,R,{
 "^":"",
 tB:[function(a){var z,y,x
@@ -15808,26 +15808,26 @@
 $2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,141,66,"call"],
 $isEH:true}}],["","",,A,{
 "^":"",
-YG:function(a,b,c){var z=$.lx()
-if(z==null||$.oo()!==!0)return
+ec:function(a,b,c){var z=$.lx()
+if(z==null||$.Ep()!==!0)return
 z.V7("shimStyling",[a,b,c])},
-Hl:function(a){var z,y,x,w,v
+q3:function(a){var z,y,x,w,v
 if(a==null)return""
 if($.UG)return""
 w=J.RE(a)
-z=w.gLU(a)
+z=w.gmH(a)
 if(J.xC(z,""))z=w.gQg(a).dA.getAttribute("href")
 try{w=new XMLHttpRequest()
 C.W3.i3(w,"GET",z,!1)
 w.send()
 w=w.responseText
 return w}catch(v){w=H.Ru(v)
-if(!!J.x(w).$isNh){y=w
+if(!!J.x(w).$isBK){y=w
 x=new H.oP(v,null)
-$.eU().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+$.Is().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
 return""}else throw v}},
 M8:[function(a){var z,y
-z=$.vu().JE.fJ.t(0,a)
+z=$.vu().xV.af.t(0,a)
 if(z==null)return!1
 y=J.Qe(z)
 return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,64,65],
@@ -15836,62 +15836,62 @@
 ZI:function(a,b){var z,y,x,w
 if(a==null)return
 document
-if($.oo()===!0)b=document.head
+if($.Ep()===!0)b=document.head
 z=document.createElement("style",null)
 J.t3(z,J.dY(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
 x=b.firstChild
 if(b===document.head){w=W.vD(document.head.querySelectorAll("style[element]"),null)
-if(w.gor(w))x=J.cC(C.z0.grZ(w.mk))}b.insertBefore(z,x)},
-Ok:function(){A.c4()
+if(w.gor(w))x=J.rk(C.t5.grZ(w.jt))}b.insertBefore(z,x)},
+Zw:function(){A.c4()
 if($.UG){A.X1($.M6,!0)
 return $.X3}var z=$.X3.iT(O.Ht())
 z.Gr(new A.mS())
 return z},
 X1:function(a,b){var z,y
-if($.DG)throw H.b("Initialization was already done.")
-$.DG=!0
+if($.HE)throw H.b("Initialization was already done.")
+$.HE=!0
 A.JP()
 $.ok=b
 if(a==null)throw H.b("Missing initialization of polymer elements. Please check that the list of entry points in your pubspec.yaml is correct. If you are using pub-serve, you may need to restart it.")
-A.Ad("auto-binding-dart",C.kA)
+A.Ad("auto-binding-dart",C.nj)
 z=document.createElement("polymer-element",null)
 z.setAttribute("name","auto-binding-dart")
 z.setAttribute("extends","template")
-J.UQ($.XX(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,93,0,null),[H.u3(a,0)]);y.G();)y.lo.$0()},
+J.UQ($.Dw(),"init").qP([],z)
+for(y=H.VM(new H.a7(a,93,0,null),[H.u3(a,0)]);y.G();)y.Ff.$0()},
 JP:function(){var z,y,x
 z=J.UQ($.Xw(),"Polymer")
 if(z==null)throw H.b(P.w("polymer.js must be loaded before polymer.dart, please add <link rel=\"import\" href=\"packages/polymer/polymer.html\"> to your <head> before any Dart scripts. Alternatively you can get a different version of polymer.js by following the instructions at http://www.polymer-project.org."))
 y=$.X3
 z.V7("whenPolymerReady",[y.ce(new A.XR())])
-x=J.UQ($.XX(),"register")
+x=J.UQ($.Dw(),"register")
 if(x==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
-J.qQ($.XX(),"register",P.mt(new A.k2(y,x)))},
+J.kW($.Dw(),"register",P.mt(new A.k2(y,x)))},
 c4:function(){var z,y,x,w
 z={}
 $.RL=!0
 y=J.UQ($.Xw(),"logFlags")
 z.a=y
 if(y==null)z.a=P.Fl(null,null)
-x=[$.a3(),$.xW(),$.UW(),$.aQ(),$.Is(),$.Fs()]
+x=[$.dn(),$.vo(),$.iX(),$.Lu(),$.REM(),$.lg()]
 w=N.QM("polymer")
-if(!H.Ck(x,new A.j0(z))){w.sOR(C.oO)
-return}H.VM(new H.U5(x,new A.j0N(z)),[H.u3(H.VM(new H.TNQ(),[H.u3(x,0)]),0)]).aN(0,new A.MZ6())
+if(!H.Ck(x,new A.j0(z))){w.sOR(C.oOA)
+return}H.VM(new H.U5(x,new A.j0N(z)),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]).aN(0,new A.MZ6())
 w.gSZ().yI(new A.mqr())},
-XP:{
-"^":"a;FL>,t5>,P1<,oc>,Q7<,DB<,eJ>,Gl<,CY<,ix<,y0,G9,wX>,mR<,yz,aU",
+So:{
+"^":"a;FL>,t5>,Jh<,oc>,Q7<,Md<,eJ>,Gl<,PH<,ix<,y0,G9,wX>,mR<,WV,vT",
 gZf:function(){var z,y
-z=J.Eh(this.FL,"template")
-if(z!=null)y=J.ti(!!J.x(z).$ishs?z:M.uH(z))
+z=J.yR(this.FL,"template")
+if(z!=null)y=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
 else y=null
 return y},
 Ba:function(a){var z,y,x
 for(z=null,y=this;y!=null;){z=J.Vs(J.y3(y)).dA.getAttribute("extends")
-y=y.gP1()}x=document
-W.wi(window,x,a,this.t5,z)},
-RH:function(a){var z=$.uj()
+y=y.gJh()}x=document
+W.Ct(window,x,a,this.t5,z)},
+Cw:function(a){var z=$.uj()
 if(z==null)return
 J.UQ(z,"urlResolver").V7("resolveDom",[a])},
 Zw:function(a){var z,y,x,w,v,u,t,s,r,q
@@ -15899,125 +15899,118 @@
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
 this.Q7=y}if(a.gix()!=null){z=a.gix()
-y=P.fM(null,null,null,null)
+y=P.Ls(null,null,null,null)
 y.FV(0,z)
 this.ix=y}}z=this.t5
 this.en(z)
 x=J.Vs(this.FL).dA.getAttribute("attributes")
-if(x!=null)for(y=C.yo.Fr(x,$.FF()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.iY(y.lo)
+if(x!=null)for(y=C.yo.Fr(x,$.FF()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.rr(y.Ff)
 if(v==="")continue
-u=$.vu().JE.T4.t(0,v)
+u=$.vu().xV.T4.t(0,v)
 t=u!=null
 if(t){s=L.hk([u])
 r=this.Q7
 if(r!=null&&r.NZ(0,s))continue
-q=$.II().CV(z,u)}else{q=null
-s=null}if(!t||q==null||q.gUA()||J.Z6(q)===!0){window
+q=$.mX().CV(z,u)}else{q=null
+s=null}if(!t||q==null||q.gUA()||J.EM(q)===!0){window
 t="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
 if(typeof console!="undefined")console.warn(t)
 continue}t=this.Q7
 if(t==null){t=P.Fl(null,null)
 this.Q7=t}t.u(0,s,q)}},
 en:function(a){var z,y,x,w,v
-for(z=$.II().Me(0,a,C.V4),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+for(z=$.mX().Me(0,a,C.V4),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 x=J.RE(y)
 if(x.gV5(y)===!0)continue
 w=this.Q7
 if(w==null){w=P.Fl(null,null)
 this.Q7=w}w.u(0,L.hk([x.goc(y)]),y)
 w=y.gDv()
-v=new H.TNQ()
+v=new H.wb()
 v.$builtinTypeInfo=[H.u3(w,0)]
 w=new H.U5(w,new A.Zd())
 w.$builtinTypeInfo=[H.u3(v,0)]
 if(w.Vr(0,new A.Da())){w=this.ix
-if(w==null){w=P.fM(null,null,null,null)
+if(w==null){w=P.Ls(null,null,null,null)
 this.ix=w}x=x.goc(y)
-w.h(0,$.vu().JE.fJ.t(0,x))}}},
+w.h(0,$.vu().xV.af.t(0,x))}}},
 Vk:function(){var z,y
 z=P.L5(null,null,null,P.qU,P.a)
-this.CY=z
-y=this.P1
-if(y!=null)z.FV(0,y.gCY())
+this.PH=z
+y=this.Jh
+if(y!=null)z.FV(0,y.gPH())
 J.Vs(this.FL).aN(0,new A.EB(this))},
-W3:function(a){J.Vs(this.FL).aN(0,new A.Pf(a))},
-fk:function(){var z=this.Bg("link[rel=stylesheet]")
+W3:function(a){J.Vs(this.FL).aN(0,new A.Y1(a))},
+ka:function(){var z=this.Bg("link[rel=stylesheet]")
 this.y0=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Rv(z.lo)},
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.Ff)},
 f6:function(){var z=this.Bg("style[polymer-scope]")
 this.G9=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Rv(z.lo)},
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.Ff)},
 yq:function(){var z,y,x,w,v,u,t,s
 z=this.y0
 z.toString
-y=H.VM(new H.U5(z,new A.IJ()),[H.u3(H.VM(new H.TNQ(),[H.u3(z,0)]),0)])
+y=H.VM(new H.U5(z,new A.IJ()),[H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0)])
 x=this.gZf()
 if(x!=null){w=P.p9("")
-for(z=H.VM(new H.Mo(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),v=z.CL;z.G();){u=A.Hl(v.gl())
+for(z=H.VM(new H.vG(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),v=z.CL;z.G();){u=A.q3(v.gl())
 t=w.IN+=typeof u==="string"?u:H.d(u)
-w.IN=t+"\n"}if(w.IN.length>0){s=J.Do(this.FL).createElement("style",null)
+w.IN=t+"\n"}if(w.IN.length>0){s=J.lu(this.FL).createElement("style",null)
 J.t3(s,H.d(w))
 z=J.RE(x)
-z.mK(x,s,z.gNL(x))}}},
+z.FO(x,s,z.gNL(x))}}},
 Wz:function(a,b){var z,y,x
-z=J.Vj(this.FL,a)
+z=J.We(this.FL,a)
 y=z.br(z)
 x=this.gZf()
-if(x!=null)C.Nm.FV(y,J.Vj(x,a))
+if(x!=null)C.Nm.FV(y,J.We(x,a))
 return y},
 Bg:function(a){return this.Wz(a,null)},
-l7:function(a){var z,y,x,w,v,u
+ds:function(a){var z,y,x,w,v,u
 z=P.p9("")
-y=new A.Vi("[polymer-scope="+a+"]")
-for(x=this.y0,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.TNQ(),[H.u3(x,0)]),0)]),x=H.VM(new H.Mo(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),w=x.CL;x.G();){v=A.Hl(w.gl())
+y=new A.ui("[polymer-scope="+a+"]")
+for(x=this.y0,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]),x=H.VM(new H.vG(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),w=x.CL;x.G();){v=A.q3(w.gl())
 u=z.IN+=typeof v==="string"?v:H.d(v)
-z.IN=u+"\n\n"}for(x=this.G9,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.TNQ(),[H.u3(x,0)]),0)]),x=H.VM(new H.Mo(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),y=x.CL;x.G();){v=J.dY(y.gl())
+z.IN=u+"\n\n"}for(x=this.G9,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]),x=H.VM(new H.vG(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),y=x.CL;x.G();){v=J.dY(y.gl())
 w=z.IN+=typeof v==="string"?v:H.d(v)
-z.IN=w+"\n\n"}y=z.IN
-return y.charCodeAt(0)==0?y:y},
+z.IN=w+"\n\n"}return z.IN},
 J3:function(a,b){var z
-if(J.xC(a,""))return
+if(a==="")return
 z=document.createElement("style",null)
 J.t3(z,a)
 z.setAttribute("element",H.d(this.oc)+"-"+b)
 return z},
 rH:function(){var z,y,x,w,v
-for(z=$.or(),z=$.II().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+for(z=$.HN(),z=$.mX().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 if(this.eJ==null)this.eJ=P.YM(null,null,null,null,null)
 x=J.RE(y)
 w=x.goc(y)
-v=$.vu().JE.fJ.t(0,w)
+v=$.vu().xV.af.t(0,w)
 w=J.U6(v)
 v=w.Nj(v,0,J.bI(w.gB(v),7))
 this.eJ.u(0,L.hk(v),[x.goc(y)])}},
-I7:function(){var z,y,x,w,v,u,t
-for(z=$.II().Me(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
-x=y.gDv()
-w=new H.a7(x,x.length,0,null)
-w.$builtinTypeInfo=[H.u3(x,0)]
-x=J.RE(y)
-for(;w.G();){v=w.lo
-if(!J.x(v).$iswA)continue
-if(this.eJ==null)this.eJ=P.YM(null,null,null,null,null)
-for(u=v.gfJ(),u=u.gA(u);u.G(),!1;){t=u.gl()
-J.dH(this.eJ.to(0,L.hk(t),new A.XU()),x.goc(y))}}}},
+I7:function(){var z,y,x
+for(z=$.mX().Me(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff.gDv()
+x=new H.a7(y,y.length,0,null)
+x.$builtinTypeInfo=[H.u3(y,0)]
+for(;x.G();)continue}},
 jq:function(a){var z=P.L5(null,null,null,P.qU,null)
-a.aN(0,new A.fh(z))
+a.aN(0,new A.Tj(z))
 return z},
-hW:function(){var z,y,x,w,v,u,t,s,r
+ut:function(){var z,y,x,w,v,u,t,s,r
 z=P.Fl(null,null)
-for(y=$.II().Me(0,this.t5,C.jJ),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.Gl;y.G();){w=y.lo
-v=H.Sz(w.gDv(),new A.HH(),null)
+for(y=$.mX().Me(0,this.t5,C.m8),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.Gl;y.G();){w=y.Ff
+v=H.FU(w.gDv(),new A.HH(),null)
 u=J.RE(w)
 t=u.goc(w)
 s=z.t(0,t)
 if(s!=null){u=u.gt5(w)
 r=J.zH(s)
-r=$.II().xs(u,r)
+r=$.mX().xs(u,r)
 u=r}else u=!0
-if(u){x.u(0,t,v.gEV())
+if(u){x.u(0,t,v.gXt())
 z.u(0,t,w)}}},
-$isXP:true,
+$isSo:true,
 static:{"^":"Kb"}},
 Zd:{
 "^":"TpZ:12;",
@@ -16029,52 +16022,52 @@
 $isEH:true},
 EB:{
 "^":"TpZ:81;a",
-$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.a.CY.u(0,a,b)},
+$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.a.PH.u(0,a,b)},
 $isEH:true},
-Pf:{
+Y1:{
 "^":"TpZ:81;a",
 $2:function(a,b){var z,y,x
 z=J.Qe(a)
 if(z.nC(a,"on-")){y=J.U6(b).OY(b,"{{")
 x=C.yo.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.yo.DY(C.yo.Nj(b,y+2,x)))}},
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.yo.bS(C.yo.Nj(b,y+2,x)))}},
 $isEH:true},
 IJ:{
 "^":"TpZ:12;",
 $1:function(a){return J.Vs(a).dA.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
-Vi:{
+ui:{
 "^":"TpZ:12;a",
-$1:function(a){return J.YN(a,this.a)},
+$1:function(a){return J.wK(a,this.a)},
 $isEH:true},
-XU:{
+eM:{
 "^":"TpZ:76;",
 $0:function(){return[]},
 $isEH:true},
-fh:{
+Tj:{
 "^":"TpZ:184;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 HH:{
 "^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$isYj},
+$1:function(a){return!1},
 $isEH:true},
 Li:{
-"^":"BG9;xI,oe",
-op:function(a,b,c){if(J.co(b,"on-"))return this.Io(a,b,c)
-return this.xI.op(a,b,c)},
-static:{"^":"rd0,Uv"}},
+"^":"BG9;Mn,oe",
+op:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
+return this.Mn.op(a,b,c)},
+static:{"^":"rd0,QPA"}},
 BG9:{
-"^":"VE+d23;"},
+"^":"vE+d23;"},
 d23:{
 "^":"a;",
-h5:function(a){var z
+XB:function(a){var z
 for(;z=J.RE(a),z.gAd(a)!=null;){if(!!z.$iszs&&J.UQ(a.n7,"eventController")!=null)return J.UQ(z.gCp(a),"eventController")
 a=z.gAd(a)}return!!z.$isI0?a.host:null},
 Z8:function(a,b,c){var z={}
 z.a=a
-return new A.AC(z,this,b,c)},
-Io:function(a,b,c){var z,y,x,w
+return new A.l5(z,this,b,c)},
+CZ:function(a,b,c){var z,y,x,w
 z={}
 y=J.Qe(b)
 if(!y.nC(b,"on-"))return
@@ -16083,17 +16076,17 @@
 w=C.yt.t(0,x)
 z.a=w!=null?w:z.a
 return new A.liz(z,this,a)}},
-AC:{
+l5:{
 "^":"TpZ:12;a,b,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.h5(this.c)
+if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
 z.a=x
 y=x}if(!!J.x(y).$iszs){y=J.x(a)
-if(!!y.$isRb){w=C.lG.gey(a)
-if(w==null)w=J.UQ(P.kW(a),"detail")}else w=null
-y=y.gXQ(a)
+if(!!y.$isDG4){w=y.gey(a)
+if(w==null)w=J.UQ(P.XY(a),"detail")}else w=null
+y=y.gF0(a)
 z=z.a
 J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
@@ -16101,50 +16094,50 @@
 "^":"TpZ:188;a,b,c",
 $3:[function(a,b,c){var z,y,x
 z=this.c
-y=P.mt(new A.Bc($.X3.mS(this.b.Z8(null,b,z))))
+y=P.mt(new A.kD($.X3.mS(this.b.Z8(null,b,z))))
 x=this.a
-$.Op().V7("addEventListener",[b,x.a,y])
+$.tNi().V7("addEventListener",[b,x.a,y])
 if(c===!0)return
-return new A.d6(z,b,x.a,y)},"$3",null,6,0,null,185,186,187,"call"],
+return new A.zIs(z,b,x.a,y)},"$3",null,6,0,null,185,186,187,"call"],
 $isEH:true},
-Bc:{
+kD:{
 "^":"TpZ:81;d",
 $2:[function(a,b){return this.d.$1(b)},"$2",null,4,0,null,13,2,"call"],
 $isEH:true},
-d6:{
-"^":"Ap;ED,v3,dF,Xj",
+zIs:{
+"^":"Ap;ED,d9,dF,Xj",
 gP:function(a){return"{{ "+this.ED+" }}"},
 TR:function(a,b){return"{{ "+this.ED+" }}"},
-xO:function(a){$.Op().V7("removeEventListener",[this.v3,this.dF,this.Xj])}},
+xO:function(a){$.tNi().V7("removeEventListener",[this.d9,this.dF,this.Xj])}},
 xn:{
 "^":"iv;vn<",
 $isxn:true},
 xc:{
-"^":"TR0;Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"TR0;Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 XI:function(a){this.kR(a)},
-static:{yk:function(a){var z,y,x,w
+static:{oaJ:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Vk.LX(a)
-C.Vk.XI(a)
+C.GBL.LX(a)
+C.GBL.XI(a)
 return a}}},
 jpR:{
 "^":"Bo+zs;Cp:n7=",
 $iszs:true,
-$ishs:true,
+$isvy:true,
 $isd3:true,
 $ish4:true,
-$isFU:true,
+$isPZ:true,
 $isKV:true},
 TR0:{
 "^":"jpR+Pi;",
@@ -16159,137 +16152,138 @@
 y=this.gQg(a).dA.getAttribute("is")
 return y==null||y===""?this.gqn(a):y},
 kR:function(a){var z,y
-z=this.gCn(a)
+z=this.gmb(a)
 if(z!=null&&z.k8!=null){window
 y="Attributes on "+H.d(this.gRT(a))+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."
 if(typeof console!="undefined")console.warn(y)}this.Ec(a)
-y=this.gM0(a)
-if(!J.xC($.Tg().t(0,y),!0))this.rf(a)},
+y=this.gJ8(a)
+if(!J.xC($.Ks().t(0,y),!0))this.rf(a)},
 Ec:function(a){var z,y
 if(a.IX!=null){window
 z="Element already prepared: "+H.d(this.gRT(a))
 if(typeof console!="undefined")console.warn(z)
-return}a.n7=P.kW(a)
+return}a.n7=P.XY(a)
 z=this.gRT(a)
-a.IX=$.RA().t(0,z)
-this.nt(a)
+a.IX=$.w3G().t(0,z)
+this.jM(a)
 z=a.MJ
 if(z!=null){y=this.gnu(a)
 z.toString
 L.ARh.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gLj(a))
 this.oR(a)
-this.xX(a)
+this.xL(a)
 this.Uc(a)},
 rf:function(a){if(a.OD)return
 a.OD=!0
 this.bT(a)
 this.Qs(a,a.IX)
 this.gQg(a).Rz(0,"unresolved")
-$.Fs().To(new A.pN(a))
+$.lg().To(new A.pN(a))
 this.I9(a)},
 I9:function(a){},
 Es:function(a){if(a.IX==null)throw H.b(P.w("polymerCreated was not called for custom element "+H.d(this.gRT(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
 this.oW(a)
 if(!a.kK){a.kK=!0
 this.rW(a,new A.hp(a))}},
-dQ:function(a){this.x3(a)},
-Qs:function(a,b){if(b!=null){this.Qs(a,b.gP1())
+Lx:function(a){this.x3(a)},
+Qs:function(a,b){if(b!=null){this.Qs(a,b.gJh())
 this.aI(a,J.y3(b))}},
 aI:function(a,b){var z,y,x,w
 z=J.RE(b)
-y=z.Wk(b,"template")
+y=z.XT(b,"template")
 if(y!=null){x=this.Tp(a,y)
 w=z.gQg(b).dA.getAttribute("name")
 if(w==null)return
 a.ZM.u(0,w,x)}},
 Tp:function(a,b){var z,y,x,w,v,u
-z=this.er(a)
-M.uH(b).rp(null)
+if(b==null)return
+z=this.TL(a)
+M.Xi(b).cl(null)
 y=this.gwX(a)
-x=!!J.x(b).$ishs?b:M.uH(b)
-w=J.ju(x,a,y==null&&J.Ee(x)==null?J.RH0(a.IX):y)
-v=a.Iy
-u=$.Uo().t(0,w)
+x=!!J.x(b).$isvy?b:M.Xi(b)
+w=J.dv(x,a,y==null&&J.qy(x)==null?J.v7(a.IX):y)
+v=a.f4
+u=$.nR().t(0,w)
 C.Nm.FV(v,u!=null?u.gdn():u)
 z.appendChild(w)
 this.lj(a,z)
 return z},
 lj:function(a,b){var z,y,x
 if(b==null)return
-for(z=J.Vj(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
+for(z=J.We(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.Ff
 y.u(0,J.eS(x),x)}},
-aC:function(a,b,c,d){var z=J.x(b)
+wN:function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
-oR:function(a){a.IX.gCY().aN(0,new A.va(a))},
-xX:function(a){if(a.IX.gDB()==null)return
+oR:function(a){a.IX.gPH().aN(0,new A.Sv(a))},
+xL:function(a){if(a.IX.gMd()==null)return
 this.gQg(a).aN(0,this.gCg(a))},
 D3:[function(a,b,c){var z,y,x,w,v,u
 z=this.B2(a,b)
 if(z==null)return
-if(c==null||J.kE(c,$.iB())===!0)return
+if(c==null||J.kE(c,$.VCp())===!0)return
 y=J.RE(z)
 x=y.goc(z)
-w=$.cp().jD(a,x)
+w=$.cp().Gp(a,x)
 v=y.gt5(z)
 x=J.x(v)
-u=Z.LB(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.bB(w):v)
+u=Z.fd(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.bB(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Q1(a,y,u)}},"$2","gCg",4,0,189],
-B2:function(a,b){var z=a.IX.gDB()
+$.cp().Cq(a,y,u)}},"$2","gCg",4,0,189],
+B2:function(a,b){var z=a.IX.gMd()
 if(z==null)return
 return z.t(0,b)},
-JL:function(a,b){if(b==null)return
+TW:function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number")return H.d(b)
 return},
 QH:function(a,b){var z,y
 z=L.hk(b).WK(a)
-y=this.JL(a,z)
+y=this.TW(a,z)
 if(y!=null)this.gQg(a).dA.setAttribute(b,y)
 else if(typeof z==="boolean")this.gQg(a).Rz(0,b)},
 nR:function(a,b,c,d){var z,y,x,w,v,u
 z=this.B2(a,b)
-if(z==null)return J.FS1(M.uH(a),b,c,d)
+if(z==null)return J.IB(M.Xi(a),b,c,d)
 else{y=J.RE(z)
 x=this.Fy(a,y.goc(z),c,d)
-if(J.xC(J.UQ(J.UQ($.Xw(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.QE(M.uH(a))==null){w=P.Fl(null,null)
-J.nC(M.uH(a),w)}J.qQ(J.QE(M.uH(a)),b,x)}v=a.IX.gix()
+if(J.xC(J.UQ(J.UQ($.Xw(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.QE(M.Xi(a))==null){w=P.Fl(null,null)
+J.CS(M.Xi(a),w)}J.kW(J.QE(M.Xi(a)),b,x)}v=a.IX.gix()
 y=y.goc(z)
-u=$.vu().JE.fJ.t(0,y)
+u=$.vu().xV.af.t(0,y)
 if(v!=null&&v.tg(0,u))this.QH(a,u)
 return x}},
 lL:function(a){return this.rf(a)},
-gCd:function(a){return J.QE(M.uH(a))},
-sCd:function(a,b){J.nC(M.uH(a),b)},
-gCn:function(a){return J.OC(M.uH(a))},
+gCd:function(a){return J.QE(M.Xi(a))},
+sCd:function(a,b){J.CS(M.Xi(a),b)},
+gmb:function(a){return J.re(M.Xi(a))},
 x3:function(a){var z,y
 if(a.bb===!0)return
-$.UW().Ny(new A.rs(a))
+$.iX().J4(new A.N3(a))
 z=a.TT
-y=this.gf2(a)
+y=this.gyz(a)
 if(z==null)z=new A.FT(null,null,null)
-z.ui(0,y,null)
+z.t6(0,y,null)
 a.TT=z},
-GB:[function(a){if(a.bb===!0)return
+GBV:[function(a){if(a.bb===!0)return
 this.mc(a)
 this.Uq(a)
-a.bb=!0},"$0","gf2",0,0,17],
+a.bb=!0},"$0","gyz",0,0,17],
 oW:function(a){var z
-if(a.bb===!0){$.UW().j2(new A.TV(a))
-return}$.UW().Ny(new A.Z7(a))
+if(a.bb===!0){$.iX().j2(new A.ti(a))
+return}$.iX().J4(new A.Rb(a))
 z=a.TT
-if(z!=null){z.TP(0)
+if(z!=null){z.nY(0)
 a.TT=null}},
-nt:function(a){var z,y,x,w,v
+jM:function(a){var z,y,x,w,v
 z=J.q1(a.IX)
 if(z!=null){y=new L.nQ(null,!1,[],null,null,null,$.jq1)
 y.z7=[]
 a.MJ=y
-a.Iy.push(y)
+a.f4.push(y)
 for(x=H.VM(new P.fG(z),[H.u3(z,0)]),w=x.ZD,x=H.VM(new P.EQ(w,w.Nm(),0,null),[H.u3(x,0)]);x.G();){v=x.fD
 y.WX(a,v)
 this.j6(a,v,v.WK(a),null)}}},
-FQx:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.q1(a.IX),P.l1(null,null,null,null)))},"$3","gnu",6,0,190],
+FQx:[function(a,b,c,d){J.Me(c,new A.OaD(a,b,c,d,J.q1(a.IX),P.l1(null,null,null,null)))},"$3","gnu",6,0,190],
 p7:[function(a,b){var z,y,x,w
 for(z=J.mY(b),y=a.qJ;z.G();){x=z.gl()
 if(!J.x(x).$isqI)continue
@@ -16297,8 +16291,8 @@
 if(y.t(0,w)!=null)continue
 this.Dt(a,w,x.zZ,x.jL)}},"$1","gLj",2,0,191,183],
 Dt:function(a,b,c,d){var z,y
-$.Is().To(new A.qW(a,b,c,d))
-z=$.vu().JE.fJ.t(0,b)
+$.REM().To(new A.qW(a,b,c,d))
+z=$.vu().xV.af.t(0,b)
 y=a.IX.gix()
 if(y!=null&&y.tg(0,z))this.QH(a,z)},
 j6:function(a,b,c,d){var z,y,x,w,v
@@ -16306,18 +16300,18 @@
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-if(!!J.x(d).$iswn){$.a3().Ny(new A.xf(a,b))
-this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){$.a3().Ny(new A.Y0(a,b))
-x=c.gXF().k0(new A.fS(a,y),null,null,!1)
+if(!!J.x(d).$iswn){$.dn().J4(new A.xf(a,b))
+this.Mx(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){$.dn().J4(new A.Y0(a,b))
+x=c.gXF().k0(new A.kMK(a,y),null,null,!1)
 w=H.d(b)+"__array"
-v=a.vG
+v=a.Bd
 if(v==null){v=P.L5(null,null,null,P.qU,P.yX)
-a.vG=v}v.u(0,w,x)}},
-Oq:function(a,b,c,d){if(d==null?c==null:d===c)return
+a.Bd=v}v.u(0,w,x)}},
+hq:function(a,b,c,d){if(d==null?c==null:d===c)return
 this.Dt(a,b,c,d)},
-rh:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
-z=$.cp().JE.E4.t(0,b)
-if(z==null)H.vh(O.lA("getter \""+H.d(b)+"\" in "+this.bu(a)))
+hO:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
+z=$.cp().xV.II.t(0,b)
+if(z==null)H.vh(O.Fm("getter \""+H.d(b)+"\" in "+this.bu(a)))
 y=z.$1(a)
 x=a.qJ.t(0,b)
 if(x==null){w=J.RE(c)
@@ -16326,10 +16320,10 @@
 v.Sx=this.gqh(a).k0(v.gou(),null,null,!1)
 w=J.mu(c,v.gew())
 v.RP=w
-u=$.cp().JE.F8.t(0,b)
-if(u==null)H.vh(O.lA("setter \""+H.d(b)+"\" in "+this.bu(a)))
+u=$.cp().xV.F8.t(0,b)
+if(u==null)H.vh(O.Fm("setter \""+H.d(b)+"\" in "+this.bu(a)))
 u.$2(a,w)
-a.Iy.push(v)
+a.f4.push(v)
 return v}x.mn=c
 w=J.RE(c)
 t=w.TR(c,x.gUe())
@@ -16340,71 +16334,71 @@
 r=x.RT
 q=J.RE(w)
 x.VB=q.ct(w,r,y,t)
-q.Oq(w,r,t,y)
+q.hq(w,r,t,y)
 v=new A.p0(x)
-a.Iy.push(v)
+a.f4.push(v)
 return v},
-wc:function(a,b,c){return this.rh(a,b,c,!1)},
+hH:function(a,b,c){return this.hO(a,b,c,!1)},
 yO:function(a,b){var z=a.IX.gGl().t(0,b)
 if(z==null)return
-return T.aC().$3$globals(T.Ms().$1(z),a,J.RH0(a.IX).xI.nF)},
+return T.yM().$3$globals(T.u5().$1(z),a,J.v7(a.IX).Mn.nF)},
 bT:function(a){var z,y,x,w,v,u,t,s
 z=a.IX.gGl()
-for(v=J.mY(J.iYM(z)),u=a.qJ;v.G();){y=v.gl()
+for(v=J.mY(J.iY(z)),u=a.qJ;v.G();){y=v.gl()
 try{x=this.yO(a,y)
-if(u.t(0,y)==null){t=new A.Zw(y,J.Vm(x),a,null)
+if(u.t(0,y)==null){t=new A.js(y,J.Vm(x),a,null)
 t.$builtinTypeInfo=[null]
-u.u(0,y,t)}this.wc(a,y,x)}catch(s){t=H.Ru(s)
+u.u(0,y,t)}this.hH(a,y,x)}catch(s){t=H.Ru(s)
 w=t
 window
 t="Failed to create computed property "+H.d(y)+" ("+H.d(J.UQ(z,y))+"): "+H.d(w)
 if(typeof console!="undefined")console.error(t)}}},
 mc:function(a){var z,y
-for(z=a.Iy,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
-if(y!=null)J.yd(y)}a.Iy=[]},
-iQ:function(a,b){var z=a.vG.Rz(0,b)
+for(z=a.f4,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
+if(y!=null)J.yd(y)}a.f4=[]},
+Mx:function(a,b){var z=a.Bd.Rz(0,b)
 if(z==null)return!1
 z.Gv()
 return!0},
 Uq:function(a){var z,y
-z=a.vG
+z=a.Bd
 if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.Hb),z.Oh),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.lo
-if(y!=null)y.Gv()}a.vG.V1(0)
-a.vG=null},
-Fy:function(a,b,c,d){var z=$.aQ()
-z.Ny(new A.aM(a,b,c))
+for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.Hb),z.Oh),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.Ff
+if(y!=null)y.Gv()}a.Bd.V1(0)
+a.Bd=null},
+Fy:function(a,b,c,d){var z=$.Lu()
+z.J4(new A.aM(a,b,c))
 if(d){if(!!J.x(c).$isAp)z.j2(new A.aMY(a,b,c))
-$.cp().Q1(a,b,c)
-return}return this.rh(a,b,c,!0)},
+$.cp().Cq(a,b,c)
+return}return this.hO(a,b,c,!0)},
 Uc:function(a){var z=a.IX.gmR()
 if(z.gl0(z))return
-$.xW().Ny(new A.SX(a,z))
+$.vo().J4(new A.SX(a,z))
 z.aN(0,new A.Jys(a))},
 ea:function(a,b,c,d){var z,y,x
-z=$.xW()
+z=$.vo()
 z.To(new A.od(a,c))
-if(!!J.x(c).$isEH){y=X.RI(c)
+if(!!J.x(c).$isEH){y=X.Zpg(c)
 if(y===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
 C.Nm.sB(d,y)
-H.eC(c,d,P.Te(null))}else if(typeof c==="string"){x=$.vu().JE.T4.t(0,c)
+H.eC(c,d,P.Te(null))}else if(typeof c==="string"){x=$.vu().xV.T4.t(0,c)
 $.cp().Ck(b,x,d,!0,null)}else z.j2("invalid callback")
-z.Ny(new A.cB(a,c))},
+z.J4(new A.cB(a,c))},
 rW:function(a,b){var z
 P.rb(F.Jy())
 $.Kc().nQ("flush")
 z=window
-C.ol.Wq(z)
-return C.ol.ne(z,W.Yt(b))},
+C.ole.Wq(z)
+return C.ole.rK(z,W.Yt(b))},
 TZ:function(a,b,c,d,e,f){var z=W.Q8(b,!0,!0,e)
-this.jR(a,z)
+this.Ph(a,z)
 return z},
 ZB:function(a,b){return this.TZ(a,b,null,null,null,null)},
 $iszs:true,
-$ishs:true,
+$isvy:true,
 $isd3:true,
 $ish4:true,
-$isFU:true,
+$isPZ:true,
 $isKV:true},
 pN:{
 "^":"TpZ:76;a",
@@ -16414,7 +16408,7 @@
 "^":"TpZ:12;a",
 $1:[function(a){return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-va:{
+Sv:{
 "^":"TpZ:81;a",
 $2:function(a,b){var z=J.Vs(this.a)
 if(z.NZ(0,a)!==!0)z.u(0,a,new A.Te4(b).$0())
@@ -16424,19 +16418,19 @@
 "^":"TpZ:76;b",
 $0:function(){return this.b},
 $isEH:true},
-rs:{
+N3:{
 "^":"TpZ:76;a",
-$0:[function(){return"["+H.d(J.VB(this.a))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.RI(this.a))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"],
 $isEH:true},
-TV:{
+ti:{
 "^":"TpZ:76;a",
-$0:[function(){return"["+H.d(J.VB(this.a))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.RI(this.a))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"],
 $isEH:true},
-Z7:{
+Rb:{
 "^":"TpZ:76;b",
-$0:[function(){return"["+H.d(J.VB(this.b))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.RI(this.b))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"],
 $isEH:true},
-N4:{
+OaD:{
 "^":"TpZ:81;a,b,c,d,e,f",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=this.b
@@ -16459,13 +16453,13 @@
 $isEH:true},
 xf:{
 "^":"TpZ:76;a,b",
-$0:[function(){return"["+H.d(J.VB(this.a))+"] observeArrayValue: unregister "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.RI(this.a))+"] observeArrayValue: unregister "+H.d(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Y0:{
 "^":"TpZ:76;c,d",
-$0:[function(){return"["+H.d(J.VB(this.c))+"] observeArrayValue: register "+H.d(this.d)},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.RI(this.c))+"] observeArrayValue: register "+H.d(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
-fS:{
+kMK:{
 "^":"TpZ:12;e,f",
 $1:[function(a){var z,y,x
 for(z=J.mY(this.f),y=this.e;z.G();){x=z.gl()
@@ -16473,38 +16467,38 @@
 $isEH:true},
 aM:{
 "^":"TpZ:76;a,b,c",
-$0:[function(){return"bindProperty: ["+H.d(this.c)+"] to ["+H.d(J.VB(this.a))+"].["+H.d(this.b)+"]"},"$0",null,0,0,null,"call"],
+$0:[function(){return"bindProperty: ["+H.d(this.c)+"] to ["+H.d(J.RI(this.a))+"].["+H.d(this.b)+"]"},"$0",null,0,0,null,"call"],
 $isEH:true},
 aMY:{
 "^":"TpZ:76;d,e,f",
-$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.VB(this.d))+"].["+H.d(this.e)+"], but found "+H.a5(this.f)+"."},"$0",null,0,0,null,"call"],
+$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.RI(this.d))+"].["+H.d(this.e)+"], but found "+H.a5(this.f)+"."},"$0",null,0,0,null,"call"],
 $isEH:true},
 SX:{
 "^":"TpZ:76;a,b",
-$0:[function(){return"["+H.d(J.VB(this.a))+"] addHostListeners: "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.RI(this.a))+"] addHostListeners: "+this.b.bu(0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Jys:{
 "^":"TpZ:81;c",
 $2:function(a,b){var z=this.c
-$.Op().V7("addEventListener",[z,a,$.X3.mS(J.RH0(z.IX).Z8(z,z,b))])},
+$.tNi().V7("addEventListener",[z,a,$.X3.mS(J.v7(z.IX).Z8(z,z,b))])},
 $isEH:true},
 od:{
 "^":"TpZ:76;a,b",
-$0:[function(){return">>> ["+H.d(J.VB(this.a))+"]: dispatch "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$0:[function(){return">>> ["+H.d(J.RI(this.a))+"]: dispatch "+H.d(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cB:{
 "^":"TpZ:76;c,d",
-$0:[function(){return"<<< ["+H.d(J.VB(this.c))+"]: dispatch "+H.d(this.d)},"$0",null,0,0,null,"call"],
+$0:[function(){return"<<< ["+H.d(J.RI(this.c))+"]: dispatch "+H.d(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lK:{
 "^":"Ap;I6,ko,q0,Sx,RP",
 z9N:[function(a){this.RP=a
-$.cp().Q1(this.I6,this.ko,a)},"$1","gew",2,0,19,60],
+$.cp().Cq(this.I6,this.ko,a)},"$1","gew",2,0,19,60],
 XH:[function(a){var z,y,x,w,v
 for(z=J.mY(a),y=this.ko;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
-w=$.cp().JE.E4.t(0,y)
-if(w==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+J.AG(z)))
+w=$.cp().xV.II.t(0,y)
+if(w==null)H.vh(O.Fm("getter \""+H.d(y)+"\" in "+J.AG(z)))
 v=w.$1(z)
 z=this.RP
 if(z==null?v!=null:z!==v)J.Fc(this.q0,v)
@@ -16529,26 +16523,26 @@
 J.yd(y)
 z.mn=null}},
 FT:{
-"^":"a;Hi,Ar,TU",
-Dj:function(){return this.Hi.$0()},
-ui:function(a,b,c){var z
-this.TP(0)
-this.Hi=b
+"^":"a;ek,Ar,lS",
+Dj:function(){return this.ek.$0()},
+t6:function(a,b,c){var z
+this.nY(0)
+this.ek=b
 z=window
-C.ol.Wq(z)
-this.TU=C.ol.ne(z,W.Yt(new A.K3(this)))},
-TP:function(a){var z,y
-z=this.TU
+C.ole.Wq(z)
+this.lS=C.ole.rK(z,W.Yt(new A.K3(this)))},
+nY:function(a){var z,y
+z=this.lS
 if(z!=null){y=window
-C.ol.Wq(y)
+C.ole.Wq(y)
 y.cancelAnimationFrame(z)
-this.TU=null}z=this.Ar
+this.lS=null}z=this.Ar
 if(z!=null){z.Gv()
 this.Ar=null}}},
 K3:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.Ar!=null||z.TU!=null){z.TP(0)
+if(z.Ar!=null||z.lS!=null){z.nY(0)
 z.Dj()}return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 mS:{
@@ -16565,10 +16559,10 @@
 k2:{
 "^":"TpZ:195;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
-if(z!=null)return this.a.Gr(new A.v4(a,b,z,$.RA().t(0,c)))
+if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.w3G().t(0,c)))
 return this.b.qP([b,c],a)},"$3",null,6,0,null,193,58,194,"call"],
 $isEH:true},
-v4:{
+zR:{
 "^":"TpZ:76;c,d,e,f",
 $0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=this.c
@@ -16576,64 +16570,63 @@
 x=this.e
 w=this.f
 v=P.Fl(null,null)
-u=$.Cl()
+u=$.Ak()
 t=P.Fl(null,null)
-v=new A.XP(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
-$.RA().u(0,y,v)
+v=new A.So(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
+$.w3G().u(0,y,v)
 v.Zw(w)
 s=v.Q7
-if(s!=null)v.DB=v.jq(s)
+if(s!=null)v.Md=v.jq(s)
 v.rH()
 v.I7()
-v.hW()
+v.ut()
 s=J.RE(z)
-r=s.Wk(z,"template")
-if(r!=null)J.NA(!!J.x(r).$ishs?r:M.uH(r),u)
-v.fk()
+r=s.XT(z,"template")
+if(r!=null)J.D4(!!J.x(r).$isvy?r:M.Xi(r),u)
+v.ka()
 v.f6()
 v.yq()
-A.ZI(v.J3(v.l7("global"),"global"),document.head)
-v.RH(z)
+A.ZI(v.J3(v.ds("global"),"global"),document.head)
+v.Cw(z)
 v.Vk()
 v.W3(t)
 q=s.gQg(z).dA.getAttribute("assetpath")
 if(q==null)q=""
-p=P.hK(s.gM0(z).baseURI)
+p=P.hK(s.gJ8(z).baseURI)
 z=P.hK(q)
 o=z.Fi
 if(o.length!==0){if(z.Kk!=null){n=z.ku
 m=z.gJf(z)
-l=z.Ni!=null?z.gtp(z):null}else{n=""
+l=z.QB!=null?z.gtp(z):null}else{n=""
 m=null
-l=null}k=p.mE(z.Ee)
+l=null}k=p.jn(z.Ee)
 j=z.xu
 if(j!=null);else j=null}else{o=p.Fi
 if(z.Kk!=null){n=z.ku
 m=z.gJf(z)
-l=P.Ec(z.Ni!=null?z.gtp(z):null,o)
-k=p.mE(z.Ee)
+l=P.JF(z.QB!=null?z.gtp(z):null,o)
+k=p.jn(z.Ee)
 j=z.xu
 if(j!=null);else j=null}else{u=z.Ee
-t=J.x(u)
-if(t.n(u,"")){k=p.Ee
+if(u===""){k=p.Ee
 j=z.xu
-if(j!=null);else j=p.xu}else{k=t.nC(u,"/")?p.mE(u):p.mE(p.Bs(p.Ee,u))
+if(j!=null);else j=p.xu}else{k=C.yo.nC(u,"/")?p.jn(u):p.jn(p.pi(p.Ee,u))
 j=z.xu
 if(j!=null);else j=null}n=p.ku
 m=p.Kk
-l=p.Ni}}i=z.ys
+l=p.QB}}i=z.ys
 if(i!=null);else i=null
-v.aU=new P.q5(m,l,k,o,n,j,i,null,null)
+v.vT=new P.q5(m,l,k,o,n,j,i,null,null)
 z=v.gZf()
-A.YG(z,y,w!=null?J.DA(w):null)
-if($.II().n6(x,C.L9))$.cp().Ck(x,C.L9,[v],!1,null)
+A.ec(z,y,w!=null?J.DA(w):null)
+if($.mX().n6(x,C.SE))$.cp().Ck(x,C.SE,[v],!1,null)
 v.Ba(y)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 Md:{
 "^":"TpZ:76;",
-$0:function(){var z=J.UQ(P.kW(document.createElement("polymer-element",null)),"__proto__")
-return!!J.x(z).$isKV?P.kW(z):z},
+$0:function(){var z=J.UQ(P.XY(document.createElement("polymer-element",null)),"__proto__")
+return!!J.x(z).$isKV?P.XY(z):z},
 $isEH:true},
 j0:{
 "^":"TpZ:12;a",
@@ -16645,56 +16638,56 @@
 $isEH:true},
 MZ6:{
 "^":"TpZ:12;",
-$1:function(a){a.sOR(C.oO)},
+$1:function(a){a.sOR(C.oOA)},
 $isEH:true},
 mqr:{
 "^":"TpZ:12;",
 $1:[function(a){P.FL(a)},"$1",null,2,0,null,169,"call"],
 $isEH:true},
-Zw:{
+js:{
 "^":"a;RT,VB,I6,mn",
-VV:[function(a){var z,y,x,w
+xz:[function(a){var z,y,x,w
 z=this.VB
 y=this.I6
 x=this.RT
 w=J.RE(y)
 this.VB=w.ct(y,x,z,a)
-w.Oq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"Zw")},60],
+w.hq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"js")},60],
 gP:function(a){var z=this.mn
 if(z!=null)z.fR()
 return this.VB},
 sP:function(a,b){var z=this.mn
 if(z!=null)J.Fc(z,b)
-else this.VV(b)},
+else this.xz(b)},
 bu:[function(a){var z,y
-z=$.vu().JE.fJ.t(0,this.RT)
+z=$.vu().xV.af.t(0,this.RT)
 y=this.mn==null?"(no-binding)":"(with-binding)"
 return"["+H.d(new H.cu(H.wO(this),null))+": "+J.AG(this.I6)+"."+H.d(z)+": "+H.d(this.VB)+" "+y+"]"},"$0","gCR",0,0,76]}}],["","",,Y,{
 "^":"",
-G0:{
-"^":"k5d;Hf,ro,XY,iS,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+hg:{
+"^":"k5d;Hf,ro,XY,cU,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gk8:function(a){return J.ZH(a.Hf)},
-gG5:function(a){return J.Ee(a.Hf)},
-sG5:function(a,b){J.NA(a.Hf,b)},
-V1:function(a){return J.U2(a.Hf)},
-gwX:function(a){return J.Ee(a.Hf)},
-eX:function(a,b,c){return J.ju(a.Hf,b,c)},
+gA0:function(a){return J.qy(a.Hf)},
+sA0:function(a,b){J.D4(a.Hf,b)},
+V1:function(a){return J.Z8(a.Hf)},
+gwX:function(a){return J.qy(a.Hf)},
+v3:function(a,b,c){return J.dv(a.Hf,b,c)},
 ea:function(a,b,c,d){return A.zs.prototype.ea.call(this,a,b===a?J.ZH(a.Hf):b,c,d)},
 dX:function(a){var z
 this.kR(a)
-a.Hf=M.uH(a)
-z=T.GF(null,C.qY)
-J.NA(a.Hf,new Y.oM(a,z,null))
+a.Hf=M.Xi(a)
+z=T.Mo(null,C.qY)
+J.D4(a.Hf,new Y.oM(a,z,null))
 $.j6().MM.ml(new Y.lkK(a))},
 $isDT:true,
-$ishs:true,
-static:{zE:function(a){var z,y,x,w
+$isvy:true,
+static:{Ifw:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -16705,21 +16698,21 @@
 C.Gkp.dX(a)
 return a}}},
 GLL:{
-"^":"yY+zs;Cp:n7=",
+"^":"OH+zs;Cp:n7=",
 $iszs:true,
-$ishs:true,
+$isvy:true,
 $isd3:true,
 $ish4:true,
-$isFU:true,
+$isPZ:true,
 $isKV:true},
 k5d:{
-"^":"GLL+d3;R9:ro%,rJ:XY%,me:iS%",
+"^":"GLL+d3;R9:ro%,rJ:XY%,xt:cU%",
 $isd3:true},
 lkK:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 z.setAttribute("bind","")
-J.mI(z,new Y.Mrx(z))},"$1",null,2,0,null,13,"call"],
+J.J1(z,new Y.Mrx(z))},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Mrx:{
 "^":"TpZ:12;b",
@@ -16730,35 +16723,35 @@
 y.ZB(z,"template-bound")},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 oM:{
-"^":"Li;dq,xI,oe",
-h5:function(a){return this.dq}}}],["","",,Z,{
+"^":"Li;dq,Mn,oe",
+XB:function(a){return this.dq}}}],["","",,Z,{
 "^":"",
-LB:function(a,b,c){var z,y,x
-z=$.RO().t(0,c)
+fd:function(a,b,c){var z,y,x
+z=$.h2().t(0,c)
 if(z!=null)return z.$2(a,b)
-try{y=C.xr.kV(J.JA(a,"'","\""))
+try{y=C.xr.iQ(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
 return a}},
-DO:{
-"^":"TpZ:81;",
-$2:function(a,b){return a},
-$isEH:true},
 lP:{
 "^":"TpZ:81;",
 $2:function(a,b){return a},
 $isEH:true},
-Uf:{
+wJY:{
+"^":"TpZ:81;",
+$2:function(a,b){return a},
+$isEH:true},
+zOQ:{
 "^":"TpZ:81;",
 $2:function(a,b){var z,y
-try{z=P.Gl(a)
+try{z=P.zu(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
-Ra:{
+W6o:{
 "^":"TpZ:81;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
-wJY:{
+MdQ:{
 "^":"TpZ:81;",
 $2:function(a,b){return H.BU(a,null,new Z.pp(b))},
 $isEH:true},
@@ -16766,7 +16759,7 @@
 "^":"TpZ:12;a",
 $1:function(a){return this.a},
 $isEH:true},
-zOQ:{
+YJG:{
 "^":"TpZ:81;",
 $2:function(a,b){return H.RR(a,new Z.fT(b))},
 $isEH:true},
@@ -16779,10 +16772,10 @@
 if(!!z.$isT8)z=J.zg(z.gvc(a),new T.IK(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
 return z},"$1","PG6",2,0,52,66],
-SC:[function(a){var z=J.x(a)
+qN:[function(a){var z=J.x(a)
 if(!!z.$isT8)z=J.ZG(J.kl(z.gvc(a),new T.k9(a)),";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Oq",2,0,52,66],
+return z},"$1","Bn",2,0,52,66],
 IK:{
 "^":"TpZ:12;a",
 $1:[function(a){return J.xC(J.UQ(this.a,a),!0)},"$1",null,2,0,null,141,"call"],
@@ -16792,10 +16785,10 @@
 $1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,141,"call"],
 $isEH:true},
 QB:{
-"^":"VE;OH,nF,R3,CZ,oe",
+"^":"vE;OH,nF,R3,SY,oe",
 op:function(a,b,c){var z,y,x
 z={}
-y=T.eHj(a,null).oK()
+y=T.OD(a,null).oK()
 if(M.CF(c)){x=J.x(b)
 x=x.n(b,"bind")||x.n(b,"repeat")}else x=!1
 if(x){z=J.x(y)
@@ -16803,22 +16796,22 @@
 else return new T.Xyb(this,y)}z.a=null
 x=!!J.x(c).$ish4
 if(x&&J.xC(b,"class"))z.a=T.PG6()
-else if(x&&J.xC(b,"style"))z.a=T.Oq()
+else if(x&&J.xC(b,"style"))z.a=T.Bn()
 return new T.Ddj(z,this,y)},
-CE:function(a){var z=this.CZ.t(0,a)
+CE:function(a){var z=this.SY.t(0,a)
 if(z==null)return new T.uK(this,a)
-return new T.rc(this,a,z)},
-LR:function(a){var z,y,x,w,v
+return new T.uKo(this,a,z)},
+jX:function(a){var z,y,x,w,v
 z=J.RE(a)
 y=z.gAd(a)
 if(y==null)return
-if(M.CF(a)){x=!!z.$ishs?a:M.uH(a)
+if(M.CF(a)){x=!!z.$isvy?a:M.Xi(a)
 z=J.RE(x)
-w=z.gCn(x)
+w=z.gmb(x)
 v=w==null?z.gk8(x):w.k8
 if(!!J.x(v).$isPF)return v
-else return this.R3.t(0,a)}return this.LR(y)},
-mH:function(a,b){var z,y
+else return this.R3.t(0,a)}return this.jX(y)},
+fi:function(a,b){var z,y
 if(a==null)return K.wm(b,this.nF)
 z=J.x(a)
 if(!!z.$ish4);if(!!J.x(b).$isPF)return b
@@ -16828,24 +16821,26 @@
 else{if(!M.CF(a))throw H.b("expected a template instead of "+H.d(a))
 return this.W5(a,b)}},
 W5:function(a,b){var z,y,x
-if(M.CF(a)){z=!!J.x(a).$ishs?a:M.uH(a)
+if(M.CF(a)){z=!!J.x(a).$isvy?a:M.Xi(a)
 y=J.RE(z)
-if(y.gCn(z)==null)y.gk8(z)
+if(y.gmb(z)==null)y.gk8(z)
 return this.R3.t(0,a)}else{y=J.RE(a)
 if(y.geT(a)==null){x=this.R3.t(0,a)
 return x!=null?x:K.wm(b,this.nF)}else return this.W5(y.gAd(a),b)}},
-static:{"^":"rp3",GF:function(a,b){var z,y,x
+static:{"^":"rp3",Mo:function(a,b){var z,y,x
 z=H.VM(new P.qo(null),[K.PF])
 y=H.VM(new P.qo(null),[P.qU])
 x=P.L5(null,null,null,P.qU,P.a)
-x.FV(0,C.c7)
-return new T.QB(b,x,z,y,null)},aV:[function(a){return T.eHj(a,null).oK()},"$1","Ms",2,0,67],QP:[function(a,b,c,d){var z=K.wm(b,c)
-return d?T.rD(a,z,null):new T.tI(z,null,a,null,null,null,null)},function(a,b){return T.QP(a,b,null,!1)},null,function(a,b,c){return T.QP(a,b,null,c)},null,function(a,b,c){return T.QP(a,b,c,!1)},null,"$4$globals$oneTime","$2","$3$oneTime","$3$globals","aC",4,5,68,22,69]}},
+x.FV(0,C.mB)
+return new T.QB(b,x,z,y,null)},ct:[function(a){return T.OD(a,null).oK()},"$1","u5",2,0,67],mD:[function(a,b,c,d){var z
+if(c==null){c=P.L5(null,null,null,null,null)
+c.FV(0,C.mB)}z=K.wm(b,c)
+return d?T.rD(a,z,null):new T.tI(z,null,a,null,null,null,null)},function(a,b){return T.mD(a,b,null,!1)},null,function(a,b,c){return T.mD(a,b,null,c)},null,function(a,b,c){return T.mD(a,b,c,!1)},null,"$4$globals$oneTime","$2","$3$oneTime","$3$globals","yM",4,5,68,22,69]}},
 qb:{
 "^":"TpZ:196;b,c,d",
 $3:[function(a,b,c){var z,y
 z=this.b
-z.CZ.u(0,b,this.c)
+z.SY.u(0,b,this.c)
 y=!!J.x(a).$isPF?a:K.wm(a,z.nF)
 z.R3.u(0,b,y)
 return new T.tI(y,null,this.d,null,null,null,null)},"$3",null,6,0,null,185,186,187,"call"],
@@ -16861,7 +16856,7 @@
 $isEH:true},
 Ddj:{
 "^":"TpZ:196;a,UI,bK",
-$3:[function(a,b,c){var z=this.UI.mH(b,a)
+$3:[function(a,b,c){var z=this.UI.fi(b,a)
 if(c===!0)return T.rD(this.bK,z,this.a.a)
 return new T.tI(z,this.a.a,this.bK,null,null,null,null)},"$3",null,6,0,null,185,186,187,"call"],
 $isEH:true},
@@ -16872,9 +16867,9 @@
 y=this.b
 x=z.R3.t(0,y)
 if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.wm(a,z.nF)}else return z.mH(y,a)},"$1",null,2,0,null,185,"call"],
+return K.wm(a,z.nF)}else return z.fi(y,a)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
-rc:{
+uKo:{
 "^":"TpZ:12;c,d,e",
 $1:[function(a){var z,y,x,w
 z=this.c
@@ -16882,10 +16877,10 @@
 x=z.R3.t(0,y)
 w=this.e
 if(x!=null)return x.t1(w,a)
-else return z.LR(y).t1(w,a)},"$1",null,2,0,null,185,"call"],
+else return z.jX(y).t1(w,a)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 tI:{
-"^":"Ap;Hk,mo,te,qc,F0,kg,Ke",
+"^":"Ap;Hk,mo,te,qc,RQ,uZ,Ke",
 Ko:function(a){return this.mo.$1(a)},
 AO:function(a){return this.qc.$1(a)},
 Mr:[function(a,b){var z,y
@@ -16904,39 +16899,41 @@
 TR:function(a,b){var z,y
 if(this.qc!=null)throw H.b(P.w("already open"))
 this.qc=b
-z=J.okV(this.te,new K.Oy(P.NZ2(null,null)))
-this.kg=z
-y=z.gqM().yI(this.gGX())
-y.fm(0,new T.yF(this))
-this.F0=y
+z=H.VM(new P.nd(null,0,0,0),[null])
+z.Eo(null,null)
+y=J.okV(this.te,new K.Oy(z))
+this.uZ=y
+z=y.gju().yI(this.gGX())
+z.fm(0,new T.yF(this))
+this.RQ=z
 this.kf(!0)
 return this.Ke},
 kf:function(a){var z,y,x,w,v
-try{x=this.kg
-J.okV(x,new K.pf(this.Hk,a))
+try{x=this.uZ
+J.okV(x,new K.Edh(this.Hk,a))
 x.gBI()
-x=this.Mr(this.kg.gBI(),a)
+x=this.Mr(this.uZ.gBI(),a)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.oP(w,null)
 x=new P.Gc(0,$.X3,null,null,null,null,null,null)
 x.$builtinTypeInfo=[null]
 new P.Zf(x).$builtinTypeInfo=[null]
-v="Error evaluating expression '"+H.d(this.kg)+"': "+H.d(z)
+v="Error evaluating expression '"+H.d(this.uZ)+"': "+H.d(z)
 if(x.YM!==0)H.vh(P.w("Future already completed"))
 x.Nk(v,y)
 return!1}},
 Yg:function(){return this.kf(!1)},
 xO:function(a){var z,y
 if(this.qc==null)return
-this.F0.Gv()
-this.F0=null
+this.RQ.Gv()
+this.RQ=null
 this.qc=null
 z=$.Pk()
-y=this.kg
+y=this.uZ
 z.toString
 J.okV(y,z)
-this.kg=null},
+this.uZ=null},
 fR:function(){if(this.qc!=null)this.Cm()},
 Cm:function(){var z=0
 while(!0){if(!(z<1000&&this.Yg()===!0))break;++z}return z>0},
@@ -16949,16 +16946,16 @@
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
 yF:{
 "^":"TpZ:81;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.kg)+"': "+H.d(a),b)},"$2",null,4,0,null,2,165,"call"],
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.uZ)+"': "+H.d(a),b)},"$2",null,4,0,null,2,165,"call"],
 $isEH:true},
 WM:{
 "^":"a;"}}],["","",,B,{
 "^":"",
-De:{
-"^":"xhq;vq>,Xq,Vg,ij",
+LL:{
+"^":"xhq;vq>,Xq,Vg,fn",
 vb:function(a,b){this.vq.yI(new B.iH6(b,this))},
 $asxhq:function(a){return[null]},
-static:{zR:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
+static:{Ha:function(a,b){var z=H.VM(new B.LL(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 iH6:{
@@ -16966,132 +16963,130 @@
 $1:[function(a){var z=this.b
 z.Xq=F.Wi(z,C.zd,z.Xq,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Lf1",args:[a]}},this.b,"De")}}}],["","",,K,{
+$signature:function(){return H.oZ(function(a){return{func:"WM",args:[a]}},this.b,"LL")}}}],["","",,K,{
 "^":"",
-jXm:function(a,b,c,d){var z,y,x,w,v,u,t,s
-z=H.VM([],[U.hw])
+jXm:function(a,b,c,d){var z,y,x,w,v,u,t
+z=H.VM([],[U.rx])
 for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gxS(a),"|"))break
 z.push(y.gT8(a))
 a=y.gBb(a)}if(!!y.$isfp){x=y.gP(a)
-w=C.OL
+w=C.x4
 v=!1}else if(!!y.$isvn){w=a.gZs()
 x=a.gmU()
 v=!0}else{if(!!y.$isx9){w=a.gZs()
-x=y.goc(a)}else{if(d)throw H.b(K.du("Expression is not assignable: "+H.d(a)))
-return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.lo
-t=J.okV(u,new K.GQ(c))
-if(!J.x(t).$isKq)if(d)throw H.b(K.du("filter must implement Transformer to be assignable: "+H.d(u)))
-else return
-b=t.Kh(b)}s=J.okV(w,new K.GQ(c))
-if(s==null)return
-if(v)J.qQ(s,J.okV(x,new K.GQ(c)),b)
-else{y=$.vu().JE.T4.t(0,x)
-$.cp().Q1(s,y,b)}return b},
-wm:function(a,b){var z,y
-z=P.L5(null,null,null,P.qU,P.a)
-z.FV(0,b)
-y=new K.Ph(new K.nk(a),z)
-if(z.NZ(0,"this"))H.vh(K.du("'this' cannot be used as a variable name."))
-z=y
-return z},
-w5:{
+x=y.goc(a)}else{if(d)throw H.b(K.zq("Expression is not assignable: "+H.d(a)))
+return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.Ff
+J.okV(u,new K.GQ(c))
+if(d)throw H.b(K.zq("filter must implement Transformer to be assignable: "+H.d(u)))
+else return}t=J.okV(w,new K.GQ(c))
+if(t==null)return
+if(v)J.kW(t,J.okV(x,new K.GQ(c)),b)
+else{y=$.vu().xV.T4.t(0,x)
+$.cp().Cq(t,y,b)}return b},
+wm:function(a,b){var z,y,x
+z=new K.ug(a)
+if(b==null)y=z
+else{y=P.L5(null,null,null,P.qU,P.a)
+y.FV(0,b)
+x=new K.Ph(z,y)
+if(y.NZ(0,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
+y=x}return y},
+w12:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.WB(a,b)},
 $isEH:true},
-w10:{
+w13:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.bI(a,b)},
 $isEH:true},
-w11:{
+w14:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
-w12:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.X9(a,b)},
-$isEH:true},
-w13:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.jOZ(a,b)},
-$isEH:true},
-w14:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.xC(a,b)},
-$isEH:true},
 w15:{
 "^":"TpZ:81;",
-$2:function(a,b){return!J.xC(a,b)},
+$2:function(a,b){return J.L9(a,b)},
 $isEH:true},
 w16:{
 "^":"TpZ:81;",
-$2:function(a,b){return a==null?b==null:a===b},
+$2:function(a,b){return J.jOZ(a,b)},
 $isEH:true},
 w17:{
 "^":"TpZ:81;",
-$2:function(a,b){return a==null?b!=null:a!==b},
+$2:function(a,b){return J.xC(a,b)},
 $isEH:true},
 w18:{
 "^":"TpZ:81;",
-$2:function(a,b){return J.xZ(a,b)},
+$2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
 w19:{
 "^":"TpZ:81;",
-$2:function(a,b){return J.J5(a,b)},
+$2:function(a,b){return a==null?b==null:a===b},
 $isEH:true},
 w20:{
 "^":"TpZ:81;",
-$2:function(a,b){return J.u6(a,b)},
+$2:function(a,b){return a==null?b!=null:a!==b},
 $isEH:true},
 w21:{
 "^":"TpZ:81;",
-$2:function(a,b){return J.Bl(a,b)},
+$2:function(a,b){return J.xZ(a,b)},
 $isEH:true},
 w22:{
 "^":"TpZ:81;",
-$2:function(a,b){return a===!0||b===!0},
+$2:function(a,b){return J.J5(a,b)},
 $isEH:true},
 w23:{
 "^":"TpZ:81;",
-$2:function(a,b){return a===!0&&b===!0},
+$2:function(a,b){return J.u6(a,b)},
 $isEH:true},
 w24:{
 "^":"TpZ:81;",
-$2:function(a,b){var z=J.x(b)
-if(!!z.$isKq)return z.At(b,a)
-z=H.Ogz(P.a)
+$2:function(a,b){return J.Bl(a,b)},
+$isEH:true},
+w25:{
+"^":"TpZ:81;",
+$2:function(a,b){return a===!0||b===!0},
+$isEH:true},
+w26:{
+"^":"TpZ:81;",
+$2:function(a,b){return a===!0&&b===!0},
+$isEH:true},
+w27:{
+"^":"TpZ:81;",
+$2:function(a,b){var z=H.Ogz(P.a)
 z=H.KT(z,[z]).Zg(b)
 if(z)return b.$1(a)
-throw H.b(K.du("Filters must be a one-argument function."))},
+throw H.b(K.zq("Filters must be a one-argument function."))},
 $isEH:true},
-lPa:{
+w5:{
 "^":"TpZ:12;",
 $1:function(a){return a},
 $isEH:true},
-Ufa:{
+w10:{
 "^":"TpZ:12;",
-$1:function(a){return J.jzo(a)},
+$1:function(a){return J.Lh(a)},
 $isEH:true},
-Raa:{
+w11:{
 "^":"TpZ:12;",
 $1:function(a){return a!==!0},
 $isEH:true},
 PF:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
-t1:function(a,b){if(J.xC(a,"this"))H.vh(K.du("'this' cannot be used as a variable name."))
+t1:function(a,b){if(J.xC(a,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
 return new K.Rf(this,a,b)},
 $isPF:true,
 $isueT:true,
 $asueT:function(){return[P.qU,P.a]}},
-nk:{
+ug:{
 "^":"PF;k8>",
 t:function(a,b){var z,y
 if(J.xC(b,"this"))return this.k8
-z=$.vu().JE.T4.t(0,b)
+z=$.vu().xV.T4.t(0,b)
 y=this.k8
-if(y==null||z==null)throw H.b(K.du("variable '"+H.d(b)+"' not found"))
-y=$.cp().jD(y,z)
-return!!J.x(y).$iscb?B.zR(y,null):y},
+if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
+y=$.cp().Gp(y,z)
+return!!J.x(y).$iswS?B.Ha(y,null):y},
 tc:function(a){return!J.xC(a,"this")},
 bu:[function(a){return"[model: "+H.d(this.k8)+"]"},"$0","gCR",0,0,73]},
 Rf:{
@@ -17101,7 +17096,7 @@
 return z},
 t:function(a,b){var z
 if(J.xC(this.hI,b)){z=this.P
-return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
+return!!J.x(z).$iswS?B.Ha(z,null):z}return this.eT.t(0,b)},
 tc:function(a){if(J.xC(this.hI,a))return!1
 return this.eT.tc(a)},
 bu:[function(a){return this.eT.bu(0)+" > [local: "+H.d(this.hI)+"]"},"$0","gCR",0,0,73]},
@@ -17110,40 +17105,40 @@
 gk8:function(a){return this.eT.k8},
 t:function(a,b){var z=this.Z3
 if(z.NZ(0,b)){z=z.t(0,b)
-return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
+return!!J.x(z).$iswS?B.Ha(z,null):z}return this.eT.t(0,b)},
 tc:function(a){if(this.Z3.NZ(0,a))return!1
 return!J.xC(a,"this")},
 bu:[function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+H.d(H.VM(new P.i5(z),[H.u3(z,0)]))+"]"},"$0","gCR",0,0,73]},
+return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.B4(H.VM(new P.i5(z),[H.u3(z,0)]),"(",")")+"]"},"$0","gCR",0,0,73]},
 Ay0:{
-"^":"a;VO?,vt<",
-gqM:function(){var z=this.vO
-return H.VM(new P.rk(z),[H.u3(z,0)])},
-gEV:function(){return this.KL},
-gBI:function(){return this.vt},
-ux:function(a){},
-BZ:function(a){var z
+"^":"a;VO?,Xl<",
+gju:function(){var z=this.vO
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
+gXt:function(){return this.KL},
+gBI:function(){return this.Xl},
+MN:function(a){},
+Yo:function(a){var z
 this.jK(0,a,!1)
 z=this.VO
-if(z!=null)z.BZ(a)},
+if(z!=null)z.Yo(a)},
 fs:function(){var z=this.tj
 if(z!=null){z.Gv()
 this.tj=null}},
 jK:function(a,b,c){var z,y,x
 this.fs()
-z=this.vt
-this.ux(b)
-if(!c){y=this.vt
+z=this.Xl
+this.MN(b)
+if(!c){y=this.Xl
 y=y==null?z!=null:y!==z}else y=!1
 if(y){y=this.vO
-x=this.vt
+x=this.Xl
 if(y.YM>=4)H.vh(y.Pq())
 y.MW(x)}},
 bu:[function(a){return this.KL.bu(0)},"$0","gCR",0,0,73],
-$ishw:true},
-pf:{
-"^":"cfS;ms,xZ",
-xn:function(a){a.jK(0,this.ms,this.xZ)}},
+$isrx:true},
+Edh:{
+"^":"cfS;ms,OQ",
+xn:function(a){a.jK(0,this.ms,this.OQ)}},
 me:{
 "^":"cfS;",
 xn:function(a){a.fs()},
@@ -17151,13 +17146,13 @@
 GQ:{
 "^":"P55;ms",
 W9:function(a){return J.ZH(this.ms)},
-Hs:function(a){return a.ep.RR(0,this)},
+Hs:function(a){return a.o2.RR(0,this)},
 Ci:function(a){var z,y,x
 z=J.okV(a.gZs(),this)
 if(z==null)return
 y=a.goc(a)
-x=$.vu().JE.T4.t(0,y)
-return $.cp().jD(z,x)},
+x=$.vu().xV.T4.t(0,y)
+return $.cp().Gp(z,x)},
 CU:function(a){var z=J.okV(a.gZs(),this)
 if(z==null)return
 return J.UQ(z,J.okV(a.gmU(),this))},
@@ -17170,13 +17165,13 @@
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gnK(a)==null)return H.eC(z,y,P.Te(null))
 x=a.gnK(a)
-v=$.vu().JE.T4.t(0,x)
+v=$.vu().xV.T4.t(0,x)
 return $.cp().Ck(z,v,y,!1,null)},
-la:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.glm(),this.gnG()),[null,null]).br(0)},
+I6W:function(a){return a.gP(a)},
+Zh:function(a){return H.VM(new H.A8(a.gBx(),this.gnG()),[null,null]).br(0)},
 o0:function(a){var z,y,x
 z=P.Fl(null,null)
-for(y=a.gJq(a),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
+for(y=a.gJq(a),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.Ff
 z.u(0,J.okV(J.AW(x),this),J.okV(x.gv4(),this))}return z},
 YV:function(a){return H.vh(P.f("should never be called"))},
 qv:function(a){return J.UQ(this.ms,a.gP(a))},
@@ -17190,27 +17185,27 @@
 return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
 else if(y==null||x==null)return
 return w.$2(y,x)},
-zPR:function(a){var z,y
-z=J.okV(a.gep(),this)
-y=$.EU().t(0,a.gxS(a))
+kb:function(a){var z,y
+z=J.okV(a.go2(),this)
+y=$.fs().t(0,a.gxS(a))
 if(J.xC(a.gxS(a),"!"))return y.$1(z==null?!1:z)
 return z==null?null:y.$1(z)},
-RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gav(),this):J.okV(a.gHy(),this)},
-kz:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
-pg:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
+RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gav(),this):J.okV(a.geE(),this)},
+ky:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
+eS:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
 Oy:{
 "^":"P55;ZG",
-W9:function(a){return new K.WhS(a,null,null,null,P.bK(null,null,!1,null))},
-Hs:function(a){return a.ep.RR(0,this)},
+W9:function(a){return new K.Il(a,null,null,null,P.bK(null,null,!1,null))},
+Hs:function(a){return a.o2.RR(0,this)},
 Ci:function(a){var z,y
 z=J.okV(a.gZs(),this)
-y=new K.vlk(z,a,null,null,null,P.bK(null,null,!1,null))
+y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(y)
 return y},
 CU:function(a){var z,y,x
 z=J.okV(a.gZs(),this)
 y=J.okV(a.gmU(),this)
-x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.iTN(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(x)
 y.sVO(x)
 return x},
@@ -17222,17 +17217,17 @@
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.faZ(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(v)
-if(y!=null)H.bQ(y,new K.o4(v))
+if(y!=null)H.bQ(y,new K.zD(v))
 return v},
-la:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
+I6W:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
-z=H.VM(new H.A8(a.glm(),this.gnG()),[null,null]).tt(0,!1)
+z=H.VM(new H.A8(a.gBx(),this.gnG()),[null,null]).tt(0,!1)
 y=new K.UF(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.wr(y))
+H.bQ(z,new K.XV(y))
 return y},
 o0:function(a){var z,y
 z=H.VM(new H.A8(a.gJq(a),this.gnG()),[null,null]).tt(0,!1)
-y=new K.ED(z,a,null,null,null,P.bK(null,null,!1,null))
+y=new K.ev2(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.Xs(y))
 return y},
 YV:function(a){var z,y,x
@@ -17246,33 +17241,33 @@
 ex:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
-x=new K.ky(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.ED(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(x)
 y.sVO(x)
 return x},
-zPR:function(a){var z,y
-z=J.okV(a.gep(),this)
+kb:function(a){var z,y
+z=J.okV(a.go2(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(y)
 return y},
 RD:function(a){var z,y,x,w
 z=J.okV(a.gdc(),this)
 y=J.okV(a.gav(),this)
-x=J.okV(a.gHy(),this)
-w=new K.an(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
+x=J.okV(a.geE(),this)
+w=new K.WW(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(w)
 y.sVO(w)
 x.sVO(w)
 return w},
-kz:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
-pg:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
-o4:{
+ky:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
+eS:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
+zD:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sVO(z)
 return z},
 $isEH:true},
-wr:{
+XV:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sVO(z)
@@ -17284,217 +17279,217 @@
 a.sVO(z)
 return z},
 $isEH:true},
-WhS:{
-"^":"Ay0;KL,VO,tj,vt,vO",
-ux:function(a){this.vt=J.ZH(a)},
+Il:{
+"^":"Ay0;KL,VO,tj,Xl,vO",
+MN:function(a){this.Xl=J.ZH(a)},
 RR:function(a,b){return b.W9(this)},
-$asAy0:function(){return[U.EO]},
-$isEO:true,
-$ishw:true},
+$asAy0:function(){return[U.WH]},
+$isWH:true,
+$isrx:true},
 x5:{
-"^":"Ay0;KL,VO,tj,vt,vO",
+"^":"Ay0;KL,VO,tj,Xl,vO",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-ux:function(a){var z=this.KL
-this.vt=z.gP(z)},
-RR:function(a,b){return b.la(this)},
-$asAy0:function(){return[U.Dv]},
-$asDv:function(){return[null]},
-$isDv:true,
-$ishw:true},
+MN:function(a){var z=this.KL
+this.Xl=z.gP(z)},
+RR:function(a,b){return b.I6W(this)},
+$asAy0:function(){return[U.noG]},
+$asnoG:function(){return[null]},
+$isnoG:true,
+$isrx:true},
 UF:{
-"^":"Ay0;lm<,KL,VO,tj,vt,vO",
-ux:function(a){this.vt=H.VM(new H.A8(this.lm,new K.Hv()),[null,null]).br(0)},
+"^":"Ay0;Bx<,KL,VO,tj,Xl,vO",
+MN:function(a){this.Xl=H.VM(new H.A8(this.Bx,new K.Hv()),[null,null]).br(0)},
 RR:function(a,b){return b.Zh(this)},
-$asAy0:function(){return[U.c09]},
-$isc09:true,
-$ishw:true},
+$asAy0:function(){return[U.c0]},
+$isc0:true,
+$isrx:true},
 Hv:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gvt()},"$1",null,2,0,null,97,"call"],
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-ED:{
-"^":"Ay0;Jq>,KL,VO,tj,vt,vO",
-ux:function(a){this.vt=H.n3(this.Jq,P.L5(null,null,null,null,null),new K.Ku())},
+ev2:{
+"^":"Ay0;Jq>,KL,VO,tj,Xl,vO",
+MN:function(a){this.Xl=H.n3(this.Jq,P.L5(null,null,null,null,null),new K.Ku())},
 RR:function(a,b){return b.o0(this)},
 $asAy0:function(){return[U.Mm]},
 $isMm:true,
-$ishw:true},
+$isrx:true},
 Ku:{
 "^":"TpZ:81;",
-$2:function(a,b){J.qQ(a,J.AW(b).gvt(),b.gv4().gvt())
+$2:function(a,b){J.kW(a,J.AW(b).gXl(),b.gv4().gXl())
 return a},
 $isEH:true},
 EL:{
-"^":"Ay0;nl>,v4<,KL,VO,tj,vt,vO",
+"^":"Ay0;nl>,v4<,KL,VO,tj,Xl,vO",
 RR:function(a,b){return b.YV(this)},
 $asAy0:function(){return[U.nu]},
 $isnu:true,
-$ishw:true},
+$isrx:true},
 ek:{
-"^":"Ay0;KL,VO,tj,vt,vO",
+"^":"Ay0;KL,VO,tj,Xl,vO",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-ux:function(a){var z,y,x,w
+MN:function(a){var z,y,x,w
 z=this.KL
 y=J.U6(a)
-this.vt=y.t(a,z.gP(z))
+this.Xl=y.t(a,z.gP(z))
 if(!a.tc(z.gP(z)))return
 x=y.gk8(a)
 y=J.x(x)
 if(!y.$isd3)return
 z=z.gP(z)
-w=$.vu().JE.T4.t(0,z)
-this.tj=y.gqh(x).yI(new K.j9(this,a,w))},
+w=$.vu().xV.T4.t(0,z)
+this.tj=y.gqh(x).yI(new K.OC(this,a,w))},
 RR:function(a,b){return b.qv(this)},
 $asAy0:function(){return[U.fp]},
 $isfp:true,
-$ishw:true},
-j9:{
+$isrx:true},
+OC:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 GC:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
 mv:{
-"^":"Ay0;ep<,KL,VO,tj,vt,vO",
+"^":"Ay0;o2<,KL,VO,tj,Xl,vO",
 gxS:function(a){var z=this.KL
 return z.gxS(z)},
-ux:function(a){var z,y
+MN:function(a){var z,y
 z=this.KL
-y=$.EU().t(0,z.gxS(z))
-if(J.xC(z.gxS(z),"!")){z=this.ep.gvt()
-this.vt=y.$1(z==null?!1:z)}else{z=this.ep
-this.vt=z.gvt()==null?null:y.$1(z.gvt())}},
-RR:function(a,b){return b.zPR(this)},
+y=$.fs().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"!")){z=this.o2.gXl()
+this.Xl=y.$1(z==null?!1:z)}else{z=this.o2
+this.Xl=z.gXl()==null?null:y.$1(z.gXl())}},
+RR:function(a,b){return b.kb(this)},
 $asAy0:function(){return[U.FH]},
 $isFH:true,
-$ishw:true},
-ky:{
-"^":"Ay0;Bb>,T8>,KL,VO,tj,vt,vO",
+$isrx:true},
+ED:{
+"^":"Ay0;Bb>,T8>,KL,VO,tj,Xl,vO",
 gxS:function(a){var z=this.KL
 return z.gxS(z)},
-ux:function(a){var z,y,x
+MN:function(a){var z,y,x
 z=this.KL
 y=$.YP().t(0,z.gxS(z))
-if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gvt()
+if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gXl()
 if(z==null)z=!1
-x=this.T8.gvt()
-this.vt=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.vt=y.$2(this.Bb.gvt(),this.T8.gvt())
+x=this.T8.gXl()
+this.Xl=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.Xl=y.$2(this.Bb.gXl(),this.T8.gXl())
 else{x=this.Bb
-if(x.gvt()==null||this.T8.gvt()==null)this.vt=null
-else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gvt()).$iswn)this.tj=H.Go(x.gvt(),"$iswn").gXF().yI(new K.nV(this,a))
-this.vt=y.$2(x.gvt(),this.T8.gvt())}}},
+if(x.gXl()==null||this.T8.gXl()==null)this.Xl=null
+else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gXl()).$iswn)this.tj=H.Go(x.gXl(),"$iswn").gXF().yI(new K.P8(this,a))
+this.Xl=y.$2(x.gXl(),this.T8.gXl())}}},
 RR:function(a,b){return b.ex(this)},
 $asAy0:function(){return[U.uku]},
 $isuku:true,
-$ishw:true},
-nV:{
+$isrx:true},
+P8:{
 "^":"TpZ:12;a,b",
-$1:[function(a){return this.a.BZ(this.b)},"$1",null,2,0,null,13,"call"],
+$1:[function(a){return this.a.Yo(this.b)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-an:{
-"^":"Ay0;dc<,av<,Hy<,KL,VO,tj,vt,vO",
-ux:function(a){var z=this.dc.gvt()
-this.vt=(z==null?!1:z)===!0?this.av.gvt():this.Hy.gvt()},
+WW:{
+"^":"Ay0;dc<,av<,eE<,KL,VO,tj,Xl,vO",
+MN:function(a){var z=this.dc.gXl()
+this.Xl=(z==null?!1:z)===!0?this.av.gXl():this.eE.gXl()},
 RR:function(a,b){return b.RD(this)},
 $asAy0:function(){return[U.x06]},
 $isx06:true,
-$ishw:true},
-vlk:{
-"^":"Ay0;Zs<,KL,VO,tj,vt,vO",
+$isrx:true},
+vl:{
+"^":"Ay0;Zs<,KL,VO,tj,Xl,vO",
 goc:function(a){var z=this.KL
 return z.goc(z)},
-ux:function(a){var z,y,x
-z=this.Zs.gvt()
-if(z==null){this.vt=null
+MN:function(a){var z,y,x
+z=this.Zs.gXl()
+if(z==null){this.Xl=null
 return}y=this.KL
 y=y.goc(y)
-x=$.vu().JE.T4.t(0,y)
-this.vt=$.cp().jD(z,x)
+x=$.vu().xV.T4.t(0,y)
+this.Xl=$.cp().Gp(z,x)
 y=J.x(z)
-if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.e9n(this,a,x))},
+if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.Vw(this,a,x))},
 RR:function(a,b){return b.Ci(this)},
 $asAy0:function(){return[U.x9]},
 $isx9:true,
-$ishw:true},
-e9n:{
+$isrx:true},
+Vw:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 WKb:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-iT:{
-"^":"Ay0;Zs<,mU<,KL,VO,tj,vt,vO",
-ux:function(a){var z,y,x
-z=this.Zs.gvt()
-if(z==null){this.vt=null
-return}y=this.mU.gvt()
+iTN:{
+"^":"Ay0;Zs<,mU<,KL,VO,tj,Xl,vO",
+MN:function(a){var z,y,x
+z=this.Zs.gXl()
+if(z==null){this.Xl=null
+return}y=this.mU.gXl()
 x=J.U6(z)
-this.vt=x.t(z,y)
-if(!!x.$iswn)this.tj=z.gXF().yI(new K.jai(this,a,y))
-else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.FAT(this,a,y))},
+this.Xl=x.t(z,y)
+if(!!x.$iswn)this.tj=z.gXF().yI(new K.tE(this,a,y))
+else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.jai(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asAy0:function(){return[U.vn]},
 $isvn:true,
-$ishw:true},
-jai:{
+$isrx:true},
+tE:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.zw(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.GST(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
-zw:{
+GST:{
 "^":"TpZ:12;d",
 $1:[function(a){return a.vP(this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-FAT:{
+jai:{
 "^":"TpZ:12;e,f,UI",
-$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.BZ(this.f)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.Yo(this.f)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 ey:{
 "^":"TpZ:12;bK",
 $1:[function(a){return!!J.x(a).$isya&&J.xC(a.nl,this.bK)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
 faZ:{
-"^":"Ay0;Zs<,re<,KL,VO,tj,vt,vO",
+"^":"Ay0;Zs<,re<,KL,VO,tj,Xl,vO",
 gnK:function(a){var z=this.KL
 return z.gnK(z)},
-ux:function(a){var z,y,x,w
+MN:function(a){var z,y,x,w
 z=this.re
 z.toString
-y=H.VM(new H.A8(z,new K.BGc()),[null,null]).br(0)
-x=this.Zs.gvt()
-if(x==null){this.vt=null
+y=H.VM(new H.A8(z,new K.vQ()),[null,null]).br(0)
+x=this.Zs.gXl()
+if(x==null){this.Xl=null
 return}z=this.KL
 if(z.gnK(z)==null){z=H.eC(x,y,P.Te(null))
-this.vt=!!J.x(z).$iscb?B.zR(z,null):z}else{z=z.gnK(z)
-w=$.vu().JE.T4.t(0,z)
-this.vt=$.cp().Ck(x,w,y,!1,null)
+this.Xl=!!J.x(z).$iswS?B.Ha(z,null):z}else{z=z.gnK(z)
+w=$.vu().xV.T4.t(0,z)
+this.Xl=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.WWJ(this,a,w))}},
+if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.BGc(this,a,w))}},
 RR:function(a,b){return b.Y7(this)},
 $asAy0:function(){return[U.RWc]},
 $isRWc:true,
-$ishw:true},
-BGc:{
+$isrx:true},
+vQ:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gvt()},"$1",null,2,0,null,49,"call"],
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,49,"call"],
 $isEH:true},
-WWJ:{
+BGc:{
 "^":"TpZ:199;a,b,c",
-$1:[function(a){if(J.VA(a,new K.Kr(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.ho(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
-Kr:{
+ho:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-nD:{
+XX:{
 "^":"a;G1>",
 bu:[function(a){return"EvalException: "+this.G1},"$0","gCR",0,0,73],
-static:{du:function(a){return new K.nD(a)}}}}],["","",,U,{
+static:{zq:function(a){return new K.XX(a)}}}}],["","",,U,{
 "^":"",
 Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
@@ -17503,58 +17498,58 @@
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
 if(!J.xC(y,b[z]))return!1}return!0},
-pz:function(a){a.toString
-return U.OT(H.n3(a,0,new U.lc()))},
+N4:function(a){a.toString
+return U.Le(H.n3(a,0,new U.lc()))},
 C0C: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},
-OT:function(a){if(typeof a!=="number")return H.s(a)
+Le: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)},
-tu:{
+Fs:{
 "^":"a;",
 Bf:[function(a,b,c){return new U.vn(b,c)},"$2","gvH",4,0,200,2,49]},
-hw:{
+rx:{
 "^":"a;",
-$ishw:true},
-EO:{
-"^":"hw;",
+$isrx:true},
+WH:{
+"^":"rx;",
 RR:function(a,b){return b.W9(this)},
-$isEO:true},
-Dv:{
-"^":"hw;P>",
-RR:function(a,b){return b.la(this)},
+$isWH:true},
+noG:{
+"^":"rx;P>",
+RR:function(a,b){return b.I6W(this)},
 bu:[function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
-z=H.RB(b,"$isDv",[H.u3(this,0)],"$asDv")
+z=H.RB(b,"$isnoG",[H.u3(this,0)],"$asnoG")
 return z&&J.xC(J.Vm(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$isDv:true},
-c09:{
-"^":"hw;lm<",
+$isnoG:true},
+c0:{
+"^":"rx;Bx<",
 RR:function(a,b){return b.Zh(this)},
-bu:[function(a){return H.d(this.lm)},"$0","gCR",0,0,73],
+bu:[function(a){return H.d(this.Bx)},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isc09&&U.Pu(b.glm(),this.lm)},
-giO:function(a){return U.pz(this.lm)},
-$isc09:true},
+return!!J.x(b).$isc0&&U.Pu(b.gBx(),this.Bx)},
+giO:function(a){return U.N4(this.Bx)},
+$isc0:true},
 Mm:{
-"^":"hw;Jq>",
+"^":"rx;Jq>",
 RR:function(a,b){return b.o0(this)},
 bu:[function(a){return"{"+H.d(this.Jq)+"}"},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
 return!!z.$isMm&&U.Pu(z.gJq(b),this.Jq)},
-giO:function(a){return U.pz(this.Jq)},
+giO:function(a){return U.N4(this.Jq)},
 $isMm:true},
 nu:{
-"^":"hw;nl>,v4<",
+"^":"rx;nl>,v4<",
 RR:function(a,b){return b.YV(this)},
 bu:[function(a){return this.nl.bu(0)+": "+H.d(this.v4)},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17564,18 +17559,18 @@
 giO:function(a){var z,y
 z=J.v1(this.nl.P)
 y=J.v1(this.v4)
-return U.OT(U.C0C(U.C0C(0,z),y))},
+return U.Le(U.C0C(U.C0C(0,z),y))},
 $isnu:true},
 XC:{
-"^":"hw;ep",
+"^":"rx;o2",
 RR:function(a,b){return b.Hs(this)},
-bu:[function(a){return"("+H.d(this.ep)+")"},"$0","gCR",0,0,73],
+bu:[function(a){return"("+H.d(this.o2)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isXC&&J.xC(b.ep,this.ep)},
-giO:function(a){return J.v1(this.ep)},
+return!!J.x(b).$isXC&&J.xC(b.o2,this.o2)},
+giO:function(a){return J.v1(this.o2)},
 $isXC:true},
 fp:{
-"^":"hw;P>",
+"^":"rx;P>",
 RR:function(a,b){return b.qv(this)},
 bu:[function(a){return this.P},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17585,20 +17580,20 @@
 giO:function(a){return J.v1(this.P)},
 $isfp:true},
 FH:{
-"^":"hw;xS>,ep<",
-RR:function(a,b){return b.zPR(this)},
-bu:[function(a){return H.d(this.xS)+" "+H.d(this.ep)},"$0","gCR",0,0,73],
+"^":"rx;xS>,o2<",
+RR:function(a,b){return b.kb(this)},
+bu:[function(a){return H.d(this.xS)+" "+H.d(this.o2)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isFH&&J.xC(z.gxS(b),this.xS)&&J.xC(b.gep(),this.ep)},
+return!!z.$isFH&&J.xC(z.gxS(b),this.xS)&&J.xC(b.go2(),this.o2)},
 giO:function(a){var z,y
 z=J.v1(this.xS)
-y=J.v1(this.ep)
-return U.OT(U.C0C(U.C0C(0,z),y))},
+y=J.v1(this.o2)
+return U.Le(U.C0C(U.C0C(0,z),y))},
 $isFH:true},
 uku:{
-"^":"hw;xS>,Bb>,T8>",
+"^":"rx;xS>,Bb>,T8>",
 RR:function(a,b){return b.ex(this)},
 bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.xS)+" "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17609,23 +17604,23 @@
 z=J.v1(this.xS)
 y=J.v1(this.Bb)
 x=J.v1(this.T8)
-return U.OT(U.C0C(U.C0C(U.C0C(0,z),y),x))},
+return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isuku:true},
 x06:{
-"^":"hw;dc<,av<,Hy<",
+"^":"rx;dc<,av<,eE<",
 RR:function(a,b){return b.RD(this)},
-bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.av)+" : "+H.d(this.Hy)+")"},"$0","gCR",0,0,73],
+bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.av)+" : "+H.d(this.eE)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isx06&&J.xC(b.gdc(),this.dc)&&J.xC(b.gav(),this.av)&&J.xC(b.gHy(),this.Hy)},
+return!!J.x(b).$isx06&&J.xC(b.gdc(),this.dc)&&J.xC(b.gav(),this.av)&&J.xC(b.geE(),this.eE)},
 giO:function(a){var z,y,x
 z=J.v1(this.dc)
 y=J.v1(this.av)
-x=J.v1(this.Hy)
-return U.OT(U.C0C(U.C0C(U.C0C(0,z),y),x))},
+x=J.v1(this.eE)
+return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isx06:true},
 X7S:{
-"^":"hw;Bb>,T8>",
-RR:function(a,b){return b.kz(this)},
+"^":"rx;Bb>,T8>",
+RR:function(a,b){return b.ky(this)},
 gxG:function(){var z=this.Bb
 return z.gP(z)},
 gkZ:function(a){return this.T8},
@@ -17636,27 +17631,27 @@
 z=this.Bb
 z=z.giO(z)
 y=J.v1(this.T8)
-return U.OT(U.C0C(U.C0C(0,z),y))},
+return U.Le(U.C0C(U.C0C(0,z),y))},
 $isX7S:true,
 $isDI:true},
-NM:{
-"^":"hw;Bb>,T8>",
-RR:function(a,b){return b.pg(this)},
+va:{
+"^":"rx;Bb>,T8>",
+RR:function(a,b){return b.eS(this)},
 gxG:function(){var z=this.T8
 return z.gP(z)},
 gkZ:function(a){return this.Bb},
 bu:[function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isNM&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
+return!!J.x(b).$isva&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
 giO:function(a){var z,y
 z=J.v1(this.Bb)
 y=this.T8
 y=y.giO(y)
-return U.OT(U.C0C(U.C0C(0,z),y))},
-$isNM:true,
+return U.Le(U.C0C(U.C0C(0,z),y))},
+$isva:true,
 $isDI:true},
 vn:{
-"^":"hw;Zs<,mU<",
+"^":"rx;Zs<,mU<",
 RR:function(a,b){return b.CU(this)},
 bu:[function(a){return H.d(this.Zs)+"["+H.d(this.mU)+"]"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
@@ -17664,10 +17659,10 @@
 giO:function(a){var z,y
 z=J.v1(this.Zs)
 y=J.v1(this.mU)
-return U.OT(U.C0C(U.C0C(0,z),y))},
+return U.Le(U.C0C(U.C0C(0,z),y))},
 $isvn:true},
 x9:{
-"^":"hw;Zs<,oc>",
+"^":"rx;Zs<,oc>",
 RR:function(a,b){return b.Ci(this)},
 bu:[function(a){return H.d(this.Zs)+"."+H.d(this.oc)},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17677,10 +17672,10 @@
 giO:function(a){var z,y
 z=J.v1(this.Zs)
 y=J.v1(this.oc)
-return U.OT(U.C0C(U.C0C(0,z),y))},
+return U.Le(U.C0C(U.C0C(0,z),y))},
 $isx9:true},
 RWc:{
-"^":"hw;Zs<,nK>,re<",
+"^":"rx;Zs<,nK>,re<",
 RR:function(a,b){return b.Y7(this)},
 bu:[function(a){return H.d(this.Zs)+"."+H.d(this.nK)+"("+H.d(this.re)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17690,8 +17685,8 @@
 giO:function(a){var z,y,x
 z=J.v1(this.Zs)
 y=J.v1(this.nK)
-x=U.pz(this.re)
-return U.OT(U.C0C(U.C0C(U.C0C(0,z),y),x))},
+x=U.N4(this.re)
+return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isRWc:true},
 lc:{
 "^":"TpZ:81;",
@@ -17700,57 +17695,68 @@
 "^":"",
 FX:{
 "^":"a;Wi,f7,JR,V6",
-gVd:function(){return this.V6.lo},
+gVd:function(){return this.V6.Ff},
 oK:function(){var z=this.f7.zl()
 this.JR=z
 this.V6=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])
 this.jz()
 return this.VK()},
 Jn:function(a,b){var z
-if(a!=null){z=this.V6.lo
+if(a!=null){z=this.V6.Ff
 z=z==null||!J.xC(J.Iz(z),a)}else z=!1
-if(!z)if(b!=null){z=this.V6.lo
+if(!z)if(b!=null){z=this.V6.Ff
 z=z==null||!J.xC(J.Vm(z),b)}else z=!1
 else z=!0
 if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gVd())))
 this.V6.G()},
 jz:function(){return this.Jn(null,null)},
 IH:function(a){return this.Jn(a,null)},
-VK:function(){if(this.V6.lo==null)return C.OL
-var z=this.ZR()
-return z==null?null:this.lM(z,0)},
-lM:function(a,b){var z,y,x
-for(;z=this.V6.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.V6.lo),"("))a=new U.RWc(a,null,this.Hr())
-else if(J.xC(J.Vm(this.V6.lo),"["))a=new U.vn(a,this.FD())
-else break
-else if(J.xC(J.Iz(this.V6.lo),3)){this.jz()
-a=this.JuP(a,this.ZR())}else if(J.xC(J.Iz(this.V6.lo),10))if(J.xC(J.Vm(this.V6.lo),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
+VK:function(){if(this.V6.Ff==null){this.Wi.toString
+return C.x4}var z=this.ZR()
+return z==null?null:this.Ay(z,0)},
+Ay:function(a,b){var z,y,x,w,v,u
+for(;z=this.V6.Ff,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.V6.Ff),"(")){y=this.Hr()
+this.Wi.toString
+a=new U.RWc(a,null,y)}else if(J.xC(J.Vm(this.V6.Ff),"[")){x=this.le()
+this.Wi.toString
+a=new U.vn(a,x)}else break
+else if(J.xC(J.Iz(this.V6.Ff),3)){this.jz()
+a=this.JuP(a,this.ZR())}else if(J.xC(J.Iz(this.V6.Ff),10))if(J.xC(J.Vm(this.V6.Ff),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
 this.jz()
-a=new U.X7S(a,this.VK())}else if(J.xC(J.Vm(this.V6.lo),"as")){this.jz()
-y=this.VK()
-if(!J.x(y).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
-a=new U.NM(a,y)}else break
-else{if(J.xC(J.Iz(this.V6.lo),8)){z=this.V6.lo.gG8()
+w=this.VK()
+this.Wi.toString
+a=new U.X7S(a,w)}else if(J.xC(J.Vm(this.V6.Ff),"as")){this.jz()
+w=this.VK()
+if(!J.x(w).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
+this.Wi.toString
+a=new U.va(a,w)}else break
+else{if(J.xC(J.Iz(this.V6.Ff),8)){z=this.V6.Ff.gG8()
 if(typeof z!=="number")return z.F()
 if(typeof b!=="number")return H.s(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.V6.lo),"?")){this.Jn(8,"?")
-x=this.VK()
+if(z)if(J.xC(J.Vm(this.V6.Ff),"?")){this.Jn(8,"?")
+v=this.VK()
 this.IH(5)
-a=new U.x06(a,x,this.VK())}else a=this.Ax(a)
+u=this.VK()
+this.Wi.toString
+a=new U.x06(a,v,u)}else a=this.Ax(a)
 else break}return a},
-JuP:function(a,b){var z=J.x(b)
-if(!!z.$isfp)return new U.x9(a,z.gP(b))
-else if(!!z.$isRWc&&!!J.x(b.gZs()).$isfp)return new U.RWc(a,J.Vm(b.gZs()),b.gre())
-else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
+JuP:function(a,b){var z,y
+z=J.x(b)
+if(!!z.$isfp){z=z.gP(b)
+this.Wi.toString
+return new U.x9(a,z)}else if(!!z.$isRWc&&!!J.x(b.gZs()).$isfp){z=J.Vm(b.gZs())
+y=b.gre()
+this.Wi.toString
+return new U.RWc(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
 Ax:function(a){var z,y,x,w,v
-z=this.V6.lo
+z=this.V6.Ff
 y=J.RE(z)
 if(!C.Nm.tg(C.fW,y.gP(z)))throw H.b(Y.RV("unknown operator: "+H.d(y.gP(z))))
 this.jz()
 x=this.ZR()
-while(!0){w=this.V6.lo
-if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.V6.lo),3)||J.xC(J.Iz(this.V6.lo),9)){w=this.V6.lo.gG8()
+while(!0){w=this.V6.Ff
+if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.V6.Ff),3)||J.xC(J.Iz(this.V6.Ff),9)){w=this.V6.Ff.gG8()
 v=z.gG8()
 if(typeof w!=="number")return w.D()
 if(typeof v!=="number")return H.s(v)
@@ -17758,145 +17764,173 @@
 w=v}else w=!1
 else w=!1
 if(!w)break
-x=this.lM(x,this.V6.lo.gG8())}return new U.uku(y.gP(z),a,x)},
-ZR:function(){var z,y
-if(J.xC(J.Iz(this.V6.lo),8)){z=J.Vm(this.V6.lo)
+x=this.Ay(x,this.V6.Ff.gG8())}y=y.gP(z)
+this.Wi.toString
+return new U.uku(y,a,x)},
+ZR:function(){var z,y,x,w
+if(J.xC(J.Iz(this.V6.Ff),8)){z=J.Vm(this.V6.Ff)
 y=J.x(z)
 if(y.n(z,"+")||y.n(z,"-")){this.jz()
-if(J.xC(J.Iz(this.V6.lo),6)){z=new U.Dv(H.BU(H.d(z)+H.d(J.Vm(this.V6.lo)),null,null))
+if(J.xC(J.Iz(this.V6.Ff),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.V6.Ff)),null,null)
+this.Wi.toString
+z=new U.noG(y)
 z.$builtinTypeInfo=[null]
 this.jz()
-return z}else if(J.xC(J.Iz(this.V6.lo),7)){z=new U.Dv(H.RR(H.d(z)+H.d(J.Vm(this.V6.lo)),null))
+return z}else{y=this.Wi
+if(J.xC(J.Iz(this.V6.Ff),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.V6.Ff)),null)
+y.toString
+z=new U.noG(x)
 z.$builtinTypeInfo=[null]
 this.jz()
-return z}else return new U.FH(z,this.lM(this.LE(),11))}else if(y.n(z,"!")){this.jz()
-return new U.FH(z,this.lM(this.LE(),11))}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LE()},
+return z}else{w=this.Ay(this.LE(),11)
+y.toString
+return new U.FH(z,w)}}}else if(y.n(z,"!")){this.jz()
+w=this.Ay(this.LE(),11)
+this.Wi.toString
+return new U.FH(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LE()},
 LE:function(){var z,y
-switch(J.Iz(this.V6.lo)){case 10:z=J.Vm(this.V6.lo)
+switch(J.Iz(this.V6.Ff)){case 10:z=J.Vm(this.V6.Ff)
 if(J.xC(z,"this")){this.jz()
+this.Wi.toString
 return new U.fp("this")}else if(C.Nm.tg(C.jY,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
 throw H.b(Y.RV("unrecognized keyword: "+H.d(z)))
 case 2:return this.Yj()
 case 1:return this.Dy()
 case 6:return this.c9()
 case 7:return this.eD()
-case 9:if(J.xC(J.Vm(this.V6.lo),"(")){this.jz()
+case 9:if(J.xC(J.Vm(this.V6.Ff),"(")){this.jz()
 y=this.VK()
 this.Jn(9,")")
-return new U.XC(y)}else if(J.xC(J.Vm(this.V6.lo),"{"))return this.I1()
-else if(J.xC(J.Vm(this.V6.lo),"["))return this.U3()
+this.Wi.toString
+return new U.XC(y)}else if(J.xC(J.Vm(this.V6.Ff),"{"))return this.hR()
+else if(J.xC(J.Vm(this.V6.Ff),"["))return this.U3()
 return
 case 5:throw H.b(Y.RV("unexpected token \":\""))
 default:return}},
 U3:function(){var z,y
 z=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.lo),9)&&J.xC(J.Vm(this.V6.lo),"]"))break
+if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"]"))break
 z.push(this.VK())
-y=this.V6.lo}while(y!=null&&J.xC(J.Vm(y),","))
+y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
 this.Jn(9,"]")
-return new U.c09(z)},
-I1:function(){var z,y,x
+return new U.c0(z)},
+hR:function(){var z,y,x
 z=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.lo),9)&&J.xC(J.Vm(this.V6.lo),"}"))break
-y=new U.Dv(J.Vm(this.V6.lo))
-y.$builtinTypeInfo=[null]
+if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"}"))break
+y=J.Vm(this.V6.Ff)
+this.Wi.toString
+x=new U.noG(y)
+x.$builtinTypeInfo=[null]
 this.jz()
 this.Jn(5,":")
-z.push(new U.nu(y,this.VK()))
-x=this.V6.lo}while(x!=null&&J.xC(J.Vm(x),","))
+z.push(new U.nu(x,this.VK()))
+y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
 this.Jn(9,"}")
 return new U.Mm(z)},
 Yj:function(){var z,y,x
-if(J.xC(J.Vm(this.V6.lo),"true")){this.jz()
-return H.VM(new U.Dv(!0),[null])}if(J.xC(J.Vm(this.V6.lo),"false")){this.jz()
-return H.VM(new U.Dv(!1),[null])}if(J.xC(J.Vm(this.V6.lo),"null")){this.jz()
-return H.VM(new U.Dv(null),[null])}if(!J.xC(J.Iz(this.V6.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gVd())+".value"))
-z=J.Vm(this.V6.lo)
+if(J.xC(J.Vm(this.V6.Ff),"true")){this.jz()
+this.Wi.toString
+return H.VM(new U.noG(!0),[null])}if(J.xC(J.Vm(this.V6.Ff),"false")){this.jz()
+this.Wi.toString
+return H.VM(new U.noG(!1),[null])}if(J.xC(J.Vm(this.V6.Ff),"null")){this.jz()
+this.Wi.toString
+return H.VM(new U.noG(null),[null])}if(!J.xC(J.Iz(this.V6.Ff),2))H.vh(Y.RV("expected identifier: "+H.d(this.gVd())+".value"))
+z=J.Vm(this.V6.Ff)
 this.jz()
+this.Wi.toString
 y=new U.fp(z)
 x=this.Hr()
 if(x==null)return y
 else return new U.RWc(y,null,x)},
 Hr:function(){var z,y
-z=this.V6.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.lo),"(")){y=[]
+z=this.V6.Ff
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"(")){y=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.lo),9)&&J.xC(J.Vm(this.V6.lo),")"))break
+if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),")"))break
 y.push(this.VK())
-z=this.V6.lo}while(z!=null&&J.xC(J.Vm(z),","))
+z=this.V6.Ff}while(z!=null&&J.xC(J.Vm(z),","))
 this.Jn(9,")")
 return y}return},
-FD:function(){var z,y
-z=this.V6.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.lo),"[")){this.jz()
+le:function(){var z,y
+z=this.V6.Ff
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"[")){this.jz()
 y=this.VK()
 this.Jn(9,"]")
 return y}return},
-Dy:function(){var z=H.VM(new U.Dv(J.Vm(this.V6.lo)),[null])
+Dy:function(){var z,y
+z=J.Vm(this.V6.Ff)
+this.Wi.toString
+y=H.VM(new U.noG(z),[null])
 this.jz()
-return z},
-Rb:function(a){var z=H.VM(new U.Dv(H.BU(H.d(a)+H.d(J.Vm(this.V6.lo)),null,null)),[null])
+return y},
+Rb:function(a){var z,y
+z=H.BU(H.d(a)+H.d(J.Vm(this.V6.Ff)),null,null)
+this.Wi.toString
+y=H.VM(new U.noG(z),[null])
 this.jz()
-return z},
+return y},
 c9:function(){return this.Rb("")},
-XO:function(a){var z=H.VM(new U.Dv(H.RR(H.d(a)+H.d(J.Vm(this.V6.lo)),null)),[null])
+XO:function(a){var z,y
+z=H.RR(H.d(a)+H.d(J.Vm(this.V6.Ff)),null)
+this.Wi.toString
+y=H.VM(new U.noG(z),[null])
 this.jz()
-return z},
+return y},
 eD:function(){return this.XO("")},
-static:{eHj:function(a,b){var z,y,x
-z=H.VM([],[Y.PnY])
+static:{OD:function(a,b){var z,y,x
+z=H.VM([],[Y.qS])
 y=P.p9("")
-x=new U.tu()
-return new T.FX(x,new Y.hc6(z,y,new P.Kg(a,0,0,null),null),null,null)}}}}],["","",,K,{
+x=new U.Fs()
+return new T.FX(x,new Y.dd(z,y,new P.hM(a,0,0,null),null),null,null)}}}}],["","",,K,{
 "^":"",
-Dce:[function(a){return H.VM(new K.Bt(a),[null])},"$1","HZg",2,0,70,71],
-O1:{
+Dce:[function(a){return H.VM(new K.Bt(a),[null])},"$1","oJ",2,0,70,71],
+Aep:{
 "^":"a;vH>,P>",
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isO1&&J.xC(b.vH,this.vH)&&J.xC(b.P,this.P)},
+return!!J.x(b).$isAep&&J.xC(b.vH,this.vH)&&J.xC(b.P,this.P)},
 giO:function(a){return J.v1(this.P)},
 bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gCR",0,0,73],
-$isO1:true},
+$isAep:true},
 Bt:{
-"^":"mW;ty",
-gA:function(a){var z=new K.kd(J.mY(this.ty),0,null)
+"^":"mW;FD",
+gA:function(a){var z=new K.vR(J.mY(this.FD),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.ty)},
-gl0:function(a){return J.FN(this.ty)},
-gtH:function(a){var z=new K.O1(0,J.Es(this.ty))
+gB:function(a){return J.q8(this.FD)},
+gl0:function(a){return J.FN(this.FD)},
+gqG:function(a){var z=new K.Aep(0,J.bT(this.FD))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 grZ:function(a){var z,y
-z=this.ty
+z=this.FD
 y=J.U6(z)
-z=new K.O1(J.bI(y.gB(z),1),y.grZ(z))
+z=new K.Aep(J.bI(y.gB(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-$asmW:function(a){return[[K.O1,a]]},
-$asQV:function(a){return[[K.O1,a]]}},
-kd:{
+$asmW:function(a){return[[K.Aep,a]]},
+$asQV:function(a){return[[K.Aep,a]]}},
+vR:{
 "^":"Anv;FU,vk,Uh",
 gl:function(){return this.Uh},
 G:function(){var z=this.FU
-if(z.G()){this.Uh=H.VM(new K.O1(this.vk++,z.gl()),[null])
+if(z.G()){this.Uh=H.VM(new K.Aep(this.vk++,z.gl()),[null])
 return!0}this.Uh=null
 return!1},
-$asAnv:function(a){return[[K.O1,a]]}}}],["","",,Y,{
+$asAnv:function(a){return[[K.Aep,a]]}}}],["","",,Y,{
 "^":"",
-Ox: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}},
-PnY:{
+qS:{
 "^":"a;fY>,P>,G8<",
-bu:[function(a){return"("+this.fY+", '"+H.d(this.P)+"')"},"$0","gCR",0,0,73],
-$isPnY:true},
-hc6:{
+bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gCR",0,0,73],
+$isqS:true},
+dd:{
 "^":"a;Bv,Lz,LP,pV",
 zl:function(){var z,y,x,w,v,u,t,s
 z=this.LP
@@ -17912,21 +17946,21 @@
 this.pV=x
 if(typeof x!=="number")return H.s(x)
 if(48<=x&&x<=57)this.e1()
-else y.push(new Y.PnY(3,".",11))}else if(x===44){this.pV=z.G()?z.ft:null
-y.push(new Y.PnY(4,",",0))}else if(x===58){this.pV=z.G()?z.ft:null
-y.push(new Y.PnY(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.pV
+else y.push(new Y.qS(3,".",11))}else if(x===44){this.pV=z.G()?z.ft:null
+y.push(new Y.qS(4,",",0))}else if(x===58){this.pV=z.G()?z.ft:null
+y.push(new Y.qS(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.pV
 x=z.G()?z.ft:null
 this.pV=x
 if(C.Nm.tg(C.bg,x)){x=this.pV
-u=H.LY([v,x])
+u=H.eT([v,x])
 if(C.Nm.tg(C.ip,u)){x=z.G()?z.ft:null
 this.pV=x
 if(x===61)x=v===33||v===61
 else x=!1
 if(x){t=u+"="
 this.pV=z.G()?z.ft:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
-y.push(new Y.PnY(8,t,C.w0.t(0,t)))}else if(C.Nm.tg(C.ML,this.pV)){s=H.mx(this.pV)
-y.push(new Y.PnY(9,s,C.w0.t(0,s)))
+y.push(new Y.qS(8,t,C.w0.t(0,t)))}else if(C.Nm.tg(C.iq,this.pV)){s=H.mx(this.pV)
+y.push(new Y.qS(9,s,C.w0.t(0,s)))
 this.pV=z.G()?z.ft:null}else this.pV=z.G()?z.ft:null}return y},
 DS:function(){var z,y,x,w
 z=this.pV
@@ -17937,11 +17971,10 @@
 if(x===92){x=y.G()?y.ft:null
 this.pV=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
-x=H.mx(Y.Ox(x))
+x=H.mx(Y.wX(x))
 w.IN+=x}else{x=H.mx(x)
 w.IN+=x}x=y.G()?y.ft:null
-this.pV=x}x=w.IN
-this.Bv.push(new Y.PnY(1,x.charCodeAt(0)==0?x:x,0))
+this.pV=x}this.Bv.push(new Y.qS(1,w.IN,0))
 w.IN=""
 this.pV=y.G()?y.ft:null},
 y3:function(){var z,y,x,w,v
@@ -17955,11 +17988,10 @@
 if(!w)break
 x=H.mx(x)
 y.IN+=x
-this.pV=z.G()?z.ft:null}z=y.IN
-v=z.charCodeAt(0)==0?z:z
+this.pV=z.G()?z.ft:null}v=y.IN
 z=this.Bv
-if(C.Nm.tg(C.jY,v))z.push(new Y.PnY(10,v,0))
-else z.push(new Y.PnY(2,v,0))
+if(C.Nm.tg(C.jY,v))z.push(new Y.qS(10,v,0))
+else z.push(new Y.qS(2,v,0))
 y.IN=""},
 jj:function(){var z,y,x,w
 z=this.LP
@@ -17974,8 +18006,7 @@
 this.pV=z
 if(typeof z!=="number")return H.s(z)
 if(48<=z&&z<=57)this.e1()
-else this.Bv.push(new Y.PnY(3,".",11))}else{z=y.IN
-this.Bv.push(new Y.PnY(6,z.charCodeAt(0)==0?z:z,0))
+else this.Bv.push(new Y.qS(3,".",11))}else{this.Bv.push(new Y.qS(6,y.IN,0))
 y.IN=""}},
 e1:function(){var z,y,x,w
 z=this.Lz
@@ -17987,13 +18018,12 @@
 if(!w)break
 x=H.mx(x)
 z.IN+=x
-this.pV=y.G()?y.ft:null}y=z.IN
-this.Bv.push(new Y.PnY(7,y.charCodeAt(0)==0?y:y,0))
+this.pV=y.G()?y.ft:null}this.Bv.push(new Y.qS(7,z.IN,0))
 z.IN=""}},
-Em:{
+hAN:{
 "^":"a;G1>",
 bu:[function(a){return"ParseException: "+this.G1},"$0","gCR",0,0,73],
-static:{RV:function(a){return new Y.Em(a)}}}}],["","",,S,{
+static:{RV:function(a){return new Y.hAN(a)}}}}],["","",,S,{
 "^":"",
 P55:{
 "^":"a;",
@@ -18002,7 +18032,7 @@
 "^":"P55;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
-Hs:function(a){a.ep.RR(0,this)
+Hs:function(a){a.o2.RR(0,this)
 this.xn(a)},
 Ci:function(a){J.okV(a.gZs(),this)
 this.xn(a)},
@@ -18011,14 +18041,14 @@
 this.xn(a)},
 Y7:function(a){var z
 J.okV(a.gZs(),this)
-if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
 this.xn(a)},
-la:function(a){this.xn(a)},
+I6W:function(a){this.xn(a)},
 Zh:function(a){var z
-for(z=a.glm(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
+for(z=a.gBx(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
 this.xn(a)},
 o0:function(a){var z
-for(z=a.gJq(a),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
+for(z=a.gJq(a),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
 this.xn(a)},
 YV:function(a){J.okV(a.gnl(a),this)
 J.okV(a.gv4(),this)
@@ -18027,31 +18057,31 @@
 ex:function(a){J.okV(a.gBb(a),this)
 J.okV(a.gT8(a),this)
 this.xn(a)},
-zPR:function(a){J.okV(a.gep(),this)
+kb:function(a){J.okV(a.go2(),this)
 this.xn(a)},
 RD:function(a){J.okV(a.gdc(),this)
 J.okV(a.gav(),this)
-J.okV(a.gHy(),this)
+J.okV(a.geE(),this)
 this.xn(a)},
-kz:function(a){a.Bb.RR(0,this)
+ky:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)},
-pg:function(a){a.Bb.RR(0,this)
+eS:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)}}}],["","",,T,{
 "^":"",
 ov:{
-"^":"V54;oX,t7,fI,Fd,hX,He,xo,ZJ,PZ,Kf,Nf,D6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gtu:function(a){return a.oX},
-stu:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
+"^":"V54;Ny,t7,fI,Fd,cI,He,xo,ZJ,PZ,Kf,Nf,D6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gtu:function(a){return a.Ny},
+stu:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
 gfg:function(a){return a.t7},
 sfg:function(a,b){a.t7=this.ct(a,C.A7,a.t7,b)},
-gX7:function(a){return a.fI},
-sX7:function(a,b){a.fI=this.ct(a,C.vY,a.fI,b)},
+gGV:function(a){return a.fI},
+sGV:function(a,b){a.fI=this.ct(a,C.vY,a.fI,b)},
 gLf:function(a){return a.Fd},
 sLf:function(a,b){a.Fd=this.ct(a,C.IT,a.Fd,b)},
-gJb:function(a){return a.hX},
-sJb:function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},
+gMl:function(a){return a.cI},
+sMl:function(a,b){a.cI=this.ct(a,C.Gr,a.cI,b)},
 gML:function(a){return a.He},
 sML:function(a,b){a.He=this.ct(a,C.kI,a.He,b)},
 gxT:function(a){return a.xo},
@@ -18062,45 +18092,45 @@
 sTj:function(a,b){a.PZ=this.ct(a,C.uG,a.PZ,b)},
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-qV:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
-vr:function(a){var z,y
+Nn:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
+W7:function(a){var z,y
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#line-"+H.d(a.He))
 if(z!=null){y=!!z.scrollIntoViewIfNeeded
 if(y)z.scrollIntoViewIfNeeded()
 else z.scrollIntoView()}},
-pLm:[function(a,b,c){this.vr(a)},"$2","gcL",4,0,202,203,204],
+qA:[function(a,b,c){this.W7(a)},"$2","giH",4,0,202,203,204],
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector(".sourceTable")
-if(z!=null){y=W.Ws(this.gcL(a))
+if(z!=null){y=W.Ws(this.giH(a))
 a.Nf=y
 C.S2.OT(y,z,!0)}},
-dQ:function(a){var z=a.Nf
+Lx:function(a){var z=a.Nf
 if(z!=null){z.disconnect()
-a.Nf=null}Z.uL.prototype.dQ.call(this,a)},
+a.Nf=null}Z.uL.prototype.Lx.call(this,a)},
 mN:[function(a,b){this.Um(a)
-this.vr(a)},"$1","goL",2,0,19,59],
-Yo:[function(a,b){this.Um(a)},"$1","gLe",2,0,19,59],
-Ti:[function(a,b){this.Um(a)},"$1","gRq",2,0,19,59],
+this.W7(a)},"$1","goL",2,0,19,59],
+KC:[function(a,b){this.Um(a)},"$1","giB",2,0,19,59],
+Ti:[function(a,b){this.Um(a)},"$1","gP3",2,0,19,59],
 Vj:[function(a,b){this.Um(a)},"$1","gcY",2,0,19,59],
 Um:function(a){var z,y,x
 a.PZ=this.ct(a,C.uG,a.PZ,!1)
 if(a.D6!=null)return
-z=a.oX
+z=a.Ny
 if(z==null)return
-if(J.iS(z)!==!0){a.D6=J.SK(a.oX).ml(new T.oEe(a))
+if(J.iS(z)!==!0){a.D6=J.SK(a.Ny).ml(new T.Es(a))
 return}z=a.Fd
-z=z!=null?a.oX.q6(z):1
+z=z!=null?a.Ny.q6(z):1
 a.xo=this.ct(a,C.nt,a.xo,z)
 z=a.fI
-z=z!=null?a.oX.q6(z):null
+z=z!=null?a.Ny.q6(z):null
 a.He=this.ct(a,C.kI,a.He,z)
-z=a.hX
-y=a.oX
+z=a.cI
+y=a.Ny
 z=z!=null?y.q6(z):J.q8(J.de(y))
 a.ZJ=this.ct(a,C.vs,a.ZJ,z)
-J.U2(a.Kf)
-for(x=J.bI(a.xo,1);z=J.Wx(x),z.E(x,J.bI(a.ZJ,1));x=z.g(x,1))J.dH(a.Kf,J.UQ(J.de(a.oX),x))
+J.Z8(a.Kf)
+for(x=J.bI(a.xo,1);z=J.Wx(x),z.E(x,J.bI(a.ZJ,1));x=z.g(x,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),x))
 a.PZ=this.ct(a,C.uG,a.PZ,!0)},
 static:{Zz:function(a){var z,y,x,w,v
 z=R.tB([])
@@ -18112,27 +18142,27 @@
 a.t7=null
 a.PZ=!1
 a.Kf=z
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.vy.LX(a)
-C.vy.XI(a)
+C.za.LX(a)
+C.za.XI(a)
 return a}}},
 V54:{
 "^":"uL+Pi;",
 $isd3:true},
-oEe:{
+Es:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0){z.D6=null
-J.TR(z)}},"$1",null,2,0,null,13,"call"],
+if(J.iS(z.Ny)===!0){z.D6=null
+J.XP(z)}},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 vr:{
-"^":"V55;X9,pL,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V55;X9,pL,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRd:function(a){return a.X9},
 sRd:function(a,b){a.X9=this.ct(a,C.VI,a.X9,b)},
 gO9:function(a){return a.pL},
@@ -18143,8 +18173,8 @@
 a.pL=this.ct(a,C.S4,z,!0)
 z=a.X9.gqr()
 y=a.X9
-if(z==null)J.wg(J.fx(y)).PI(J.fx(a.X9),J.f2(a.X9)).ml(new T.eE(a))
-else J.wg(J.fx(y)).Xu(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,49,50,85],
+if(z==null)J.aT(J.zE(y)).G5(J.zE(a.X9),J.f2(a.X9)).ml(new T.eE(a))
+else J.aT(J.zE(y)).Xu(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,49,50,85],
 static:{aed:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -18152,7 +18182,7 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.pL=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -18168,22 +18198,22 @@
 eE:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-z.pL=J.Q5(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
+z.pL=J.NB(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 b3:{
 "^":"TpZ:12;b",
 $1:[function(a){var z=this.b
-z.pL=J.Q5(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
+z.pL=J.NB(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true}}],["","",,A,{
 "^":"",
 kn:{
-"^":"oEY;jJ,Vg,ij,tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"oEY;jJ,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gBV:function(a){return a.jJ},
 sBV:function(a,b){a.jJ=this.ct(a,C.tW,a.jJ,b)},
 gJp:function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gJp.call(this,a)
-return z.gzz()},
-J4:[function(a,b){this.at(a,null)},"$1","gUv",2,0,19,59],
+return z.gTE()},
+fX:[function(a,b){this.at(a,null)},"$1","glD",2,0,19,59],
 at:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
 this.ct(a,C.Fh,0,1)}},"$1","gRy",2,0,19,13],
@@ -18204,23 +18234,23 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.jJ=-1
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Mh.LX(a)
-C.Mh.XI(a)
+C.Wa.LX(a)
+C.Wa.XI(a)
 return a}}},
 oEY:{
 "^":"xI+Pi;",
 $isd3:true}}],["","",,U,{
 "^":"",
 fI:{
-"^":"V56;Uz,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V56;Uz,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gtu:function(a){return a.Uz},
 stu:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
 Es:function(a){var z
@@ -18229,14 +18259,14 @@
 if(z==null)return
 J.SK(z)},
 pA:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,19,102],
-Da:[function(a,b){J.y9(a.Uz).wM(b)},"$1","gDX",2,0,19,102],
-static:{Ln:function(a){var z,y,x,w
+m4:[function(a,b){J.y9(a.Uz).wM(b)},"$1","gDX",2,0,19,102],
+static:{TXt:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -18250,8 +18280,8 @@
 "^":"uL+Pi;",
 $isd3:true}}],["","",,D,{
 "^":"",
-Xm:[function(a,b){return J.FW(J.DA(a),J.DA(b))},"$2","Br",4,0,72],
-Ep:function(a){switch(a){case"BoundedType":case"Instance":case"List":case"String":case"Type":case"TypeParameter":case"TypeRef":case"bool":case"double":case"int":case"null":return!0
+Xm:[function(a,b){return J.FW(J.DA(a),J.DA(b))},"$2","E0",4,0,72],
+dV:function(a){switch(a){case"BoundedType":case"Instance":case"List":case"String":case"Type":case"TypeParameter":case"TypeRef":case"bool":case"double":case"int":case"null":return!0
 default:return!1}},
 rO:function(a){switch(a){case"BoundedType":case"Type":case"TypeParameter":case"TypeRef":return!0
 default:return!1}},
@@ -18259,7 +18289,7 @@
 if(b==null)return
 z=J.U6(b)
 z=z.t(b,"id")!=null&&z.t(b,"type")!=null
-if(!z)N.QM("").YX("Malformed service object: "+H.d(b))
+if(!z)N.QM("").hh("Malformed service object: "+H.d(b))
 z=J.U6(b)
 y=z.t(b,"type")
 x=J.Qe(y)
@@ -18287,7 +18317,7 @@
 t.$builtinTypeInfo=[z]
 t=new Q.wn(null,null,t,null,null)
 t.$builtinTypeInfo=[z]
-s=new D.dy(null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.qp(0,0,null,null),new D.qp(0,0,null,null)),new D.Iy(new D.qp(0,0,null,null),new D.qp(0,0,null,null)),new D.qp(0,0,null,null),x,v,null,u,t,null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.dy(null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.mT(0,0,null,null),x,v,null,u,t,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 case"Code":z=[]
 z.$builtinTypeInfo=[D.ta]
@@ -18344,7 +18374,7 @@
 p.$builtinTypeInfo=[r]
 p=new Q.wn(null,null,p,null,null)
 p.$builtinTypeInfo=[r]
-r=P.L5(null,null,null,P.qU,P.CP)
+r=P.L5(null,null,null,P.qU,P.Vf)
 r=R.tB(r)
 o=P.qU
 n=D.YX
@@ -18383,12 +18413,12 @@
 r.$builtinTypeInfo=[z]
 s=new D.U4(null,x,v,u,t,r,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"Object":switch(w){case"PcDescriptors":z=D.xb
+case"Object":switch(w){case"PcDescriptors":z=D.Z9
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-s=new D.hn(null,null,x,null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.Hx(null,null,x,null,null,a,null,null,null,!1,null,null,null,null,null)
 z=$.oK
 if(z==null)H.qw("created PcDescriptors.")
 else z.$1("created PcDescriptors.")
@@ -18400,7 +18430,7 @@
 x.$builtinTypeInfo=[z]
 s=new D.Mi(null,null,x,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"TokenStream":s=new D.Ik(null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"TokenStream":s=new D.RA(null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 default:s=null}break
 case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
@@ -18418,14 +18448,14 @@
 break
 case"Socket":s=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-default:s=D.Ep(y)||J.xC(y,"Sentinel")?new D.uq(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null):null
+default:s=D.dV(y)||J.xC(y,"Sentinel")?new D.uq(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null):null
 break}if(s==null){z=new V.qC(P.YM(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
 s=new D.vO(z,a,null,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
-vQ:function(a){if(a.gHh())return
+UW:function(a){if(a.gHh())return
 return a},
-D5:function(a){var z
+bF: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},
@@ -18435,7 +18465,7 @@
 else if(!!z.$iswn)D.f3(a,b)},
 Gf:function(a,b){a.aN(0,new D.Qf(a,b))},
 f3:function(a,b){var z,y,x,w,v,u
-for(z=a.xN,y=0;y<z.length;++y){x=z[y]
+for(z=a.XG,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
 v=!!w.$isqC
 if(v)u=w.t(x,"id")!=null&&w.t(x,"type")!=null
@@ -18445,39 +18475,39 @@
 else if(v)D.Gf(x,b)}},
 af:{
 "^":"Pi;bN@,GR@",
-gXP:function(){return this.V0},
-gwv:function(a){return J.wp(this.V0)},
-god:function(a){return J.wg(this.V0)},
-gjO:function(a){return this.r0},
+gXP:function(){return this.x8},
+gwv:function(a){return J.wp(this.x8)},
+god:function(a){return J.aT(this.x8)},
+gjO:function(a){return this.TU},
 gt5:function(a){return this.oU},
 gdr:function(){return this.JK},
 glO:function(){return D.rO(this.oU)},
 gFY:function(){return J.xC(this.oU,"bool")},
 gzx:function(){return J.xC(this.oU,"double")},
 gt3:function(){return J.xC(this.oU,"Error")},
-gNs:function(){return D.Ep(this.oU)},
+gNs:function(){return D.dV(this.oU)},
 gSO:function(){return J.xC(this.oU,"int")},
 gK4:function(a){return J.xC(this.oU,"List")},
 gHh:function(){return J.xC(this.oU,"null")},
 gl5:function(){return J.xC(this.oU,"Sentinel")},
 gu7:function(){return J.xC(this.oU,"String")},
-gOC:function(){return J.xC(this.JK,"MirrorReference")},
+gJE:function(){return J.xC(this.JK,"MirrorReference")},
 gl2:function(){return J.xC(this.JK,"WeakProperty")},
 gBF:function(){return!1},
 gXM:function(){return J.xC(this.oU,"Instance")&&!J.xC(this.JK,"MirrorReference")&&!J.xC(this.JK,"WeakProperty")&&!this.gBF()},
-gPj:function(a){return this.V0.YC(this.r0)},
-gox:function(a){return this.ks},
+gPj:function(a){return this.x8.YC(this.TU)},
+gox:function(a){return this.qu},
 gjm:function(){return!1},
 gM8:function(){return!1},
 goc:function(a){return this.gbN()},
 soc:function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},
-gzz:function(){return this.gGR()},
-szz:function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},
-xW:function(a){if(this.ks)return P.Ab(this,null)
+gTE:function(){return this.gGR()},
+sTE:function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},
+xW:function(a){if(this.qu)return P.Ab(this,null)
 return this.VD(0)},
 VD:function(a){var z
-if(J.xC(this.r0,""))return P.Ab(this,null)
-if(this.ks&&this.gM8())return P.Ab(this,null)
+if(J.xC(this.TU,""))return P.Ab(this,null)
+if(this.qu&&this.gM8())return P.Ab(this,null)
 z=this.mQ
 if(z==null){z=this.gwv(this).jU(this.gPj(this)).ml(new D.n1(this)).wM(new D.jI(this))
 this.mQ=z}return z},
@@ -18487,13 +18517,13 @@
 x=z.t(a,"type")
 w=J.Qe(x)
 if(w.nC(x,"@"))x=w.yn(x,1)
-w=this.r0
-if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
+w=this.TU
+if(w!=null&&!J.xC(w,z.t(a,"id")));this.TU=z.t(a,"id")
 this.oU=x
 if(z.NZ(a,"_vmType")===!0){z=z.t(a,"_vmType")
 w=J.Qe(z)
 this.JK=w.nC(z,"@")?w.yn(z,1):z}else this.JK=this.oU
-this.bF(0,a,y)},
+this.R5(0,a,y)},
 YC:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,172,205],
 $isaf:true},
 n1:{
@@ -18513,17 +18543,17 @@
 $isEH:true},
 boh:{
 "^":"a;",
-qe:function(a){J.Me(a,new D.u9(this))},
-lh:[function(a){return this.gwv(this).jU(this.YC("coverage")).ml(new D.TCE(this))},"$0","gDX",0,0,208]},
-u9:{
+O5:function(a){J.Me(a,new D.P5(this))},
+lh:[function(a){return this.gwv(this).jU(this.YC("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,208]},
+P5:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
 z.t(a,"script").lV(z.t(a,"hits"))},"$1",null,2,0,null,209,"call"],
 $isEH:true},
-TCE:{
+Rv:{
 "^":"TpZ:207;a",
 $1:[function(a){var z=this.a
-z.qe(D.Nl(J.xC(z.gt5(z),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,206,"call"],
+z.O5(D.Nl(J.xC(z.gt5(z),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,206,"call"],
 $isEH:true},
 xm:{
 "^":"af;"},
@@ -18533,27 +18563,27 @@
 god:function(a){return},
 gi2:function(){var z=this.Qi
 return z.gUQ(z)},
-gPj:function(a){return H.d(this.r0)},
+gPj:function(a){return H.d(this.TU)},
 YC:[function(a){return H.d(a)},"$1","gua",2,0,172,205],
 gYe:function(a){return this.Ox},
 gI2:function(){return this.RW},
 gA3:function(){return this.Ts},
 gdW:function(){return this.Va},
-gU6:function(){return this.h7},
-gJW:function(){return this.jA},
+gU6:function(){return this.kU},
+gJW:function(){return this.l7},
 hQ:function(a,b){var z,y,x,w
 z={}
 z.a=null
 try{y=this.hb(a)
 z.a=y
-if(b!=null)J.qQ(y,"_data",b)}catch(x){H.Ru(x)
-N.QM("").YX("Ignoring malformed event message: "+H.d(a))
-return}if(!J.xC(J.UQ(z.a,"type"),"ServiceEvent")){N.QM("").YX("Expected 'ServiceEvent' but found '"+H.d(J.UQ(z.a,"type"))+"'")
+if(b!=null)J.kW(y,"_data",b)}catch(x){H.Ru(x)
+N.QM("").hh("Ignoring malformed event message: "+H.d(a))
+return}if(!J.xC(J.UQ(z.a,"type"),"ServiceEvent")){N.QM("").hh("Expected 'ServiceEvent' but found '"+H.d(J.UQ(z.a,"type"))+"'")
 return}w=J.UQ(J.UQ(z.a,"isolate"),"id")
-this.wD(w).ml(new D.mT(z,this,w))},
+this.wD(w).ml(new D.jy(z,this,w))},
 EM:function(a){return this.hQ(a,null)},
 BC:function(a){var z,y,x,w
-z=$.r0().R4(0,a)
+z=$.rc().R4(0,a)
 if(z==null)return
 y=z.pX
 x=y.input
@@ -18563,7 +18593,7 @@
 if(typeof y!=="number")return H.s(y)
 return C.yo.yn(x,w+y)},
 ZS:function(a){var z,y,x
-z=$.jN().R4(0,a)
+z=$.fA().R4(0,a)
 if(z==null)return""
 y=z.pX
 x=y.index
@@ -18576,42 +18606,42 @@
 if(J.xC(a,""))return P.Ab(null,null)
 z=this.Qi.t(0,a)
 if(z!=null)return P.Ab(z,null)
-return this.VD(0).ml(new D.wU(this,a))},
+return this.VD(0).ml(new D.MZ(this,a))},
 cv:function(a){var z,y,x
 if(J.co(a,"isolates/")){z=this.ZS(a)
 y=this.BC(a)
-return this.wD(z).ml(new D.kk(this,y))}x=this.uj.t(0,a)
+return this.wD(z).ml(new D.aEE(this,y))}x=this.uj.t(0,a)
 if(x!=null)return J.LE(x)
-return this.jU(a).ml(new D.it(this,a))},
-nJ:[function(a,b){return b},"$2","gS6",4,0,81],
+return this.jU(a).ml(new D.oew(this,a))},
+B5:[function(a,b){return b},"$2","gJ2",4,0,81],
 hb:function(a){var z,y,x
 z=null
-try{y=new P.Mx(this.gS6())
-z=P.jc(a,y.gJ2())}catch(x){H.Ru(x)
+try{y=new P.c5(this.gJ2())
+z=P.jc(a,y.gFs())}catch(x){H.Ru(x)
 return}return R.tB(z)},
 OJ:function(a){var z
-if(!D.D5(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
-return P.t5(D.Nl(this,R.tB(z)),null,null)}z=J.U6(a)
-if(J.xC(z.t(a,"type"),"ServiceError"))return P.t5(D.Nl(this,a),null,null)
-else if(J.xC(z.t(a,"type"),"ServiceException"))return P.t5(D.Nl(this,a),null,null)
+if(!D.bF(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
+return P.pz(D.Nl(this,R.tB(z)),null,null)}z=J.U6(a)
+if(J.xC(z.t(a,"type"),"ServiceError"))return P.pz(D.Nl(this,a),null,null)
+else if(J.xC(z.t(a,"type"),"ServiceException"))return P.pz(D.Nl(this,a),null,null)
 return P.Ab(a,null)},
 jU:function(a){return this.z6(0,a).ml(new D.zA(this,a)).pU(new D.tm(this),new D.mR()).pU(new D.hc(this),new D.pa())},
-bF:function(a,b,c){var z,y
+R5:function(a,b,c){var z,y
 if(c)return
-this.ks=!0
+this.qu=!0
 z=J.U6(b)
 y=z.t(b,"version")
 this.Ox=F.Wi(this,C.zn,this.Ox,y)
 y=z.t(b,"architecture")
-this.GY=F.Wi(this,C.ke,this.GY,y)
+this.GY=F.Wi(this,C.US,this.GY,y)
 y=z.t(b,"uptime")
 this.RW=F.Wi(this,C.mh,this.RW,y)
 y=P.Wu(H.BU(z.t(b,"date"),null,null),!1)
-this.jA=F.Wi(this,C.GI,this.jA,y)
+this.l7=F.Wi(this,C.GI,this.l7,y)
 y=z.t(b,"assertsEnabled")
 this.Ts=F.Wi(this,C.ET,this.Ts,y)
 y=z.t(b,"pid")
-this.h7=F.Wi(this,C.uI,this.h7,y)
+this.kU=F.Wi(this,C.uI,this.kU,y)
 y=z.t(b,"typeChecksEnabled")
 this.Va=F.Wi(this,C.J2,this.Va,y)
 this.y8(z.t(b,"isolates"))},
@@ -18624,7 +18654,7 @@
 if(u!=null)y.u(0,v,u)
 else{u=D.Nl(this,w)
 y.u(0,v,u)
-N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.Yu())
+N.QM("").To("New isolate '"+H.d(u.TU)+"'")}}y.aN(0,new D.Yu())
 this.Qi=y},
 Lw:function(){this.bN=this.ct(this,C.YS,this.bN,"vm")
 this.GR=this.ct(this,C.KS,this.GR,"vm")
@@ -18635,21 +18665,21 @@
 O1w:{
 "^":"xm+Pi;",
 $isd3:true},
-mT:{
+jy:{
 "^":"TpZ:12;a,b,c",
 $1:[function(a){var z,y
-if(a==null)N.QM("").YX("Ignoring event with unknown isolate id: "+H.d(this.c))
+if(a==null)N.QM("").hh("Ignoring event with unknown isolate id: "+H.d(this.c))
 else{z=D.Nl(a,this.a.a)
 y=this.b.Rk
 if(y.YM>=4)H.vh(y.Pq())
 y.MW(z)}},"$1",null,2,0,null,210,"call"],
 $isEH:true},
-wU:{
+MZ:{
 "^":"TpZ:12;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
 return this.a.Qi.t(0,this.b)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-kk:{
+aEE:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z
 if(a==null)return this.a
@@ -18657,7 +18687,7 @@
 if(z==null)return J.LE(a)
 else return a.cv(z)},"$1",null,2,0,null,6,"call"],
 $isEH:true},
-it:{
+oew:{
 "^":"TpZ:207;c,d",
 $1:[function(a){var z,y
 z=this.c
@@ -18674,8 +18704,8 @@
 $1:[function(a){var z,y,x
 z=this.a
 y=z.hb(a)
-x=$.hm
-if(x!=null)x.AS(0,"Received response for "+H.d(this.b),y)
+x=$.ax
+if(x!=null)x.ab(0,"Received response for "+H.d(this.b),y)
 return z.OJ(y)},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 tm:{
@@ -18683,7 +18713,7 @@
 $1:[function(a){var z=this.c.G2
 if(z.YM>=4)H.vh(z.Pq())
 z.MW(a)
-return P.t5(a,null,null)},"$1",null,2,0,null,23,"call"],
+return P.pz(a,null,null)},"$1",null,2,0,null,23,"call"],
 $isEH:true},
 mR:{
 "^":"TpZ:12;",
@@ -18694,7 +18724,7 @@
 $1:[function(a){var z=this.d.Li
 if(z.YM>=4)H.vh(z.Pq())
 z.MW(a)
-return P.t5(a,null,null)},"$1",null,2,0,null,90,"call"],
+return P.pz(a,null,null)},"$1",null,2,0,null,90,"call"],
 $isEH:true},
 pa:{
 "^":"TpZ:12;",
@@ -18713,7 +18743,7 @@
 v=z[x]
 if(typeof v!=="number")return H.s(v)
 this.jf=w+v}},
-dS:function(a,b){var z,y,x,w,v,u,t
+pg:function(a,b){var z,y,x,w,v,u,t
 for(z=this.XE,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
 if(v>=w)return H.e(b,v)
 u=J.bI(u,b[v])
@@ -18721,7 +18751,7 @@
 t=this.jf
 if(typeof u!=="number")return H.s(u)
 this.jf=t+u}},
-q9:[function(a,b){var z,y,x,w,v,u
+k5:[function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
 y=this.XE
 x=y.length
@@ -18736,13 +18766,13 @@
 for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
 tL:{
-"^":"a;fJ<,Fw<,u1,Ob,Eq,kL",
+"^":"a;af<,Fw<,u1,Ob,Eq,kL",
 gvh:function(){return this.u1},
 Qv:function(a,b){var z,y,x,w,v,u
 this.u1=a
 z=J.U6(b)
 y=z.t(b,"counters")
-x=this.fJ
+x=this.af
 if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
 this.kL=J.q8(z.t(b,"counters"))
 for(z=this.Eq,x=this.Fw,w=0;w<z;++w){v=this.kL
@@ -18764,23 +18794,23 @@
 z=Array(z)
 z.fixed$length=init
 u=new D.ER(a,H.VM(z,[P.KN]),0)
-u.dS(y,this.Ob.XE)
-this.Ob.q9(0,y)
+u.pg(y,this.Ob.XE)
+this.Ob.k5(0,y)
 z=this.Fw
 z.push(u)
 if(z.length>this.Eq)C.Nm.W4(z,0)}},
 eK:{
-"^":"Pi;Ev,ob,j8,yp,Og,hu,Vg,ij",
-gSU:function(){return this.Ev},
-gbZ:function(){return this.ob},
+"^":"Pi;zd,ob,j8,yp,Og,hu,Vg,fn",
+gSU:function(){return this.zd},
+gkV:function(){return this.ob},
 gMX:function(){return this.j8},
 gYk:function(){return this.yp},
 gpy:function(){return this.Og},
-gUH:function(){return this.hu},
+gqZ:function(){return this.hu},
 eC:function(a){var z,y
 z=J.U6(a)
 y=z.t(a,"used")
-this.Ev=F.Wi(this,C.LP,this.Ev,y)
+this.zd=F.Wi(this,C.LP,this.zd,y)
 y=z.t(a,"capacity")
 this.ob=F.Wi(this,C.bV,this.ob,y)
 y=z.t(a,"external")
@@ -18792,28 +18822,28 @@
 z=z.t(a,"avgCollectionPeriodMillis")
 this.hu=F.Wi(this,C.BE,this.hu,z)}},
 bv:{
-"^":"bvc;V3,Jr,EY,eU,yP,XV,uj,KJ,h0,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,SF,Y8,UY<,xQ<,Q2H,yv,qo<,yA,Ac,iD<,hz,pG<,Sn<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
-gwv:function(a){return this.V0},
+"^":"bvc;V3,Jr,EY,eU,yP,XV,uj,KJ,Wm,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,cL,Y8,UY<,xQ<,Q2H,yv,qo<,n5,l9,iD<,hz,pG<,Sn<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+gwv:function(a){return this.x8},
 god:function(a){return this},
 gXE:function(a){return this.V3},
 sXE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
-gPj:function(a){return"/"+H.d(this.r0)},
+gPj:function(a){return"/"+H.d(this.TU)},
 gBP:function(a){return this.Jr},
-gLd:function(){return this.EY},
+gGL:function(){return this.EY},
 gaj:function(){return this.eU},
 gn0:function(){return this.yP},
-YC:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gua",2,0,172,205],
-f9:function(a){var z,y,x,w
+YC:[function(a){return"/"+H.d(this.TU)+"/"+H.d(a)},"$1","gua",2,0,172,205],
+N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
 for(x=J.mY(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
-this.Id()
-this.qx(a,z)
+this.I1()
+this.nN(a,z)
 w=y.t(a,"exclusive_trie")
 if(w!=null)this.qo=this.Jm(w,z)},
-Id:function(){var z=this.uj
-z.gUQ(z).aN(0,new D.S0())},
-qx:function(a,b){var z,y,x,w
+I1:function(){var z=this.uj
+z.gUQ(z).aN(0,new D.TV())},
+nN:function(a,b){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"codes")
 x=z.t(a,"samples")
@@ -18824,17 +18854,17 @@
 z=[]
 for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
 w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.hz(z,!1)},"$1","gLG",2,0,213,214],
+if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","gLG",2,0,213,214],
 lKe:[function(a){var z,y,x,w
 z=this.AI
 z.V1(z)
-this.h0=F.Wi(this,C.as,this.h0,null)
+this.Wm=F.Wi(this,C.jo,this.Wm,null)
 for(y=J.mY(a);y.G();){x=y.gl()
 if(x.gAY()==null)z.h(0,x)
-if(J.xC(x.gzz(),"Object")&&J.xC(x.geh(),!1)){w=this.h0
-if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.as,w,x)
+if(J.xC(x.gTE(),"Object")&&J.xC(x.geh(),!1)){w=this.Wm
+if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.jo,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.h0=x}}return P.Ab(this.h0,null)},"$1","gHB",2,0,215,216],
+this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gHB",2,0,215,216],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -18846,25 +18876,25 @@
 return x},
 cv:function(a){var z=this.uj.t(0,a)
 if(z!=null)return J.LE(z)
-return this.V0.jU("/"+H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gDZ:function(){return this.h0},
+return this.x8.jU("/"+H.d(this.TU)+"/"+H.d(a)).ml(new D.KQ(this,a))},
+gDZ:function(){return this.Wm},
 gVc:function(){return this.v9},
 sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
-gpd:function(){return this.tW},
+gvU:function(){return this.tW},
 gkw:function(){return this.zb},
 goc:function(a){return this.KT},
 soc:function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},
-gzz:function(){return this.f5},
-szz:function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},
+gTE:function(){return this.f5},
+sTE:function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},
 gIT:function(){return this.i9},
-gw2:function(){return this.SF},
-sw2:function(a){this.SF=F.Wi(this,C.tP,this.SF,a)},
+gw2:function(){return this.cL},
+sw2:function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},
 gkc:function(a){return this.yv},
 skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
-WU:function(a){var z=J.U6(a)
+Bs:function(a){var z=J.U6(a)
 this.UY.eC(z.t(a,"new"))
 this.xQ.eC(z.t(a,"old"))},
-bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+R5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z=J.U6(b)
 y=z.t(b,"mainPort")
 this.i9=F.Wi(this,C.wT,this.i9,y)
@@ -18873,15 +18903,15 @@
 y=z.t(b,"name")
 this.f5=F.Wi(this,C.KS,this.f5,y)
 if(c)return
-this.ks=!0
+this.qu=!0
 this.yP=F.Wi(this,C.DY,this.yP,!1)
 this.Xb()
 D.kT(b,this)
-if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heaps")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
+if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heaps")==null){N.QM("").hh("Malformed 'Isolate' response: "+H.d(b))
 return}y=z.t(b,"rootLib")
 this.v9=F.Wi(this,C.eN,this.v9,y)
 if(z.t(b,"entry")!=null){y=z.t(b,"entry")
-this.SF=F.Wi(this,C.tP,this.SF,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
+this.cL=F.Wi(this,C.tP,this.cL,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
 this.zb=F.Wi(this,C.bc,this.zb,y)}else this.zb=F.Wi(this,C.bc,this.zb,null)
 x=z.t(b,"tagCounters")
 if(x!=null){y=J.U6(x)
@@ -18903,13 +18933,13 @@
 while(!0){s=y.gB(w)
 if(typeof s!=="number")return H.s(s)
 if(!(t<s))break
-J.qQ(this.V3,y.t(w,t),"0.0%");++t}}else{s=J.U6(w)
+J.kW(this.V3,y.t(w,t),"0.0%");++t}}else{s=J.U6(w)
 t=0
 while(!0){r=s.gB(w)
 if(typeof r!=="number")return H.s(r)
 if(!(t<r))break
-J.qQ(this.V3,s.t(w,t),C.CD.Sy(J.X9(y.t(v,t),u)*100,2)+"%");++t}}}q=P.Fl(null,null)
-J.Me(z.t(b,"timers"),new D.dn(q))
+J.kW(this.V3,s.t(w,t),C.CD.Sy(J.L9(y.t(v,t),u)*100,2)+"%");++t}}}q=P.Fl(null,null)
+J.Me(z.t(b,"timers"),new D.Qq(q))
 y=this.Y8
 s=J.w1(y)
 s.u(y,"total",q.t(0,"time_total_runtime"))
@@ -18917,7 +18947,7 @@
 s.u(y,"gc",0)
 s.u(y,"init",J.WB(J.WB(J.WB(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
 s.u(y,"dart",q.t(0,"time_dart_execution"))
-this.WU(z.t(b,"heaps"))
+this.Bs(z.t(b,"heaps"))
 p=z.t(b,"features")
 if(p!=null)for(y=J.mY(p);y.G();)if(J.xC(y.gl(),"io")){s=this.XV
 if(this.gnz(this)&&!J.xC(s,!0)){s=new T.qI(this,C.iA,s,!0)
@@ -18934,37 +18964,37 @@
 y=this.tW
 y.V1(y)
 y.FV(0,z.t(b,"libraries"))
-y.GT(y,D.Br())},
-m7:function(){return this.V0.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.O5(this))},
-Jm:function(a,b){this.yA=0
-this.Ac=a
+y.GT(y,D.E0())},
+xB:function(){return this.x8.jU("/"+H.d(this.TU)+"/profile/tag").ml(new D.O5(this))},
+Jm:function(a,b){this.n5=0
+this.l9=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.LB(b)},
-LB:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.Ac
-y=this.yA
+return this.ci(b)},
+ci:function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.l9
+y=this.n5
 if(typeof y!=="number")return y.g()
-this.yA=y+1
+this.n5=y+1
 x=J.UQ(z,y)
 if(x>>>0!==x||x>=a.length)return H.e(a,x)
 w=a[x]
-y=this.Ac
-z=this.yA
+y=this.l9
+z=this.n5
 if(typeof z!=="number")return z.g()
-this.yA=z+1
+this.n5=z+1
 v=J.UQ(y,z)
 z=[]
-z.$builtinTypeInfo=[D.TH]
-u=new D.TH(w,v,z,0)
-y=this.Ac
-t=this.yA
+z.$builtinTypeInfo=[D.D5]
+u=new D.D5(w,v,z,0)
+y=this.l9
+t=this.n5
 if(typeof t!=="number")return t.g()
-this.yA=t+1
+this.n5=t+1
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
-for(;r<s;++r){q=this.LB(a)
+for(;r<s;++r){q=this.ci(a)
 z.push(q)
 y=u.Jv
 t=q.Av
@@ -18995,16 +19025,16 @@
 Xb:function(){var z=this.hz
 if(z==null){z=this.cv("debug/breakpoints").ml(new D.y4(this)).wM(new D.Cm(this))
 this.hz=z}return z},
-PI:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.JL(this,a,b))},
+G5:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.ad(this,a,b))},
 Xu:function(a){return this.cv(H.d(J.eS(a))+"/clear").ml(new D.fw(this,a))},
-zd:[function(a){return this.cv("debug/pause").ml(new D.G4(this))},"$0","gX0",0,0,208],
+WJ:[function(a){return this.cv("debug/pause").ml(new D.G4(this))},"$0","gX0",0,0,208],
 QE:[function(a){return this.cv("debug/resume").ml(new D.LO(this))},"$0","gDQ",0,0,208],
-Lg:[function(a){return this.cv("debug/resume?step=into").ml(new D.wX(this))},"$0","gLc",0,0,208],
-PJ:[function(a){return this.cv("debug/resume?step=over").ml(new D.Vd(this))},"$0","gqF",0,0,208],
-h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.pW(this))},"$0","gZp",0,0,208],
-yB:function(a,b){return this.cv(a).ml(new D.oq(b))},
-VT:function(){return this.yB("metrics",this.pG).ml(new D.y1(this))},
-bu:[function(a){return"Isolate("+H.d(this.r0)+")"},"$0","gCR",0,0,73],
+Lg:[function(a){return this.cv("debug/resume?step=into").ml(new D.qD(this))},"$0","gLc",0,0,208],
+Fc:[function(a){return this.cv("debug/resume?step=over").ml(new D.A6(this))},"$0","gqF",0,0,208],
+h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.xK(this))},"$0","gZp",0,0,208],
+WO:function(a,b){return this.cv(a).ml(new D.oq(b))},
+VT:function(){return this.WO("metrics",this.pG).ml(new D.y1(this))},
+bu:[function(a){return"Isolate("+H.d(this.TU)+")"},"$0","gCR",0,0,73],
 $isbv:true,
 static:{"^":"ZGx"}},
 PKX:{
@@ -19012,11 +19042,11 @@
 bvc:{
 "^":"PKX+Pi;",
 $isd3:true},
-S0:{
+TV:{
 "^":"TpZ:12;",
-$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
+$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.kr,a.xM,0)
 a.Du=0
-a.pn=0
+a.fF=0
 a.mM=F.Wi(a,C.eF,a.mM,"")
 a.rF=F.Wi(a,C.uU,a.rF,"")
 C.Nm.sB(a.VS,0)
@@ -19035,7 +19065,7 @@
 "^":"TpZ:76;c",
 $0:function(){return this.c},
 $isEH:true},
-dn:{
+Qq:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
 this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,217,"call"],
@@ -19061,7 +19091,7 @@
 "^":"TpZ:76;b",
 $0:[function(){this.b.hz=null},"$0",null,0,0,null,"call"],
 $isEH:true},
-JL:{
+ad:{
 "^":"TpZ:12;a,b,c",
 $1:[function(a){if(!!J.x(a).$iscn)J.UQ(J.de(this.b),J.bI(this.c,1)).sj9(!1)
 return this.a.Xb()},"$1",null,2,0,null,121,"call"],
@@ -19069,42 +19099,42 @@
 fw:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z,y
-if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
+if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
 z=this.a
 y=z.Jr
-if(y!=null&&y.gYZ()!=null&&J.xC(J.UQ(z.Jr.gYZ(),"id"),J.UQ(this.b,"id")))return z.VD(0)
+if(y!=null&&y.gQ1()!=null&&J.xC(J.UQ(z.Jr.gQ1(),"id"),J.UQ(this.b,"id")))return z.VD(0)
 else return z.Xb()},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 G4:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 LO:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-wX:{
+qD:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-Vd:{
+A6:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-pW:{
+xK:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 oq:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y,x
 z=J.x(a)
-if(!!z.$iscn){N.QM("").YX(a.LD)
+if(!!z.$iscn){N.QM("").hh(a.LD)
 return}y=this.a
 y.V1(0)
 for(z=J.mY(z.t(a,"members"));z.G();){x=z.gl()
@@ -19113,47 +19143,47 @@
 y1:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-return z.yB("metrics/vm",z.Sn)},"$1",null,2,0,null,13,"call"],
+return z.WO("metrics/vm",z.Sn)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 vO:{
-"^":"af;RF,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
-gjm:function(){return(J.xC(this.oU,"Class")||J.xC(this.oU,"Function")||J.xC(this.oU,"Field"))&&!J.co(this.r0,$.RQ)},
+"^":"af;RF,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+gjm:function(){return(J.xC(this.oU,"Class")||J.xC(this.oU,"Function")||J.xC(this.oU,"Field"))&&!J.co(this.TU,$.RQ)},
 gM8:function(){return!1},
-bF:function(a,b,c){var z,y,x
-this.ks=!c
+R5:function(a,b,c){var z,y,x
+this.qu=!c
 z=this.RF
 z.V1(0)
 z.FV(0,b)
-y=z.tf
+y=z.LL
 x=y.t(0,"name")
 this.bN=this.ct(0,C.YS,this.bN,x)
 y=y.NZ(0,"vmName")?y.t(0,"vmName"):this.bN
 this.GR=this.ct(0,C.KS,this.GR,y)
-D.kT(z,this.V0)},
+D.kT(z,this.x8)},
 FV:function(a,b){return this.RF.FV(0,b)},
 V1:function(a){return this.RF.V1(0)},
-NZ:function(a,b){return this.RF.tf.NZ(0,b)},
-aN:function(a,b){return this.RF.tf.aN(0,b)},
+NZ:function(a,b){return this.RF.LL.NZ(0,b)},
+aN:function(a,b){return this.RF.LL.aN(0,b)},
 Rz:function(a,b){return this.RF.Rz(0,b)},
-t:function(a,b){return this.RF.tf.t(0,b)},
+t:function(a,b){return this.RF.LL.t(0,b)},
 u:function(a,b,c){this.RF.u(0,b,c)
 return c},
-gl0:function(a){var z=this.RF.tf
+gl0:function(a){var z=this.RF.LL
 return z.gB(z)===0},
-gor:function(a){var z=this.RF.tf
+gor:function(a){var z=this.RF.LL
 return z.gB(z)!==0},
-gvc:function(a){var z=this.RF.tf
+gvc:function(a){var z=this.RF.LL
 return z.gvc(z)},
-gUQ:function(a){var z=this.RF.tf
+gUQ:function(a){var z=this.RF.LL
 return z.gUQ(z)},
-gB:function(a){var z=this.RF.tf
+gB:function(a){var z=this.RF.LL
 return z.gB(z)},
 HC:[function(a){var z=this.RF
 return z.HC(z)},"$0","gDx",0,0,131],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-Tr:[function(a){return},"$0","gcm",0,0,17],
+w37:[function(a){return},"$0","gcm",0,0,17],
 dt:[function(a){this.RF.Vg=null
 return},"$0","gym",0,0,17],
 gqh:function(a){var z=this.RF
@@ -19163,7 +19193,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-bu:[function(a){return"ServiceMap("+H.d(this.RF)+")"},"$0","gCR",0,0,73],
+bu:[function(a){return"ServiceMap("+P.vW(this.RF)+")"},"$0","gCR",0,0,73],
 $isvO:true,
 $isqC:true,
 $asqC:function(){return[null,null]},
@@ -19172,18 +19202,18 @@
 $isd3:true,
 static:{"^":"RQ"}},
 cn:{
-"^":"wVq;I0,LD,jo,Ne,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"wVq;I0,LD,jo,Ne,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
-bF:function(a,b,c){var z,y,x
+R5:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"message")
 this.LD=F.Wi(this,C.pX,this.LD,y)
-y=this.V0
+y=this.x8
 x=D.Nl(y,z.t(b,"exception"))
 this.jo=F.Wi(this,C.ne,this.jo,x)
 z=D.Nl(y,z.t(b,"stacktrace"))
@@ -19198,11 +19228,11 @@
 "^":"af+Pi;",
 $isd3:true},
 N7:{
-"^":"dZL;I0,LD,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"dZL;I0,LD,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
-bF:function(a,b,c){var z,y
-this.ks=!0
+R5:function(a,b,c){var z,y
+this.qu=!0
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -19218,11 +19248,11 @@
 "^":"af+Pi;",
 $isd3:true},
 Ix:{
-"^":"w8F;I0,LD,IV,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"w8F;I0,LD,IV,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
 gn9:function(a){return this.IV},
-bF:function(a,b,c){var z,y
+R5:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -19240,15 +19270,15 @@
 "^":"af+Pi;",
 $isd3:true},
 Mk:{
-"^":"V4b;eq,NH,jo,ZK,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"V4b;eq,HQ,jo,ZK,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gfG:function(a){return this.eq},
-gYZ:function(){return this.NH},
+gQ1:function(){return this.HQ},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
 gRn:function(a){return this.ZK},
-bF:function(a,b,c){var z,y
-this.ks=!0
-D.kT(b,this.V0)
+R5:function(a,b,c){var z,y
+this.qu=!0
+D.kT(b,this.x8)
 z=J.U6(b)
 y=z.t(b,"eventType")
 y=F.Wi(this,C.qR,this.eq,y)
@@ -19258,7 +19288,7 @@
 this.bN=y
 this.GR=this.ct(this,C.KS,this.GR,y)
 if(z.t(b,"breakpoint")!=null){y=z.t(b,"breakpoint")
-this.NH=F.Wi(this,C.hR,this.NH,y)}if(z.t(b,"exception")!=null){y=z.t(b,"exception")
+this.HQ=F.Wi(this,C.hR,this.HQ,y)}if(z.t(b,"exception")!=null){y=z.t(b,"exception")
 this.jo=F.Wi(this,C.ne,this.jo,y)}if(z.t(b,"_data")!=null){z=z.t(b,"_data")
 this.ZK=F.Wi(this,C.ee,this.ZK,z)}},
 bu:[function(a){var z,y
@@ -19270,48 +19300,50 @@
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gO3:function(a){return this.dj},
 gjm:function(){return!0},
 gM8:function(){return!1},
-bF:function(a,b,c){var z,y,x,w
+R5:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=z.t(b,"url")
 x=F.Wi(this,C.Fh,this.dj,y)
 this.dj=x
 if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
 w=J.U6(y)
-x=w.yn(y,w.cn(y,"/")+1)}y=z.t(b,"name")
+v=w.cn(y,"/")
+if(typeof v!=="number")return v.g()
+x=w.yn(y,v+1)}y=z.t(b,"name")
 y=this.ct(this,C.YS,this.bN,y)
 this.bN=y
 if(J.FN(y)===!0)this.bN=this.ct(this,C.YS,this.bN,x)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.KS,this.GR,y)
 if(c)return
-this.ks=!0
-D.kT(b,J.wg(this.V0))
+this.qu=!0
+D.kT(b,J.aT(this.x8))
 y=this.Bm
 y.V1(y)
-w=J.Ij(z.t(b,"imports")).br(0)
-H.ig(w,D.Br())
+w=J.dF(z.t(b,"imports")).br(0)
+H.ig(w,D.E0())
 y.FV(0,w)
 y=this.XR
 y.V1(y)
-w=J.Ij(z.t(b,"scripts")).br(0)
-H.ig(w,D.Br())
+w=J.dF(z.t(b,"scripts")).br(0)
+H.ig(w,D.E0())
 y.FV(0,w)
 y=this.DD
 y.V1(y)
 y.FV(0,z.t(b,"classes"))
-y.GT(y,D.Br())
+y.GT(y,D.E0())
 y=this.Z3
 y.V1(y)
 y.FV(0,z.t(b,"variables"))
-y.GT(y,D.Br())
+y.GT(y,D.E0())
 y=this.mu
 y.V1(y)
 y.FV(0,z.t(b,"functions"))
-y.GT(y,D.Br())},
+y.GT(y,D.E0())},
 bu:[function(a){return"Library("+H.d(this.dj)+")"},"$0","gCR",0,0,73],
 $isU4:true},
 T5W:{
@@ -19319,11 +19351,11 @@
 rG9:{
 "^":"T5W+Pi;",
 $isd3:true},
-qp:{
-"^":"Pi;wf,wY,Vg,ij",
+mT:{
+"^":"Pi;wf,wY,Vg,fn",
 gWt:function(a){return this.wf},
 sWt:function(a,b){this.wf=F.Wi(this,C.yB,this.wf,b)},
-gET:function(){return this.wY}},
+gfj:function(){return this.wY}},
 Iy:{
 "^":"a;EJ<,l<",
 eC:function(a){var z,y,x
@@ -19340,16 +19372,16 @@
 x.wY=F.Wi(x,C.hN,x.wY,y)},
 static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,Whu"}},
 dy:{
-"^":"cOr;Gz,ar,Lh,GQ,GU,J1,E8,qG,dN,yv,UY<,xQ<,vU,tJ<,mu<,k9,p2<,up<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"cOr;Gz,ar,Lh,GQ,GU,J1,E8,eH,dN,yv,UY<,xQ<,dQ,tJ<,mu<,k9,p2<,LT<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gHt:function(a){return this.Gz},
 sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
 gVM:function(){return this.Lh},
-gRh:function(){return this.GQ},
+gRs:function(){return this.GQ},
 geh:function(){return this.J1},
-gVF:function(){return this.qG},
-sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
+gVF:function(){return this.eH},
+sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
 gej:function(){return this.dN},
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
 gkc:function(a){return this.yv},
@@ -19368,15 +19400,15 @@
 sAY:function(a){this.k9=F.Wi(this,C.FZ,this.k9,a)},
 gjm:function(){return!0},
 gM8:function(){return!1},
-bF:function(a,b,c){var z,y,x,w
+R5:function(a,b,c){var z,y,x,w
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.KS,this.GR,y)
 if(c)return
-this.ks=!0
-D.kT(b,J.wg(this.V0))
+this.qu=!0
+D.kT(b,J.aT(this.x8))
 if(!!J.x(z.t(b,"library")).$isU4){y=z.t(b,"library")
 this.Gz=F.Wi(this,C.EV,this.Gz,y)}else this.Gz=F.Wi(this,C.EV,this.Gz,null)
 y=z.t(b,"script")
@@ -19392,21 +19424,21 @@
 y=z.t(b,"implemented")
 this.E8=F.Wi(this,C.Ih,this.E8,y)
 y=z.t(b,"tokenPos")
-this.qG=F.Wi(this,C.dA,this.qG,y)
+this.eH=F.Wi(this,C.dA,this.eH,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
-y=this.up
+y=this.LT
 y.V1(y)
 y.FV(0,z.t(b,"subclasses"))
-y.GT(y,D.Br())
+y.GT(y,D.E0())
 y=this.tJ
 y.V1(y)
 y.FV(0,z.t(b,"fields"))
-y.GT(y,D.Br())
+y.GT(y,D.E0())
 y=this.mu
 y.V1(y)
 y.FV(0,z.t(b,"functions"))
-y.GT(y,D.Br())
+y.GT(y,D.E0())
 y=z.t(b,"super")
 y=F.Wi(this,C.FZ,this.k9,y)
 this.k9=y
@@ -19417,16 +19449,16 @@
 if(x!=null){z=J.U6(x)
 this.UY.eC(z.t(x,"new"))
 this.xQ.eC(z.t(x,"old"))
-y=this.vU
+y=this.dQ
 w=z.t(x,"promotedInstances")
 y.wf=F.Wi(y,C.yB,y.wf,w)
 z=z.t(x,"promotedBytes")
 y.wY=F.Wi(y,C.hN,y.wY,z)}},
-u2:function(a){var z=this.up
+u2:function(a){var z=this.LT
 if(z.tg(z,a))return
 z.h(0,a)
-z.GT(z,D.Br())},
-cv:function(a){return J.wg(this.V0).cv(J.WB(this.r0,"/"+H.d(a)))},
+z.GT(z,D.E0())},
+cv:function(a){return J.aT(this.x8).cv(J.WB(this.TU,"/"+H.d(a)))},
 bu:[function(a){return"Class("+H.d(this.GR)+")"},"$0","gCR",0,0,73],
 $isdy:true},
 ZzQ:{
@@ -19435,25 +19467,25 @@
 "^":"ZzQ+Pi;",
 $isd3:true},
 uq:{
-"^":"Zqa;df,MD,lA,fQ,ni,Xl,bN:di@,cM,F6,oI,dG,Rf,z0,TG,tk,FA,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"Zqa;df,MD,lA,fQ,ni,Iv,bN:di@,cM,F6,oI,dG,Rf,z0,TG,tk,FA,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gky:function(a){return this.MD},
+gyT:function(a){return this.MD},
 gPE:function(){return this.lA},
 gSS:function(){return this.fQ},
 gwz:function(){return this.ni},
 swz:function(a){this.ni=F.Wi(this,C.aw,this.ni,a)},
-gu5:function(){return this.Xl},
-su5:function(a){this.Xl=F.Wi(this,C.mM,this.Xl,a)},
+gu5:function(){return this.Iv},
+su5:function(a){this.Iv=F.Wi(this,C.mM,this.Iv,a)},
 goc:function(a){return this.di},
 soc:function(a,b){this.di=F.Wi(this,C.YS,this.di,b)},
 gB:function(a){return this.cM},
 sB:function(a,b){this.cM=F.Wi(this,C.Wn,this.cM,b)},
-gQR:function(){return this.F6},
-sQR:function(a){this.F6=F.Wi(this,C.hx,this.F6,a)},
+gCY:function(){return this.F6},
+sCY:function(a){this.F6=F.Wi(this,C.hx,this.F6,a)},
 gtJ:function(){return this.oI},
 stJ:function(a){this.oI=F.Wi(this,C.fV,this.oI,a)},
-gDm:function(){return this.dG},
+gbA:function(){return this.dG},
 gP9:function(a){return this.Rf},
 sP9:function(a,b){this.Rf=F.Wi(this,C.mw,this.Rf,b)},
 gCM:function(){return this.TG},
@@ -19463,8 +19495,8 @@
 gP:function(a){return this.FA},
 sP:function(a,b){this.FA=F.Wi(this,C.zd,this.FA,b)},
 gBF:function(){return this.ni!=null},
-bF:function(a,b,c){var z,y
-D.kT(b,J.wg(this.V0))
+R5:function(a,b,c){var z,y
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"class")
 this.df=F.Wi(this,C.Wt,this.df,y)
@@ -19477,7 +19509,7 @@
 y=z.t(b,"closureFunc")
 this.ni=F.Wi(this,C.aw,this.ni,y)
 y=z.t(b,"closureCtxt")
-this.Xl=F.Wi(this,C.mM,this.Xl,y)
+this.Iv=F.Wi(this,C.mM,this.Iv,y)
 y=z.t(b,"name")
 this.di=F.Wi(this,C.YS,this.di,y)
 y=z.t(b,"length")
@@ -19492,32 +19524,32 @@
 y=z.t(b,"type_class")
 this.F6=F.Wi(this,C.hx,this.F6,y)
 y=z.t(b,"user_name")
-this.z0=F.Wi(this,C.ct,this.z0,y)
+this.z0=F.Wi(this,C.Gy,this.z0,y)
 y=z.t(b,"referent")
 this.TG=F.Wi(this,C.Tc,this.TG,y)
 y=z.t(b,"key")
 this.tk=F.Wi(this,C.z6,this.tk,y)
 z=z.t(b,"value")
 this.FA=F.Wi(this,C.zd,this.FA,z)
-this.ks=!0},
+this.qu=!0},
 bu:[function(a){var z=this.lA
 return"Instance("+H.d(z!=null?z:"a "+H.d(J.DA(this.df)))+")"},"$0","gCR",0,0,73]},
 Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 lI:{
-"^":"D3i;df,MD,Jx,cM,A6,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"D3i;df,MD,Jx,cM,A6,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gky:function(a){return this.MD},
+gyT:function(a){return this.MD},
 gqH:function(){return this.Jx},
 sqH:function(a){this.Jx=F.Wi(this,C.BV,this.Jx,a)},
 gB:function(a){return this.cM},
 sB:function(a,b){this.cM=F.Wi(this,C.Wn,this.cM,b)},
 gZ3:function(){return this.A6},
 sZ3:function(a){this.A6=F.Wi(this,C.xw,this.A6,a)},
-bF:function(a,b,c){var z,y
-D.kT(b,J.wg(this.V0))
+R5:function(a,b,c){var z,y
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"size")
 this.MD=F.Wi(this,C.da,this.MD,y)
@@ -19530,44 +19562,44 @@
 this.df=F.Wi(this,C.Wt,this.df,y)
 z=z.t(b,"variables")
 this.A6=F.Wi(this,C.xw,this.A6,z)
-this.ks=!0},
+this.qu=!0},
 bu:[function(a){return"Context("+H.d(this.cM)+")"},"$0","gCR",0,0,73]},
 D3i:{
 "^":"af+Pi;",
 $isd3:true},
-yz:{
+ma:{
 "^":"a;Sf",
 bu:[function(a){return this.Sf},"$0","gCR",0,0,76],
-Q2:function(){return C.Nm.tg([$.Dh(),$.Nk(),$.zx(),$.OA()],this)},
-static:{"^":"et,jX,PZ,Bs,G8,xs,ab,Sp,Et,Ll,fJ,bt,dQ,z3,tT,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.xK()
-case"kClosureFunction":return $.HU()
-case"kGetterFunction":return $.rQ()
-case"kSetterFunction":return $.en()
+Q2:function(){return C.Nm.tg([$.b1(),$.YK(),$.zx(),$.dh()],this)},
+static:{"^":"Ij,jX,F0,Bs,G8,xs,ab,Sp,Et,Ll,HU,bt,dQ,z3,Gh,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.qu()
+case"kClosureFunction":return $.xq()
+case"kGetterFunction":return $.xW()
+case"kSetterFunction":return $.Kw()
 case"kConstructor":return $.kj()
 case"kImplicitGetter":return $.d9()
 case"kImplicitSetter":return $.AH()
 case"kStaticInitializer":return $.y5()
 case"kMethodExtractor":return $.Ot()
 case"kNoSuchMethodDispatcher":return $.E7()
-case"kInvokeFieldDispatcher":return $.bh()
-case"Collected":return $.Dh()
-case"Native":return $.Nk()
+case"kInvokeFieldDispatcher":return $.f6()
+case"Collected":return $.b1()
+case"Native":return $.YK()
 case"Tag":return $.zx()
-case"Reused":return $.OA()}return $.lC()}}},
+case"Reused":return $.dh()}return $.lC()}}},
 Kp:{
-"^":"S6L;Pp,EG,bV,GQ,fd,ar,qG,dN,v5,NM,vf,H7,I0,XN,Ph,kE,TA,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
-gP2:function(){return this.Pp},
-sP2:function(a){this.Pp=F.Wi(this,C.YV,this.Pp,a)},
+"^":"S6L;Pp,EG,bV,GQ,fd,ar,eH,dN,v5,NM,vf,H7,I0,XN,Ni,kE,Z4,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+gEl:function(){return this.Pp},
+sEl:function(a){this.Pp=F.Wi(this,C.YV,this.Pp,a)},
 gxH:function(){return this.EG},
 sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
 gFo:function(){return this.bV},
-gRh:function(){return this.GQ},
+gRs:function(){return this.GQ},
 geT:function(a){return this.fd},
 seT:function(a,b){this.fd=F.Wi(this,C.nX,this.fd,b)},
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gVF:function(){return this.qG},
-sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
+gVF:function(){return this.eH},
+sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
 gej:function(){return this.dN},
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
 gtT:function(a){return this.v5},
@@ -19575,19 +19607,19 @@
 gjW:function(){return this.NM},
 sjW:function(a){this.NM=F.Wi(this,C.OU,this.NM,a)},
 gW1:function(){return this.vf},
-gxL:function(){return this.H7},
+gho:function(){return this.H7},
 gfY:function(a){return this.I0},
-gOs:function(){return this.XN},
-gUx:function(){return this.Ph},
+guh:function(){return this.XN},
+gUx:function(){return this.Ni},
 gSu:function(){return this.kE},
-gMA:function(){return this.TA},
-bF:function(a,b,c){var z,y
+gMA:function(){return this.Z4},
+R5:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.KS,this.GR,y)
-D.kT(b,J.wg(this.V0))
+D.kT(b,J.aT(this.x8))
 y=z.NZ(b,"owningClass")===!0?z.t(b,"owningClass"):null
 this.Pp=F.Wi(this,C.YV,this.Pp,y)
 y=z.NZ(b,"owningLibrary")===!0?z.t(b,"owningLibrary"):null
@@ -19596,7 +19628,7 @@
 y=F.Wi(this,C.Lc,this.I0,y)
 this.I0=y
 y=y.Q2()
-this.TA=F.Wi(this,C.a0,this.TA,!y)
+this.Z4=F.Wi(this,C.a0,this.Z4,!y)
 if(c)return
 y=z.t(b,"static")
 this.bV=F.Wi(this,C.AT,this.bV,y)
@@ -19607,12 +19639,12 @@
 y=z.t(b,"script")
 this.ar=F.Wi(this,C.PX,this.ar,y)
 y=z.t(b,"tokenPos")
-this.qG=F.Wi(this,C.dA,this.qG,y)
+this.eH=F.Wi(this,C.dA,this.eH,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
-y=D.vQ(z.t(b,"code"))
+y=D.UW(z.t(b,"code"))
 this.v5=F.Wi(this,C.i4,this.v5,y)
-y=D.vQ(z.t(b,"unoptimizedCode"))
+y=D.UW(z.t(b,"unoptimizedCode"))
 this.NM=F.Wi(this,C.OU,this.NM,y)
 y=z.t(b,"optimizable")
 this.vf=F.Wi(this,C.Vl,this.vf,y)
@@ -19625,8 +19657,8 @@
 z=this.fd
 if(z==null){z=this.Pp
 z=z!=null?H.d(J.DA(z))+"."+H.d(this.bN):this.bN
-this.Ph=F.Wi(this,C.AO,this.Ph,z)}else{z=H.d(z.gUx())+"."+H.d(this.bN)
-this.Ph=F.Wi(this,C.AO,this.Ph,z)}},
+this.Ni=F.Wi(this,C.AO,this.Ni,z)}else{z=H.d(z.gUx())+"."+H.d(this.bN)
+this.Ni=F.Wi(this,C.AO,this.Ni,z)}},
 $isKp:true},
 wvY:{
 "^":"af+boh;"},
@@ -19634,36 +19666,36 @@
 "^":"wvY+Pi;",
 $isd3:true},
 xB:{
-"^":"Pqb;kU,Br,bV,f3,GQ,FA,bN:T6@,GR:vS@,ND,lw,jB,ar,qG,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
-gXP:function(){return this.kU},
-sXP:function(a){this.kU=F.Wi(this,C.Yp,this.kU,a)},
+"^":"Pqb;qy,Br,bV,f3,GQ,FA,bN:T6@,GR:vS@,ND,lw,ne,ar,eH,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+gXP:function(){return this.qy},
+sXP:function(a){this.qy=F.Wi(this,C.Yp,this.qy,a)},
 gOF:function(){return this.Br},
 sOF:function(a){this.Br=F.Wi(this,C.yC,this.Br,a)},
 gFo:function(){return this.bV},
 gV5:function(a){return this.f3},
-gRh:function(){return this.GQ},
+gRs:function(){return this.GQ},
 gP:function(a){return this.FA},
 sP:function(a,b){this.FA=F.Wi(this,C.zd,this.FA,b)},
 goc:function(a){return this.T6},
 soc:function(a,b){this.T6=F.Wi(this,C.YS,this.T6,b)},
-gzz:function(){return this.vS},
-szz:function(a){this.vS=F.Wi(this,C.KS,this.vS,a)},
+gTE:function(){return this.vS},
+sTE:function(a){this.vS=F.Wi(this,C.KS,this.vS,a)},
 gRl:function(){return this.ND},
 gSE:function(){return this.lw},
 sSE:function(a){this.lw=F.Wi(this,C.ft,this.lw,a)},
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gVF:function(){return this.qG},
-sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
-bF:function(a,b,c){var z,y
-D.kT(b,J.wg(this.V0))
+gVF:function(){return this.eH},
+sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
+R5:function(a,b,c){var z,y
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"name")
 this.T6=F.Wi(this,C.YS,this.T6,y)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.T6
 this.vS=F.Wi(this,C.KS,this.vS,y)
 y=z.t(b,"owner")
-this.kU=F.Wi(this,C.Yp,this.kU,y)
+this.qy=F.Wi(this,C.Yp,this.qy,y)
 y=z.t(b,"declaredType")
 this.Br=F.Wi(this,C.yC,this.Br,y)
 y=z.t(b,"static")
@@ -19680,19 +19712,19 @@
 y=z.t(b,"guardClass")
 this.lw=F.Wi(this,C.ft,this.lw,y)
 y=z.t(b,"guardLength")
-this.jB=F.Wi(this,C.fX,this.jB,y)
+this.ne=F.Wi(this,C.fX,this.ne,y)
 y=z.t(b,"script")
 this.ar=F.Wi(this,C.PX,this.ar,y)
 z=z.t(b,"tokenPos")
-this.qG=F.Wi(this,C.dA,this.qG,z)
-this.ks=!0},
-bu:[function(a){return"Field("+H.d(J.DA(this.kU))+"."+H.d(this.T6)+")"},"$0","gCR",0,0,73],
+this.eH=F.Wi(this,C.dA,this.eH,z)
+this.qu=!0},
+bu:[function(a){return"Field("+H.d(J.DA(this.qy))+"."+H.d(this.T6)+")"},"$0","gCR",0,0,73],
 $isxB:true},
 Pqb:{
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":"Pi;tu>,Rd>,a4>,x9,Yp,am,Vg,ij",
+"^":"Pi;tu>,Rd>,a4>,x9,Yp,am,Vg,fn",
 gc1:function(){return this.x9},
 sc1:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
 gqr:function(){return this.Yp},
@@ -19705,7 +19737,7 @@
 jY:function(a,b,c){var z,y,x,w,v,u,t
 z=D.y8(this.a4)
 this.am=F.Wi(this,C.Jf,this.am,!z)
-for(z=this.tu,y=J.mY(J.UQ(J.wg(z.V0).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
+for(z=this.tu,y=J.mY(J.UQ(J.aT(z.x8).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
 v=J.U6(w)
 u=J.UQ(v.t(w,"location"),"script")
 t=J.UQ(v.t(w,"location"),"tokenPos")
@@ -19720,41 +19752,43 @@
 z=z.Fr(a,"")
 y=new H.a7(z,z.length,0,null)
 y.$builtinTypeInfo=[H.u3(z,0)]
-for(;y.G();)switch(y.lo){case"{":case"}":case"(":case")":case";":break
+for(;y.G();)switch(y.Ff){case"{":case"}":case"(":case")":case";":break
 default:return!1}return!0},y8:function(a){var z,y,x,w
-z=J.BQ(a,new H.VR("(\\s)+",H.Vq("(\\s)+",!1,!0,!1),null,null))
-for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.BQ(y.lo,new H.VR("(\\b)",H.Vq("(\\b)",!1,!0,!1),null,null))
+z=J.BQ(a,new H.VR("(\\s)+",H.v4("(\\s)+",!1,!0,!1),null,null))
+for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.BQ(y.Ff,new H.VR("(\\b)",H.v4("(\\b)",!1,!0,!1),null,null))
 w=new H.a7(x,x.length,0,null)
 w.$builtinTypeInfo=[H.u3(x,0)]
-for(;w.G();)if(!D.Fu(w.lo))return!1}return!0},Yo:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
+for(;w.G();)if(!D.Fu(w.Ff))return!1}return!0},NQ:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
 z.jY(a,b,c)
 return z}}},
 vx:{
-"^":"vix;Gd>,p3,I0,l9,nE,EG,yc,zD,MO,aQ,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"vix;Gd>,p3,I0,E4,nE,EG,yc,zD,MO,aQ,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gxH:function(){return this.EG},
 sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
 gjm:function(){return!0},
 gM8:function(){return!0},
-rK:function(a){var z,y
+Vw:function(a){var z,y
 z=J.bI(a,1)
-y=this.Gd.xN
+y=this.Gd.XG
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 return y[z]},
 q6:function(a){return this.MO.t(0,a)},
-bF:function(a,b,c){var z,y,x
-D.kT(b,J.wg(this.V0))
+R5:function(a,b,c){var z,y,x,w
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"name")
 this.zD=y
 x=J.U6(y)
-y=x.yn(y,x.cn(y,"/")+1)
-this.yc=y
-this.bN=this.ct(this,C.YS,this.bN,y)
-y=this.zD
-this.GR=this.ct(this,C.KS,this.GR,y)
+w=x.cn(y,"/")
+if(typeof w!=="number")return w.g()
+w=x.yn(y,w+1)
+this.yc=w
+this.bN=this.ct(this,C.YS,this.bN,w)
+w=this.zD
+this.GR=this.ct(this,C.KS,this.GR,w)
 if(c)return
 this.Aj(z.t(b,"source"))
 this.YG(z.t(b,"tokenPosTable"))
@@ -19766,9 +19800,9 @@
 z.V1(0)
 y=this.aQ
 y.V1(0)
-this.l9=F.Wi(this,C.Gd,this.l9,null)
-this.nE=F.Wi(this,C.qa,this.nE,null)
-x=P.fM(null,null,null,null)
+this.E4=F.Wi(this,C.Gd,this.E4,null)
+this.nE=F.Wi(this,C.kA,this.nE,null)
+x=P.Ls(null,null,null,null)
 for(w=J.mY(a);w.G();){v=w.gl()
 u=J.U6(v)
 t=u.t(v,0)
@@ -19779,25 +19813,25 @@
 if(!(s<r))break
 q=u.t(v,s)
 p=u.t(v,s+1)
-r=this.l9
+r=this.E4
 if(r==null){if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.Gd,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.l9=q
+this.nq(this,r)}this.E4=q
 r=this.nE
-if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.qa,r,q)
+if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.kA,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.l9:q
-o=this.l9
+this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.E4:q
+o=this.E4
 if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.Gd,o,r)
 o.$builtinTypeInfo=[null]
-this.nq(this,o)}this.l9=r
+this.nq(this,o)}this.E4=r
 r=J.J5(this.nE,q)?this.nE:q
 o=this.nE
-if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.qa,o,r)
+if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.kA,o,r)
 o.$builtinTypeInfo=[null]
 this.nq(this,o)}this.nE=r}z.u(0,q,t)
 y.u(0,q,p)
-s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.lo
+s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.Ff
 if(!x.tg(0,J.f2(v)))v.sj9(!1)}},
 lV:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
@@ -19810,20 +19844,20 @@
 u=z.t(a,x+1)
 t=y.t(0,v)
 y.u(0,v,t!=null?J.WB(u,t):u)
-x+=2}this.xz()},
+x+=2}this.f2()},
 Aj:function(a){var z,y,x,w
-this.ks=!1
+this.qu=!1
 if(a==null)return
 z=J.BQ(a,"\n")
 if(z.length===0)return
-this.ks=!0
+this.qu=!0
 y=this.Gd
 y.V1(y)
 N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.zD))
 for(x=0;x<z.length;x=w){w=x+1
-y.h(0,D.Yo(this,w,z[x]))}this.xz()},
-xz:function(){var z,y,x
-for(z=this.Gd,z=z.gA(z),y=this.p3;z.G();){x=z.lo
+y.h(0,D.NQ(this,w,z[x]))}this.f2()},
+f2:function(){var z,y,x
+for(z=this.Gd,z=z.gA(z),y=this.p3;z.G();){x=z.Ff
 x.sc1(y.t(0,J.f2(x)))}},
 $isvx:true},
 Vlh:{
@@ -19832,18 +19866,18 @@
 "^":"Vlh+Pi;",
 $isd3:true},
 uA:{
-"^":"a;Yu<,Du<,pn<",
+"^":"a;Yu<,Du<,fF<",
 $isuA:true},
-xb:{
-"^":"Pi;Yu<,p4,VF<,Yn,fY>,ar,GL,Vg,ij",
+Z9:{
+"^":"Pi;Yu<,p4,VF<,Yn,fY>,ar,up,Vg,fn",
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gP3:function(){return this.GL},
+gmE:function(){return this.up},
 JM:[function(){var z,y
 z=this.p4
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gqE",0,0,73],
+return y.bu(z)},"$0","gkA",0,0,73],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -19851,19 +19885,19 @@
 y=a.q6(z)
 if(y==null)return
 this.ar=F.Wi(this,C.PX,this.ar,a)
-z=J.dY(a.rK(y))
-this.GL=F.Wi(this,C.oI,this.GL,z)},
-$isxb:true},
-hn:{
-"^":"nla;df,MD,uH<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+z=J.dY(a.Vw(y))
+this.up=F.Wi(this,C.oI,this.up,z)},
+$isZ9:true},
+Hx:{
+"^":"nla;df,MD,uH<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gky:function(a){return this.MD},
+gyT:function(a){return this.MD},
 gjm:function(){return!1},
 gM8:function(){return!0},
-bF:function(a,b,c){var z,y,x,w
+R5:function(a,b,c){var z,y,x,w
 if(c)return
-D.kT(b,J.wg(this.V0))
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"class")
 this.df=F.Wi(this,C.Wt,this.df,y)
@@ -19873,23 +19907,23 @@
 y.V1(y)
 for(z=J.mY(z.t(b,"members"));z.G();){x=z.gl()
 w=J.U6(x)
-y.h(0,new D.xb(H.BU(w.t(x,"pc"),16,null),w.t(x,"deoptId"),w.t(x,"tokenPos"),w.t(x,"tryIndex"),J.iY(w.t(x,"kind")),null,null,null,null))}}},
+y.h(0,new D.Z9(H.BU(w.t(x,"pc"),16,null),w.t(x,"deoptId"),w.t(x,"tokenPos"),w.t(x,"tryIndex"),J.rr(w.t(x,"kind")),null,null,null,null))}}},
 nla:{
 "^":"af+Pi;",
 $isd3:true},
 br:{
-"^":"Pi;oc>,vH>,eb,Jb>,ePv,fY>,Vg,ij",
+"^":"Pi;oc>,vH>,eb,Ml>,ePv,fY>,Vg,fn",
 $isbr:true},
 Mi:{
-"^":"Fba;df,MD,uH<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"Fba;df,MD,uH<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gky:function(a){return this.MD},
+gyT:function(a){return this.MD},
 gjm:function(){return!1},
 gM8:function(){return!0},
-bF:function(a,b,c){var z,y,x,w
+R5:function(a,b,c){var z,y,x,w
 if(c)return
-D.kT(b,J.wg(this.V0))
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"class")
 this.df=F.Wi(this,C.Wt,this.df,y)
@@ -19899,20 +19933,20 @@
 y.V1(y)
 for(z=J.mY(z.t(b,"members"));z.G();){x=z.gl()
 w=J.U6(x)
-y.h(0,new D.br(w.t(x,"name"),w.t(x,"index"),w.t(x,"beginPos"),w.t(x,"endPos"),w.t(x,"scopeId"),J.iY(w.t(x,"kind")),null,null))}}},
+y.h(0,new D.br(w.t(x,"name"),w.t(x,"index"),w.t(x,"beginPos"),w.t(x,"endPos"),w.t(x,"scopeId"),J.rr(w.t(x,"kind")),null,null))}}},
 Fba:{
 "^":"af+Pi;",
 $isd3:true},
-Ik:{
-"^":"laa;df,MD,C9,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+RA:{
+"^":"laa;df,MD,C9,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gky:function(a){return this.MD},
+gyT:function(a){return this.MD},
 gjm:function(){return!1},
 gM8:function(){return!0},
-bF:function(a,b,c){var z,y
+R5:function(a,b,c){var z,y
 if(c)return
-D.kT(b,J.wg(this.V0))
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"class")
 this.df=F.Wi(this,C.Wt,this.df,y)
@@ -19924,26 +19958,26 @@
 "^":"af+Pi;",
 $isd3:true},
 Q4:{
-"^":"Pi;Yu<,m7E,u0<,dh,uH<,Vg,ij",
-gnp:function(){return this.dh},
+"^":"Pi;Yu<,m7E,u0<,dh,uH<,Vg,fn",
+gEB:function(){return this.dh},
 gUB:function(){return J.xC(this.Yu,0)},
-ghR:function(){return this.uH.xN.length>0},
-dV:[function(){var z,y
+gX1:function(){return this.uH.XG.length>0},
+xtx:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
 return"0x"+y.WZ(z,16)},"$0","gZd",0,0,73],
 tU:[function(a){var z
 if(a==null)return""
-z=a.gn3().tf.t(0,this.Yu)
+z=a.gn3().LL.t(0,this.Yu)
 if(z==null)return""
-if(J.xC(z.gpn(),z.gDu()))return""
-return D.Tn(z.gpn(),a.glt())+" ("+H.d(z.gpn())+")"},"$1","gcQ",2,0,219,78],
+if(J.xC(z.gfF(),z.gDu()))return""
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,219,78],
 P7:[function(a){var z
 if(a==null)return""
-z=a.gn3().tf.t(0,this.Yu)
+z=a.gn3().LL.t(0,this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gAX",2,0,219,78],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,219,78],
 lF:function(){var z,y,x,w
 y=J.BQ(this.u0," ")
 x=y.length
@@ -19959,15 +19993,15 @@
 if(!J.co(z,"j"))return
 y=this.lF()
 x=J.x(y)
-if(x.n(y,0)){N.QM("").YX("Could not determine jump address for "+H.d(z))
-return}for(z=a.xN,w=0;w<z.length;++w){v=z[w]
+if(x.n(y,0)){N.QM("").hh("Could not determine jump address for "+H.d(z))
+return}for(z=a.XG,w=0;w<z.length;++w){v=z[w]
 if(J.xC(v.gYu(),y)){z=this.dh
 if(this.gnz(this)&&!J.xC(z,v)){z=new T.qI(this,C.b5,z,v)
 z.$builtinTypeInfo=[null]
 this.nq(this,z)}this.dh=v
-return}}N.QM("").YX("Could not find instruction at "+x.WZ(y,16))},
+return}}N.QM("").hh("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
-static:{Tn:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
+static:{Tn:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
 bu:[function(a){return this.uX},"$0","gCR",0,0,73],
@@ -19975,18 +20009,18 @@
 if(z.n(a,"Native"))return C.Oc
 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.AA
-else if(z.n(a,"Tag"))return C.oA
+else if(z.n(a,"Reused"))return C.yP
+else if(z.n(a,"Tag"))return C.Z7
 N.QM("").j2("Unknown code kind "+H.d(a))
 throw H.b(P.a9())}}},
 ta:{
 "^":"a;tT>,Av<",
 $ista:true},
-TH:{
-"^":"a;tT>,Av<,qu>,Jv",
-$isTH:true},
+D5:{
+"^":"a;tT>,Av<,ks>,Jv",
+$isD5:true},
 kx:{
-"^":"w25;I0,xM,Du<,pn<,vg,QA,VS,hw,va<,n3<,mM,rF,fo,uG,ar,MH,Mk,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"w28;I0,xM,Du<,fF<,vg,uE,VS,hw,va<,n3<,mM,rF,fo,uG,ar,MH,Mk,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 glt:function(){return this.xM},
 gS7:function(){return this.mM},
@@ -20002,16 +20036,16 @@
 gM8:function(){return!0},
 P8:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gH8",2,0,220,221],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.Ff.guH(),y=y.gA(y);y.G();)y.Ff.bR(a)},"$1","gH8",2,0,220,221],
 QW:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
 var z=this.uG
 if(z==null)return
-if(J.fx(z)==null){J.SK(this.uG).ml(new D.fA(this))
-return}J.SK(J.fx(this.uG)).ml(this.gH8())},
+if(J.zE(z)==null){J.SK(this.uG).ml(new D.Em(this))
+return}J.SK(J.zE(this.uG)).ml(this.gH8())},
 VD:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.VD.call(this,this)
 return P.Ab(this,null)},
-GK:function(a,b,c){var z,y,x,w,v
+ui:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=0
 while(!0){x=z.gB(b)
@@ -20021,21 +20055,21 @@
 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 D.ta(c[w],v))
-y+=2}H.ig(a,new D.jm())},
+y+=2}H.ig(a,new D.fx())},
 Il:function(a,b,c){var z,y
-this.xM=F.Wi(this,C.Kj,this.xM,c)
+this.xM=F.Wi(this,C.kr,this.xM,c)
 z=J.U6(a)
-this.pn=H.BU(z.t(a,"inclusive_ticks"),null,null)
+this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
 this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
-this.GK(this.VS,z.t(a,"callers"),b)
-this.GK(this.hw,z.t(a,"callees"),b)
+this.ui(this.VS,z.t(a,"callers"),b)
+this.ui(this.hw,z.t(a,"callees"),b)
 y=z.t(a,"ticks")
 if(y!=null)this.Zk(y)
-z=D.Rd(this.pn,this.xM)+" ("+H.d(this.pn)+")"
+z=D.Rd(this.fF,this.xM)+" ("+H.d(this.fF)+")"
 this.mM=F.Wi(this,C.eF,this.mM,z)
 z=D.Rd(this.Du,this.xM)+" ("+H.d(this.Du)+")"
 this.rF=F.Wi(this,C.uU,this.rF,z)},
-bF:function(a,b,c){var z,y,x,w,v,u
+R5:function(a,b,c){var z,y,x,w,v,u
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
@@ -20046,8 +20080,8 @@
 y=D.CQ(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 this.vg=H.BU(z.t(b,"start"),16,null)
-this.QA=H.BU(z.t(b,"end"),16,null)
-y=this.V0
+this.uE=H.BU(z.t(b,"end"),16,null)
+y=this.x8
 x=J.RE(y)
 w=x.god(y).Qn(z.t(b,"function"))
 this.uG=F.Wi(this,C.nf,this.uG,w)
@@ -20057,8 +20091,8 @@
 if(v!=null)this.cr(v)
 u=z.t(b,"descriptors")
 if(u!=null)this.Xd(J.UQ(u,"members"))
-z=this.va.xN
-this.ks=z.length!==0||!J.xC(this.I0,C.l8)
+z=this.va.XG
+this.qu=z.length!==0||!J.xC(this.I0,C.l8)
 z=z.length!==0&&J.xC(this.I0,C.l8)
 this.Mk=F.Wi(this,C.zS,this.Mk,z)},
 gUa:function(){return this.Mk},
@@ -20073,22 +20107,22 @@
 v=y.t(a,x+1)
 u=y.t(a,x+2)
 t=!J.xC(y.t(a,x),"")?H.BU(y.t(a,x),null,null):0
-w=D.xb
+w=D.Z9
 s=[]
 s.$builtinTypeInfo=[w]
 s=new Q.wn(null,null,s,null,null)
 s.$builtinTypeInfo=[w]
 z.h(0,new D.Q4(t,v,u,null,s,null,null))
-x+=3}for(y=z.gA(z);y.G();)y.lo.pj(z)},
+x+=3}for(y=z.gA(z);y.G();)y.Ff.pj(z)},
 MY:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=H.BU(z.t(a,"pc"),16,null)
 x=z.t(a,"deoptId")
 w=z.t(a,"tokenPos")
 v=z.t(a,"tryIndex")
-u=J.iY(z.t(a,"kind"))
-for(z=this.va,z=z.gA(z);z.G();){t=z.lo
-if(J.xC(t.gYu(),y)){t.guH().h(0,new D.xb(y,x,w,v,u,null,null,null,null))
+u=J.rr(z.t(a,"kind"))
+for(z=this.va,z=z.gA(z);z.G();){t=z.Ff
+if(J.xC(t.gYu(),y)){t.guH().h(0,new D.Z9(y,x,w,v,u,null,null,null,null))
 return}}N.QM("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
 Xd:function(a){var z
 for(z=J.mY(a);z.G();)this.MY(z.gl())},
@@ -20103,29 +20137,29 @@
 y.u(0,v,new D.uA(v,H.BU(z.t(a,x+1),null,null),H.BU(z.t(a,x+2),null,null)))
 x+=3}},
 tg:function(a,b){var z=J.Wx(b)
-return z.F(b,this.vg)&&z.C(b,this.QA)},
-gqy:function(){return J.xC(this.I0,C.l8)},
+return z.F(b,this.vg)&&z.C(b,this.uE)},
+gcE:function(){return J.xC(this.I0,C.l8)},
 $iskx:true,
-static:{Rd:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
-w25:{
+static:{Rd:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
+w28:{
 "^":"af+Pi;",
 $isd3:true},
-fA:{
+Em:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=this.a
-y=J.fx(z.uG)
+y=J.zE(z.uG)
 if(y==null)return
 J.SK(y).ml(z.gH8())},"$1",null,2,0,null,222,"call"],
 $isEH:true},
-jm:{
+fx:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.bI(b.gAv(),a.gAv())},
 $isEH:true},
 M9x:{
 "^":"a;uX",
 bu:[function(a){return this.uX},"$0","gCR",0,0,73],
-static:{"^":"Cnk,lTU,FJy,wjk",AR:function(a){var z=J.x(a)
+static:{"^":"Cnk,qp,FJy,wr",AR:function(a){var z=J.x(a)
 if(z.n(a,"Listening"))return C.Cn
 else if(z.n(a,"Normal"))return C.lT
 else if(z.n(a,"Pipe"))return C.FJ
@@ -20133,21 +20167,21 @@
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"w26;V8@,jel,IHj,I0,vu,e5,ho,SI,L7,zw,tO,HO,u8,Wm,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"w29;ip@,jel,IHj,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gjm:function(){return!0},
 gHY:function(){return J.xC(this.I0,C.FJ)},
 gfY:function(a){return this.I0},
-gA8:function(a){return this.vu},
-gm8:function(){return this.e5},
-gSY:function(){return this.ho},
-gmy:function(){return this.SI},
+gaB:function(a){return this.vu},
+gm8:function(){return this.DB},
+gaU:function(){return this.XK},
+gaP:function(){return this.FH},
 gzM:function(){return this.L7},
-gq2:function(){return this.zw},
+gki:function(){return this.zw},
 giP:function(){return this.tO},
-gbB:function(){return this.HO},
+gfJ:function(){return this.HO},
 gNS:function(){return this.u8},
-gzK:function(){return this.Wm},
-bF:function(a,b,c){var z,y
+gzK:function(){return this.EC},
+R5:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
@@ -20156,14 +20190,14 @@
 y=D.AR(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 if(c)return
-this.ks=!0
-D.kT(b,J.wg(this.V0))
+this.qu=!0
+D.kT(b,J.aT(this.x8))
 y=z.t(b,"readClosed")
-this.e5=F.Wi(this,C.I7,this.e5,y)
+this.DB=F.Wi(this,C.I7,this.DB,y)
 y=z.t(b,"writeClosed")
-this.ho=F.Wi(this,C.Uy,this.ho,y)
+this.XK=F.Wi(this,C.Uy,this.XK,y)
 y=z.t(b,"closing")
-this.SI=F.Wi(this,C.To,this.SI,y)
+this.FH=F.Wi(this,C.To,this.FH,y)
 y=z.t(b,"listening")
 this.L7=F.Wi(this,C.cc,this.L7,y)
 y=z.t(b,"protocol")
@@ -20175,37 +20209,37 @@
 y=z.t(b,"remoteAddress")
 this.u8=F.Wi(this,C.dx,this.u8,y)
 y=z.t(b,"remotePort")
-this.Wm=F.Wi(this,C.ni,this.Wm,y)
+this.EC=F.Wi(this,C.ni,this.EC,y)
 y=z.t(b,"fd")
 this.zw=F.Wi(this,C.R3,this.zw,y)
-this.V8=z.t(b,"owner")}},
-w26:{
+this.ip=z.t(b,"owner")}},
+w29:{
 "^":"af+Pi;",
 $isd3:true},
 G9:{
 "^":"a;P>,Fl<",
 $isG9:true},
 YX:{
-"^":"w27;L5,mw@,Jk<,kB,Qd,FA,zn,ay,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"w30;L5,mw@,Jk<,wE,Qd,FA,zn,LV,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gjm:function(){return!0},
 gM8:function(){return!1},
-ghM:function(){return this.kB},
-shM:function(a){this.kB=a
-this.nW()},
+ghM:function(){return this.wE},
+shM:function(a){this.wE=a
+this.Hi()},
 NT:function(a){this.Jk.h(0,a)
-this.nW()},
-nW:function(){var z,y,x
+this.Hi()},
+Hi:function(){var z,y,x
 z=this.Jk
-y=z.xN.length
-x=this.kB
+y=z.XG.length
+x=this.wE
 if(typeof x!=="number")return H.s(x)
 if(y>x)z.oq(0,0,y-x)},
-gQZ:function(){return this.Qd},
+gGB:function(){return this.Qd},
 gP:function(a){return this.FA},
 sP:function(a,b){this.FA=F.Wi(this,C.zd,this.FA,b)},
 gBp:function(a){return this.zn},
-gA5:function(a){return this.ay},
-bF:function(a,b,c){var z,y
+gA5:function(a){return this.LV},
+R5:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
@@ -20218,19 +20252,19 @@
 y=z.t(b,"min")
 this.zn=F.Wi(this,C.a2,this.zn,y)
 z=z.t(b,"max")
-this.ay=F.Wi(this,C.qi,this.ay,z)},
-bu:[function(a){return"ServiceMetric("+H.d(this.r0)+")"},"$0","gCR",0,0,73],
+this.LV=F.Wi(this,C.qi,this.LV,z)},
+bu:[function(a){return"ServiceMetric("+H.d(this.TU)+")"},"$0","gCR",0,0,73],
 $isYX:true},
-w27:{
+w30:{
 "^":"af+Pi;",
 $isd3:true},
 W1:{
-"^":"a;fj<,MT>,Cb",
+"^":"a;Jb<,MT>,Cb",
 Gv:function(){var z=this.Cb
 if(z!=null)z.Gv()
 this.Cb=null},
-Lyg:[function(a,b){var z,y,x,w
-for(z=this.fj,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=J.LE(z.lo)
+Y0:[function(a,b){var z,y,x,w
+for(z=this.Jb,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=J.LE(z.Ff)
 y.toString
 x=$.X3
 w=new P.Gc(0,x,null,null,x.cR(new D.r6()),null,P.VH(null,$.X3),null)
@@ -20250,17 +20284,17 @@
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
-if(y&&D.D5(b))this.a.u(0,a,this.b.Qn(b))
+if(y&&D.bF(b))this.a.u(0,a,this.b.Qn(b))
 else if(!!z.$iswn)D.f3(b,this.b)
 else if(y)D.Gf(b,this.b)},
 $isEH:true}}],["","",,L,{
 "^":"",
 Z5:{
-"^":"a;FH@,A9<,oc*,w8<",
+"^":"a;eX@,A9<,oc*,w8<",
 gp8:function(){return this.A9!==!0},
-Lt:function(){return P.EF(["lastConnectionTime",this.FH,"chrome",this.A9,"name",this.oc,"networkAddress",this.w8],null,null)},
+Lt:function(){return P.EF(["lastConnectionTime",this.eX,"chrome",this.A9,"name",this.oc,"networkAddress",this.w8],null,null)},
 UT:function(a){var z=J.U6(a)
-this.FH=z.t(a,"lastConnectionTime")
+this.eX=z.t(a,"lastConnectionTime")
 this.A9=z.t(a,"chrome")
 this.oc=z.t(a,"name")
 z=z.t(a,"networkAddress")
@@ -20270,47 +20304,49 @@
 static:{K9:function(a){var z=new L.Z5(0,!1,null,null)
 z.UT(a)
 return z}}},
-Z8:{
-"^":"a;jO>,mh<",
-$isZ8:true},
+U2:{
+"^":"a;jO>,qT<",
+$isU2:true},
 Uon:{
 "^":"wv;N>",
 gEH:function(){return this.Tn.MM},
-FZ:function(){var z=this.Fq.MM
+FZ:function(){if(!this.ib)return
+var z=this.Fq.MM
 if(z.YM===0){N.QM("").To("WebSocketVM connection error: "+H.d(this.N.gw8()))
 if(z.YM!==0)H.vh(P.w("Future already completed"))
 z.Xf(this)}},
 giG:function(a){return this.Fq.MM},
 je:function(a){if(this.Sl)this.Ra.bs.close()
-this.C8()
+this.M0()
 this.FZ()},
 z6:function(a,b){var z,y,x
 if(!this.Sl){this.Sl=!0
 this.Ra.Tc(this.N.gw8(),this.gkQ(),this.gM3(),this.gCW(),this.gNu())}z=C.jn.bu(this.x7++)
 y=P.qU
 y=H.VM(new P.Zf(P.Dt(y)),[y])
-x=new L.Z8(b,y)
+x=new L.U2(b,y)
 if(this.Ra.bs.readyState===1)this.Mf(z,x)
 else this.WE.u(0,z,x)
 return y.MM},
-abp:[function(){this.C8()
+abp:[function(){this.M0()
 this.FZ()},"$0","gNu",0,0,17],
-Xs:[function(){this.C8()
+Xs:[function(){this.M0()
 this.FZ()},"$0","gCW",0,0,17],
-LN:[function(){var z,y
+LNZ:[function(){var z,y
 z=this.N
 y=Date.now()
 new P.iP(y,!1).EK()
-z.sFH(y)
+z.seX(y)
 this.e2()
+this.ib=!0
 y=this.Tn.MM
 if(y.YM===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
 if(y.YM!==0)H.vh(P.w("Future already completed"))
 y.Xf(this)}},"$0","gkQ",0,0,17],
 PW:[function(a){var z,y,x,w,v
 if(typeof a!=="string"){this.Ra.OI(a).ml(new L.jF(this))
-return}z=C.xr.kV(a)
-if(z==null){N.QM("").YX("WebSocketVM got empty message")
+return}z=C.xr.iQ(a)
+if(z==null){N.QM("").hh("WebSocketVM got empty message")
 return}if(this.N.gA9()===!0){y=J.U6(z)
 if(!J.xC(y.t(z,"method"),"Dart.observatoryData"))return
 x=J.AG(J.UQ(y.t(z,"params"),"id"))
@@ -20318,13 +20354,13 @@
 x=y.t(z,"seq")
 w=y.t(z,"response")}if(x==null){this.EM(w)
 return}v=this.Td.Rz(0,x)
-if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
-return}y=v.gmh().MM
+if(v==null){N.QM("").hh("Received unexpected message: "+H.d(z))
+return}y=v.gqT().MM
 if(y.YM!==0)H.vh(P.w("Future already completed"))
 y.Xf(w)},"$1","gM3",2,0,19],
-ck:function(a){a.aN(0,new L.dV(this))
+ck:function(a){a.aN(0,new L.aZ(this))
 a.V1(0)},
-C8:function(){var z=this.Td
+M0:function(){var z=this.Td
 if(z.X5>0){N.QM("").To("Cancelling all pending requests.")
 this.ck(z)}z=this.WE
 if(z.X5>0){N.QM("").To("Cancelling all delayed requests.")
@@ -20344,13 +20380,13 @@
 "^":"TpZ:224;a",
 $1:[function(a){var z,y,x,w,v,u,t
 z=J.RE(a)
-y=z.mt(a,0,C.eL)
+y=z.mt(a,0,C.it)
 x=this.a
 w=z.gbg(a)
 v=z.gVl(a)
 if(typeof v!=="number")return v.g()
 w.toString
-u=x.Ur.WJ(H.GG(w,v+8,y))
+u=x.Ur.Sw(H.z4(w,v+8,y))
 t=C.jn.g(8,y)
 v=z.gbg(a)
 w=z.gVl(a)
@@ -20359,10 +20395,10 @@
 if(typeof z!=="number")return z.W()
 x.hQ(u,J.cm(v,w+t,z-t))},"$1",null,2,0,null,15,"call"],
 $isEH:true},
-dV:{
+aZ:{
 "^":"TpZ:225;a",
 $2:function(a,b){var z,y
-z=b.gmh()
+z=b.gqT()
 y=C.xr.KP(P.EF(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null))
 z=z.MM
 if(z.YM!==0)H.vh(P.w("Future already completed"))
@@ -20370,16 +20406,16 @@
 $isEH:true}}],["","",,R,{
 "^":"",
 zM:{
-"^":"V57;S4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V57;S4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gkc:function(a){return a.S4},
 skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
-static:{ZmK:function(a){var z,y,x,w
+static:{qa:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20394,24 +20430,24 @@
 $isd3:true}}],["","",,D,{
 "^":"",
 Rk:{
-"^":"V58;D1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gja:function(a){return a.D1},
-sja:function(a,b){a.D1=this.ct(a,C.ne,a.D1,b)},
+"^":"V58;Xc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gja:function(a){return a.Xc},
+sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
 static:{bZp:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.kgQ.LX(a)
-C.kgQ.XI(a)
+C.Vd.LX(a)
+C.Vd.XI(a)
 return a}}},
 V58:{
 "^":"uL+Pi;",
@@ -20419,29 +20455,29 @@
 "^":"",
 hA:{
 "^":"a;bs",
-Tc:function(a,b,c,d,e){var z=W.D7(a,null)
+Tc:function(a,b,c,d,e){var z=W.P0(a,null)
 this.bs=z
-z=H.VM(new W.vG(z,"close",!1),[null])
+z=H.VM(new W.RO(z,C.d6.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.lo(e)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.vG(z,"error",!1),[null])
+z=H.VM(new W.RO(z,C.MD.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.j3(d)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.vG(z,"open",!1),[null])
+z=H.VM(new W.RO(z,C.JL.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.Fz(b)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.vG(z,"message",!1),[null])
+z=H.VM(new W.RO(z,C.ph.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.oy(c)),z.el),[H.u3(z,0)]).DN()},
 wR:function(a,b){this.bs.send(b)},
 xO:function(a){this.bs.close()},
 OI:function(a){var z,y
 z=new FileReader()
 z.readAsArrayBuffer(a)
-y=H.VM(new W.vG(z,"loadend",!1),[null])
-return y.gtH(y).ml(new U.OW(z))}},
+y=H.VM(new W.RO(z,C.G5.fA,!1),[null])
+return y.gqG(y).ml(new U.OW(z))}},
 lo:{
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.$0()},"$1",null,2,0,null,226,"call"],
@@ -20463,13 +20499,13 @@
 $1:[function(a){return J.cm(C.kL.gyG(this.a),0,null)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 KM:{
-"^":"Uon;Tn,Fq,N,WE,Td,x7,Sl,Ur,Ra,Ox,GY,RW,Ts,Va,h7,jA,Li,G2,Rk,uj,Qi,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"Uon;Tn,Fq,N,WE,Td,x7,Sl,ib,Ur,Ra,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 $isKM:true},
 dS:{
-"^":"wv;eG,iW,S3,yb,Ox,GY,RW,Ts,Va,h7,jA,Li,G2,Rk,uj,Qi,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"wv;eG,rp,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 je:function(a){},
 gEH:function(){return this.eG.MM},
-giG:function(a){return this.iW.MM},
+giG:function(a){return this.rp.MM},
 j03:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -20488,16 +20524,16 @@
 y.u(0,"query",H.d(b));++this.yb
 x=H.VM(new P.Zf(P.Dt(null)),[null])
 this.S3.u(0,z,x)
-J.bb(W.Pv(window.parent),C.xr.KP(y),"*")
+J.tT(W.Pv(window.parent),C.xr.KP(y),"*")
 return x.MM},
-ZH:function(){var z=H.VM(new W.vG(window,"message",!1),[null])
+ZH:function(){var z=H.VM(new W.RO(window,C.ph.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(this.gDi()),z.el),[H.u3(z,0)]).DN()
 z=this.eG.MM
 if(z.YM!==0)H.vh(P.w("Future already completed"))
 z.Xf(this)}}}],["","",,U,{
 "^":"",
 Ti:{
-"^":"V59;Ll,Sa,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V59;Ll,Sa,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gWA:function(a){return a.Ll},
 sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
 gl6:function(a){return a.Sa},
@@ -20507,7 +20543,7 @@
 J.CJ(z,a.Ll)
 return z
 case"BreakpointList":z=W.r3("breakpoint-list",null)
-J.oJ(z,a.Ll)
+J.o3(z,a.Ll)
 return z
 case"Class":z=W.r3("class-view",null)
 J.NZ(z,a.Ll)
@@ -20558,7 +20594,7 @@
 J.A4(z,a.Ll)
 return z
 case"WebSocket":z=W.r3("io-web-socket-view",null)
-J.w7(z,a.Ll)
+J.tH(z,a.Ll)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
 J.Rp(z,a.Ll)
@@ -20617,21 +20653,21 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Ns.LX(a)
-C.Ns.XI(a)
+C.Uv.LX(a)
+C.Uv.XI(a)
 return a}}},
 V59:{
 "^":"uL+Pi;",
 $isd3:true},
 Um:{
-"^":"V60;dL,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V60;dL,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gBN:function(a){return a.dL},
 sBN:function(a,b){a.dL=this.ct(a,C.nE,a.dL,b)},
 static:{T21:function(a){var z,y,x,w
@@ -20640,7 +20676,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20654,13 +20690,13 @@
 "^":"uL+Pi;",
 $isd3:true},
 VZ:{
-"^":"V61;GW,C7,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V61;GW,C7,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gIr:function(a){return a.GW},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.GW=this.ct(a,C.SR,a.GW,b)},
 git:function(a){return a.C7},
 sit:function(a,b){a.C7=this.ct(a,C.B0,a.C7,b)},
-ITt:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
+hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
 Cpp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,166],
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
@@ -20672,61 +20708,61 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.C7=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.vmJ.LX(a)
-C.vmJ.XI(a)
+C.OX.LX(a)
+C.OX.XI(a)
 return a}}},
 V61:{
 "^":"uL+Pi;",
 $isd3:true},
 WG:{
-"^":"V62;Jg,C7,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V62;Jg,C7,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Jg},
 sjx:function(a,b){a.Jg=this.ct(a,C.vp,a.Jg,b)},
 git:function(a){return a.C7},
 sit:function(a,b){a.C7=this.ct(a,C.B0,a.C7,b)},
-ITt:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
+hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
 Cpp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,166],
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
 c.$0()},"$2","gus",4,0,230,231,102],
-static:{KTC:function(a){var z,y,x,w
+static:{z0:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.C7=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.dl.LX(a)
-C.dl.XI(a)
+C.DX.LX(a)
+C.DX.XI(a)
 return a}}},
 V62:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,Q,{
 "^":"",
 xI:{
-"^":"Dsd;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"Dsd;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gnv:function(a){return a.tY},
 snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
-gjT:function(a){return a.R1},
-sjT:function(a,b){a.R1=this.ct(a,C.uu,a.R1,b)},
+gjT:function(a){return a.Pe},
+sjT:function(a,b){a.Pe=this.ct(a,C.uu,a.Pe,b)},
 Qj:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
 this.ct(a,C.pu,0,1)
-this.ct(a,C.k6,"",this.gJp(a))},"$1","gBj",2,0,19,59],
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,19,59],
 gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 z=J.Ds(z)
@@ -20734,7 +20770,7 @@
 return"#"+H.d(z)},
 gJp:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},
+return z.gTE()},
 goc:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 return J.DA(z)},
@@ -20745,8 +20781,8 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20760,7 +20796,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 f7:{
-"^":"V63;tY,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V63;tY,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gnv:function(a){return a.tY},
 snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
 pY:function(a){var z
@@ -20804,14 +20840,14 @@
 x=this.pY(a)
 if(x==null){N.QM("").To("Unable to find a ref element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gBj",2,0,12,59],
-static:{wzV:function(a){var z,y,x,w
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gLe",2,0,12,59],
+static:{nk:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20825,15 +20861,15 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ce:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{FMr:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20845,14 +20881,14 @@
 return a}}}}],["","",,Q,{
 "^":"",
 CY:{
-"^":"ImK;kF,IK,bP,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"ImK;kF,IK,bP,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gd4:function(a){return a.kF},
 sd4:function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},
 gEu:function(a){return a.IK},
 sEu:function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
-oew:[function(a,b,c,d){var z=J.rp((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+oew:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
 a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,116,2,232,107],
 static:{AlS:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -20860,23 +20896,23 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.zb.LX(a)
-C.zb.XI(a)
+C.Yo.LX(a)
+C.Yo.XI(a)
 return a}}},
 ImK:{
 "^":"xc+Pi;",
 $isd3:true}}],["","",,A,{
 "^":"",
 rv:{
-"^":"a;kl,IW,Mg,nN,ER,Ja,BY,rM",
-WO:function(a,b){return this.rM.$1(b)},
+"^":"a;kl,IW,Mg,Yx,ER,Ja,BY,rM",
+xZ:function(a,b){return this.rM.$1(b)},
 bu:[function(a){var z=P.p9("")
 z.KF("(options:")
 z.KF(this.kl?"fields ":"")
@@ -20887,12 +20923,11 @@
 z.KF("annotations: "+H.d(this.BY))
 z.KF(this.rM!=null?"with matcher":"")
 z.KF(")")
-z=z.IN
-return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,73]},
+return z.IN},"$0","gCR",0,0,73]},
 ES:{
 "^":"a;oc>,fY>,V5>,t5>,Fo<,Dv<",
 gZI:function(){return this.fY===C.nU},
-gUd:function(){return this.fY===C.BM},
+gRS:function(){return this.fY===C.BM},
 gUA:function(){return this.fY===C.hU},
 giO:function(a){var z=this.oc
 return z.giO(z)},
@@ -20906,8 +20941,7 @@
 z.KF(this.Fo?"static ":"")
 z.KF(this.Dv)
 z.KF(")")
-z=z.IN
-return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,73],
+return z.IN},"$0","gCR",0,0,73],
 $isES:true},
 iYn:{
 "^":"a;fY>"}}],["","",,X,{
@@ -20924,17 +20958,17 @@
 ZO:function(a,b){var z,y,x,w,v,u
 z=new H.a7(a,a.length,0,null)
 z.$builtinTypeInfo=[H.u3(a,0)]
-for(;z.G();){y=z.lo
+for(;z.G();){y=z.Ff
 b.length
 x=new H.a7(b,1,0,null)
 x.$builtinTypeInfo=[H.u3(b,0)]
 w=J.x(y)
-for(;x.G();){v=x.lo
+for(;x.G();){v=x.Ff
 if(w.n(y,v))return!0
 if(!!J.x(v).$isLz){u=w.gbx(y)
-u=$.II().xs(u,v)}else u=!1
+u=$.mX().xs(u,v)}else u=!1
 if(u)return!0}}return!1},
-OS:function(a){var z,y
+na:function(a){var z,y
 z=H.G3()
 y=H.KT(z).Zg(a)
 if(y)return 0
@@ -20945,7 +20979,7 @@
 z=H.KT(z,[z,z,z]).Zg(a)
 if(z)return 3
 return 4},
-RI:function(a){var z,y
+Zpg:function(a){var z,y
 z=H.G3()
 y=H.KT(z,[z,z,z]).Zg(a)
 if(y)return 3
@@ -20961,9 +20995,9 @@
 y=b.length
 if(z!==y)return!1
 if(c){x=P.Fl(null,null)
-for(z=H.VM(new H.a7(b,y,0,null),[H.u3(b,0)]);z.G();){w=z.lo
+for(z=H.VM(new H.a7(b,y,0,null),[H.u3(b,0)]);z.G();){w=z.Ff
 v=x.t(0,w)
-x.u(0,w,J.WB(v==null?0:v,1))}for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){w=z.lo
+x.u(0,w,J.WB(v==null?0:v,1))}for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){w=z.Ff
 v=x.t(0,w)
 if(v==null)return!1
 if(v===1)x.Rz(0,w)
@@ -20974,15 +21008,15 @@
 kP:function(){throw H.b(P.eG("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["","",,O,{
 "^":"",
 Oj:{
-"^":"a;E4,F8,ZG,YK,t6,fJ<,T4,NI",
-FV:function(a,b){this.E4.FV(0,b.gE4())
+"^":"a;II,F8,ZG,of,F3,af<,T4,nX",
+FV:function(a,b){this.II.FV(0,b.gII())
 this.F8.FV(0,b.gF8())
 this.ZG.FV(0,b.gZG())
-O.PV(this.YK,b.gYK())
-O.PV(this.t6,b.gt6())
-this.fJ.FV(0,b.gfJ())
-b.gfJ().aN(0,new O.W2(this))},
-IZ:function(a,b,c,d,e,f,g){this.fJ.aN(0,new O.PO(this))},
+O.PV(this.of,b.gof())
+O.PV(this.F3,b.gF3())
+this.af.FV(0,b.gaf())
+b.gaf().aN(0,new O.T6(this))},
+IZ:function(a,b,c,d,e,f,g){this.af.aN(0,new O.PO(this))},
 static:{rH:function(a,b,c,d,e,f,g){var z,y
 z=P.Fl(null,null)
 y=P.Fl(null,null)
@@ -20990,98 +21024,98 @@
 z.IZ(a,b,c,d,e,f,g)
 return z},PV:function(a,b){var z,y
 for(z=b.gvc(b),z=z.gA(z);z.G(),!1;){y=z.gl()
-a.to(0,y,new O.D8())
+a.to(0,y,new O.oQ())
 J.bj(a.t(0,y),b.t(0,y))}}}},
 PO:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.T4.u(0,b,a)},
 $isEH:true},
-W2:{
+T6:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.T4.u(0,b,a)},
 $isEH:true},
-D8:{
+oQ:{
 "^":"TpZ:76;",
 $0:function(){return P.Fl(null,null)},
 $isEH:true},
 fH:{
-"^":"a;JE",
-jD:function(a,b){var z=this.JE.E4.t(0,b)
-if(z==null)throw H.b(O.lA("getter \""+H.d(b)+"\" in "+H.d(a)))
+"^":"a;xV",
+Gp:function(a,b){var z=this.xV.II.t(0,b)
+if(z==null)throw H.b(O.Fm("getter \""+H.d(b)+"\" in "+H.d(a)))
 return z.$1(a)},
-Q1:function(a,b,c){var z=this.JE.F8.t(0,b)
-if(z==null)throw H.b(O.lA("setter \""+H.d(b)+"\" in "+H.d(a)))
+Cq:function(a,b,c){var z=this.xV.F8.t(0,b)
+if(z==null)throw H.b(O.Fm("setter \""+H.d(b)+"\" in "+H.d(a)))
 z.$2(a,c)},
 Ck:function(a,b,c,d,e){var z,y,x,w,v,u,t,s
 z=null
-x=this.JE
-if(!!J.x(a).$isLz){w=x.t6.t(0,a)
-z=w==null?null:J.UQ(w,b)}else{v=x.E4.t(0,b)
-z=v==null?null:v.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
+x=this.xV
+if(!!J.x(a).$isLz){w=x.F3.t(0,a)
+z=w==null?null:J.UQ(w,b)}else{v=x.II.t(0,b)
+z=v==null?null:v.$1(a)}if(z==null)throw H.b(O.Fm("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){u=X.OS(z)
+if(d){u=X.na(z)
 if(u>3){y="we tried to adjust the arguments for calling \""+H.d(b)+"\", but we couldn't determine the exact number of arguments it expects (it is more than 3)."
-c=X.Na(c,u,P.y(u,J.q8(c)))}else{t=X.RI(z)
+c=X.Na(c,u,P.y(u,J.q8(c)))}else{t=X.Zpg(z)
 x=t>=0?t:J.q8(c)
 c=X.Na(c,u,x)}}try{x=H.eC(z,c,P.Te(null))
 return x}catch(s){if(!!J.x(H.Ru(s)).$isJS){if(y!=null)P.FL(y)
 throw s}else throw s}}},
 bY:{
-"^":"a;JE",
+"^":"a;xV",
 xs:function(a,b){var z,y,x
 if(J.xC(a,b)||J.xC(b,C.AP))return!0
-for(z=this.JE,y=z.ZG;!J.xC(a,C.AP);a=x){x=y.t(0,a)
+for(z=this.xV,y=z.ZG;!J.xC(a,C.AP);a=x){x=y.t(0,a)
 if(J.xC(x,b))return!0
-if(x==null){if(!z.NI)return!1
-throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+H.d(x)+")"))}}return!1},
+if(x==null){if(!z.nX)return!1
+throw H.b(O.Fm("superclass of \""+H.d(a)+"\" ("+H.d(x)+")"))}}return!1},
 UK:function(a,b){var z=this.NW(a,b)
 return z!=null&&z.gUA()&&z.gFo()!==!0},
 n6:function(a,b){var z,y,x
-z=this.JE
-y=z.YK.t(0,a)
-if(y==null){if(!z.NI)return!1
-throw H.b(O.lA("declarations for "+H.d(a)))}x=J.UQ(y,b)
+z=this.xV
+y=z.of.t(0,a)
+if(y==null){if(!z.nX)return!1
+throw H.b(O.Fm("declarations for "+H.d(a)))}x=J.UQ(y,b)
 return x!=null&&x.gUA()&&x.gFo()===!0},
 CV:function(a,b){var z=this.NW(a,b)
-if(z==null){if(!this.JE.NI)return
-throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
+if(z==null){if(!this.xV.nX)return
+throw H.b(O.Fm("declaration for "+H.d(a)+"."+H.d(b)))}return z},
 Me:function(a,b,c){var z,y,x,w,v,u
 z=[]
-if(c.Mg){y=this.JE
+if(c.Mg){y=this.xV
 x=y.ZG.t(0,b)
-if(x==null){if(y.NI)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!J.xC(x,c.nN))z=this.Me(0,x,c)}y=this.JE
-w=y.YK.t(0,b)
-if(w==null){if(!y.NI)return z
-throw H.b(O.lA("declarations for "+H.d(b)))}for(y=J.mY(J.hI(w));y.G();){v=y.gl()
+if(x==null){if(y.nX)throw H.b(O.Fm("superclass of \""+H.d(b)+"\""))}else if(!J.xC(x,c.Yx))z=this.Me(0,x,c)}y=this.xV
+w=y.of.t(0,b)
+if(w==null){if(!y.nX)return z
+throw H.b(O.Fm("declarations for "+H.d(b)))}for(y=J.mY(J.hI(w));y.G();){v=y.gl()
 if(!c.kl&&v.gZI())continue
-if(!c.IW&&v.gUd())continue
-if(c.ER&&J.Z6(v)===!0)continue
+if(!c.IW&&v.gRS())continue
+if(c.ER&&J.EM(v)===!0)continue
 if(!c.Ja&&v.gUA())continue
-if(c.rM!=null&&c.WO(0,J.DA(v))!==!0)continue
+if(c.rM!=null&&c.xZ(0,J.DA(v))!==!0)continue
 u=c.BY
 if(u!=null&&!X.ZO(v.gDv(),u))continue
 z.push(v)}return z},
 NW:function(a,b){var z,y,x,w,v,u
-for(z=this.JE,y=z.ZG,x=z.YK;!J.xC(a,C.AP);a=u){w=x.t(0,a)
+for(z=this.xV,y=z.ZG,x=z.of;!J.xC(a,C.AP);a=u){w=x.t(0,a)
 if(w!=null){v=J.UQ(w,b)
 if(v!=null)return v}u=y.t(0,a)
-if(u==null){if(!z.NI)return
-throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
+if(u==null){if(!z.nX)return
+throw H.b(O.Fm("superclass of \""+H.d(a)+"\""))}}return}},
 ut:{
-"^":"a;JE"},
+"^":"a;xV"},
 tk:{
-"^":"a;QZ<",
-bu:[function(a){return"Missing "+this.QZ+". Code generation for the smoke package seems incomplete."},"$0","gCR",0,0,73],
-static:{lA:function(a){return new O.tk(a)}}}}],["","",,K,{
+"^":"a;GB<",
+bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gCR",0,0,73],
+static:{Fm:function(a){return new O.tk(a)}}}}],["","",,K,{
 "^":"",
 nm:{
-"^":"V64;xP,yl,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V64;xP,rs,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gM6:function(a){return a.xP},
 sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
-git:function(a){return a.yl},
-sit:function(a,b){a.yl=this.ct(a,C.B0,a.yl,b)},
+git:function(a){return a.rs},
+sit:function(a,b){a.rs=this.ct(a,C.B0,a.rs,b)},
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-vQ:[function(a,b,c){a.yl=this.ct(a,C.B0,a.yl,b)
+vQ:[function(a,b,c){a.rs=this.ct(a,C.B0,a.rs,b)
 c.$0()},"$2","gus",4,0,230,231,102],
 static:{ant:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -21089,8 +21123,8 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.yl=!1
-a.Iy=[]
+a.rs=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -21105,17 +21139,17 @@
 $isd3:true}}],["","",,X,{
 "^":"",
 Vu:{
-"^":"V65;ju,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gtN:function(a){return a.ju},
-stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-pA:[function(a,b){J.LE(a.ju).wM(b)},"$1","gvC",2,0,19,102],
+"^":"V65;Jl,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gtN:function(a){return a.Jl},
+stN:function(a,b){a.Jl=this.ct(a,C.kw,a.Jl,b)},
+pA:[function(a,b){J.LE(a.Jl).wM(b)},"$1","gvC",2,0,19,102],
 static:{lt2:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -21129,58 +21163,59 @@
 "^":"uL+Pi;",
 $isd3:true}}],["","",,M,{
 "^":"",
-iX:function(a,b){var z,y,x,w,v,u
+dg:function(a,b){var z,y,x,w,v,u
 z=M.pNz(a,b)
 if(z==null)z=new M.XI([],null,null)
-for(y=J.RE(a),x=y.gNL(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.iX(x,b)
-if(w==null){w=Array(y.gdH(a).uR.childNodes.length)
+for(y=J.RE(a),x=y.gNL(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.dg(x,b)
+if(u==null)continue
+if(w==null){w=Array(y.gUN(a).uR.childNodes.length)
 w.fixed$length=init}if(v>=w.length)return H.e(w,v)
-w[v]=u}z.qu=w
+w[v]=u}z.ks=w
 return z},
-Ch:function(a,b,c,d,e,f,g,h){var z,y,x,w
-z=b.appendChild(J.Ct(c,a,!1))
-for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.Ch(y,z,c,x?d.f8(w):null,e,f,g,null)
-if(d.ghK()){M.uH(z).rp(a)
-if(f!=null)J.NA(M.uH(z),f)}M.mV(z,d,e,g)
+S0:function(a,b,c,d,e,f,g,h){var z,y,x,w
+z=b.appendChild(J.pL(c,a,!1))
+for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.S0(y,z,c,x?d.f8(w):null,e,f,g,null)
+if(d.ghK()){M.Xi(z).cl(a)
+if(f!=null)J.D4(M.Xi(z),f)}M.mV(z,d,e,g)
 return z},
-b1:function(a,b){return!!J.x(a).$iskJ&&J.xC(b,"text")?"textContent":b},
+aR:function(a,b){return!!J.x(a).$isUn&&J.xC(b,"text")?"textContent":b},
 xa:function(a){var z
 if(a==null)return
 z=J.UQ(a,"__dartBindable")
-return!!J.x(z).$isAp?z:new M.dP(a)},
+return!!J.x(z).$isAp?z:new M.VB(a)},
 fg:function(a){var z,y,x
-if(!!J.x(a).$isdP)return a.qf
+if(!!J.x(a).$isVB)return a.qf
 z=$.X3
-y=new M.Vf(z)
+y=new M.Ra(z)
 x=new M.aY(z)
-return P.jT(P.EF(["open",x.$1(new M.SL(a)),"close",y.$1(new M.no(a)),"discardChanges",y.$1(new M.uD(a)),"setValue",x.$1(new M.eT(a)),"deliver",y.$1(new M.Wb(a)),"__dartBindable",a],null,null))},
+return P.jT(P.EF(["open",x.$1(new M.SL(a)),"close",y.$1(new M.no(a)),"discardChanges",y.$1(new M.uD(a)),"setValue",x.$1(new M.Wb(a)),"deliver",y.$1(new M.SLX(a)),"__dartBindable",a],null,null))},
 tA:function(a){var z
-for(;z=J.cP(a),z!=null;a=z);return a},
-l5:function(a,b){var z,y,x,w,v,u
+for(;z=J.ra5(a),z!=null;a=z);return a},
+cS:function(a,b){var z,y,x,w,v,u
 if(b==null||b==="")return
 z="#"+H.d(b)
 for(;!0;){a=M.tA(a)
-y=$.Uo()
+y=$.nR()
 y.toString
-x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.V2())
+x=H.vA(a,"expando$values")
+w=x==null?null:H.vA(x,y.V2())
 y=w==null
-if(!y&&w.gNK()!=null)v=J.Eh(w.gNK(),z)
+if(!y&&w.gcA()!=null)v=J.yR(w.gcA(),z)
 else{u=J.x(a)
-v=!!u.$isSy||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
+v=!!u.$isYN||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
 if(y)return
-a=w.gLx()
+a=w.gXD()
 if(a==null)return}},
 ah:function(a,b,c){if(c==null)return
-return new M.hg(a,b,c)},
+return new M.iT(a,b,c)},
 pNz:function(a,b){var z,y
 z=J.x(a)
 if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$iskJ){y=S.iw(a.textContent,M.ah("text",a,b))
+if(!!z.$isUn){y=S.j9(a.textContent,M.ah("text",a,b))
 if(y!=null)return new M.XI(["text",y],null,null)}return},
 rJ:function(a,b,c){var z=a.getAttribute(b)
 if(z==="")z="{{}}"
-return S.iw(z,M.ah(b,a,c))},
+return S.j9(z,M.ah(b,a,c))},
 F5:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=null
@@ -21190,18 +21225,18 @@
 if(x==null){w=[]
 z.a=w
 z=w}else z=x
-v=new M.qfK(null,null,null,z,null,null)
+v=new M.qf(null,null,null,z,null,null)
 z=M.rJ(a,"if",b)
 v.Z0=z
 x=M.rJ(a,"bind",b)
 v.lC=x
 u=M.rJ(a,"repeat",b)
 v.vJ=u
-if(z!=null&&x==null&&u==null)v.lC=S.iw("{{}}",M.ah("bind",a,b))
+if(z!=null&&x==null&&u==null)v.lC=S.j9("{{}}",M.ah("bind",a,b))
 return v}z=z.a
 return z==null?null:new M.XI(z,null,null)},
 i8:function(a,b,c,d){var z,y,x,w,v,u,t
-if(b.gqz()){z=b.Bd(0)
+if(b.gqz()){z=b.cf(0)
 y=z!=null?z.$3(d,c,!0):b.Pn(0).WK(d)
 return b.gaW()?y:b.qm(y)}x=J.U6(b)
 w=x.gB(b)
@@ -21213,13 +21248,13 @@
 while(!0){t=x.gB(b)
 if(typeof t!=="number")return H.s(t)
 if(!(u<t))break
-z=b.Bd(u)
+z=b.cf(u)
 t=z!=null?z.$3(d,c,!1):b.Pn(u).WK(d)
 if(u>=w)return H.e(v,u)
 v[u]=t;++u}return b.qm(v)},
-G5:function(a,b,c,d){var z,y,x,w,v,u,t,s
+jb:function(a,b,c,d){var z,y,x,w,v,u,t,s
 if(b.gau())return M.i8(a,b,c,d)
-if(b.gqz()){z=b.Bd(0)
+if(b.gqz()){z=b.cf(0)
 y=z!=null?z.$3(d,c,!1):new L.WR(L.hk(b.Pn(0)),d,null,null,null,null,$.jq1)
 return b.gaW()?y:new Y.cU(y,b.gPf(),null,null,null)}y=new L.nQ(null,!1,[],null,null,null,$.jq1)
 y.z7=[]
@@ -21228,8 +21263,8 @@
 while(!0){v=x.gB(b)
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
-c$0:{u=b.U0(w)
-z=b.Bd(w)
+c$0:{u=b.AX(w)
+z=b.cf(w)
 if(z!=null){t=z.$3(d,c,u)
 if(u===!0)y.ti(t)
 else y.YU(t)
@@ -21239,7 +21274,7 @@
 mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o
 z=J.RE(b)
 y=z.gCd(b)
-x=!!J.x(a).$ishs?a:M.uH(a)
+x=!!J.x(a).$isvy?a:M.Xi(a)
 w=J.U6(y)
 v=J.RE(x)
 u=0
@@ -21248,78 +21283,78 @@
 if(!(u<t))break
 s=w.t(y,u)
 r=w.t(y,u+1)
-q=v.nR(x,s,M.G5(s,r,a,c),r.gau())
+q=v.nR(x,s,M.jb(s,r,a,c),r.gau())
 if(q!=null&&!0)d.push(q)
 u+=2}v.lL(x)
-if(!z.$isqfK)return
-p=M.uH(a)
+if(!z.$isqf)return
+p=M.Xi(a)
 p.sQk(c)
 o=p.KI(b)
 if(o!=null&&!0)d.push(o)},
-uH:function(a){var z,y,x,w
-z=$.rw()
+Xi:function(a){var z,y,x,w
+z=$.as()
 z.toString
-y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.V2())
+y=H.vA(a,"expando$values")
+x=y==null?null:H.vA(y,z.V2())
 if(x!=null)return x
 w=J.x(a)
-if(!!w.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).dA.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!w.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).dA.hasAttribute("template")===!0&&C.bq.NZ(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!0
 else w=!0
 else w=!1
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,P.kW(a),null):new M.hs(a,P.kW(a),null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,P.XY(a),null):new M.vy(a,P.XY(a),null)
 z.u(0,a,x)
 return x},
 CF:function(a){var z=J.x(a)
-if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).dA.hasAttribute("template")===!0&&C.lY.NZ(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).dA.hasAttribute("template")===!0&&C.bq.NZ(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
 else z=!0
 else z=!0
 else z=!1
 return z},
-VE:{
+vE:{
 "^":"a;oe",
 op:function(a,b,c){return},
 static:{"^":"ac"}},
 XI:{
-"^":"a;Cd>,qu>,rz>",
+"^":"a;Cd>,ks>,rz>",
 ghK:function(){return!1},
-f8:function(a){var z=this.qu
+f8:function(a){var z=this.ks
 if(z==null||a>=z.length)return
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
-qfK:{
-"^":"XI;Z0,lC,vJ,Cd,qu,rz",
+qf:{
+"^":"XI;Z0,lC,vJ,Cd,ks,rz",
 ghK:function(){return!0},
-$isqfK:true},
-hs:{
+$isqf:true},
+vy:{
 "^":"a;KB<,qf,qL?",
 gCd:function(a){var z=J.UQ(this.qf,"bindings_")
 if(z==null)return
 return new M.lb(this.gKB(),z)},
 sCd:function(a,b){var z=this.gCd(this)
-if(z==null){J.qQ(this.qf,"bindings_",P.jT(P.Fl(null,null)))
+if(z==null){J.kW(this.qf,"bindings_",P.jT(P.Fl(null,null)))
 z=this.gCd(this)}z.FV(0,b)},
-nR:function(a,b,c,d){b=M.b1(this.gKB(),b)
+nR:function(a,b,c,d){b=M.aR(this.gKB(),b)
 if(!d&&!!J.x(c).$isAp)c=M.fg(c)
 return M.xa(this.qf.V7("bind",[b,c,d]))},
 lL:function(a){return this.qf.nQ("bindFinished")},
-gCn:function(a){var z=this.qL
+gmb:function(a){var z=this.qL
 if(z!=null);else if(J.Lp(this.gKB())!=null){z=J.Lp(this.gKB())
-z=J.OC(!!J.x(z).$ishs?z:M.uH(z))}else z=null
+z=J.re(!!J.x(z).$isvy?z:M.Xi(z))}else z=null
 return z},
-$ishs:true},
+$isvy:true},
 lb:{
 "^":"ilb;KB<,dn<",
 gvc:function(a){return J.kl(J.UQ($.Xw(),"Object").V7("keys",[this.dn]),new M.Tl(this))},
-t:function(a,b){if(!!J.x(this.KB).$iskJ&&J.xC(b,"text"))b="textContent"
+t:function(a,b){if(!!J.x(this.KB).$isUn&&J.xC(b,"text"))b="textContent"
 return M.xa(J.UQ(this.dn,b))},
-u:function(a,b,c){if(!!J.x(this.KB).$iskJ&&J.xC(b,"text"))b="textContent"
-J.qQ(this.dn,b,M.fg(c))},
+u:function(a,b,c){if(!!J.x(this.KB).$isUn&&J.xC(b,"text"))b="textContent"
+J.kW(this.dn,b,M.fg(c))},
 Rz:[function(a,b){var z,y,x
 z=this.KB
-b=M.b1(z,b)
+b=M.aR(z,b)
 y=this.dn
-x=M.xa(J.UQ(y,M.b1(z,b)))
+x=M.xa(J.UQ(y,M.aR(z,b)))
 y.Ji(b)
 return x},"$1","gUS",2,0,233,58],
 V1:function(a){J.Me(this.gvc(this),this.gUS(this))},
@@ -21327,17 +21362,17 @@
 $asT8:function(){return[P.qU,A.Ap]}},
 Tl:{
 "^":"TpZ:12;a",
-$1:[function(a){return!!J.x(this.a.KB).$iskJ&&J.xC(a,"textContent")?"text":a},"$1",null,2,0,null,58,"call"],
+$1:[function(a){return!!J.x(this.a.KB).$isUn&&J.xC(a,"textContent")?"text":a},"$1",null,2,0,null,58,"call"],
 $isEH:true},
-dP:{
+VB:{
 "^":"Ap;qf",
 TR:function(a,b){return this.qf.V7("open",[$.X3.mS(b)])},
 xO:function(a){return this.qf.nQ("close")},
 gP:function(a){return this.qf.nQ("discardChanges")},
 sP:function(a,b){this.qf.V7("setValue",[b])},
 fR:function(){return this.qf.nQ("deliver")},
-$isdP:true},
-Vf:{
+$isVB:true},
+Ra:{
 "^":"TpZ:12;a",
 $1:function(a){return this.a.xi(a,!1)},
 $isEH:true},
@@ -21361,80 +21396,80 @@
 "^":"TpZ:76;f",
 $0:[function(){return J.Vm(this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
-eT:{
+Wb:{
 "^":"TpZ:12;UI",
 $1:[function(a){J.Fc(this.UI,a)
 return a},"$1",null,2,0,null,180,"call"],
 $isEH:true},
-Wb:{
+SLX:{
 "^":"TpZ:76;bK",
 $0:[function(){return this.bK.fR()},"$0",null,0,0,null,"call"],
 $isEH:true},
 qU9:{
-"^":"a;k8>,tA,ip"},
+"^":"a;k8>,tA,MC"},
 DT:{
-"^":"hs;Qk?,Rc,kr<,mT,Gw?,Yz?,CS?,dK,Fe,XA,KB,qf,qL",
+"^":"vy;Qk?,Rc,kr<,mT,Gw?,Yz?,CS?,dK,Fe,XA,KB,qf,qL",
 gKB:function(){return this.KB},
 nR:function(a,b,c,d){var z,y
-if(!J.xC(b,"ref"))return M.hs.prototype.nR.call(this,this,b,c,d)
-z=d?c:J.mu(c,new M.Aj(this))
+if(!J.xC(b,"ref"))return M.vy.prototype.nR.call(this,this,b,c,d)
+z=d?c:J.mu(c,new M.De(this))
 J.Vs(this.KB).dA.setAttribute("ref",z)
 this.NB()
 if(d)return
 if(this.gCd(this)==null)this.sCd(0,P.Fl(null,null))
 y=this.gCd(this)
-J.qQ(y.dn,M.b1(y.KB,"ref"),M.fg(c))
+J.kW(y.dn,M.aR(y.KB,"ref"),M.fg(c))
 return c},
 KI:function(a){var z=this.kr
-if(z!=null)z.qT()
+if(z!=null)z.la()
 if(a.Z0==null&&a.lC==null&&a.vJ==null){z=this.kr
 if(z!=null){z.xO(0)
 this.kr=null}return}z=this.kr
 if(z==null){z=new M.TGm(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
 this.kr=z}z.FE(a,this.Qk)
-J.ZW($.TQ(),this.KB,["ref"],!0)
+J.ZW($.ik(),this.KB,["ref"],!0)
 return this.kr},
-eX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+v3:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(c==null)c=this.Rc
 z=this.XA
-if(z==null){z=this.gws()
-z=J.ti(!!J.x(z).$ishs?z:M.uH(z))
+if(z==null){z=this.gPI()
+z=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
 this.XA=z}y=J.RE(z)
 if(y.gNL(z)==null)return $.zl()
 x=c==null?$.Bu():c
 w=x.oe
 if(w==null){w=H.VM(new P.qo(null),[null])
 x.oe=w}v=w.t(0,z)
-if(v==null){v=M.iX(z,x)
+if(v==null){v=M.dg(z,x)
 x.oe.u(0,z,v)}w=this.dK
-if(w==null){u=J.Do(this.KB)
-w=$.MO()
+if(w==null){u=J.lu(this.KB)
+w=$.Ou()
 t=w.t(0,u)
 if(t==null){t=u.implementation.createHTMLDocument("")
-$.Tg().u(0,t,!0)
+$.Ks().u(0,t,!0)
 M.AL(t)
 w.u(0,u,t)}this.dK=t
-w=t}s=J.bs(w)
+w=t}s=J.O2(w)
 w=[]
-r=new M.qdK(w,null,null,null)
-q=$.Uo()
-r.Lx=this.KB
-r.NK=z
+r=new M.Fi(w,null,null,null)
+q=$.nR()
+r.XD=this.KB
+r.cA=z
 q.u(0,s,r)
 p=new M.qU9(b,null,null)
-M.uH(s).sqL(p)
+M.Xi(s).sqL(p)
 for(o=y.gNL(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
 l=z?v.f8(n):null
-k=M.Ch(o,s,this.dK,l,b,c,w,null)
-M.uH(k).sqL(p)
+k=M.S0(o,s,this.dK,l,b,c,w,null)
+M.Xi(k).sqL(p)
 if(m)r.yi=k}p.tA=s.firstChild
-p.ip=s.lastChild
-r.NK=null
-r.Lx=null
+p.MC=s.lastChild
+r.cA=null
+r.XD=null
 return s},
 gk8:function(a){return this.Qk},
-gG5:function(a){return this.Rc},
-sG5:function(a,b){var z
+gA0:function(a){return this.Rc},
+sA0:function(a,b){var z
 if(this.Rc!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
 this.Rc=b
 this.Fe=null
@@ -21444,15 +21479,15 @@
 z.Mv=null}},
 NB:function(){var z,y
 if(this.kr!=null){z=this.XA
-y=this.gws()
-y=J.ti(!!J.x(y).$ishs?y:M.uH(y))
+y=this.gPI()
+y=J.f5(!!J.x(y).$isvy?y:M.Xi(y))
 y=z==null?y==null:z===y
 z=y}else z=!0
 if(z)return
 this.XA=null
 this.kr.Oo(null)
 z=this.kr
-z.kY(z.Tf())},
+z.OP(z.Tf())},
 V1:function(a){var z,y
 this.Qk=null
 this.Rc=null
@@ -21463,62 +21498,62 @@
 y.Oo(null)
 this.kr.xO(0)
 this.kr=null},
-gws:function(){var z,y
+gPI:function(){var z,y
 this.xk()
-z=M.l5(this.KB,J.Vs(this.KB).dA.getAttribute("ref"))
+z=M.cS(this.KB,J.Vs(this.KB).dA.getAttribute("ref"))
 if(z==null){z=this.Gw
-if(z==null)return this.KB}y=M.uH(z).gws()
+if(z==null)return this.KB}y=M.Xi(z).gPI()
 return y!=null?y:z},
 grz:function(a){var z
 this.xk()
 z=this.Yz
-return z!=null?z:H.Go(this.KB,"$isyY").content},
-rp:function(a){var z,y,x,w,v,u,t
+return z!=null?z:H.Go(this.KB,"$isOH").content},
+cl:function(a){var z,y,x,w,v,u,t
 if(this.CS===!0)return!1
 M.oR()
-M.hb()
+M.Tr()
 this.CS=!0
-z=!!J.x(this.KB).$isyY
+z=!!J.x(this.KB).$isOH
 y=!z
 if(y){x=this.KB
 w=J.RE(x)
-if(w.gQg(x).dA.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
+if(w.gQg(x).dA.hasAttribute("template")===!0&&C.bq.NZ(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
 v=M.pZ(this.KB)
-v=!!J.x(v).$ishs?v:M.uH(v)
+v=!!J.x(v).$isvy?v:M.Xi(v)
 v.sCS(!0)
-z=!!J.x(v.gKB()).$isyY
+z=!!J.x(v.gKB()).$isOH
 u=!0}else{x=this.KB
 w=J.RE(x)
-if(w.gq5(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.KB
+if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.KB
 w=J.RE(x)
-t=w.gM0(x).createElement("template",null)
+t=w.gJ8(x).createElement("template",null)
 w.gAd(x).insertBefore(t,x)
 t.toString
 new W.E9(t).FV(0,w.gQg(x))
 w.gQg(x).V1(0)
 w.wg(x)
-v=!!J.x(t).$ishs?t:M.uH(t)
+v=!!J.x(t).$isvy?t:M.Xi(t)
 v.sCS(!0)
-z=!!J.x(v.gKB()).$isyY}else{v=this
+z=!!J.x(v.gKB()).$isOH}else{v=this
 z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sYz(J.bs(M.TA(v.gKB())))
+u=!1}if(!z)v.sYz(J.O2(M.TA(v.gKB())))
 if(a!=null)v.sGw(a)
-else if(y)M.KE(v,this.KB,u)
-else M.Af(J.ti(v))
+else if(y)M.O1(v,this.KB,u)
+else M.Af(J.f5(v))
 return!0},
-xk:function(){return this.rp(null)},
+xk:function(){return this.cl(null)},
 $isDT:true,
-static:{"^":"Ub,Xi,YO,vU,Hg,joK",TA:function(a){var z,y,x,w
-z=J.Do(a)
+static:{"^":"Ub,v2,YO,vU,Xa,joK",TA:function(a){var z,y,x,w
+z=J.lu(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.B8().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)}$.B8().u(0,z,y)}return y},pZ:function(a){var z,y,x,w,v,u
 z=J.RE(a)
-y=z.gM0(a).createElement("template",null)
+y=z.gJ8(a).createElement("template",null)
 z.gAd(a).insertBefore(y,a)
-for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
+for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.Ff
 switch(w){case"template":v=z.gQg(a).dA
 v.getAttribute(w)
 v.removeAttribute(w)
@@ -21528,27 +21563,27 @@
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-break}}return y},KE:function(a,b,c){var z,y,x,w
-z=J.ti(a)
+break}}return y},O1:function(a,b,c){var z,y,x,w
+z=J.f5(a)
 if(c){J.y2(z,b)
 return}for(y=J.RE(b),x=J.RE(z);w=y.gNL(b),w!=null;)x.mx(z,w)},Af:function(a){var z,y
 z=new M.CE()
-y=J.Vj(a,$.S1())
+y=J.We(a,$.S1())
 if(M.CF(a))z.$1(a)
 y.aN(y,z)},oR:function(){if($.vU===!0)return
 $.vU=!0
 var z=document.createElement("style",null)
 J.t3(z,H.d($.S1())+" { display: none; }")
-document.head.appendChild(z)},hb:function(){var z,y
-if($.Hg===!0)return
-$.Hg=!0
+document.head.appendChild(z)},Tr:function(){var z,y
+if($.Xa===!0)return
+$.Xa=!0
 z=document.createElement("template",null)
-if(!!J.x(z).$isyY){y=z.content.ownerDocument
+if(!!J.x(z).$isOH){y=z.content.ownerDocument
 if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
 if(J.lL(y).querySelector("base")==null)M.AL(y)}},AL:function(a){var z=a.createElement("base",null)
-J.PS(z,document.baseURI)
+J.dc(z,document.baseURI)
 J.lL(a).appendChild(z)}}},
-Aj:{
+De:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 J.Vs(z.KB).dA.setAttribute("ref",a)
@@ -21556,26 +21591,26 @@
 $isEH:true},
 CE:{
 "^":"TpZ:19;",
-$1:function(a){if(!M.uH(a).rp(null))M.Af(J.ti(!!J.x(a).$ishs?a:M.uH(a)))},
+$1:function(a){if(!M.Xi(a).cl(null))M.Af(J.f5(!!J.x(a).$isvy?a:M.Xi(a)))},
 $isEH:true},
-W6o:{
+DOe:{
 "^":"TpZ:12;",
 $1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,141,"call"],
 $isEH:true},
-YJG:{
+Ufa:{
 "^":"TpZ:81;",
 $2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.uH(J.l2(z.gl())).NB()},"$2",null,4,0,null,183,13,"call"],
+for(z=J.mY(a);z.G();)M.Xi(J.l2(z.gl())).NB()},"$2",null,4,0,null,183,13,"call"],
 $isEH:true},
-DOe:{
+Raa:{
 "^":"TpZ:76;",
 $0:function(){var z=document.createDocumentFragment()
-$.Uo().u(0,z,new M.qdK([],null,null,null))
+$.nR().u(0,z,new M.Fi([],null,null,null))
 return z},
 $isEH:true},
-qdK:{
-"^":"a;dn<,yi<,Lx<,NK<"},
-hg:{
+Fi:{
+"^":"a;dn<,yi<,XD<,cA<"},
+iT:{
 "^":"TpZ:12;a,b,c",
 $1:function(a){return this.c.op(a,this.a,this.b)},
 $isEH:true},
@@ -21586,7 +21621,7 @@
 if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
 else z=!1
 if(z)return
-y=S.iw(b,M.ah(a,this.b,this.c))
+y=S.j9(b,M.ah(a,this.b,this.c))
 if(y!=null){z=this.a
 x=z.a
 if(x==null){w=[]
@@ -21596,11 +21631,11 @@
 z.push(y)}},
 $isEH:true},
 TGm:{
-"^":"Ap;kb,tM,nH,dO,TE,Up,h6,RS,Gi,vj,lH,AB,z1,iz,Mv",
+"^":"Ap;yQ,tM,nH,dO,vx,Up,h6,dz,Gi,vj,lH,AB,z1,iz,Mv",
 ln:function(a){return this.iz.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
 gP:function(a){return this.h6},
-qT:function(){var z,y
+la:function(){var z,y
 z=this.Up
 y=J.x(z)
 if(!!y.$isAp){y.xO(z)
@@ -21609,14 +21644,14 @@
 if(!!y.$isAp){y.xO(z)
 this.h6=null}},
 FE:function(a,b){var z,y,x,w,v
-this.qT()
-z=this.kb.KB
+this.la()
+z=this.yQ.KB
 y=a.Z0
 x=y!=null
-this.RS=x
+this.dz=x
 this.Gi=a.vJ!=null
 if(x){this.vj=y.au
-w=M.G5("if",y,z,b)
+w=M.jb("if",y,z,b)
 this.Up=w
 y=this.vj===!0
 if(y)x=!(null!=w&&!1!==w)
@@ -21625,11 +21660,11 @@
 return}if(!y)w=H.Go(w,"$isAp").TR(0,this.ge7())}else w=!0
 if(this.Gi===!0){y=a.vJ
 this.lH=y.au
-y=M.G5("repeat",y,z,b)
+y=M.jb("repeat",y,z,b)
 this.h6=y
 v=y}else{y=a.lC
 this.lH=y.au
-y=M.G5("bind",y,z,b)
+y=M.jb("bind",y,z,b)
 this.h6=y
 v=y}if(this.lH!==!0)v=J.mu(v,this.gVN())
 if(!(null!=w&&!1!==w)){this.Oo(null)
@@ -21640,8 +21675,8 @@
 return!(null!=y&&y)?J.Vm(z):z},
 YSS:[function(a){if(!(null!=a&&!1!==a)){this.Oo(null)
 return}this.Ca(this.Tf())},"$1","ge7",2,0,19,235],
-kY:[function(a){var z
-if(this.RS===!0){z=this.Up
+OP:[function(a){var z
+if(this.dz===!0){z=this.Up
 if(this.vj!==!0){H.Go(z,"$isAp")
 z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Oo([])
 return}}this.Ca(a)},"$1","gVN",2,0,19,20],
@@ -21658,85 +21693,85 @@
 y=y!=null?y:[]
 this.LA(G.jj(y,0,J.q8(y),z,0,z.length))},
 Dk:function(a){var z,y,x,w
-if(J.xC(a,-1))return this.kb.KB
-z=$.Uo()
+if(J.xC(a,-1))return this.yQ.KB
+z=$.nR()
 y=this.tM
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
 x=z.t(0,y[a]).gyi()
 if(x==null)return this.Dk(a-1)
-if(!M.CF(x)||x===this.kb.KB)return x
-w=M.uH(x).gkr()
+if(!M.CF(x)||x===this.yQ.KB)return x
+w=M.Xi(x).gkr()
 if(w==null)return x
 return w.Dk(w.tM.length-1)},
-eS:function(a){var z,y,x,w,v,u,t
+C8:function(a){var z,y,x,w,v,u,t
 z=this.Dk(J.bI(a,1))
 y=this.Dk(a)
-J.cP(this.kb.KB)
+J.ra5(this.yQ.KB)
 x=C.Nm.W4(this.tM,a)
 for(w=J.RE(x),v=J.RE(z);!J.xC(y,z);){u=v.guD(z)
 if(u==null?y==null:u===y)y=z
 t=u.parentNode
 if(t!=null)t.removeChild(u)
 w.mx(x,u)}return x},
-LA:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d
-if(this.TE||J.FN(a)===!0)return
-u=this.kb
+LA:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
+if(this.vx||J.FN(a)===!0)return
+u=this.yQ
 t=u.KB
-if(J.cP(t)==null){this.xO(0)
+if(J.ra5(t)==null){this.xO(0)
 return}s=this.nH
-Q.Y5p(s,this.dO,a)
+Q.Oi(s,this.dO,a)
 z=u.Rc
 if(!this.z1){this.z1=!0
-r=J.Ee(!!J.x(u.KB).$isDT?u.KB:u)
-if(r!=null){this.iz=r.xI.CE(t)
+r=J.qy(!!J.x(u.KB).$isDT?u.KB:u)
+if(r!=null){this.iz=r.Mn.CE(t)
 this.Mv=null}}q=P.YM(P.XK(),null,null,null,null)
 for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
-for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.lo
-i=this.eS(J.WB(k.gvH(m),n))
+for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.Ff
+i=this.C8(J.WB(k.gvH(m),n))
 if(!J.xC(i,$.zl()))q.u(0,j,i)}l=m.gNg()
 if(typeof l!=="number")return H.s(l)
-n-=l}for(p=p.gA(a),o=this.tM;p.G();){m=p.gl()
-for(l=J.RE(m),h=l.gvH(m);J.u6(h,J.WB(l.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
+n-=l}for(p=p.gA(a);p.G();){m=p.gl()
+for(o=J.RE(m),h=o.gvH(m);J.u6(h,J.WB(o.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
 y=s[h]
 x=q.Rz(0,y)
 if(x==null)try{if(this.iz!=null)y=this.ln(y)
 if(y==null)x=$.zl()
-else x=u.eX(0,y,z)}catch(g){k=H.Ru(g)
-w=k
+else x=u.v3(0,y,z)}catch(g){l=H.Ru(g)
+w=l
 v=new H.oP(g,null)
-k=new P.Gc(0,$.X3,null,null,null,null,null,null)
-k.$builtinTypeInfo=[null]
-new P.Zf(k).$builtinTypeInfo=[null]
-f=w
-if(f==null)H.vh(P.u("Error must not be null"))
-if(k.YM!==0)H.vh(P.w("Future already completed"))
-k.Nk(f,v)
-x=$.zl()}k=x
-e=this.Dk(h-1)
-d=J.cP(u.KB)
-C.Nm.aP(o,h,k)
-d.insertBefore(k,J.p7(e))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.Hb),u.Oh),[H.u3(u,0),H.u3(u,1)]);u.G();)this.vB(u.lo)},"$1","gSp",2,0,236,237],
+l=new P.Gc(0,$.X3,null,null,null,null,null,null)
+l.$builtinTypeInfo=[null]
+new P.Zf(l).$builtinTypeInfo=[null]
+k=w
+if(k==null)H.vh(P.u("Error must not be null"))
+if(l.YM!==0)H.vh(P.w("Future already completed"))
+l.Nk(k,v)
+x=$.zl()}l=x
+f=this.Dk(h-1)
+e=J.ra5(u.KB)
+C.Nm.xe(this.tM,h,l)
+e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.Hb),u.Oh),[H.u3(u,0),H.u3(u,1)]);u.G();)this.vB(u.Ff)},"$1","gSp",2,0,236,237],
 vB:[function(a){var z,y
-z=$.Uo()
+z=$.nR()
 z.toString
-y=H.of(a,"expando$values")
-for(z=J.mY((y==null?null:H.of(y,z.V2())).gdn());z.G();)J.yd(z.gl())},"$1","gJO",2,0,238],
+y=H.vA(a,"expando$values")
+for(z=J.mY((y==null?null:H.vA(y,z.V2())).gdn());z.G();)J.yd(z.gl())},"$1","gJO",2,0,238],
 ud:function(){var z=this.AB
 if(z==null)return
 z.Gv()
 this.AB=null},
 xO:function(a){var z
-if(this.TE)return
+if(this.vx)return
 this.ud()
 z=this.tM
 H.bQ(z,this.gJO())
 C.Nm.sB(z,0)
-this.qT()
-this.kb.kr=null
-this.TE=!0}}}],["","",,S,{
+this.la()
+this.yQ.kr=null
+this.vx=!0}}}],["","",,S,{
 "^":"",
 VH2:{
-"^":"a;qN,au<,PS",
+"^":"a;qN,au<,ll",
 gqz:function(){return this.qN.length===5},
 gaW:function(){var z,y
 z=this.qN
@@ -21745,10 +21780,10 @@
 if(J.xC(z[0],"")){if(4>=z.length)return H.e(z,4)
 z=J.xC(z[4],"")}else z=!1}else z=!1
 return z},
-gPf:function(){return this.PS},
+gPf:function(){return this.ll},
 qm:function(a){return this.gPf().$1(a)},
 gB:function(a){return C.jn.BU(this.qN.length,4)},
-U0:function(a){var z,y
+AX:function(a){var z,y
 z=this.qN
 y=a*4+1
 if(y>=z.length)return H.e(z,y)
@@ -21758,7 +21793,7 @@
 y=a*4+2
 if(y>=z.length)return H.e(z,y)
 return z[y]},
-Bd:function(a){var z,y
+cf:function(a){var z,y
 z=this.qN
 y=a*4+3
 if(y>=z.length)return H.e(z,y)
@@ -21782,10 +21817,9 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.IN+=typeof s==="string"?s:H.d(s)}z=y.IN
-return z.charCodeAt(0)==0?z:z},"$1","gYF",2,0,240,241],
-l3:function(a,b){this.PS=this.qN.length===5?this.gSG():this.gYF()},
-static:{"^":"rz5,xN8,t3a,epG,UO,Ftg",iw:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+y.IN+=typeof s==="string"?s:H.d(s)}return y.IN},"$1","gYF",2,0,240,241],
+l3:function(a,b){this.ll=this.qN.length===5?this.gSG():this.gYF()},
+static:{"^":"rz5,xN8,t3a,epG,UO,Ftg",j9:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
 z=a.length
 for(y=b==null,x=J.U6(a),w=null,v=0,u=!0;v<z;){t=x.XU(a,"{{",v)
@@ -21800,7 +21834,7 @@
 w.push(C.yo.yn(a,v))
 break}if(w==null)w=[]
 w.push(C.yo.Nj(a,v,t))
-n=C.yo.DY(C.yo.Nj(a,t+2,o))
+n=C.yo.bS(C.yo.Nj(a,t+2,o))
 w.push(q)
 u=u&&q
 m=y?null:b.$1(n)
@@ -21834,45 +21868,53 @@
 ez:function(a,b){return this.Ir.$1(b)},
 $islX:true},
 KZ:{
-"^":"d3;RV,NP,Rk*,ro,XY,iS",
+"^":"d3;RV,NP,Rk*,ro,XY,cU",
 Gv:function(){this.RV.Gv()},
-AS:[function(a,b,c){var z=new Z.lX(J.Ts(J.vX(this.NP.giU(),1000000),$.Ji),b,null)
+ab:[function(a,b,c){var z=new Z.lX(J.Cl(J.vX(this.NP.giU(),1000000),$.Ji),b,null)
 z.Ir=Z.d8(c)
-J.dH(this.Rk,z)
-return z},function(a,b){return this.AS(a,b,null)},"WL","$2$map","$1","gtN",2,3,242,22,243,206],
+J.bi(this.Rk,z)
+return z},function(a,b){return this.ab(a,b,null)},"ZF","$2$map","$1","gtN",2,3,242,22,243,206],
 l8:function(){var z=new P.VV(null,null)
-H.w4()
+H.Xe()
 $.Ji=$.xG
 this.NP=z
-z.wE(0)
-this.RV=N.QM("").gSZ().yI(new Z.QC(this))
+z.D5(0)
+this.RV=N.QM("").gSZ().yI(new Z.Ym(this))
 this.NP.CH(0)
-J.U2(this.Rk)},
-static:{"^":"hm",JQ:function(){var z=new Z.KZ(null,null,Q.pT(null,Z.lX),null,null,null)
+J.Z8(this.Rk)},
+static:{"^":"ax",JQ:function(){var z=new Z.KZ(null,null,Q.pT(null,Z.lX),null,null,null)
 z.l8()
 return z}}},
-QC:{
+Ym:{
 "^":"TpZ:170;a",
-$1:[function(a){this.a.WL(0,a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,169,"call"],
+$1:[function(a){this.a.ZF(0,a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,169,"call"],
 $isEH:true}}],["","",,G,{
 "^":"",
-YZ:{
-"^":"mW;N3,Mn,fO",
-gA:function(a){var z=this.Mn
-return new G.ay(this.N3,z-1,z+this.fO)},
+GMB:{
+"^":"mW;f9,D1,fO",
+gA:function(a){var z,y
+z=this.D1
+y=this.fO
+if(typeof y!=="number")return H.s(y)
+return new G.vZG(this.f9,z-1,z+y)},
 gB:function(a){return this.fO},
-a0:function(a,b,c){var z=this.Mn
-if(z>this.N3.Bx.length)throw H.b(P.N(z))
-if(this.fO<0)throw H.b(P.N(this.fO))
-z=this.fO+z
-if(z>this.N3.Bx.length)throw H.b(P.N(z))},
+a0:function(a,b,c){var z,y,x
+z=this.D1
+if(z>this.f9.vF.length)throw H.b(P.N(z))
+y=this.fO
+if(y!=null){if(typeof y!=="number")return y.C()
+x=y<0}else x=!1
+if(x)throw H.b(P.N(y))
+if(typeof y!=="number")return y.g()
+z=y+z
+if(z>this.f9.vF.length)throw H.b(P.N(z))},
 $asmW:function(){return[null]},
 $asQV:function(){return[null]}},
-ay:{
-"^":"a;N3,Mn,c0",
-gl:function(){return C.yo.j(this.N3.Bx,this.Mn)},
-G:function(){return++this.Mn<this.c0},
-eR:function(a,b){this.Mn+=b}}}],["","",,Z,{
+vZG:{
+"^":"a;f9,D1,c0",
+gl:function(){return C.yo.j(this.f9.vF,this.D1)},
+G:function(){return++this.D1<this.c0},
+eR:function(a,b){this.D1+=b}}}],["","",,Z,{
 "^":"",
 kb:{
 "^":"a;aH,Rr,O4",
@@ -21881,26 +21923,26 @@
 G:function(){var z,y,x,w,v,u
 this.O4=null
 z=this.aH
-y=++z.Mn
+y=++z.D1
 x=z.c0
 if(y>=x)return!1
-w=z.N3.Bx
+w=z.f9.vF
 v=C.yo.j(w,y)
 if(v>=55296)y=v>57343&&v<=65535
 else y=!0
 if(y)this.O4=v
-else if(v<56320&&++z.Mn<x){u=C.yo.j(w,z.Mn)
+else if(v<56320&&++z.D1<x){u=C.yo.j(w,z.D1)
 if(u>=56320&&u<=57343)this.O4=(v-55296<<10>>>0)+(65536+(u-56320))
-else{if(u>=55296&&u<56320)--z.Mn
+else{if(u>=55296&&u<56320)--z.D1
 this.O4=this.Rr}}else this.O4=this.Rr
 return!0}}}],["","",,U,{
 "^":"",
 LQ:function(a,b,c,d){var z,y,x,w,v,u,t
-z=a.Bx.length-b
-new G.YZ(a,b,z).a0(a,b,c)
+z=a.vF.length-b
+new G.GMB(a,b,z).a0(a,b,c)
 z=b+z
 y=b-1
-x=new Z.kb(new G.ay(a,y,z),d,null)
+x=new Z.kb(new G.vZG(a,y,z),d,null)
 w=H.VM(Array(z-y-1),[P.KN])
 for(z=w.length,v=0;x.G();v=u){u=v+1
 y=x.O4
@@ -21913,7 +21955,7 @@
 return t}}}],["","",,V,{
 "^":"",
 Pa:{
-"^":"V66;GG,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V66;GG,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gN:function(a){return a.GG},
 sN:function(a,b){a.GG=this.ct(a,C.pD,a.GG,b)},
 ghS:function(a){var z=a.GG
@@ -21922,16 +21964,16 @@
 gnI:function(a){var z=$.Kh.Nv
 if(z==null)return!1
 return J.xC(H.Go(z,"$isKM").N,a.GG)},
-f8D:[function(a,b,c,d){var z,y,x,w
+xX:[function(a,b,c,d){var z,y,x,w
 z=J.RE(b)
-y=z.gAy(b)
+y=z.gEV(b)
 if(typeof y!=="number")return y.D()
-if(y>0||z.gNl(b)===!0||z.gTu(b)===!0||z.gkA(b)===!0||z.gw4(b)===!0)return
-z.TI(b)
+if(y>0||z.gNl(b)===!0||z.gEX(b)===!0||z.gqx(b)===!0||z.gYK(b)===!0)return
+z.e6(b)
 x=$.Kh.Nv
 if(x==null||!J.xC(J.l2(x),a.GG)){z=$.Kh
 y=a.GG
-y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.Z8),P.L5(null,null,null,P.qU,L.Z8),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 y.Lw()
 z.swv(0,y)}w=J.Vs(d).dA.getAttribute("href")
 $.Kh.Z6.bo(0,w)},"$3","gkD",6,0,171,87,106,186],
@@ -21950,7 +21992,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -21964,31 +22006,31 @@
 "^":"uL+Pi;",
 $isd3:true},
 D2:{
-"^":"V67;ot,KW,E6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V67;ot,YE,E6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gvm:function(a){return a.ot},
 svm:function(a,b){a.ot=this.ct(a,C.uX,a.ot,b)},
-gHL:function(a){return a.KW},
-sHL:function(a,b){a.KW=this.ct(a,C.oE,a.KW,b)},
+gHL:function(a){return a.YE},
+sHL:function(a,b){a.YE=this.ct(a,C.oE,a.YE,b)},
 gFK:function(a){return a.E6},
 sFK:function(a,b){a.E6=this.ct(a,C.am,a.E6,b)},
-yY:function(a){this.Wd(a)},
+yY:function(a){this.iW(a)},
 VP:function(a,b){if(J.co(b,"ws://"))return b
 return"ws://"+H.d(b)+"/ws"},
 nyC:[function(a,b,c,d){var z,y,x
-J.jD(b)
+J.fD(b)
 z=this.VP(a,a.ot)
-d=$.Kh.m2.J8(z)
+d=$.Kh.m2.TP(z)
 y=$.Kh
-x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.Z8),P.L5(null,null,null,P.qU,L.Z8),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 x.Lw()
 y.swv(0,x)
-$.Kh.Z6.bo(0,"#/vm")},"$3","guZ",6,0,116,2,106,107],
-jLH:[function(a,b,c,d){J.jD(b)
-this.Wd(a)},"$3","gzG",6,0,116,2,106,107],
-Wd:function(a){G.QX(a.KW).ml(new V.Vn(a)).OA(new V.oU(a))},
+$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,116,2,106,107],
+jLH:[function(a,b,c,d){J.fD(b)
+this.iW(a)},"$3","gzG",6,0,116,2,106,107],
+iW:function(a){G.n8(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
 Kq:function(a){var z=P.ii(0,0,0,0,0,1)
 a.tB=this.ct(a,C.O9,a.tB,z)},
-static:{n5p:function(a){var z,y,x,w,v
+static:{Hr:function(a){var z,y,x,w,v
 z=Q.pT(null,L.Z5)
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -21996,9 +22038,9 @@
 w=P.Fl(null,null)
 v=P.Fl(null,null)
 a.ot=""
-a.KW="localhost:9222"
+a.YE="localhost:9222"
 a.E6=z
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
@@ -22016,7 +22058,7 @@
 "^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w
 z=this.a
-J.U2(z.E6)
+J.Z8(z.E6)
 if(a==null)return
 y=J.U6(a)
 x=0
@@ -22024,23 +22066,23 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.dH(z.E6,y.t(a,x))}++x}},"$1",null,2,0,null,244,"call"],
+J.bi(z.E6,y.t(a,x))}++x}},"$1",null,2,0,null,244,"call"],
 $isEH:true},
 oU:{
 "^":"TpZ:12;b",
-$1:[function(a){J.U2(this.b.E6)},"$1",null,2,0,null,2,"call"],
+$1:[function(a){J.Z8(this.b.E6)},"$1",null,2,0,null,2,"call"],
 $isEH:true}}],["","",,X,{
 "^":"",
 I5:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{vC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -22052,7 +22094,7 @@
 return a}}}}],["","",,U,{
 "^":"",
 el:{
-"^":"V68;uB,lc,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V68;uB,lc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gwv:function(a){return a.uB},
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
@@ -22064,15 +22106,15 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Tkx.LX(a)
-C.Tkx.XI(a)
+C.Hd.LX(a)
+C.Hd.XI(a)
 return a}}},
 V68:{
 "^":"uL+Pi;",
@@ -22082,15 +22124,15 @@
 ;(function(){var z=!0,y
 y=P.KN
 y.$isKN=z
-y.$isFK=z
+y.$islf=z
 y.$isfRn=z
-y.$asfRn=[P.FK]
+y.$asfRn=[P.lf]
 y.$isa=z
-y=P.CP
-y.$isCP=z
-y.$isFK=z
+y=P.Vf
+y.$isVf=z
+y.$islf=z
 y.$isfRn=z
-y.$asfRn=[P.FK]
+y.$asfRn=[P.lf]
 y.$isa=z
 y=W.KV
 y.$isKV=z
@@ -22101,11 +22143,11 @@
 y.$isfRn=z
 y.$asfRn=[P.qU]
 y.$isa=z
-W.M5K.$isa=z
-y=P.FK
-y.$isFK=z
+W.QI.$isa=z
+y=P.lf
+y.$islf=z
 y.$isfRn=z
-y.$asfRn=[P.FK]
+y.$asfRn=[P.lf]
 y.$isa=z
 y=N.Ng
 y.$isfRn=z
@@ -22116,61 +22158,61 @@
 y.$isfRn=z
 y.$asfRn=[P.a6]
 y.$isa=z
-P.a.$isa=z
-P.Od.$isa=z
-y=P.WO
-y.$isWO=z
-y.$isQV=z
-y.$isa=z
-y=A.Ap
-y.$isAp=z
-y.$isa=z
-P.oz.$isa=z
 y=W.h4
 y.$ish4=z
 y.$isKV=z
 y.$isa=z
-y=K.O1
-y.$isO1=z
+y=P.WO
+y.$isWO=z
+y.$isQV=z
+y.$isa=z
+P.Od.$isa=z
+P.oz.$isa=z
+P.a.$isa=z
+y=A.Ap
+y.$isAp=z
+y.$isa=z
+y=K.Aep
+y.$isAep=z
 y.$isa=z
 y=U.x06
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.FH
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.uku
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.fp
 y.$isfp=z
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.nu
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.Mm
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
-y=U.c09
-y.$ishw=z
+y=U.c0
+y.$isrx=z
 y.$isa=z
-y=U.Dv
-y.$ishw=z
+y=U.noG
+y.$isrx=z
 y.$isa=z
 y=U.RWc
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.vn
 y.$isvn=z
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.x9
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
-y=U.EO
-y.$isEO=z
-y.$ishw=z
+y=U.WH
+y.$isWH=z
+y.$isrx=z
 y.$isa=z
 y=P.IN
 y.$isIN=z
@@ -22182,19 +22224,12 @@
 y=T.yj
 y.$isyj=z
 y.$isa=z
-F.d3.$isa=z
-A.XP.$isa=z
-W.O7.$isa=z
-y=P.SQ
-y.$isSQ=z
+y=W.Iv
+y.$ish4=z
+y.$isKV=z
 y.$isa=z
-G.MQ.$isa=z
-y=D.Mk
-y.$isMk=z
-y.$isaf=z
-y.$isa=z
-y=L.Z8
-y.$isZ8=z
+y=L.U2
+y.$isU2=z
 y.$isa=z
 y=D.af
 y.$isaf=z
@@ -22202,10 +22237,6 @@
 y=D.bv
 y.$isaf=z
 y.$isa=z
-y=G.Zq
-y.$isZq=z
-y.$isyj=z
-y.$isa=z
 D.ta.$isa=z
 D.ER.$isa=z
 y=D.xB
@@ -22231,33 +22262,68 @@
 y.$isvx=z
 y.$isaf=z
 y.$isa=z
-D.xb.$isa=z
+D.Z9.$isa=z
 D.br.$isa=z
 D.c2.$isa=z
-y=P.z5
+y=G.Zq
+y.$isZq=z
+y.$isyj=z
+y.$isa=z
+y=W.BI
+y.$isea=z
+y.$isa=z
+y=W.ea
+y.$isea=z
+y.$isa=z
+y=W.cxu
+y.$iscxu=z
+y.$isea=z
+y.$isa=z
+y=P.Ol
 y.$isQV=z
 y.$isa=z
-y=Z.lX
-y.$islX=z
+y=P.SQ
+y.$isSQ=z
 y.$isa=z
-D.W1.$isa=z
-P.A5.$isa=z
+y=W.ew7
+y.$isea=z
+y.$isa=z
+W.fJ.$isa=z
 y=G.Y2
 y.$isY2=z
 y.$isa=z
-y=L.Tv
-y.$isTv=z
-y.$isa=z
-K.PF.$isa=z
-y=W.Iv
-y.$ish4=z
-y.$isKV=z
-y.$isa=z
 y=D.kx
 y.$iskx=z
 y.$isaf=z
 y.$isa=z
-D.TH.$isa=z
+D.D5.$isa=z
+F.d3.$isa=z
+A.So.$isa=z
+y=W.N2
+y.$isN2=z
+y.$isea=z
+y.$isa=z
+G.OS.$isa=z
+y=D.Mk
+y.$isMk=z
+y.$isaf=z
+y.$isa=z
+y=W.niR
+y.$isniR=z
+y.$isea=z
+y.$isa=z
+y=Z.lX
+y.$islX=z
+y.$isa=z
+D.W1.$isa=z
+P.A0.$isa=z
+y=W.PGY
+y.$isea=z
+y.$isa=z
+y=L.Zl
+y.$isZl=z
+y.$isa=z
+K.PF.$isa=z
 y=N.HV
 y.$isHV=z
 y.$isa=z
@@ -22268,9 +22334,9 @@
 y.$ishsw=z
 y.$isKV=z
 y.$isa=z
-Y.PnY.$isa=z
-y=U.hw
-y.$ishw=z
+Y.qS.$isa=z
+y=U.rx
+y.$isrx=z
 y.$isa=z
 y=P.yX
 y.$isyX=z
@@ -22278,34 +22344,24 @@
 y=L.Z5
 y.$isZ5=z
 y.$isa=z
-G.c0.$isa=z
-y=P.e4y
-y.$ise4y=z
-y.$isa=z
-y=P.JBS
-y.$isJBS=z
-y.$isa=z
-y=P.BpP
-y.$isBpP=z
-y.$isa=z
+G.Ni.$isa=z
 y=V.qC
 y.$isqC=z
 y.$isT8=z
 y.$isa=z
-y=W.cxu
-y.$iscxu=z
-y.$isea=z
+y=P.BpP
+y.$isBpP=z
 y.$isa=z
-y=P.Wy
-y.$isWy=z
+y=P.V2
+y.$isV2=z
 y.$isa=z
 y=P.KA
 y.$isKA=z
 y.$isNOT=z
 y.$isyX=z
 y.$isa=z
-y=P.JIw
-y.$isJIw=z
+y=P.LR
+y.$isLR=z
 y.$isKA=z
 y.$isNOT=z
 y.$isyX=z
@@ -22322,6 +22378,12 @@
 y.$isuq=z
 y.$isaf=z
 y.$isa=z
+y=P.e4y
+y.$ise4y=z
+y.$isa=z
+y=P.JBS
+y.$isJBS=z
+y.$isa=z
 y=P.fRn
 y.$isfRn=z
 y.$isa=z
@@ -22340,8 +22402,8 @@
 y=P.EH
 y.$isEH=z
 y.$isa=z
-y=P.cb
-y.$iscb=z
+y=P.wS
+y.$iswS=z
 y.$isa=z
 y=P.b8
 y.$isb8=z
@@ -22349,28 +22411,17 @@
 y=P.NOT
 y.$isNOT=z
 y.$isa=z
+y=P.fIm
+y.$isfIm=z
+y.$isa=z
 y=P.iP
 y.$isiP=z
 y.$isfRn=z
 y.$asfRn=[null]
 y.$isa=z
-y=P.fIm
-y.$isfIm=z
-y.$isa=z
-y=W.v3
-y.$isv3=z
-y.$isea=z
-y.$isa=z
-y=W.ea
-y.$isea=z
-y.$isa=z
 y=O.Hz
 y.$isHz=z
 y.$isa=z
-y=W.niR
-y.$isniR=z
-y.$isea=z
-y.$isa=z
 y=D.wv
 y.$iswv=z
 y.$isaf=z
@@ -22409,13 +22460,13 @@
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.MZ(a)}
+return J.aN(a)}
 J.U6=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.MZ(a)}
+return J.aN(a)}
 J.Wx=function(a){if(typeof a=="number")return J.P.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
@@ -22424,7 +22475,7 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.MZ(a)}
+return J.aN(a)}
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
 return J.VA7.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.CDU.prototype
@@ -22432,175 +22483,186 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.MZ(a)}
+return J.aN(a)}
 J.A1=function(a,b){return J.RE(a).seT(a,b)}
 J.A4=function(a,b){return J.RE(a).sjx(a,b)}
-J.A6=function(a,b){return J.RE(a).sdl(a,b)}
-J.AE=function(a,b){return J.RE(a).sJb(a,b)}
+J.A6L=function(a,b){return J.RE(a).sdl(a,b)}
+J.AC=function(a,b){return J.RE(a).Ky(a,b)}
 J.AF=function(a){return J.RE(a).gIi(a)}
 J.AG=function(a){return J.x(a).bu(a)}
 J.AI=function(a,b){return J.RE(a).su6(a,b)}
-J.AU=function(a){return J.RE(a).gpM(a)}
 J.AW=function(a){return J.RE(a).gnl(a)}
 J.Ac=function(a,b){return J.RE(a).siZ(a,b)}
 J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
-J.Ag=function(a){return J.RE(a).zd(a)}
-J.Ak=function(a){return J.RE(a).ghy(a)}
+J.As=function(a){return J.Wx(a).gVz(a)}
 J.At=function(a){return J.RE(a).gvC(a)}
 J.Aw=function(a){return J.RE(a).gb6(a)}
 J.B9=function(a,b){return J.RE(a).shN(a,b)}
-J.BB=function(a){return J.RE(a).gP9(a)}
 J.BC=function(a,b){return J.RE(a).sja(a,b)}
 J.BL=function(a,b){return J.RE(a).sRd(a,b)}
 J.BQ=function(a,b){return J.Qe(a).Fr(a,b)}
-J.BT=function(a){return J.RE(a).goN(a)}
+J.BT=function(a){return J.RE(a).gNG(a)}
 J.BZ=function(a){return J.RE(a).gnv(a)}
 J.Bj=function(a,b){return J.RE(a).snl(a,b)}
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.C3=function(a,b){return J.RE(a).sig(a,b)}
-J.CA=function(a){return J.RE(a).gil(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
-J.CNb=function(a){return J.RE(a).gd0(a)}
-J.Co=function(a,b){return J.RE(a).szH(a,b)}
-J.Cr=function(a){return J.RE(a).gEQ(a)}
-J.Cs=function(a){return J.RE(a).gWw(a)}
-J.Ct=function(a,b,c){return J.RE(a).ek(a,b,c)}
+J.CN=function(a){return J.RE(a).gd0(a)}
+J.CP=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
+J.CS=function(a,b){return J.RE(a).sCd(a,b)}
+J.Cl=function(a,b){return J.Wx(a).Z(a,b)}
+J.Cs=function(a){return J.RE(a).gyg(a)}
 J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
 J.Cz=function(a,b,c){return J.w1(a).oq(a,b,c)}
+J.D4=function(a,b){return J.RE(a).sA0(a,b)}
+J.D8=function(a){return J.RE(a).gl6(a)}
 J.DA=function(a){return J.RE(a).goc(a)}
+J.DF=function(a,b){return J.RE(a).soc(a,b)}
+J.DG=function(a,b){return J.RE(a).Tk(a,b)}
 J.DP=function(a,b,c){return J.U6(a).XU(a,b,c)}
-J.Dc=function(a){return J.RE(a).gEa(a)}
-J.Do=function(a){return J.RE(a).gM0(a)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
-J.E1=function(a){return J.RE(a).gi0(a)}
+J.Dv=function(a){return J.Wx(a).zQ(a)}
+J.E3=function(a){return J.RE(a).gRu(a)}
 J.EC=function(a,b){return J.RE(a).svm(a,b)}
 J.EE=function(a,b){return J.RE(a).sFF(a,b)}
 J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
+J.EM=function(a){return J.RE(a).gV5(a)}
+J.Ec=function(a){return J.RE(a).gMZ(a)}
 J.Ed=function(a,b){return J.RE(a).sFK(a,b)}
-J.Ee=function(a){return J.RE(a).gG5(a)}
-J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
+J.Eh=function(a,b){return J.Wx(a).O(a,b)}
 J.Ei=function(a,b){return J.w1(a).uk(a,b)}
 J.Eo=function(a,b){return J.RE(a).sDQ(a,b)}
 J.Er=function(a){return J.RE(a).gu6(a)}
-J.Es=function(a){return J.w1(a).gtH(a)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
 J.F9=function(a){return J.RE(a).gvm(a)}
 J.FI=function(a,b){return J.RE(a).sih(a,b)}
 J.FN=function(a){return J.U6(a).gl0(a)}
 J.FS=function(a){return J.RE(a).gwp(a)}
-J.FS1=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
 J.FW=function(a,b){return J.Qc(a).iM(a,b)}
 J.Fc=function(a,b){return J.RE(a).sP(a,b)}
 J.Fd=function(a,b,c){return J.w1(a).aM(a,b,c)}
-J.Ff=function(a){return J.RE(a).gLc(a)}
-J.Fi=function(a){return J.RE(a).gnZ(a)}
 J.Fv=function(a,b){return J.RE(a).sFR(a,b)}
 J.Fy=function(a){return J.RE(a).h9(a)}
 J.G7=function(a,b){return J.RE(a).seZ(a,b)}
+J.GF=function(a){return J.RE(a).gz2(a)}
+J.GG=function(a){return J.Qe(a).gNq(a)}
 J.GH=function(a){return J.RE(a).gyW(a)}
-J.GJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
+J.GL=function(a){return J.RE(a).gBp(a)}
+J.GW=function(a){return J.RE(a).gVY(a)}
 J.GZ=function(a,b){return J.RE(a).sph(a,b)}
-J.Gt=function(a){return J.RE(a).gRY(a)}
+J.Gl=function(a){return J.RE(a).ghy(a)}
 J.H1=function(a){return J.RE(a).gLe(a)}
-J.H3=function(a){return J.RE(a).gl6(a)}
+J.H2=function(a){return J.RE(a).gYi(a)}
+J.H3=function(a,b){return J.RE(a).sZA(a,b)}
 J.H4=function(a,b){return J.RE(a).wR(a,b)}
 J.HB=function(a){return J.RE(a).gxT(a)}
-J.HL=function(a){return J.RE(a).gvq(a)}
-J.HP=function(a){return J.RE(a).ghf(a)}
-J.HS=function(a){return J.RE(a).guS(a)}
+J.HP=function(a){return J.RE(a).gFK(a)}
 J.HT=function(a,b){return J.RE(a).sLc(a,b)}
-J.Hd=function(a){return J.RE(a).gLF(a)}
 J.Hf=function(a,b){return J.RE(a).seo(a,b)}
+J.Hg=function(a){return J.RE(a).gP9(a)}
 J.Hh=function(a,b){return J.RE(a).sO9(a,b)}
-J.Hm=function(a){return J.RE(a).gTK(a)}
-J.Hq=function(a){return J.RE(a).grV(a)}
+J.Hn=function(a,b){return J.RE(a).sxT(a,b)}
+J.Ho=function(a){return J.RE(a).WJ(a)}
 J.Hs=function(a){return J.RE(a).goL(a)}
 J.Hy=function(a){return J.RE(a).gZp(a)}
-J.I1=function(a){return J.RE(a).gCF(a)}
+J.IB=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
+J.II=function(a){return J.w1(a).Jd(a)}
 J.IL=function(a){return J.RE(a).goE(a)}
+J.IO=function(a){return J.RE(a).gRH(a)}
 J.IP=function(a){return J.RE(a).gSs(a)}
-J.IR=function(a){return J.RE(a).gYt(a)}
-J.IX=function(a,b){return J.RE(a).sTj(a,b)}
-J.Ij=function(a){return J.w1(a).Oe(a)}
-J.Ip=function(a,b){return J.RE(a).QS(a,b)}
+J.IR=function(a){return J.RE(a).gkZ(a)}
+J.IX=function(a,b){return J.RE(a).sEu(a,b)}
 J.Ir=function(a){return J.RE(a).gyK(a)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
-J.J1=function(a){return J.RE(a).PJ(a)}
-J.J2g=function(a){return J.RE(a).UV(a)}
+J.J0=function(a,b){return J.RE(a).sR1(a,b)}
+J.J1=function(a,b){return J.RE(a).rW(a,b)}
 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.Qe(a).h8(a,b,c)}
-J.JC=function(a){return J.RE(a).gCw(a)}
 J.JG=function(a,b){return J.RE(a).si0(a,b)}
-J.JU=function(a){return J.RE(a).gGc(a)}
 J.JX=function(a){return J.RE(a).gpE(a)}
 J.JZ=function(a,b){return J.RE(a).st0(a,b)}
-J.Jh=function(a){return J.RE(a).guh(a)}
+J.Jj=function(a){return J.RE(a).gWA(a)}
 J.Jl=function(a,b){return J.RE(a).sML(a,b)}
-J.Jp9=function(a){return J.RE(a).gjl(a)}
-J.Jq=function(a){return J.RE(a).gFF(a)}
-J.Jv=function(a){return J.RE(a).gfg(a)}
+J.Jp=function(a){return J.RE(a).gjl(a)}
+J.Jr=function(a){return J.RE(a).gGV(a)}
+J.Jv=function(a){return J.RE(a).gzG(a)}
+J.K0=function(a){return J.RE(a).gd4(a)}
+J.K2=function(a){return J.RE(a).gtN(a)}
 J.KD=function(a,b){return J.RE(a).j3(a,b)}
-J.Kf=function(a){return J.RE(a).gtN(a)}
+J.KG=function(a){return J.RE(a).guz(a)}
+J.Kd=function(a){return J.RE(a).gCF(a)}
+J.Kj=function(a){return J.RE(a).gYt(a)}
 J.Kl=function(a){return J.RE(a).gBP(a)}
-J.Ks=function(a){return J.RE(a).gPe(a)}
-J.Kv=function(a){return J.RE(a).gyZ(a)}
-J.Kw=function(a,b){return J.RE(a).sLF(a,b)}
-J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
-J.L6=function(a){return J.RE(a).gRu(a)}
+J.L1=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
+J.L6=function(a){return J.RE(a).glD(a)}
+J.L9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
+return J.Wx(a).V(a,b)}
 J.LE=function(a){return J.RE(a).VD(a)}
-J.LF=function(a){return J.RE(a).gpf(a)}
-J.LL=function(a){return J.RE(a).gFK(a)}
 J.LM=function(a){return J.RE(a).gn9(a)}
-J.LY4=function(a){return J.RE(a).gBp(a)}
+J.LW=function(a,b,c){return J.RE(a).AS(a,b,c)}
+J.LY=function(a){return J.RE(a).gi0(a)}
 J.La=function(a,b){return J.RE(a).sBN(a,b)}
 J.Ld=function(a,b){return J.w1(a).eR(a,b)}
+J.Lh=function(a){if(typeof a=="number")return-a
+return J.Wx(a).J(a)}
 J.Lp=function(a){return J.RE(a).geT(a)}
+J.M2=function(a){return J.RE(a).gFF(a)}
 J.ME=function(a,b){return J.RE(a).sUo(a,b)}
 J.MF=function(a,b){return J.RE(a).syK(a,b)}
-J.MI=function(a,b){return J.RE(a).PN(a,b)}
+J.MI=function(a,b){return J.RE(a).sQR(a,b)}
+J.MQ=function(a){return J.w1(a).grZ(a)}
 J.MT=function(a){return J.RE(a).guc(a)}
-J.MV=function(a){return J.RE(a).gRq(a)}
+J.MU=function(a){return J.RE(a).Fc(a)}
 J.MX=function(a,b){return J.RE(a).sPj(a,b)}
 J.Me=function(a,b){return J.w1(a).aN(a,b)}
+J.Mh=function(a,b){return J.RE(a).sTj(a,b)}
+J.Mp=function(a){return J.w1(a).wg(a)}
+J.Mx=function(a){return J.RE(a).gks(a)}
 J.N1=function(a){return J.RE(a).Es(a)}
-J.NA=function(a,b){return J.RE(a).sG5(a,b)}
-J.NC=function(a){return J.RE(a).gNG(a)}
+J.NB=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.NC=function(a){return J.RE(a).gHy(a)}
+J.NDJ=function(a){return J.RE(a).gWt(a)}
 J.NE=function(a,b){return J.RE(a).sHL(a,b)}
 J.NH=function(a,b){return J.RE(a).swv(a,b)}
 J.NO=function(a,b){return J.RE(a).soE(a,b)}
-J.NQ=function(a){return J.Wx(a).zQ(a)}
+J.NV=function(a){return J.RE(a).gYe(a)}
 J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
-J.Nb=function(a){return J.RE(a).gt0(a)}
+J.Nb=function(a){return J.RE(a).gdH(a)}
+J.Nd=function(a){return J.w1(a).br(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
+J.Nh=function(a,b){return J.RE(a).sz2(a,b)}
 J.Nj=function(a,b,c){return J.Qe(a).Nj(a,b,c)}
-J.Nx=function(a){return J.RE(a).gMN(a)}
+J.Nk=function(a){return J.RE(a).gtT(a)}
+J.Nq=function(a){return J.RE(a).gGc(a)}
+J.O2=function(a){return J.RE(a).JP(a)}
 J.O8=function(a){return J.RE(a).Sd(a)}
-J.OC=function(a){return J.RE(a).gCn(a)}
+J.OB=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
-J.OH=function(a){return J.w1(a).grZ(a)}
-J.OX=function(a){return J.Qe(a).gNq(a)}
+J.OT=function(a){return J.RE(a).gXE(a)}
 J.Oh=function(a){return J.RE(a).gG1(a)}
-J.Oi=function(a){return J.RE(a).gBo(a)}
-J.Okq=function(a){return J.RE(a).ghU(a)}
+J.Ok=function(a){return J.RE(a).ghU(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
-J.P5=function(a){return J.RE(a).gHo(a)}
 J.P6=function(a,b){return J.RE(a).sZ2(a,b)}
 J.PG=function(a){return J.RE(a).gEE(a)}
+J.PK=function(a){return J.RE(a).gQR(a)}
 J.PN=function(a,b){return J.RE(a).sCI(a,b)}
 J.PP=function(a,b){return J.RE(a).snv(a,b)}
-J.PQ=function(a){return J.RE(a).gVY(a)}
-J.PS=function(a,b){return J.RE(a).sLU(a,b)}
+J.PR=function(a){return J.RE(a).gA5(a)}
+J.PS=function(a){return J.x(a).gCR(a)}
 J.PW=function(a){return J.RE(a).gVb(a)}
+J.PY=function(a){return J.RE(a).goN(a)}
+J.Pc=function(a,b){return J.RE(a).yU(a,b)}
+J.Pf=function(a){return J.RE(a).gWw(a)}
 J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
 J.Pp=function(a,b){return J.Qe(a).j(a,b)}
 J.Pq=function(a){return J.RE(a).gqF(a)}
+J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
 J.Px=function(a,b){return J.RE(a).swp(a,b)}
-J.Q0=function(a){return J.RE(a).gwh(a)}
+J.Q0=function(a,b){return J.U6(a).OY(a,b)}
 J.Q2=function(a){return J.RE(a).gO3(a)}
-J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 J.Q9=function(a){return J.RE(a).gf0(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
 J.QT=function(a,b){return J.RE(a).vV(a,b)}
@@ -22612,79 +22674,85 @@
 J.Qy=function(a,b){return J.RE(a).shf(a,b)}
 J.R1=function(a){return J.RE(a).Fn(a)}
 J.R8=function(a,b){return J.RE(a).sMT(a,b)}
-J.RH0=function(a){return J.RE(a).gwX(a)}
+J.RC=function(a){return J.RE(a).gTA(a)}
+J.RI=function(a){return J.RE(a).gRT(a)}
 J.RX=function(a,b){return J.RE(a).sjl(a,b)}
 J.Rp=function(a,b){return J.RE(a).sod(a,b)}
-J.Rv=function(a){return J.w1(a).wg(a)}
-J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
+J.Rr=function(a){return J.RE(a).ga7(a)}
+J.Ry=function(a){return J.RE(a).gVE(a)}
 J.SF=function(a,b){return J.RE(a).sIi(a,b)}
 J.SG=function(a){return J.RE(a).gDI(a)}
 J.SK=function(a){return J.RE(a).xW(a)}
 J.SM=function(a){return J.RE(a).gbw(a)}
 J.SO=function(a,b){return J.RE(a).sCF(a,b)}
-J.SS=function(a){return J.RE(a).gQP(a)}
 J.Sf=function(a,b){return J.RE(a).sXE(a,b)}
 J.Sj=function(a,b){return J.RE(a).svC(a,b)}
 J.Sl=function(a){return J.RE(a).gxb(a)}
 J.Sm=function(a,b){return J.RE(a).skZ(a,b)}
+J.Sr=function(a){return J.RE(a).gvq(a)}
 J.T5=function(a,b){return J.RE(a).stT(a,b)}
 J.TG=function(a){return J.RE(a).gFb(a)}
 J.TM=function(a){return J.RE(a).gOd(a)}
-J.TP=function(a,b){return J.RE(a).sd0(a,b)}
-J.TR=function(a){return J.RE(a).Um(a)}
+J.TP=function(a,b){return J.RE(a).sGV(a,b)}
+J.TY=function(a){return J.RE(a).gvp(a)}
 J.TZ=function(a,b){return J.RE(a).sN(a,b)}
-J.Ts=function(a,b){return J.Wx(a).Z(a,b)}
+J.Tg=function(a){return J.RE(a).gCI(a)}
+J.Tm=function(a){return J.RE(a).grX(a)}
+J.Ts=function(a){return J.RE(a).gfG(a)}
 J.Tu=function(a,b){return J.RE(a).sl6(a,b)}
+J.Tv=function(a){return J.RE(a).gB1(a)}
 J.Tx=function(a,b){return J.RE(a).spf(a,b)}
-J.U2=function(a){return J.w1(a).V1(a)}
-J.U8=function(a,b){return J.RE(a).sX7(a,b)}
+J.U8=function(a){return J.RE(a).gEQ(a)}
+J.UA=function(a){return J.RE(a).gP2(a)}
 J.UE=function(a){return J.w1(a).git(a)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
 return J.Wx(a).w(a,b)}
+J.UP=function(a){return J.RE(a).gnZ(a)}
 J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.Gp(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
 return J.U6(a).t(a,b)}
-J.US=function(a){return J.RE(a).gWt(a)}
-J.UU=function(a,b){return J.RE(a).sng(a,b)}
-J.Ua=function(a){return J.RE(a).gkZ(a)}
-J.Ur=function(a){return J.RE(a).gyX(a)}
+J.UR=function(a){return J.RE(a).Lg(a)}
+J.UT=function(a){return J.RE(a).gDQ(a)}
+J.Ue=function(a){return J.RE(a).gV8(a)}
 J.Ux=function(a){return J.RE(a).geo(a)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
-J.V2=function(a,b,c){return J.w1(a).aP(a,b,c)}
 J.VA=function(a,b){return J.w1(a).Vr(a,b)}
-J.VB=function(a){return J.RE(a).gRT(a)}
-J.Vj=function(a,b){return J.RE(a).Md(a,b)}
+J.VU=function(a,b){return J.RE(a).PN(a,b)}
+J.Vk=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vr=function(a,b){return J.Qe(a).C1(a,b)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
-J.Vw=function(a,b){return J.U6(a).sB(a,b)}
-J.W2H=function(a){return J.RE(a).gCf(a)}
+J.W2=function(a){return J.RE(a).gCf(a)}
 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,b){return J.RE(a).soc(a,b)}
+J.WI=function(a,b){return J.RE(a).sLF(a,b)}
 J.WT=function(a){return J.RE(a).gFR(a)}
-J.WX7=function(a){return J.RE(a).gbJ(a)}
+J.WX=function(a){return J.RE(a).gbJ(a)}
+J.We=function(a,b){return J.RE(a).VG(a,b)}
 J.Wf=function(a){return J.RE(a).D4(a)}
+J.Wp=function(a){return J.RE(a).gQU(a)}
+J.Wy=function(a,b){return J.RE(a).sBk(a,b)}
+J.X6=function(a){return J.RE(a).gjD(a)}
 J.X7=function(a){return J.RE(a).gcH(a)}
-J.X9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
-return J.Wx(a).V(a,b)}
-J.XB=function(a){return J.RE(a).gQU(a)}
+J.X9=function(a){return J.RE(a).gTK(a)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
 J.XHl=function(a){return J.Wx(a).yu(a)}
-J.Xa=function(a){return J.RE(a).gXc(a)}
+J.XP=function(a){return J.RE(a).Um(a)}
 J.Xf=function(a){return J.RE(a).gbq(a)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
-J.Xp=function(a){return J.RE(a).gzH(a)}
+J.Xr=function(a){return J.RE(a).gEa(a)}
 J.Xu=function(a,b){return J.RE(a).sFL(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
-J.YH=function(a){return J.RE(a).gnS(a)}
-J.YN=function(a,b){return J.RE(a).WO(a,b)}
+J.Y7=function(a){return J.RE(a).gLU(a)}
+J.YG=function(a){return J.RE(a).gQP(a)}
+J.YH=function(a){return J.RE(a).gpM(a)}
 J.YQ=function(a){return J.RE(a).gPL(a)}
 J.YSV=function(a,b){return J.RE(a).sNJ(a,b)}
+J.Yd=function(a){return J.RE(a).gBV(a)}
 J.Yf=function(a){return J.w1(a).gIr(a)}
-J.Yq=function(a){return J.RE(a).gSR(a)}
+J.Yq=function(a){return J.RE(a).gph(a)}
 J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
-J.Z6=function(a){return J.RE(a).gV5(a)}
-J.ZC=function(a){return J.RE(a).gph(a)}
+J.Z6=function(a,b){return J.RE(a).sP9(a,b)}
+J.Z8=function(a){return J.w1(a).V1(a)}
 J.ZF=function(a){return J.RE(a).gAF(a)}
 J.ZG=function(a,b){return J.w1(a).zV(a,b)}
 J.ZH=function(a){return J.RE(a).gk8(a)}
@@ -22692,193 +22760,184 @@
 J.ZW=function(a,b,c,d){return J.RE(a).MS(a,b,c,d)}
 J.ZZ=function(a,b){return J.Qe(a).yn(a,b)}
 J.Zh=function(a){return J.RE(a).grJ(a)}
-J.Zl=function(a){return J.RE(a).gB1(a)}
 J.Zo=function(a){return J.RE(a).gK4(a)}
 J.Zs=function(a){return J.RE(a).gcY(a)}
-J.Zv=function(a){return J.RE(a).grs(a)}
+J.a3=function(a){return J.RE(a).gBk(a)}
+J.aA=function(a){return J.RE(a).gzY(a)}
+J.aB=function(a){return J.RE(a).gql(a)}
+J.aT=function(a){return J.RE(a).god(a)}
 J.aW=function(a){return J.RE(a).gJp(a)}
-J.ad=function(a){return J.RE(a).guZ(a)}
+J.an=function(a,b){return J.RE(a).Id(a,b)}
 J.au=function(a,b){return J.RE(a).sNG(a,b)}
+J.ay=function(a){return J.RE(a).giB(a)}
 J.b0=function(a,b){return J.RE(a).suc(a,b)}
 J.bB=function(a){return J.x(a).gbx(a)}
 J.bH=function(a,b,c,d){return J.RE(a).ea(a,b,c,d)}
 J.bI=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
-J.bL=function(a){return J.RE(a).gUt(a)}
-J.bb=function(a,b,c){return J.RE(a).X6(a,b,c)}
-J.be=function(a){return J.RE(a).gB3(a)}
+J.bL=function(a){return J.RE(a).ghS(a)}
+J.bS=function(a){return J.RE(a).gUo(a)}
+J.bT=function(a){return J.w1(a).gqG(a)}
+J.bh=function(a){return J.RE(a).geZ(a)}
+J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
-J.bs=function(a){return J.RE(a).JP(a)}
 J.bu=function(a){return J.RE(a).gyw(a)}
-J.cC=function(a){return J.RE(a).gke(a)}
+J.c7=function(a){return J.RE(a).guS(a)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cI=function(a,b){return J.Wx(a).Sy(a,b)}
 J.cO=function(a){return J.RE(a).gjx(a)}
-J.cP=function(a){return J.RE(a).gAd(a)}
-J.cS=function(a,b){return J.RE(a).sqF(a,b)}
 J.cV=function(a,b){return J.RE(a).sjT(a,b)}
 J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.cj=function(a){return J.RE(a).gMT(a)}
 J.cl=function(a,b){return J.RE(a).sHt(a,b)}
 J.cm=function(a,b,c){return J.RE(a).kq(a,b,c)}
 J.co=function(a,b){return J.Qe(a).nC(a,b)}
-J.d5=function(a){return J.Wx(a).gKy(a)}
 J.dE=function(a){return J.RE(a).gGs(a)}
-J.dH=function(a,b){return J.w1(a).h(a,b)}
+J.dF=function(a){return J.w1(a).zH(a)}
+J.dK=function(a){return J.RE(a).gWk(a)}
 J.dY=function(a){return J.RE(a).ga4(a)}
-J.dd=function(a){return J.RE(a).gqu(a)}
+J.dZ=function(a){return J.RE(a).gDX(a)}
+J.dc=function(a,b){return J.RE(a).smH(a,b)}
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a){return J.RE(a).QE(a)}
-J.dv=function(a){return J.RE(a).gUL(a)}
+J.dj=function(a){return J.RE(a).gyZ(a)}
+J.dv=function(a,b,c){return J.RE(a).v3(a,b,c)}
+J.dw=function(a){return J.RE(a).gMt(a)}
 J.eS=function(a){return J.RE(a).gjO(a)}
+J.eU=function(a){return J.RE(a).gRh(a)}
 J.eY=function(a){return J.RE(a).gR(a)}
 J.eb=function(a){return J.RE(a).gIb(a)}
 J.ev=function(a){return J.RE(a).gkD(a)}
 J.f2=function(a){return J.RE(a).gRd(a)}
+J.f5=function(a){return J.RE(a).grz(a)}
+J.fD=function(a){return J.RE(a).e6(a)}
+J.fM=function(a){return J.RE(a).gLf(a)}
 J.fR=function(a,b){return J.RE(a).sMZ(a,b)}
-J.fY=function(a){return J.RE(a).gky(a)}
 J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
+J.fh=function(a){return J.RE(a).ghf(a)}
 J.fi=function(a){return J.RE(a).gX0(a)}
-J.fm=function(a,b){return J.RE(a).sxr(a,b)}
 J.fv=function(a){return J.RE(a).gZ9(a)}
-J.fx=function(a){return J.RE(a).gtu(a)}
 J.h6=function(a){return J.RE(a).gML(a)}
 J.h9=function(a,b){return J.RE(a).sWA(a,b)}
 J.hI=function(a){return J.RE(a).gUQ(a)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
-J.hW=function(a){return J.RE(a).gql(a)}
-J.ho=function(a){return J.RE(a).ghS(a)}
+J.hn=function(a){return J.RE(a).gEu(a)}
 J.ht=function(a){return J.RE(a).gZ2(a)}
 J.i0=function(a,b){return J.RE(a).sPB(a,b)}
 J.i2=function(a,b){return J.RE(a).sRk(a,b)}
-J.i2U=function(a){return J.RE(a).gCK(a)}
 J.i9=function(a,b){return J.w1(a).Zv(a,b)}
+J.iB=function(a){return J.RE(a).giC(a)}
 J.iL=function(a){return J.RE(a).gNb(a)}
 J.iS=function(a){return J.RE(a).gox(a)}
-J.iY=function(a){return J.Qe(a).DY(a)}
-J.iYM=function(a){return J.RE(a).gvc(a)}
-J.iiZ=function(a){return J.RE(a).gfG(a)}
-J.ik=function(a){return J.RE(a).gHt(a)}
+J.iY=function(a){return J.RE(a).gvc(a)}
+J.id=function(a){return J.RE(a).gR1(a)}
 J.io=function(a){return J.RE(a).gja(a)}
-J.iq=function(a){return J.RE(a).gRs(a)}
 J.is=function(a,b){return J.RE(a).snZ(a,b)}
-J.ix=function(a,b){return J.RE(a).sXc(a,b)}
-J.jD=function(a){return J.RE(a).TI(a)}
-J.jE=function(a){return J.RE(a).gA5(a)}
-J.jH=function(a){return J.RE(a).ghN(a)}
-J.jL=function(a){return J.RE(a).gBV(a)}
+J.ix=function(a){return J.RE(a).gnI(a)}
+J.j1=function(a){return J.RE(a).gZA(a)}
+J.jB=function(a){return J.RE(a).gpf(a)}
 J.jOZ=function(a,b){return J.Wx(a).Y(a,b)}
 J.jd=function(a){return J.RE(a).gZm(a)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
-J.jg=function(a){return J.RE(a).gEu(a)}
-J.jk=function(a,b,c){return J.RE(a).OP(a,b,c)}
-J.jo=function(a){return J.RE(a).gCI(a)}
+J.jl=function(a){return J.RE(a).gHt(a)}
 J.jq=function(a,b){return J.RE(a).sZp(a,b)}
-J.ju=function(a,b,c){return J.RE(a).eX(a,b,c)}
-J.jy=function(a,b){return J.RE(a).sPe(a,b)}
-J.jzo=function(a){if(typeof a=="number")return-a
-return J.Wx(a).J(a)}
 J.k0=function(a){return J.RE(a).giZ(a)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
+J.kW=function(a,b,c){if((a.constructor==Array||H.Gp(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
+return J.w1(a).u(a,b,c)}
 J.kX=function(a,b){return J.RE(a).sNb(a,b)}
+J.kZ=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.kv=function(a){return J.RE(a).glp(a)}
+J.kv=function(a){return J.RE(a).gDf(a)}
 J.l2=function(a){return J.RE(a).gN(a)}
-J.lF=function(a,b){return J.RE(a).snS(a,b)}
+J.lA=function(a){return J.RE(a).gLc(a)}
 J.lL=function(a){return J.RE(a).gQr(a)}
-J.lf=function(a,b){return J.Wx(a).O(a,b)}
-J.ls=function(a){return J.RE(a).gnI(a)}
+J.lN=function(a){return J.RE(a).gil(a)}
+J.le=function(a){return J.RE(a).gUt(a)}
+J.lu=function(a){return J.RE(a).gJ8(a)}
 J.m4=function(a){return J.RE(a).gig(a)}
-J.m8=function(a,b){return J.RE(a).sEu(a,b)}
-J.mB=function(a){return J.RE(a).Zi(a)}
 J.mF=function(a){return J.RE(a).gHn(a)}
-J.mI=function(a,b){return J.RE(a).rW(a,b)}
 J.mN=function(a){return J.RE(a).gRO(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.mU=function(a,b){return J.RE(a).skm(a,b)}
 J.mY=function(a){return J.w1(a).gA(a)}
-J.ma=function(a){return J.RE(a).gyG(a)}
-J.mk=function(a){return J.RE(a).gWA(a)}
 J.mu=function(a,b){return J.RE(a).TR(a,b)}
 J.my=function(a,b){return J.RE(a).sQl(a,b)}
 J.mz=function(a,b){return J.RE(a).scH(a,b)}
-J.n8=function(a){return J.RE(a).gUo(a)}
 J.n9=function(a){return J.RE(a).gQq(a)}
 J.nA=function(a,b){return J.RE(a).sPL(a,b)}
-J.nC=function(a,b){return J.RE(a).sCd(a,b)}
-J.nEe=function(a){return J.RE(a).gDf(a)}
 J.nG=function(a){return J.RE(a).gv8(a)}
-J.nb=function(a,b,c,d,e,f,g,h){return J.RE(a).kN(a,b,c,d,e,f,g,h)}
-J.nl=function(a){return J.RE(a).gDQ(a)}
+J.nN=function(a){return J.RE(a).gTt(a)}
+J.nb=function(a){return J.RE(a).gyX(a)}
 J.ns=function(a){return J.RE(a).gjT(a)}
 J.nv=function(a){return J.RE(a).gLW(a)}
+J.o3=function(a,b){return J.RE(a).sjD(a,b)}
+J.o6=function(a){return J.RE(a).Lx(a)}
+J.o8=function(a,b){return J.RE(a).sqF(a,b)}
 J.oD=function(a,b){return J.RE(a).hP(a,b)}
-J.oJ=function(a,b){return J.RE(a).srs(a,b)}
 J.oN=function(a){return J.RE(a).gj4(a)}
+J.oO=function(a){return J.RE(a).UV(a)}
+J.of=function(a){return J.RE(a).je(a)}
 J.okV=function(a,b){return J.RE(a).RR(a,b)}
+J.ol=function(a){return J.RE(a).glp(a)}
 J.op=function(a){return J.RE(a).gD7(a)}
-J.os=function(a){return J.RE(a).gqA(a)}
+J.p6=function(a){return J.RE(a).gBN(a)}
 J.p7=function(a){return J.RE(a).guD(a)}
 J.pA=function(a,b){return J.RE(a).sYt(a,b)}
 J.pB=function(a,b){return J.w1(a).sit(a,b)}
 J.pI=function(a){return J.RE(a).gH3(a)}
+J.pL=function(a,b,c){return J.RE(a).d2(a,b,c)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
-J.pU=function(a){return J.RE(a).gYe(a)}
-J.ph=function(a){return J.RE(a).gDX(a)}
-J.pq=function(a,b){return J.RE(a).yU(a,b)}
+J.pU=function(a){return J.RE(a).ghN(a)}
+J.pm=function(a){return J.RE(a).gt0(a)}
+J.pq=function(a,b){return J.RE(a).sV8(a,b)}
 J.q0=function(a,b){return J.RE(a).syG(a,b)}
 J.q1=function(a){return J.RE(a).geJ(a)}
 J.q8=function(a){return J.U6(a).gB(a)}
-J.qA=function(a){return J.w1(a).br(a)}
-J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
-J.qN=function(a){return J.RE(a).giC(a)}
-J.qQ=function(a,b,c){if((a.constructor==Array||H.Gp(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
-return J.w1(a).u(a,b,c)}
-J.qd=function(a,b,c,d){return J.RE(a).aC(a,b,c,d)}
-J.qf=function(a){return J.RE(a).gMl(a)}
-J.ql=function(a){return J.RE(a).gBN(a)}
-J.qq=function(a){return J.RE(a).dQ(a)}
+J.ql=function(a){return J.RE(a).gaB(a)}
 J.qx=function(a){return J.RE(a).gbe(a)}
+J.qy=function(a){return J.RE(a).gA0(a)}
+J.r0=function(a){return J.RE(a).gi6(a)}
+J.r5=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.rA=function(a,b){return J.RE(a).sbe(a,b)}
 J.rL=function(a,b){return J.RE(a).spE(a,b)}
-J.rN=function(a){return J.RE(a).gVE(a)}
-J.rS=function(a){return J.RE(a).gyr(a)}
+J.ra5=function(a){return J.RE(a).gAd(a)}
+J.re=function(a){return J.RE(a).gmb(a)}
+J.rk=function(a){return J.RE(a).gke(a)}
 J.ro=function(a){return J.RE(a).gOB(a)}
-J.rp=function(a){return J.RE(a).gd4(a)}
+J.rr=function(a){return J.Qe(a).bS(a)}
+J.rw=function(a){return J.RE(a).gMl(a)}
 J.ry=function(a,b){return J.RE(a).stu(a,b)}
 J.t0=function(a){return J.RE(a).gTj(a)}
 J.t3=function(a,b){return J.RE(a).sa4(a,b)}
 J.t8=function(a){return J.RE(a).gYQ(a)}
-J.tE=function(a,b){return J.RE(a).JX(a,b)}
-J.tX=function(a){return J.RE(a).gtT(a)}
-J.tdY=function(a){return J.RE(a).gng(a)}
-J.ti=function(a){return J.RE(a).grz(a)}
+J.tG=function(a){return J.RE(a).Zi(a)}
+J.tH=function(a,b){return J.RE(a).sHy(a,b)}
+J.tPf=function(a,b){return J.RE(a).X3(a,b)}
+J.tT=function(a,b,c){return J.RE(a).X6(a,b,c)}
 J.tv=function(a,b){return J.RE(a).sDX(a,b)}
-J.tw=function(a){return J.RE(a).je(a)}
+J.tw=function(a){return J.RE(a).gCK(a)}
 J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
-J.u5=function(a){return J.RE(a).gA8(a)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.uF=function(a,b){return J.w1(a).GT(a,b)}
-J.ufU=function(a){return J.RE(a).gxr(a)}
-J.ug=function(a){return J.x(a).gCR(a)}
+J.uH=function(a,b){return J.RE(a).sP2(a,b)}
+J.uN=function(a){return J.RE(a).gHo(a)}
+J.uW=function(a){return J.RE(a).gyG(a)}
+J.uf=function(a){return J.RE(a).gxr(a)}
 J.ul=function(a){return J.RE(a).gU4(a)}
 J.um=function(a){return J.RE(a).gRk(a)}
+J.un=function(a){return J.RE(a).gRY(a)}
 J.up=function(a){return J.RE(a).gIf(a)}
-J.us=function(a){return J.RE(a).gRN(a)}
 J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
-J.v7=function(a){return J.RE(a).Lg(a)}
-J.vE=function(a){return J.RE(a).gMZ(a)}
-J.vF=function(a,b){return J.RE(a).sP9(a,b)}
-J.vI=function(a,b){return J.RE(a).jn(a,b)}
+J.v7=function(a){return J.RE(a).gwX(a)}
 J.vJ=function(a,b){return J.RE(a).spM(a,b)}
 J.vP=function(a,b){return J.RE(a).sR(a,b)}
-J.vR=function(a,b){return J.RE(a).YP(a,b)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
 J.vc=function(a){return J.RE(a).gxD(a)}
@@ -22886,59 +22945,51 @@
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
 J.wJ=function(a,b){return J.RE(a).slp(a,b)}
-J.wS=function(a){return J.RE(a).geZ(a)}
+J.wK=function(a,b){return J.RE(a).xZ(a,b)}
 J.wd=function(a){return J.RE(a).gqw(a)}
-J.wg=function(a){return J.RE(a).god(a)}
+J.we=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
+J.wg=function(a,b){return J.U6(a).sB(a,b)}
 J.wl=function(a,b){return J.RE(a).Ch(a,b)}
 J.wp=function(a){return J.RE(a).gwv(a)}
+J.wt=function(a){return J.RE(a).gP3(a)}
 J.wu=function(a,b){return J.RE(a).sLf(a,b)}
 J.wx=function(a,b){return J.RE(a).Rg(a,b)}
 J.x0=function(a,b){return J.RE(a).sWt(a,b)}
-J.x3=function(a){return J.RE(a).gvp(a)}
 J.xC=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.xH=function(a,b){return J.RE(a).sxT(a,b)}
 J.xQ=function(a,b){return J.RE(a).sGd(a,b)}
 J.xZ=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
 return J.Wx(a).D(a,b)}
 J.xe=function(a){return J.RE(a).gPB(a)}
-J.xi=function(a){return J.RE(a).gBj(a)}
-J.xk=function(a){return J.RE(a).gXE(a)}
-J.xlH=function(a){return J.RE(a).gUv(a)}
+J.xo=function(a){return J.RE(a).gJN(a)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
 J.y3=function(a){return J.RE(a).gFL(a)}
 J.y9=function(a){return J.RE(a).lh(a)}
 J.yH=function(a){return J.Wx(a).Vy(a)}
-J.yI=function(a){return J.RE(a).gLf(a)}
+J.yI=function(a){return J.RE(a).gih(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yW=function(a){return J.RE(a).gX7(a)}
-J.yb=function(a){return J.RE(a).gWF(a)}
+J.yR=function(a,b){return J.RE(a).XT(a,b)}
 J.yd=function(a){return J.RE(a).xO(a)}
-J.yf=function(a){return J.RE(a).gzG(a)}
 J.yi=function(a,b){return J.RE(a).sMj(a,b)}
 J.yq=function(a){return J.RE(a).gQl(a)}
-J.yr=function(a){return J.RE(a).gJb(a)}
+J.yz=function(a){return J.RE(a).gLF(a)}
 J.z7Y=function(a,b,c,d,e){return J.RE(a).GM(a,b,c,d,e)}
-J.zC=function(a){return J.RE(a).gi6(a)}
-J.zD=function(a){return J.RE(a).gEl(a)}
-J.zF=function(a){return J.RE(a).gih(a)}
+J.zE=function(a){return J.RE(a).gtu(a)}
+J.zF=function(a){return J.RE(a).gHL(a)}
 J.zH=function(a){return J.RE(a).gt5(a)}
 J.zL=function(a){return J.RE(a).gO9(a)}
 J.zN=function(a){return J.RE(a).gM6(a)}
 J.zY=function(a){return J.RE(a).gdu(a)}
-J.za=function(a,b){return J.U6(a).OY(a,b)}
-J.ze=function(a){return J.RE(a).gHL(a)}
 J.zg=function(a,b){return J.w1(a).ad(a,b)}
 J.zj=function(a){return J.RE(a).gvH(a)}
-J.zq=function(a){return J.w1(a).Jd(a)}
 C.Gx=X.hV.prototype
 C.J9=Q.f7.prototype
-C.Gkp=Y.G0.prototype
+C.Gkp=Y.hg.prototype
 C.QD=B.G6.prototype
 C.FC=T.vr.prototype
 C.ic=A.wM.prototype
-C.YZz=Q.eW.prototype
+C.i3=Q.eW.prototype
 C.fe=O.eo.prototype
 C.ka=Z.ak.prototype
 C.tWO=O.VY.prototype
@@ -22946,42 +22997,41 @@
 C.vS=T.uV.prototype
 C.oS=U.NY.prototype
 C.O0=R.JI.prototype
-C.lG=W.Rb.prototype
-C.vo=G.Tk.prototype
+C.BB=G.Tk.prototype
 C.On=F.ZP.prototype
-C.GhT=L.nJ.prototype
-C.qL=R.Eg.prototype
+C.Jh=L.nJ.prototype
+C.lQ=R.Eg.prototype
 C.MC=D.i7.prototype
-C.D4=A.Gk.prototype
+C.LTI=A.Gk.prototype
 C.kL=W.H05.prototype
-C.Hb=X.MJ.prototype
-C.N3=X.J3.prototype
+C.ls6=X.MJ.prototype
+C.n0=X.J3.prototype
 C.Xo=U.DK.prototype
 C.PJ8=N.BS.prototype
 C.Al=O.Vb.prototype
 C.Vc=K.Ly.prototype
-C.W3=W.O7.prototype
-C.Ug=E.WS.prototype
+C.W3=W.fJ.prototype
+C.bP=E.WS.prototype
 C.GII=E.H8.prototype
 C.Ie=E.mO.prototype
 C.Ig=E.DE.prototype
-C.x4=E.U1.prototype
+C.VLs=E.U1.prototype
 C.ej=E.qM.prototype
-C.Wa=E.av.prototype
+C.OkI=E.av.prototype
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
 C.RVQ=E.wN.prototype
 C.wP=E.ds.prototype
-C.aj2=E.Mb.prototype
+C.Ag=E.Mb.prototype
 C.ozm=E.oF.prototype
-C.wK=E.qh.prototype
+C.IXz=E.qh.prototype
 C.rU=E.Q6.prototype
-C.j1=E.L4.prototype
+C.j1o=E.L4.prototype
 C.ag=E.Zn.prototype
-C.js=E.uE.prototype
+C.Fw=E.uE.prototype
 C.UZ=E.n5.prototype
 C.QFk=O.Im.prototype
-C.hM=B.pR.prototype
+C.uRw=B.pR.prototype
 C.yKx=Z.EZ.prototype
 C.aXP=D.Z4.prototype
 C.rCJ=D.Qh.prototype
@@ -22991,48 +23041,47 @@
 C.F2=D.IW.prototype
 C.mb=D.Oz.prototype
 C.OoF=D.St.prototype
-C.Xe=L.qk.prototype
+C.hys=L.qk.prototype
 C.Nm=J.Q.prototype
 C.YI=J.VA7.prototype
 C.jn=J.imn.prototype
-C.bP=J.CDU.prototype
+C.jN=J.CDU.prototype
 C.CD=J.P.prototype
 C.yo=J.O.prototype
 C.Du=Z.vj.prototype
 C.xA=A.UK.prototype
 C.Z3=R.LU.prototype
-C.MG=M.CX.prototype
-C.dl=U.WG.prototype
-C.vmJ=U.VZ.prototype
+C.fQ=M.CX.prototype
+C.DX=U.WG.prototype
+C.OX=U.VZ.prototype
 C.Ax=N.I2.prototype
-C.h1=N.FB.prototype
+C.Mw=N.FB.prototype
 C.po=N.qn.prototype
-C.S2=W.H9.prototype
+C.S2=W.x76.prototype
 C.yp=H.eEV.prototype
-C.Jm=H.V6a.prototype
-C.kD=A.md.prototype
+C.aV=A.md.prototype
 C.pl=A.ye.prototype
 C.IG=A.Bm.prototype
 C.nn=A.Ya.prototype
 C.BJj=A.NK.prototype
 C.L8=A.Zx.prototype
 C.J7=A.Ww.prototype
-C.z0=W.BH3.prototype
+C.t5=W.BH3.prototype
 C.aD=L.qV.prototype
 C.ji=Q.Ce.prototype
 C.LQi=L.NT.prototype
 C.YpE=V.F1.prototype
-C.Pfz=Z.uL.prototype
+C.mk=Z.uL.prototype
 C.Sx=J.iCW.prototype
-C.Vk=A.xc.prototype
-C.vy=T.ov.prototype
-C.Mh=A.kn.prototype
+C.GBL=A.xc.prototype
+C.za=T.ov.prototype
+C.Wa=A.kn.prototype
 C.cJ0=U.fI.prototype
 C.U0=R.zM.prototype
-C.kgQ=D.Rk.prototype
-C.Ns=U.Ti.prototype
+C.Vd=D.Rk.prototype
+C.Uv=U.Ti.prototype
 C.HRc=Q.xI.prototype
-C.zb=Q.CY.prototype
+C.Yo=Q.CY.prototype
 C.dX=K.nm.prototype
 C.bg3=X.Vu.prototype
 C.OKl=A.G1.prototype
@@ -23041,35 +23090,35 @@
 C.aXh=V.D2.prototype
 C.J57=V.Pa.prototype
 C.V8=X.I5.prototype
-C.Tkx=U.el.prototype
-C.ol=W.K5.prototype
+C.Hd=U.el.prototype
+C.ole=W.K5.prototype
 C.Kn=new H.i6()
-C.OL=new U.EO()
+C.x4=new U.WH()
 C.Ar=new H.MB()
 C.MS=new H.FuS()
 C.Eq=new P.k5C()
 C.qY=new T.WM()
 C.ZB=new P.yRf()
 C.Xh=new P.mgb()
-C.aZ=new L.iNc()
+C.zr=new L.iNc()
 C.NU=new P.R81()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
-C.AA=new D.WAE("Reused")
-C.oA=new D.WAE("Tag")
+C.yP=new D.WAE("Reused")
+C.Z7=new D.WAE("Tag")
 C.nU=new A.iYn(0)
 C.BM=new A.iYn(1)
 C.hU=new A.iYn(2)
 C.hf=new H.tx("label")
-C.Gh=H.Kxv('qU')
+C.lY=H.Kxv('qU')
 C.B10=new K.vly()
 C.vrd=new A.xn(!1)
 I.uLC=function(a){a.immutable$list=init
 a.fixed$length=init
 return a}
 C.ucP=I.uLC([C.B10,C.vrd])
-C.V0=new A.ES(C.hf,C.BM,!1,C.Gh,!1,C.ucP)
+C.V0=new A.ES(C.hf,C.BM,!1,C.lY,!1,C.ucP)
 C.EV=new H.tx("library")
 C.Jny=H.Kxv('U4')
 C.ZQ=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.ucP)
@@ -23104,7 +23153,7 @@
 C.esx=I.uLC([C.B10,C.J19])
 C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.esx)
 C.zU=new H.tx("uncheckedText")
-C.uT=new A.ES(C.zU,C.BM,!1,C.Gh,!1,C.ucP)
+C.uT=new A.ES(C.zU,C.BM,!1,C.lY,!1,C.ucP)
 C.mr=new H.tx("expanded")
 C.iz=new A.ES(C.mr,C.BM,!1,C.Ow,!1,C.esx)
 C.VI=new H.tx("line")
@@ -23114,7 +23163,7 @@
 C.yw=H.Kxv('KN')
 C.NL=new A.ES(C.IT,C.BM,!1,C.yw,!1,C.ucP)
 C.A7=new H.tx("height")
-C.SD=new A.ES(C.A7,C.BM,!1,C.Gh,!1,C.ucP)
+C.SD=new A.ES(C.A7,C.BM,!1,C.lY,!1,C.ucP)
 C.fn=new H.tx("instance")
 C.Q56=H.Kxv('uq')
 C.Kk=new A.ES(C.fn,C.BM,!1,C.Q56,!1,C.ucP)
@@ -23127,12 +23176,12 @@
 C.jFX=H.Kxv('dy')
 C.dq=new A.ES(C.XA,C.BM,!1,C.jFX,!1,C.ucP)
 C.aH=new H.tx("displayCutoff")
-C.w3=new A.ES(C.aH,C.BM,!1,C.Gh,!1,C.esx)
+C.w3=new A.ES(C.aH,C.BM,!1,C.lY,!1,C.esx)
 C.rB=new H.tx("isolate")
 C.a2p=H.Kxv('bv')
 C.xY=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.esx)
 C.mJ=new H.tx("color")
-C.Qu=new A.ES(C.mJ,C.BM,!1,C.Gh,!1,C.ucP)
+C.Qu=new A.ES(C.mJ,C.BM,!1,C.lY,!1,C.ucP)
 C.bz=new H.tx("isolateChanged")
 C.Bk=new A.ES(C.bz,C.hU,!1,C.yQP,!1,C.xD)
 C.CG=new H.tx("posChanged")
@@ -23141,7 +23190,7 @@
 C.oUD=H.Kxv('N7')
 C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
 C.Gs=new H.tx("sampleCount")
-C.iO=new A.ES(C.Gs,C.BM,!1,C.Gh,!1,C.esx)
+C.iO=new A.ES(C.Gs,C.BM,!1,C.lY,!1,C.esx)
 C.oj=new H.tx("httpServer")
 C.GT=new A.ES(C.oj,C.BM,!1,C.MR,!1,C.ucP)
 C.td=new H.tx("object")
@@ -23150,7 +23199,7 @@
 C.NBK=H.Kxv('Z5')
 C.Gz=new A.ES(C.pD,C.BM,!1,C.NBK,!1,C.ucP)
 C.TW=new H.tx("tagSelector")
-C.H0=new A.ES(C.TW,C.BM,!1,C.Gh,!1,C.esx)
+C.H0=new A.ES(C.TW,C.BM,!1,C.lY,!1,C.esx)
 C.vp=new H.tx("list")
 C.Rz=new A.ES(C.vp,C.BM,!1,C.hAX,!1,C.ucP)
 C.uO=new H.tx("inboundReferences")
@@ -23162,10 +23211,10 @@
 C.Rs=new H.tx("currentPosChanged")
 C.EW=new A.ES(C.Rs,C.hU,!1,C.yQP,!1,C.xD)
 C.zz=new H.tx("timeSpan")
-C.lS=new A.ES(C.zz,C.BM,!1,C.Gh,!1,C.esx)
+C.lS=new A.ES(C.zz,C.BM,!1,C.lY,!1,C.esx)
 C.EP=new H.tx("page")
-C.VW=H.Kxv('JM')
-C.db=new A.ES(C.EP,C.BM,!1,C.VW,!1,C.ucP)
+C.wIp=H.Kxv('JM')
+C.db=new A.ES(C.EP,C.BM,!1,C.wIp,!1,C.ucP)
 C.CZi=H.Kxv('cn')
 C.tO=new A.ES(C.yh,C.BM,!1,C.CZi,!1,C.ucP)
 C.kw=new H.tx("trace")
@@ -23193,7 +23242,7 @@
 C.Mda=H.Kxv('Ix')
 C.bp=new A.ES(C.ne,C.BM,!1,C.Mda,!1,C.ucP)
 C.kV=new H.tx("link")
-C.vz=new A.ES(C.kV,C.BM,!1,C.Gh,!1,C.ucP)
+C.vz=new A.ES(C.kV,C.BM,!1,C.lY,!1,C.ucP)
 C.Ve=new H.tx("socket")
 C.Xmq=H.Kxv('WP')
 C.X4=new A.ES(C.Ve,C.BM,!1,C.Xmq,!1,C.ucP)
@@ -23204,14 +23253,14 @@
 C.vY=new H.tx("currentPos")
 C.ZS=new A.ES(C.vY,C.BM,!1,C.yw,!1,C.ucP)
 C.p8=new H.tx("event")
-C.x8=H.Kxv('Mk')
-C.uc=new A.ES(C.p8,C.BM,!1,C.x8,!1,C.ucP)
+C.Kp2=H.Kxv('Mk')
+C.uc=new A.ES(C.p8,C.BM,!1,C.Kp2,!1,C.ucP)
 C.YD=new H.tx("sampleRate")
-C.fP=new A.ES(C.YD,C.BM,!1,C.Gh,!1,C.esx)
+C.fP=new A.ES(C.YD,C.BM,!1,C.lY,!1,C.esx)
 C.Aa=new H.tx("results")
 C.k5=new A.ES(C.Aa,C.BM,!1,C.Gsc,!1,C.esx)
 C.t6=new H.tx("mapAsString")
-C.b6=new A.ES(C.t6,C.BM,!1,C.Gh,!1,C.esx)
+C.b6=new A.ES(C.t6,C.BM,!1,C.lY,!1,C.esx)
 C.qs=new H.tx("io")
 C.MN=new A.ES(C.qs,C.BM,!1,C.MR,!1,C.ucP)
 C.QH=new H.tx("fragmentation")
@@ -23229,15 +23278,18 @@
 C.He=new H.tx("hideTagsChecked")
 C.fz=new A.ES(C.He,C.BM,!1,C.Ow,!1,C.esx)
 C.eh=new H.tx("lineMode")
-C.jO=new A.ES(C.eh,C.BM,!1,C.Gh,!1,C.esx)
+C.jO=new A.ES(C.eh,C.BM,!1,C.lY,!1,C.esx)
 C.PM=new H.tx("status")
-C.jv=new A.ES(C.PM,C.BM,!1,C.Gh,!1,C.esx)
+C.jv=new A.ES(C.PM,C.BM,!1,C.lY,!1,C.esx)
 C.Zi=new H.tx("lastAccumulatorReset")
-C.xx=new A.ES(C.Zi,C.BM,!1,C.Gh,!1,C.esx)
+C.xx=new A.ES(C.Zi,C.BM,!1,C.lY,!1,C.esx)
 C.lH=new H.tx("checkedText")
-C.dG=new A.ES(C.lH,C.BM,!1,C.Gh,!1,C.ucP)
+C.dG=new A.ES(C.lH,C.BM,!1,C.lY,!1,C.ucP)
 C.VK=new H.tx("devtools")
 C.lW=new A.ES(C.VK,C.BM,!1,C.Ow,!1,C.ucP)
+C.AV=new H.tx("callback")
+C.QiO=H.Kxv('Sa')
+C.fr=new A.ES(C.AV,C.BM,!1,C.QiO,!1,C.ucP)
 C.vs=new H.tx("endLine")
 C.MP=new A.ES(C.vs,C.BM,!1,C.yw,!1,C.esx)
 C.li=new H.tx("startPosChanged")
@@ -23246,11 +23298,11 @@
 C.Rh=new A.ES(C.ox,C.hU,!1,C.yQP,!1,C.xD)
 C.XM=new H.tx("path")
 C.Tt=new A.ES(C.XM,C.BM,!1,C.MR,!1,C.ucP)
-C.GO=new A.ES(C.EP,C.BM,!1,C.VW,!1,C.esx)
+C.GO=new A.ES(C.EP,C.BM,!1,C.wIp,!1,C.esx)
 C.bJ=new H.tx("counters")
 C.UI=new A.ES(C.bJ,C.BM,!1,C.SXK,!1,C.ucP)
 C.bE=new H.tx("sampleDepth")
-C.h3=new A.ES(C.bE,C.BM,!1,C.Gh,!1,C.esx)
+C.h3=new A.ES(C.bE,C.BM,!1,C.lY,!1,C.esx)
 C.N8=new H.tx("scriptChanged")
 C.qE=new A.ES(C.N8,C.hU,!1,C.yQP,!1,C.xD)
 C.YT=new H.tx("expr")
@@ -23268,23 +23320,23 @@
 C.YE=new H.tx("webSocket")
 C.Wl=new A.ES(C.YE,C.BM,!1,C.MR,!1,C.ucP)
 C.Dj=new H.tx("refreshTime")
-C.Ay=new A.ES(C.Dj,C.BM,!1,C.Gh,!1,C.esx)
+C.Ay=new A.ES(C.Dj,C.BM,!1,C.lY,!1,C.esx)
 C.Gr=new H.tx("endPos")
 C.VJ=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.ucP)
 C.RJ=new H.tx("vm")
 C.U0P=H.Kxv('wv')
 C.BP=new A.ES(C.RJ,C.BM,!1,C.U0P,!1,C.ucP)
 C.uX=new H.tx("standaloneVmAddress")
-C.Eb=new A.ES(C.uX,C.BM,!1,C.Gh,!1,C.ucP)
+C.Eb=new A.ES(C.uX,C.BM,!1,C.lY,!1,C.ucP)
 C.PX=new H.tx("script")
-C.iF=H.Kxv('vx')
-C.jz=new A.ES(C.PX,C.BM,!1,C.iF,!1,C.ucP)
+C.KB=H.Kxv('vx')
+C.jz=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.ucP)
 C.Gn=new H.tx("objectChanged")
 C.az=new A.ES(C.Gn,C.hU,!1,C.yQP,!1,C.xD)
 C.o0=new A.ES(C.vp,C.BM,!1,C.MR,!1,C.ucP)
 C.i4=new H.tx("code")
-C.pM=H.Kxv('kx')
-C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.ucP)
+C.nqy=H.Kxv('kx')
+C.aJ=new A.ES(C.i4,C.BM,!1,C.nqy,!1,C.ucP)
 C.nE=new H.tx("tracer")
 C.Tbd=H.Kxv('KZ')
 C.FM=new A.ES(C.nE,C.BM,!1,C.Tbd,!1,C.ucP)
@@ -23296,7 +23348,7 @@
 C.uk=new H.tx("last")
 C.rY=new A.ES(C.uk,C.BM,!1,C.Ow,!1,C.ucP)
 C.TN=new H.tx("lastServiceGC")
-C.Gj=new A.ES(C.TN,C.BM,!1,C.Gh,!1,C.esx)
+C.Gj=new A.ES(C.TN,C.BM,!1,C.lY,!1,C.esx)
 C.OO=new H.tx("flag")
 C.Cf=new A.ES(C.OO,C.BM,!1,C.SXK,!1,C.ucP)
 C.S4=new H.tx("busy")
@@ -23306,10 +23358,7 @@
 C.am=new H.tx("chromeTargets")
 C.JD=new A.ES(C.am,C.BM,!1,C.Gsc,!1,C.esx)
 C.oE=new H.tx("chromiumAddress")
-C.r2=new A.ES(C.oE,C.BM,!1,C.Gh,!1,C.ucP)
-C.AV=new H.tx("callback")
-C.Fyq=H.Kxv('Sa')
-C.k1=new A.ES(C.AV,C.BM,!1,C.Fyq,!1,C.ucP)
+C.r2=new A.ES(C.oE,C.BM,!1,C.lY,!1,C.ucP)
 C.r1=new H.tx("expandChanged")
 C.nP=new A.ES(C.r1,C.hU,!1,C.yQP,!1,C.xD)
 C.Mc=new H.tx("flagList")
@@ -23317,11 +23366,11 @@
 C.rE=new H.tx("frame")
 C.B7=new A.ES(C.rE,C.BM,!1,C.SXK,!1,C.ucP)
 C.cg=new H.tx("anchor")
-C.ll=new A.ES(C.cg,C.BM,!1,C.Gh,!1,C.ucP)
+C.ll=new A.ES(C.cg,C.BM,!1,C.lY,!1,C.ucP)
 C.ngm=I.uLC([C.J19])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.pM,!1,C.ngm)
+C.Qs=new A.ES(C.i4,C.BM,!0,C.nqy,!1,C.ngm)
 C.mi=new H.tx("text")
-C.yV=new A.ES(C.mi,C.BM,!1,C.Gh,!1,C.esx)
+C.yV=new A.ES(C.mi,C.BM,!1,C.lY,!1,C.esx)
 C.tW=new H.tx("pos")
 C.It=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.ucP)
 C.TO=new A.ES(C.kY,C.BM,!1,C.SmN,!1,C.ucP)
@@ -23334,7 +23383,18 @@
 C.Mq=new A.ES(C.vb,C.BM,!1,C.MR,!1,C.ucP)
 C.KK=new A.ES(C.uO,C.BM,!1,C.Gsc,!1,C.esx)
 C.ny=new P.a6(0)
-C.eL=new P.moY(!1)
+C.it=new P.moY(!1)
+C.d6=H.VM(new W.FkO("close"),[W.BI])
+C.iw=H.VM(new W.FkO("disconnect"),[W.PGY])
+C.JN=H.VM(new W.FkO("error"),[W.ew7])
+C.MD=H.VM(new W.FkO("error"),[W.ea])
+C.LF=H.VM(new W.FkO("load"),[W.ew7])
+C.G5=H.VM(new W.FkO("loadend"),[W.ew7])
+C.ph=H.VM(new W.FkO("message"),[W.cxu])
+C.Whw=H.VM(new W.FkO("mousedown"),[W.N2])
+C.Kq=H.VM(new W.FkO("mousemove"),[W.N2])
+C.JL=H.VM(new W.FkO("open"),[W.ea])
+C.yf=H.VM(new W.FkO("popstate"),[W.niR])
 C.mp=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -23467,16 +23527,16 @@
   hooks.prototypeForTag = prototypeForTagFixed;
 }
 C.xr=new P.byg(null,null)
-C.A3=new P.Mx(null)
-C.Sr=new P.ojF(null,null)
+C.A3=new P.c5(null)
+C.cb=new P.ojF(null,null)
 C.EkO=new N.Ng("FINER",400)
-C.R5=new N.Ng("FINE",500)
+C.t4=new N.Ng("FINE",500)
 C.IF=new N.Ng("INFO",800)
-C.oO=new N.Ng("OFF",2000)
+C.oOA=new N.Ng("OFF",2000)
 C.cd=new N.Ng("SEVERE",1000)
 C.nT=new N.Ng("WARNING",900)
 C.Gb=H.VM(I.uLC([127,2047,65535,1114111]),[P.KN])
-C.jb=I.uLC([1,6])
+C.Q5=I.uLC([1,6])
 C.rz=I.uLC([0,0,32776,33792,1,10240,0,0])
 C.SY=new H.tx("keys")
 C.l4=new H.tx("values")
@@ -23486,22 +23546,22 @@
 C.WK=I.uLC([C.SY,C.l4,C.Wn,C.ai,C.nZ])
 C.o5=I.uLC([0,0,65490,45055,65535,34815,65534,18431])
 C.fW=H.VM(I.uLC(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
-C.mKy=I.uLC([0,0,26624,1023,65534,2047,65534,2047])
-C.yD=I.uLC([0,0,26498,1023,65534,34815,65534,18431])
+C.qq=I.uLC([0,0,26624,1023,65534,2047,65534,2047])
+C.Fa=I.uLC([0,0,26498,1023,65534,34815,65534,18431])
 C.fJ3=H.Kxv('iv')
-C.fo=I.uLC([C.fJ3])
+C.bfK=I.uLC([C.fJ3])
 C.ip=I.uLC(["==","!=","<=",">=","||","&&"])
 C.jY=I.uLC(["as","in","this"])
 C.jx=I.uLC([0,0,32722,12287,65534,34815,65534,18431])
-C.Jp=I.uLC(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
+C.QC=I.uLC(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
 C.bg=I.uLC([43,45,42,47,33,38,37,60,61,62,63,94,124])
 C.B2=I.uLC([0,0,24576,1023,65534,34815,65534,18431])
 C.aa=I.uLC([0,0,32754,11263,65534,34815,65534,18431])
 C.ZJ=I.uLC([0,0,65490,12287,65535,34815,65534,18431])
-C.jr=I.uLC([0,0,32722,12287,65535,34815,65534,18431])
-C.ML=I.uLC([40,41,91,93,123,125])
+C.yk=I.uLC([0,0,32722,12287,65535,34815,65534,18431])
+C.iq=I.uLC([40,41,91,93,123,125])
 C.zao=I.uLC(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.lY=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.zao)
+C.bq=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.zao)
 C.Vgv=I.uLC(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.yt=new H.LPe(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
 C.rW=I.uLC(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
@@ -23509,17 +23569,17 @@
 C.kKi=I.uLC(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
 C.w0=new H.LPe(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
 C.MEG=I.uLC(["enumerate"])
-C.c7=new H.LPe(1,{enumerate:K.HZg()},C.MEG)
+C.mB=new H.LPe(1,{enumerate:K.oJ()},C.MEG)
 C.tq=H.Kxv('Bo')
 C.uwj=H.Kxv('wA')
 C.wE=I.uLC([C.uwj])
 C.Tb=new A.rv(!1,!1,!0,C.tq,!1,!0,C.wE,null)
 C.eQn=H.Kxv('Yj')
 C.Qnw=I.uLC([C.eQn])
-C.jJ=new A.rv(!0,!0,!0,C.tq,!1,!1,C.Qnw,null)
+C.m8=new A.rv(!0,!0,!0,C.tq,!1,!1,C.Qnw,null)
 C.jUO=H.Kxv('xn')
-C.qv=I.uLC([C.jUO])
-C.V4=new A.rv(!0,!0,!0,C.tq,!1,!1,C.qv,null)
+C.erP=I.uLC([C.jUO])
+C.V4=new A.rv(!0,!0,!0,C.tq,!1,!1,C.erP,null)
 C.wj=new D.M9x("Internal")
 C.Cn=new D.M9x("Listening")
 C.lT=new D.M9x("Normal")
@@ -23527,7 +23587,7 @@
 C.BE=new H.tx("averageCollectionPeriodInMillis")
 C.IH=new H.tx("address")
 C.j2=new H.tx("app")
-C.ke=new H.tx("architecture")
+C.US=new H.tx("architecture")
 C.Wq=new H.tx("asStringLiteral")
 C.ET=new H.tx("assertsEnabled")
 C.WC=new H.tx("bpt")
@@ -23645,7 +23705,7 @@
 C.b5=new H.tx("jumpTarget")
 C.z6=new H.tx("key")
 C.Lc=new H.tx("kind")
-C.qa=new H.tx("lastTokenPos")
+C.kA=new H.tx("lastTokenPos")
 C.GI=new H.tx("lastUpdate")
 C.ur=new H.tx("lib")
 C.VN=new H.tx("libraries")
@@ -23666,7 +23726,7 @@
 C.BJ=new H.tx("newSpace")
 C.OV=new H.tx("noSuchMethod")
 C.c6=new H.tx("notifications")
-C.as=new H.tx("objectClass")
+C.jo=new H.tx("objectClass")
 C.zO=new H.tx("objectPool")
 C.vg=new H.tx("oldSpace")
 C.Yp=new H.tx("owner")
@@ -23691,7 +23751,7 @@
 C.KX=new H.tx("refreshCoverage")
 C.ja=new H.tx("refreshGC")
 C.mn=new H.tx("refreshRateChange")
-C.L9=new H.tx("registerCallback")
+C.SE=new H.tx("registerCallback")
 C.ir=new H.tx("relativeLink")
 C.dx=new H.tx("remoteAddress")
 C.ni=new H.tx("remotePort")
@@ -23737,7 +23797,7 @@
 C.dA=new H.tx("tokenPos")
 C.bc=new H.tx("topFrame")
 C.h5=new H.tx("totalCollectionTimeInSeconds")
-C.Kj=new H.tx("totalSamplesInProfile")
+C.kr=new H.tx("totalSamplesInProfile")
 C.ep=new H.tx("tree")
 C.hB=new H.tx("type")
 C.J2=new H.tx("typeChecksEnabled")
@@ -23748,7 +23808,7 @@
 C.Fh=new H.tx("url")
 C.yv=new H.tx("usageCounter")
 C.LP=new H.tx("used")
-C.ct=new H.tx("userName")
+C.Gy=new H.tx("userName")
 C.jh=new H.tx("v")
 C.zd=new H.tx("value")
 C.Db=new H.tx("valueAsString")
@@ -23767,15 +23827,15 @@
 C.Dl=H.Kxv('F1')
 C.mK=H.Kxv('Mb')
 C.UJ=H.Kxv('oa')
-C.E0=H.Kxv('aI')
+C.uh=H.Kxv('aI')
 C.Y3=H.Kxv('CY')
 C.QJ=H.Kxv('WG')
+C.Bc=H.Kxv('Hl')
 C.ra=H.Kxv('Nn')
 C.j4=H.Kxv('IW')
 C.Ke=H.Kxv('EZ')
 C.Vx=H.Kxv('MJ')
 C.Vh=H.Kxv('Pz')
-C.HC=H.Kxv('F0')
 C.rR=H.Kxv('wN')
 C.kt=H.Kxv('Um')
 C.yS=H.Kxv('G6')
@@ -23796,21 +23856,20 @@
 C.dD=H.Kxv('av')
 C.FA=H.Kxv('Ya')
 C.PFz=H.Kxv('yyN')
-C.T1=H.Kxv('Wy')
 C.Th=H.Kxv('fI')
+C.cz=H.Kxv('Vf')
 C.tU=H.Kxv('L4')
-C.yT=H.Kxv('FK')
 C.cK=H.Kxv('I5')
 C.jA=H.Kxv('Eg')
 C.K4=H.Kxv('hV')
 C.Mt=H.Kxv('hu')
-C.qB=H.Kxv('ZX')
-C.CR=H.Kxv('CP')
+C.laj=H.Kxv('ZX')
 C.ca=H.Kxv('Z4')
 C.pJ=H.Kxv('Q6')
 C.Yy=H.Kxv('uE')
-C.M5=H.Kxv('yc')
-C.kA=H.Kxv('G0')
+C.WU=H.Kxv('lf')
+C.nC=H.Kxv('cQ')
+C.u9=H.Kxv('yc')
 C.Yxm=H.Kxv('Pg')
 C.il=H.Kxv('xI')
 C.lp=H.Kxv('LU')
@@ -23819,12 +23878,10 @@
 C.EG=H.Kxv('Oz')
 C.nw=H.Kxv('eo')
 C.OG=H.Kxv('eW')
-C.hD=H.Kxv('lM')
 C.km=H.Kxv('fl')
 C.jV=H.Kxv('rF')
 C.rC=H.Kxv('qV')
 C.OZ=H.Kxv('Ce')
-C.Ho=H.Kxv('zt')
 C.Tq=H.Kxv('vj')
 C.ou=H.Kxv('ak')
 C.JW=H.Kxv('Ww')
@@ -23839,23 +23896,26 @@
 C.Nw=H.Kxv('vr')
 C.kq=H.Kxv('NT')
 C.a8=H.Kxv('Zx')
+C.YZ=H.Kxv('zt')
 C.NR=H.Kxv('nm')
 C.Fn=H.Kxv('qn')
 C.DD=H.Kxv('Zn')
-C.Ev=H.Kxv('Un')
+C.nj=H.Kxv('hg')
 C.qF=H.Kxv('mO')
+C.JA3=H.Kxv('b0B')
 C.Ey=H.Kxv('wM')
 C.pF=H.Kxv('WS')
 C.qZ=H.Kxv('DE')
 C.jw=H.Kxv('xc')
 C.NW=H.Kxv('ye')
-C.jRi=H.Kxv('we')
 C.pi=H.Kxv('FB')
 C.Xv=H.Kxv('n5')
 C.KO=H.Kxv('ZP')
+C.nW=H.Kxv('V2')
 C.he=H.Kxv('qM')
 C.Wz=H.Kxv('pR')
 C.tc=H.Kxv('Ma')
+C.Wr=H.Kxv('m9')
 C.Io=H.Kxv('Qh')
 C.Qt=H.Kxv('NK')
 C.wk=H.Kxv('nJ')
@@ -23870,7 +23930,7 @@
 C.Az=H.Kxv('Gk')
 C.GX=H.Kxv('c8')
 C.R9=H.Kxv('f7')
-C.J0=H.Kxv('vi')
+C.QP=H.Kxv('vi')
 C.tQ=H.Kxv('Vu')
 C.X8=H.Kxv('Ti')
 C.Lg=H.Kxv('JI')
@@ -23881,28 +23941,28 @@
 C.oT=H.Kxv('VY')
 C.jK=H.Kxv('el')
 C.xM=new P.u5F(!1)
-C.rj=new P.Ls(C.NU,P.Uwa())
-C.Xk=new P.Ls(C.NU,P.Dk())
-C.pm=new P.Ls(C.NU,P.zi())
-C.Rt=new P.Ls(C.NU,P.wLZ())
-C.Sq=new P.Ls(C.NU,P.zci())
-C.mc=new P.Ls(C.NU,P.xN())
-C.uo=new P.Ls(C.NU,P.uy1())
-C.pj=new P.Ls(C.NU,P.u3Q())
-C.lk=new P.Ls(C.NU,P.qKH())
-C.Gu=new P.Ls(C.NU,P.xd())
-C.Yl=new P.Ls(C.NU,P.MM())
-C.Zc=new P.Ls(C.NU,P.yA())
-C.Qq=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
+C.NA=new P.Uf(C.NU,P.RN())
+C.Xk=new P.Uf(C.NU,P.Dk())
+C.F6=new P.Uf(C.NU,P.H9())
+C.Rt=new P.Uf(C.NU,P.wLZ())
+C.Sq=new P.Uf(C.NU,P.zci())
+C.mc=new P.Uf(C.NU,P.OjX())
+C.uo=new P.Uf(C.NU,P.uy1())
+C.pj=new P.Uf(C.NU,P.W7())
+C.lk=new P.Uf(C.NU,P.qKH())
+C.Gu=new P.Uf(C.NU,P.xd())
+C.Yl=new P.Uf(C.NU,P.MM())
+C.Zc=new P.Uf(C.NU,P.yA())
+C.zb=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
 $.libraries_to_load = {}
 $.VzC=null
-$.v0=1
+$.tye=1
 $.z7="$cachedFunction"
 $.Mr="$cachedInvocation"
 $.xG=null
 $.hG=null
 $.OK=0
-$.bf=null
+$.mJs=null
 $.P4=null
 $.lcs=!1
 $.NF=null
@@ -23927,113 +23987,113 @@
 $.RL=!1
 $.DR=C.IF
 $.xO=0
-$.dL=0
+$.Nc=0
 $.Oo=null
 $.Td=!1
 $.jq1=0
-$.ng=1
-$.H2=2
+$.ljh=1
+$.ls=2
 $.rf=null
 $.ok=!1
-$.DG=!1
+$.HE=!1
 $.M6=null
 $.UG=!0
 $.RQ="objects/"
 $.vU=null
-$.Hg=null
-$.hm=null
-$.uv=[C.tq,W.Bo,{},C.hP,E.uz,{created:E.z1},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.PU},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.mK,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.Zgg},C.Y3,Q.CY,{created:Q.AlS},C.QJ,U.WG,{created:U.KTC},C.j4,D.IW,{created:D.v8},C.Ke,Z.EZ,{created:Z.CoW},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.wZ7},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.KU},C.Sb,A.kn,{created:A.Thl},C.kH,U.NY,{created:U.ui},C.IZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.Qje},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.FeK},C.uC,O.Im,{created:O.eka},C.PT,M.CX,{created:M.ec},C.iD,O.Vb,{created:O.dF},C.ce,X.kK,{created:X.CM},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.P5Z},C.PFz,W.yyN,{},C.Th,U.fI,{created:U.Ln},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.egu},C.kA,Y.G0,{created:Y.zE},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.Le},C.u4,U.VZ,{created:U.Wzx},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.zf},C.rC,L.qV,{created:L.P5f},C.OZ,Q.Ce,{created:Q.FMr},C.Tq,Z.vj,{created:Z.mA},C.ou,Z.ak,{created:Z.zB},C.JW,A.Ww,{created:A.wC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.Mz,Z.uL,{created:Z.LD},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.cua},C.bC,V.D2,{created:V.n5p},C.Nw,T.vr,{created:T.aed},C.kq,L.NT,{created:L.di},C.a8,A.Zx,{created:A.yno},C.NR,K.nm,{created:K.ant},C.Fn,N.qn,{created:N.hYg},C.DD,E.Zn,{created:E.n0},C.qF,E.mO,{created:E.V6},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.lIg},C.jw,A.xc,{created:A.yk},C.NW,A.ye,{created:A.mBQ},C.jRi,H.we,{"":H.m6},C.pi,N.FB,{created:N.kUw},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.TEI},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.kR},C.wk,L.nJ,{created:L.Rpj},C.Bi,G.Tk,{created:G.aMd},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJ},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.fU,N.I2,{created:N.rI3},C.Az,A.Gk,{created:A.cYO},C.R9,Q.f7,{created:Q.wzV},C.tQ,X.Vu,{created:X.lt2},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.EDe},C.mq,L.qk,{created:L.Qtp},C.XW,T.uV,{created:T.CvM},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.E3U},C.jK,U.el,{created:U.oH}]
+$.Xa=null
+$.ax=null
+$.AuW=[C.tq,W.Bo,{},C.hP,E.uz,{created:E.z1},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.Br},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.VO},C.mK,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.Zgg},C.Y3,Q.CY,{created:Q.AlS},C.QJ,U.WG,{created:U.z0},C.j4,D.IW,{created:D.dmb},C.Ke,Z.EZ,{created:Z.CoW},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.KU},C.Sb,A.kn,{created:A.Thl},C.kH,U.NY,{created:U.q5n},C.IZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.Qje},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.fm},C.uC,O.Im,{created:O.eka},C.PT,M.CX,{created:M.SPd},C.iD,O.Vb,{created:O.teo},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.JR},C.PFz,W.yyN,{},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.egu},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.bUN},C.u4,U.VZ,{created:U.Wzx},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.YtF},C.rC,L.qV,{created:L.P5f},C.OZ,Q.Ce,{created:Q.FMr},C.Tq,Z.vj,{created:Z.mA},C.ou,Z.ak,{created:Z.TH},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.qa},C.Mz,Z.uL,{created:Z.ew},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.cua},C.bC,V.D2,{created:V.Hr},C.Nw,T.vr,{created:T.aed},C.kq,L.NT,{created:L.di},C.a8,A.Zx,{created:A.yno},C.NR,K.nm,{created:K.ant},C.Fn,N.qn,{created:N.hYg},C.DD,E.Zn,{created:E.kf},C.nj,Y.hg,{created:Y.Ifw},C.qF,E.mO,{created:E.Ch},C.JA3,H.b0B,{"":H.m6},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.l5s},C.qZ,E.DE,{created:E.lIg},C.jw,A.xc,{created:A.oaJ},C.NW,A.ye,{created:A.mBQ},C.pi,N.FB,{created:N.kUw},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Wz,B.pR,{created:B.luW},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rpj},C.Bi,G.Tk,{created:G.oo},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJ},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.fU,N.I2,{created:N.rI3},C.Az,A.Gk,{created:A.cYO},C.R9,Q.f7,{created:Q.nk},C.tQ,X.Vu,{created:X.lt2},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.EDe},C.mq,L.qk,{created:L.Qtp},C.XW,T.uV,{created:T.CvM},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.E3U},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
-I.$lazy($,"workerIds","Fa","cz",function(){return H.VM(new P.qo(null),[P.KN])})
+I.$lazy($,"workerIds","rS","qv",function(){return H.VM(new P.qo(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
-I.$lazy($,"notClosurePattern","xq","bN",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
+I.$lazy($,"notClosurePattern","k1","Up",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.cM(H.S7(null))})
 I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"undefinedCallPattern","GK","BN",function(){return H.cM(H.S7(void 0))})
-I.$lazy($,"undefinedLiteralCallPattern","rZ","Y9",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
+I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{(void 0).$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"nullPropertyPattern","BX","W6",function(){return H.cM(H.Mj(null))})
 I.$lazy($,"nullLiteralPropertyPattern","tt","PB",function(){return H.cM(function(){try{null.$method$}catch(z){return z.message}}())})
 I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.cM(H.Mj(void 0))})
 I.$lazy($,"undefinedLiteralPropertyPattern","Ai","qK",function(){return H.cM(function(){try{(void 0).$method$}catch(z){return z.message}}())})
 I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_matcher","lZ","NP",function(){return new H.VR("isolates/.*/metrics",H.Vq("isolates/.*/metrics",!1,!0,!1),null,null)})
-I.$lazy($,"_isolateMatcher","M2","Il",function(){return new H.VR("isolates/.*/",H.Vq("isolates/.*/",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","lZ","NP",function(){return new H.VR("isolates/.*/metrics",H.v4("isolates/.*/metrics",!1,!0,!1),null,null)})
+I.$lazy($,"_isolateMatcher","AX","qL",function(){return new H.VR("isolates/.*/",H.v4("isolates/.*/",!1,!0,!1),null,null)})
 I.$lazy($,"POLL_PERIODS","Bw","c3",function(){return[8000,4000,2000,1000,100]})
 I.$lazy($,"_storage","wZ","Vy",function(){return window.localStorage})
 I.$lazy($,"scheduleImmediateClosure","Mn","zp",function(){return P.xg()})
-I.$lazy($,"_rootMap","ln","wb",function(){return P.YM(null,null,null,null,null)})
+I.$lazy($,"_rootMap","ln","OL",function(){return P.YM(null,null,null,null,null)})
 I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
 I.$lazy($,"context","Lt","Xw",function(){return P.ND(self)})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","xu","LZ",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","fK","iW",function(){return function DartObject(a){this.o=a}})
 I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
-I.$lazy($,"_pageSeparationColor","dg","vl",function(){return[0,0,0,255]})
+I.$lazy($,"_pageSeparationColor","Os","Qg",function(){return[0,0,0,255]})
 I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.TJ)})
-I.$lazy($,"_logger","y7","aT",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","l7","O3",function(){return new L.vH([])})
-I.$lazy($,"_identRegExp","fZ","cD",function(){return new L.MdQ().$0()})
-I.$lazy($,"_logger","y7Y","Nd",function(){return N.QM("observe.PathObserver")})
-I.$lazy($,"_pathCache","un","aB",function(){return P.L5(null,null,null,P.qU,L.Tv)})
-I.$lazy($,"_polymerSyntax","Kb","Cl",function(){return new A.Li(T.GF(null,C.qY),null)})
+I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
+I.$lazy($,"_instance","HS","ptP",function(){return new L.vH([])})
+I.$lazy($,"_identRegExp","pVY","cx",function(){return new L.lPa().$0()})
+I.$lazy($,"_logger","y7Y","YLt",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_pathCache","zC","Nu",function(){return P.L5(null,null,null,P.qU,L.Zl)})
+I.$lazy($,"_polymerSyntax","Kb","Ak",function(){return new A.Li(T.Mo(null,C.qY),null)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.Lz)})
-I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.qU,A.XP)})
-I.$lazy($,"_hasShadowDomPolyfill","PR","oo",function(){return $.Xw().Eg("ShadowDOMPolyfill")})
+I.$lazy($,"_declarations","Hq","w3G",function(){return P.L5(null,null,null,P.qU,A.So)})
+I.$lazy($,"_hasShadowDomPolyfill","Yx","Ep",function(){return $.Xw().Eg("ShadowDOMPolyfill")})
 I.$lazy($,"_ShadowCss","qP","lx",function(){var z=$.Kc()
 return z!=null?J.UQ(z,"ShadowCSS"):null})
-I.$lazy($,"_sheetLog","pe","eU",function(){return N.QM("polymer.stylesheet")})
-I.$lazy($,"_changedMethodQueryOptions","cq","or",function(){return new A.rv(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
-I.$lazy($,"_ATTRIBUTES_REGEX","TS","FF",function(){return new H.VR("\\s|,",H.Vq("\\s|,",!1,!0,!1),null,null)})
+I.$lazy($,"_sheetLog","pe","Is",function(){return N.QM("polymer.stylesheet")})
+I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.rv(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
+I.$lazy($,"_ATTRIBUTES_REGEX","TS","FF",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
 I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Xw(),"Platform")})
 I.$lazy($,"_Polymer","kz","uj",function(){return J.UQ($.Xw(),"Polymer")})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.Vq("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"bindPattern","ZA","VCp",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
 I.$lazy($,"_onReady","T8g","j6",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_observeLog","DZ","a3",function(){return N.QM("polymer.observe")})
-I.$lazy($,"_eventsLog","PK","xW",function(){return N.QM("polymer.events")})
-I.$lazy($,"_unbindLog","Ne","UW",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","xz","aQ",function(){return N.QM("polymer.bind")})
-I.$lazy($,"_watchLog","p5","Is",function(){return N.QM("polymer.watch")})
-I.$lazy($,"_readyLog","nS","Fs",function(){return N.QM("polymer.ready")})
-I.$lazy($,"_PolymerGestures","Yd","Op",function(){return J.UQ($.Xw(),"PolymerGestures")})
-I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
-I.$lazy($,"_typeHandlers","lq","RO",function(){return P.EF([C.Gh,new Z.DO(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.Ow,new Z.Ra(),C.yw,new Z.wJY(),C.CR,new Z.zOQ()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w5(),"-",new K.w10(),"*",new K.w11(),"/",new K.w12(),"%",new K.w13(),"==",new K.w14(),"!=",new K.w15(),"===",new K.w16(),"!==",new K.w17(),">",new K.w18(),">=",new K.w19(),"<",new K.w20(),"<=",new K.w21(),"||",new K.w22(),"&&",new K.w23(),"|",new K.w24()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","oQ","EU",function(){return P.EF(["+",new K.lPa(),"-",new K.Ufa(),"!",new K.Raa()],null,null)})
+I.$lazy($,"_observeLog","DZ","dn",function(){return N.QM("polymer.observe")})
+I.$lazy($,"_eventsLog","fo","vo",function(){return N.QM("polymer.events")})
+I.$lazy($,"_unbindLog","eu","iX",function(){return N.QM("polymer.unbind")})
+I.$lazy($,"_bindLog","xz","Lu",function(){return N.QM("polymer.bind")})
+I.$lazy($,"_watchLog","p5","REM",function(){return N.QM("polymer.watch")})
+I.$lazy($,"_readyLog","nS","lg",function(){return N.QM("polymer.ready")})
+I.$lazy($,"_PolymerGestures","Jm","tNi",function(){return J.UQ($.Xw(),"PolymerGestures")})
+I.$lazy($,"_polymerElementProto","f8","Dw",function(){return new A.Md().$0()})
+I.$lazy($,"_typeHandlers","FZ4","h2",function(){return P.EF([C.lY,new Z.lP(),C.GX,new Z.wJY(),C.Yc,new Z.zOQ(),C.Ow,new Z.W6o(),C.yw,new Z.MdQ(),C.cz,new Z.YJG()],null,null)})
+I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w12(),"-",new K.w13(),"*",new K.w14(),"/",new K.w15(),"%",new K.w16(),"==",new K.w17(),"!=",new K.w18(),"===",new K.w19(),"!==",new K.w20(),">",new K.w21(),">=",new K.w22(),"<",new K.w23(),"<=",new K.w24(),"||",new K.w25(),"&&",new K.w26(),"|",new K.w27()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.EF(["+",new K.w5(),"-",new K.w10(),"!",new K.w11()],null,null)})
 I.$lazy($,"_instance","jC","Pk",function(){return new K.me()})
-I.$lazy($,"_currentIsolateMatcher","vf","jN",function(){return new H.VR("isolates/\\d+",H.Vq("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","r0",function(){return new H.VR("isolates/\\d+/",H.Vq("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"kRegularFunction","et","xK",function(){return new D.yz("function")})
-I.$lazy($,"kClosureFunction","jX","HU",function(){return new D.yz("closure function")})
-I.$lazy($,"kGetterFunction","PZ","rQ",function(){return new D.yz("getter function")})
-I.$lazy($,"kSetterFunction","Bs","en",function(){return new D.yz("setter function")})
-I.$lazy($,"kConstructor","G8","kj",function(){return new D.yz("constructor")})
-I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.yz("implicit getter function")})
-I.$lazy($,"kImplicitSetterFunction","ab","AH",function(){return new D.yz("implicit setter function")})
-I.$lazy($,"kStaticInitializer","Sp","y5",function(){return new D.yz("static initializer")})
-I.$lazy($,"kMethodExtractor","Et","Ot",function(){return new D.yz("method extractor")})
-I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.yz("noSuchMethod dispatcher")})
-I.$lazy($,"kInvokeFieldDispatcher","fJ","bh",function(){return new D.yz("invoke field dispatcher")})
-I.$lazy($,"kCollected","bt","Dh",function(){return new D.yz("Collected")})
-I.$lazy($,"kNative","dQ","Nk",function(){return new D.yz("Native")})
-I.$lazy($,"kTag","z3","zx",function(){return new D.yz("Tag")})
-I.$lazy($,"kReused","tT","OA",function(){return new D.yz("Reused")})
-I.$lazy($,"kUNKNOWN","ve","lC",function(){return new D.yz("UNKNOWN")})
+I.$lazy($,"_currentIsolateMatcher","vf","fA",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"kRegularFunction","Ij","qu",function(){return new D.ma("function")})
+I.$lazy($,"kClosureFunction","jX","xq",function(){return new D.ma("closure function")})
+I.$lazy($,"kGetterFunction","F0","xW",function(){return new D.ma("getter function")})
+I.$lazy($,"kSetterFunction","Bs","Kw",function(){return new D.ma("setter function")})
+I.$lazy($,"kConstructor","G8","kj",function(){return new D.ma("constructor")})
+I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.ma("implicit getter function")})
+I.$lazy($,"kImplicitSetterFunction","ab","AH",function(){return new D.ma("implicit setter function")})
+I.$lazy($,"kStaticInitializer","Sp","y5",function(){return new D.ma("static initializer")})
+I.$lazy($,"kMethodExtractor","Et","Ot",function(){return new D.ma("method extractor")})
+I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.ma("noSuchMethod dispatcher")})
+I.$lazy($,"kInvokeFieldDispatcher","HU","f6",function(){return new D.ma("invoke field dispatcher")})
+I.$lazy($,"kCollected","bt","b1",function(){return new D.ma("Collected")})
+I.$lazy($,"kNative","dQ","YK",function(){return new D.ma("Native")})
+I.$lazy($,"kTag","z3","zx",function(){return new D.ma("Tag")})
+I.$lazy($,"kReused","Gh","dh",function(){return new D.ma("Reused")})
+I.$lazy($,"kUNKNOWN","ve","lC",function(){return new D.ma("UNKNOWN")})
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
-I.$lazy($,"typeInspector","Yv","II",function(){return D.kP()})
+I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","vu",function(){return D.kP()})
-I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.VE(null)})
+I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.vE(null)})
 I.$lazy($,"_contentsOwner","Ub","B8",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_ownerStagingDocument","Xi","MO",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","S1",function(){return C.yo.g("template, ",J.ZG(J.kl(C.lY.gvc(C.lY),new M.W6o()),", "))})
-I.$lazy($,"_templateObserver","joK","TQ",function(){return W.Ws(new M.YJG())})
-I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.DOe().$0()})
-I.$lazy($,"_instanceExtension","lET","Uo",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_isStagingDocument","Fg","Tg",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.qo("template_binding"),[null])})
+I.$lazy($,"_ownerStagingDocument","v2","Ou",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_allTemplatesSelectors","YO","S1",function(){return C.yo.g("template, ",J.ZG(J.kl(C.bq.gvc(C.bq),new M.DOe()),", "))})
+I.$lazy($,"_templateObserver","joK","ik",function(){return W.Ws(new M.Ufa())})
+I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.Raa().$0()})
+I.$lazy($,"_instanceExtension","nB","nR",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_isStagingDocument","Fg","Ks",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_expando","fF","as",function(){return H.VM(new P.qo("template_binding"),[null])})
 
-init.metadata=["object","sender","e",{func:"rb",args:[P.qU]},{func:"Za",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"qt",void:true},{func:"n9F",void:true,args:[{func:"qt",void:true}]},{func:"G5O",void:true,args:[null]},"value",{func:"Vx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"rE",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"h2",args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},"f",{func:"aE",args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]},null,null]},{func:"HQr",ret:{func:"ny"},args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"qs",ret:{func:"aB",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]}]},{func:"tD",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"Uk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"qt",void:true}]},"duration","callback",{func:"zk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"pe",void:true,args:[P.kWp]}]},{func:"SA",void:true,args:[P.JBS,P.e4y,P.JBS,P.qU]},"line",{func:"DM",void:true,args:[P.qU]},{func:"Jj",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.n7,P.T8]},"specification","zoneValues",{func:"qa",ret:P.SQ,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"Dl",ret:P.KN,args:[P.fRn,P.fRn]},{func:"I8",ret:P.SQ,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.SQ,args:[P.IN]},"symbol","v",{func:"DW",ret:U.hw,args:[P.qU]},{func:"ZU",args:[U.hw,null],named:{globals:[P.T8,P.qU,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.O1],args:[P.QV]},"iterable",{func:"Tx",ret:P.KN,args:[D.af,D.af]},{func:"mb",ret:P.qU},"invocation","fractionDigits",{func:"ny"},{func:"N4",args:[P.EH]},"code","key","val",{func:"bh",args:[null,null]},{func:"HF",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},"event",{func:"F3",void:true,args:[D.N7]},{func:"Cj",void:true,args:[D.Ix]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.SQ,args:[null]},"oldEvent",{func:"ai",void:true,args:[W.niR]},"obj","i","responseText",{func:"Om",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Hj",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"de",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"le",args:[D.uq]},{func:"jM",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},{func:"ff",void:true,args:[P.SQ,P.EH]},"expand","onDone","result",{func:"hF",void:true,args:[P.EH]},{func:"jF",args:[{func:"qt",void:true}]},"data","theError","theStackTrace",{func:"Tw",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"uu",void:true,args:[P.a],opt:[P.BpP]},{func:"Hp",args:[null],opt:[null]},{func:"cA",ret:P.SQ},"ignored","convert","element",{func:"K5",args:[P.SQ]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"DR",ret:P.KN,args:[null,P.KN]},{func:"v0",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"nY",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.SQ,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.qU],opt:[null]},"xhr",{func:"QO",void:true,args:[W.v3]},{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"DT",ret:P.qU,args:[P.SQ]},"newSpace",{func:"Z5",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"OE",ret:P.QV,args:[{func:"rb",args:[P.qU]}]},{func:"T5",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.qU]}]},"s","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"d4C",void:true,args:[W.v3,null,W.h4]},{func:"zs",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"FJ",ret:P.qU,args:[P.qU],opt:[P.SQ]},"wasTruncated",{func:"B4",args:[P.e4y,P.JBS]},{func:"djS",args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]}]},"x",{func:"VL8",void:true,args:[P.a,P.a]},"prop","records",{func:"My",args:[L.Tv,null]},"model","node","oneTime",{func:"zI",args:[null,null,null]},{func:"jk",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.T8,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"changes","jsElem","extendee",{func:"zi",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.SQ]},{func:"qj",ret:P.SQ,args:[null],named:{skipChanges:P.SQ}},"skipChanges",{func:"Gm",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.vn,args:[U.hw,U.hw]},{func:"mM9",args:[U.hw]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"rP",args:[V.qC]},{func:"rl6",ret:P.b8},"scriptCoverage","owningIsolate",{func:"K7",void:true,args:[[P.WO,P.KN]]},"counters",{func:"a6",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"RC",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"NuY",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"T2",void:true,args:[P.qU,L.Z8]},{func:"Riv",args:[P.Wy]},{func:"Kg",args:[P.qU,L.Z8]},"CloseEvent","Event",{func:"cOy",args:[W.cxu]},"msg",{func:"K8",void:true,args:[P.SQ,null]},"exp","details",{func:"kn",ret:A.Ap,args:[P.qU]},"ref","ifValue",{func:"PzC",void:true,args:[[P.WO,G.Zq]]},"splices",{func:"U8",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"nUs",ret:Z.lX,args:[P.qU],named:{map:P.T8}},"message","targets",];$=null
+init.metadata=["object","sender","e",{func:"pd",args:[P.qU]},{func:"a1",ret:P.lf},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"T9",void:true},{func:"n9F",void:true,args:[{func:"T9",void:true}]},{func:"G5O",void:true,args:[null]},"value",{func:"Vx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"rE",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"h2",args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},"f",{func:"aE",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]},null,null]},{func:"HQr",ret:{func:"ny"},args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"qs",ret:{func:"l4",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},{func:"tD",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"Uk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"T9",void:true}]},"duration","callback",{func:"zk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"JX",void:true,args:[P.kWp]}]},{func:"SA",void:true,args:[P.JBS,P.e4y,P.JBS,P.qU]},"line",{func:"DM",void:true,args:[P.qU]},{func:"Jj",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.n7,P.T8]},"specification","zoneValues",{func:"qa",ret:P.SQ,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"Dl",ret:P.KN,args:[P.fRn,P.fRn]},{func:"I8",ret:P.SQ,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.SQ,args:[P.IN]},"symbol","v",{func:"DW",ret:U.rx,args:[P.qU]},{func:"ZU",args:[U.rx,null],named:{globals:[P.T8,P.qU,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Tx",ret:P.KN,args:[D.af,D.af]},{func:"I6a",ret:P.qU},"invocation","fractionDigits",{func:"ny"},{func:"N4",args:[P.EH]},"code","key","val",{func:"bh",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},"event",{func:"lrq",void:true,args:[D.N7]},{func:"Cj",void:true,args:[D.Ix]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.SQ,args:[null]},"oldEvent",{func:"ai",void:true,args:[W.niR]},"obj","i","responseText",{func:"Om",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Hj",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"de",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"jB",args:[D.uq]},{func:"Np8",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},{func:"ux",void:true,args:[P.SQ,P.EH]},"expand","onDone","result",{func:"aG",void:true,args:[P.EH]},{func:"lJL",args:[{func:"T9",void:true}]},"data","theError","theStackTrace",{func:"Tw",args:[P.a]},{func:"YP",void:true,opt:[null]},{func:"uu",void:true,args:[P.a],opt:[P.BpP]},{func:"yV",args:[null],opt:[null]},{func:"Wy",ret:P.SQ},"ignored","convert","element",{func:"K5",args:[P.SQ]},{func:"a9",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"DR",ret:P.KN,args:[null,P.KN]},{func:"v0",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.Vf,args:[P.qU]},{func:"cd",ret:P.SQ,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.qU],opt:[null]},"xhr",{func:"bB",void:true,args:[W.N2]},{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"DT",ret:P.qU,args:[P.SQ]},"newSpace",{func:"Z5",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"OE",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"T5",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.qU]}]},"s","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"d4C",void:true,args:[W.N2,null,W.h4]},{func:"Ig",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.Vf]},"time",{func:"FJ",ret:P.qU,args:[P.qU],opt:[P.SQ]},"wasTruncated",{func:"B4",args:[P.e4y,P.JBS]},{func:"djS",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},"x",{func:"VL8",void:true,args:[P.a,P.a]},"prop","records",{func:"My",args:[L.Zl,null]},"model","node","oneTime",{func:"cq",args:[null,null,null]},{func:"jk",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.T8,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"changes","jsElem","extendee",{func:"zi",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.SQ]},{func:"pD",ret:P.SQ,args:[null],named:{skipChanges:P.SQ}},"skipChanges",{func:"Gm",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.vn,args:[U.rx,U.rx]},{func:"Qc",args:[U.rx]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"rP",args:[V.qC]},{func:"rl6",ret:P.b8},"scriptCoverage","owningIsolate",{func:"K7",void:true,args:[[P.WO,P.KN]]},"counters",{func:"a6",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"RC",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"NuY",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"T2",void:true,args:[P.qU,L.U2]},{func:"Riv",args:[P.V2]},{func:"T3G",args:[P.qU,L.U2]},"CloseEvent","Event",{func:"cOy",args:[W.cxu]},"msg",{func:"S0",void:true,args:[P.SQ,null]},"exp","details",{func:"D2",ret:A.Ap,args:[P.qU]},"ref","ifValue",{func:"PzC",void:true,args:[[P.WO,G.Zq]]},"splices",{func:"U8",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"nUs",ret:Z.lX,args:[P.qU],named:{map:P.T8}},"message","targets",];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -24168,7 +24228,7 @@
 a[c]=y
 a[d]=function(){var w=$[c]
 try{if(w===y){$[c]=x
-try{w=$[c]=e()}finally{if(w===y)$[c]=null}}else{if(w===x)H.eQK(b)}return w}finally{$[d]=function(){return this[c]}}}}
+try{w=$[c]=e()}finally{if(w===y)if($[c]===x)$[c]=null}}else{if(w===x)H.eQK(b)}return w}finally{$[d]=function(){return this[c]}}}}
 I.$finishIsolateConstructor=function(a){var y=a.p
 function Isolate(){var x=Object.prototype.hasOwnProperty
 for(var w in y)if(x.call(y,w))this[w]=y[w]
@@ -24194,5 +24254,5 @@
 return}if(document.currentScript){a(document.currentScript)
 return}var z=document.scripts
 function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.V7A(),b)},[])}else{(function(b){H.wW(E.V7A(),b)})([])}})
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.jk(),b)},[])}else{(function(b){H.wW(E.jk(),b)})([])}})
 })()
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html_bootstrap.dart.js
index b8d37aa5..dfc15cc 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -157,7 +157,7 @@
 "^":"",
 x:function(a){return void 0},
 uM:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-MZ:function(a){var z,y,x,w
+aN:function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -169,23 +169,23 @@
 if(w==null){y=Object.getPrototypeOf(a)
 if(y==null||y===Object.prototype)return C.Sx
 else return C.vB}return w},
-zG:function(a){var z,y,x,w
-z=$.uv
+e1g:function(a){var z,y,x,w
+z=$.AuW
 if(z==null)return
 y=z
 for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
 if(x.n(a,y[w]))return w}return},
-Xr:function(a){var z,y,x
-z=J.zG(a)
+Dc:function(a){var z,y,x
+z=J.e1g(a)
 if(z==null)return
-y=$.uv
+y=$.AuW
 x=z+1
 if(x>=y.length)return H.e(y,x)
 return y[x]},
-YC:function(a,b){var z,y,x
-z=J.zG(a)
+KE:function(a,b){var z,y,x
+z=J.e1g(a)
 if(z==null)return
-y=$.uv
+y=$.AuW
 x=z+2
 if(x>=y.length)return H.e(y,x)
 return y[x][b]},
@@ -213,7 +213,7 @@
 Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
-gbx:function(a){return C.Ho}},
+gbx:function(a){return C.Bc}},
 iCW:{
 "^":"Ue1;"},
 kdQ:{
@@ -227,7 +227,7 @@
 if(b<0||b>=a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
 return a.splice(b,1)[0]},
-aP:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
+xe:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0||b>a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
 a.splice(b,0,c)},
@@ -238,13 +238,13 @@
 for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
 return!0}return!1},
 uk:function(a,b){H.DQ(a,b)},
-ad:function(a,b){return H.VM(new H.U5(a,b),[H.u3(H.VM(new H.TNQ(),[H.u3(a,0)]),0)])},
-yx:[function(a,b){return H.VM(new H.Fm(a,b),[null,null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
+ad:function(a,b){return H.VM(new H.U5(a,b),[H.u3(H.VM(new H.wb(),[H.u3(a,0)]),0)])},
+lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},30],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kY",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},30],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -252,17 +252,17 @@
 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)},
-eR:function(a,b){return H.c1(a,b,null,H.u3(H.VM(new H.TNQ(),[H.u3(a,0)]),0))},
+eR:function(a,b){return H.c1(a,b,null,H.u3(H.VM(new H.wb(),[H.u3(a,0)]),0))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 aM:function(a,b,c){if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))
 if(b===c)return H.VM([],[H.u3(a,0)])
 return H.VM(a.slice(b,c),[H.u3(a,0)])},
-Yc:function(a,b,c){var z=H.VM(new H.TNQ(),[H.u3(a,0)])
-H.K0(a,b,c)
+Yc:function(a,b,c){var z=H.VM(new H.wb(),[H.u3(a,0)])
+H.xF(a,b,c)
 return H.c1(a,b,c,H.u3(z,0))},
-gtH:function(a){if(a.length>0)return a[0]
+gqG:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -280,7 +280,7 @@
 Jd:function(a){return this.GT(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
 OY:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return H.EHn(a,b,a.length-1)},
+Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
 cn:function(a,b){return this.Pk(a,b,null)},
 tg:function(a,b){var z
 for(z=0;z<a.length;++z)if(J.xC(a[z],b))return!0
@@ -294,7 +294,7 @@
 z.fixed$length=init
 return z}},
 br:function(a){return this.tt(a,!0)},
-Oe:function(a){var z=P.fM(null,null,null,H.u3(a,0))
+zH:function(a){var z=P.Ls(null,null,null,H.u3(a,0))
 z.FV(0,a)
 return z},
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)])},
@@ -330,7 +330,7 @@
 return 1}else return-1},
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
-gx8:function(a){return isFinite(a)},
+gzr:function(a){return isFinite(a)},
 JV:function(a,b){return a%b},
 Vy:function(a){return Math.abs(a)},
 yu:function(a){var z
@@ -346,7 +346,7 @@
 if(z.C(b,0)||z.D(b,20))throw H.b(P.KP(b))
 y=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+y
-return y},"$1","gKy",2,0,14,75],
+return y},"$1","gVz",2,0,14,75],
 WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
 return a.toString(b)},
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
@@ -398,20 +398,20 @@
 return a<=b},
 F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return a>=b},
-gbx:function(a){return C.yT},
-$isFK:true,
+gbx:function(a){return C.WU},
+$islf:true,
 static:{"^":"SAz,N6l"}},
 imn:{
 "^":"P;",
 gbx:function(a){return C.yw},
-$isCP:true,
-$isFK:true,
+$isVf:true,
+$islf:true,
 $isKN:true},
 VA7:{
 "^":"P;",
-gbx:function(a){return C.CR},
-$isCP:true,
-$isFK:true},
+gbx:function(a){return C.cz},
+$isVf:true,
+$islf:true},
 O:{
 "^":"Gv;",
 j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
@@ -460,7 +460,7 @@
 if(J.xZ(c,a.length))throw H.b(P.N(c))
 return a.substring(b,c)},
 yn:function(a,b){return this.Nj(a,b,null)},
-DY:function(a){var z,y,x,w,v
+bS:function(a){var z,y,x,w,v
 z=a.trim()
 y=z.length
 if(y===0)return z
@@ -479,7 +479,7 @@
 b=b>>>1
 if(b===0)break
 z+=z}return y},
-LL:function(a,b,c){var z=b-a.length
+YX:function(a,b,c){var z=b-a.length
 if(z<=0)return a
 return this.U(c,z)+a},
 gNq:function(a){return new J.IA(a)},
@@ -517,7 +517,7 @@
 y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
 y^=y>>11
 return 536870911&y+((16383&y)<<15>>>0)},
-gbx:function(a){return C.Gh},
+gbx:function(a){return C.lY},
 gB:function(a){return a.length},
 t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
@@ -534,10 +534,10 @@
 x=a.charCodeAt(y)
 if(x!==32&&x!==13&&!J.Ga(x))break}return b}}},
 IA:{
-"^":"w2Y;Bx",
-gB:function(a){return this.Bx.length},
+"^":"w2Y;vF",
+gB:function(a){return this.vF.length},
 t:function(a,b){var z,y
-z=this.Bx
+z=this.vF
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 y=J.Wx(b)
 if(y.C(b,0))H.vh(P.N(b))
@@ -545,7 +545,7 @@
 return z.charCodeAt(b)},
 $asw2Y:function(){return[P.KN]},
 $asark:function(){return[P.KN]},
-$asE9h:function(){return[P.KN]},
+$aseD:function(){return[P.KN]},
 $asWO:function(){return[P.KN]},
 $asQV:function(){return[P.KN]}}}],["","",,H,{
 "^":"",
@@ -562,15 +562,15 @@
 z.a=b
 y=b}else y=b
 if(!J.x(y).$isWO)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
-y=new H.O2(0,0,1,null,null,null,null,null,null,null,null,null,a)
+y=new H.dl(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.N8(a)
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
 x=P.L5(null,null,null,P.KN,H.HX)
-w=P.fM(null,null,null,P.KN)
+w=P.Ls(null,null,null,P.KN)
 v=new H.HX(0,null,!1)
-u=new H.aX(y,x,w,new I(),v,new H.iV(H.t4()),new H.iV(H.t4()),!1,!1,[],P.fM(null,null,null,null),null,null,!1,!0,P.fM(null,null,null,null))
+u=new H.aX(y,x,w,new I(),v,new H.kuS(H.rp()),new H.kuS(H.rp()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 w.h(0,0)
 u.ac(0,v)
 init.globalState.Nr=u
@@ -596,21 +596,21 @@
 if(y!=null)return y[1]
 throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
 Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=H.BK(b.data)
+z=H.Ln(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.NO=y.t(z,"id")
 x=y.t(z,"functionName")
 w=x==null?init.globalState.w2:init.globalFunctions[x]()
 v=y.t(z,"args")
-u=H.BK(y.t(z,"msg"))
+u=H.Ln(y.t(z,"msg"))
 t=y.t(z,"isSpawnUri")
 s=y.t(z,"startPaused")
-r=H.BK(y.t(z,"replyTo"))
+r=H.Ln(y.t(z,"replyTo"))
 y=init.globalState.Hg++
 q=P.L5(null,null,null,P.KN,H.HX)
-p=P.fM(null,null,null,P.KN)
+p=P.Ls(null,null,null,P.KN)
 o=new H.HX(0,null,!1)
-n=new H.aX(y,q,p,new I(),o,new H.iV(H.t4()),new H.iV(H.t4()),!1,!1,[],P.fM(null,null,null,null),null,null,!1,!0,P.fM(null,null,null,null))
+n=new H.aX(y,q,p,new I(),o,new H.kuS(H.rp()),new H.kuS(H.rp()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 p.h(0,0)
 n.ac(0,o)
 init.globalState.Xz.Rk.B7(0,new H.IY(n,new H.jl3(w,v,u,t,s,r),"worker-start"))
@@ -621,11 +621,11 @@
 case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
 init.globalState.Xz.bL()
 break
-case"close":init.globalState.XC.Rz(0,$.cz().t(0,a))
+case"close":init.globalState.XC.Rz(0,$.qv().t(0,a))
 a.terminate()
 init.globalState.Xz.bL()
 break
-case"log":H.VLM(y.t(z,"msg"))
+case"log":H.Vj(y.t(z,"msg"))
 break
 case"print":if(init.globalState.EF===!0){y=init.globalState.rj
 q=H.GyL(P.EF(["command","print","msg",z],null,null))
@@ -633,7 +633,7 @@
 self.postMessage(q)}else P.FL(y.t(z,"msg"))
 break
 case"error":throw H.b(y.t(z,"msg"))}},"$2","NBB",4,0,null,1,2],
-VLM:function(a){var z,y,x,w
+Vj:function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.rj
 x=H.GyL(P.EF(["command","log","msg",a],null,null))
 y.toString
@@ -645,20 +645,20 @@
 y=z.jO
 $.z7=$.z7+("_"+y)
 $.Mr=$.Mr+("_"+y)
-y=z.D5
+y=z.er
 x=init.globalState.N0.jO
 w=z.Qy
-J.H4(f,["spawned",new H.VU(y,x),w,z.PX])
+J.H4(f,["spawned",new H.Kg(y,x),w,z.PX])
 x=new H.zX(a,b,c,d,z)
-if(e===!0){z.oz(w,w)
+if(e===!0){z.V0(w,w)
 init.globalState.Xz.Rk.B7(0,new H.IY(z,x,"start isolate"))}else x.$0()},
 GyL:function(a){var z
-if(init.globalState.ji===!0){z=new H.RS(0,new H.cx())
+if(init.globalState.ji===!0){z=new H.RS(0,new H.oV())
 z.dZ=new H.m3(null)
-return z.Zo(a)}else{z=new H.fL(new H.cx())
+return z.h7(a)}else{z=new H.fL(new H.oV())
 z.dZ=new H.m3(null)
-return z.Zo(a)}},
-BK:function(a){if(init.globalState.ji===!0)return new H.hq(null).ug(a)
+return z.h7(a)}},
+Ln:function(a){if(init.globalState.ji===!0)return new H.EU(null).QS(a)
 else return a},
 vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
@@ -670,7 +670,7 @@
 "^":"TpZ:76;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
-O2:{
+dl:{
 "^":"a;Hg,NO,hJ,N0,Nr,Xz,Ws,EF,ji,i2<,rj,XC,w2<",
 N8:function(a){var z,y,x
 z=self.window==null
@@ -681,7 +681,10 @@
 else y=!0
 this.ji=y
 this.Ws=z&&!x
-this.Xz=new H.ae(P.NZ2(null,H.IY),0)
+y=H.IY
+x=H.VM(new P.nd(null,0,0,0),[y])
+x.Eo(null,y)
+this.Xz=new H.ae(x,0)
 this.i2=P.L5(null,null,null,P.KN,H.aX)
 this.XC=P.L5(null,null,null,P.KN,null)
 if(this.EF===!0){z=new H.JH()
@@ -690,8 +693,8 @@
 self.dartPrint=self.dartPrint||function(b){return function(c){if(self.console&&self.console.log){self.console.log(c)}else{self.postMessage(b(c))}}}(H.wI)}},
 static:{wI:[function(a){return H.GyL(P.EF(["command","print","msg",a],null,null))},"$1","UB",2,0,null,0]}},
 aX:{
-"^":"a;jO>,A4,fW,En<,D5<,Qy,PX,xF?,UF<,Vp<,lJ,QC,fB,P0,pa,ir",
-oz:function(a,b){if(!this.Qy.n(0,a))return
+"^":"a;jO>,A4,fW,En<,er<,Qy,PX,xF?,UF<,Vp<,lJ,QC,fB,P0,pa,ir",
+V0:function(a,b){if(!this.Qy.n(0,a))return
 if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
 this.CX()},
 NR:function(a){var z,y,x,w,v,u
@@ -726,19 +729,21 @@
 return}y=new H.NYh(a)
 if(z.n(b,2)){init.globalState.Xz.Rk.B7(0,new H.IY(this,y,"ping"))
 return}z=this.fB
-if(z==null){z=P.NZ2(null,null)
+if(z==null){z=H.VM(new P.nd(null,0,0,0),[null])
+z.Eo(null,null)
 this.fB=z}z.B7(0,y)},
 w1:function(a,b){var z,y
 if(!this.PX.n(0,a))return
 z=J.x(b)
 if(!z.n(b,0))y=z.n(b,1)&&!this.P0
 else y=!0
-if(y){this.Pb()
+if(y){this.Dm()
 return}if(z.n(b,2)){z=init.globalState.Xz
 y=this.gIm()
 z.Rk.B7(0,new H.IY(this,y,"kill"))
 return}z=this.fB
-if(z==null){z=P.NZ2(null,null)
+if(z==null){z=H.VM(new P.nd(null,0,0,0),[null])
+z.Eo(null,null)
 this.fB=z}z.B7(0,this.gIm())},
 hk:function(a,b){var z,y
 z=this.ir
@@ -760,13 +765,13 @@
 x=u
 w=new H.oP(v,null)
 this.hk(x,w)
-if(this.pa===!0){this.Pb()
+if(this.pa===!0){this.Dm()
 if(this===init.globalState.Nr)throw v}}finally{this.P0=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
 if(this.fB!=null)for(;u=this.fB,!u.gl0(u);)this.fB.AR().$0()}return y},"$1","gZ2",2,0,77,78],
 Ds:function(a){var z=J.U6(a)
-switch(z.t(a,0)){case"pause":this.oz(z.t(a,1),z.t(a,2))
+switch(z.t(a,0)){case"pause":this.V0(z.t(a,1),z.t(a,2))
 break
 case"resume":this.NR(z.t(a,1))
 break
@@ -789,17 +794,17 @@
 if(z.NZ(0,a))throw H.b(P.eG("Registry: ports must be registered only once."))
 z.u(0,a,b)},
 CX:function(){if(this.A4.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.i2.u(0,this.jO,this)
-else this.Pb()},
-Pb:[function(){var z,y
+else this.Dm()},
+Dm:[function(){var z,y
 z=this.fB
 if(z!=null)z.V1(0)
-for(z=this.A4,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.Hb),y.Oh),[H.u3(y,0),H.u3(y,1)]);y.G();)y.lo.BG()
+for(z=this.A4,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.Hb),y.Oh),[H.u3(y,0),H.u3(y,1)]);y.G();)y.Ff.BG()
 z.V1(0)
 this.fW.V1(0)
 init.globalState.i2.Rz(0,this.jO)
 this.ir.V1(0)
 z=this.QC
-if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.lo,null)
+if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.H4(z.Ff,null)
 this.QC=null}},"$0","gIm",0,0,17],
 $isaX:true},
 NYh:{
@@ -808,11 +813,11 @@
 $isEH:true},
 ae:{
 "^":"a;Rk>,kv",
-MK:function(){var z=this.Rk
+mj:function(){var z=this.Rk
 if(z.QN===z.Bq)return
 return z.AR()},
-xB:function(){var z,y,x
-z=this.MK()
+d5:function(){var z,y,x
+z=this.mj()
 if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.NZ(0,init.globalState.Nr.jO)&&init.globalState.Ws===!0&&init.globalState.Nr.A4.X5===0)H.vh(P.eG("Program exited with open ReceivePorts."))
 y=init.globalState
 if(y.EF===!0&&y.i2.X5===0&&y.Xz.kv===0){y=y.rj
@@ -821,7 +826,7 @@
 self.postMessage(x)}return!1}J.R1(z)
 return!0},
 nT:function(){if(self.window!=null)new H.Rm(this).$0()
-else for(;this.xB(););},
+else for(;this.d5(););},
 bL:function(){var z,y,x,w,v
 if(init.globalState.EF!==!0)this.nT()
 else try{this.nT()}catch(x){w=H.Ru(x)
@@ -833,7 +838,7 @@
 self.postMessage(v)}}},
 Rm:{
 "^":"TpZ:17;a",
-$0:[function(){if(!this.a.xB())return
+$0:[function(){if(!this.a.d5())return
 P.cH(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
@@ -862,9 +867,9 @@
 $isEH:true},
 Iy4:{
 "^":"a;",
-$isRZ:true,
-$isXY:true},
-VU:{
+$ispW:true,
+$ishq:true},
+Kg:{
 "^":"Iy4;kx,AJ",
 wR:function(a,b){var z,y,x,w,v
 z={}
@@ -876,22 +881,22 @@
 v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
 z.a=b
 if(v)z.a=H.GyL(b)
-if(x.gD5()===w){x.Ds(z.a)
+if(x.ger()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.B7(0,new H.IY(x,new H.cR(z,this,v),w))},
+y.Rk.B7(0,new H.IY(x,new H.Ua(z,this,v),w))},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isVU&&J.xC(this.kx,b.kx)},
-giO:function(a){return J.dv(this.kx)},
-$isVU:true,
-$isRZ:true,
-$isXY:true},
-cR:{
+return!!J.x(b).$isKg&&J.xC(this.kx,b.kx)},
+giO:function(a){return J.Rr(this.kx)},
+$isKg:true,
+$ispW:true,
+$ishq:true},
+Ua:{
 "^":"TpZ:76;a,b,c",
 $0:[function(){var z,y
 z=this.b.kx
 if(!z.geL()){if(this.c){y=this.a
-y.a=H.BK(y.a)}J.pq(z,this.a.a)}},"$0",null,0,0,null,"call"],
+y.a=H.Ln(y.a)}J.Pc(z,this.a.a)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 bM:{
 "^":"Iy4;Bi,ma,AJ",
@@ -903,16 +908,16 @@
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isbM&&J.xC(this.Bi,b.Bi)&&J.xC(this.AJ,b.AJ)&&J.xC(this.ma,b.ma)},
 giO:function(a){var z,y,x
-z=J.lf(this.Bi,16)
-y=J.lf(this.AJ,8)
+z=J.Eh(this.Bi,16)
+y=J.Eh(this.AJ,8)
 x=this.ma
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
 $isbM:true,
-$isRZ:true,
-$isXY:true},
+$ispW:true,
+$ishq:true},
 HX:{
-"^":"a;UL>,Oy,eL<",
+"^":"a;a7>,Oy,eL<",
 mY:function(a){return this.Oy.$1(a)},
 BG:function(){this.eL=!0
 this.Oy=null},
@@ -921,29 +926,29 @@
 this.eL=!0
 this.Oy=null
 z=init.globalState.N0
-y=this.UL
+y=this.a7
 z.A4.Rz(0,y)
 z.fW.Rz(0,y)
 z.CX()},
 yU:function(a,b){if(this.eL)return
 this.mY(b)},
 $isHX:true,
-static:{"^":"v0"}},
+static:{"^":"tye"}},
 RS:{
-"^":"jP1;uP,dZ",
-DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.NO,a.AJ,J.dv(a.kx)]
+"^":"hz;uP,dZ",
+DE:function(a){if(!!a.$isKg)return["sendport",init.globalState.NO,a.AJ,J.Rr(a.kx)]
 if(!!a.$isbM)return["sendport",a.Bi,a.AJ,a.ma]
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return["capability",a.UL]
+yf:function(a){if(!!a.$iskuS)return["capability",a.a7]
 throw H.b("Capability not serializable: "+a.bu(0))}},
 fL:{
 "^":"ooy;dZ",
-DE:function(a){if(!!a.$isVU)return new H.VU(a.kx,a.AJ)
+DE:function(a){if(!!a.$isKg)return new H.Kg(a.kx,a.AJ)
 if(!!a.$isbM)return new H.bM(a.Bi,a.ma,a.AJ)
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return new H.iV(a.UL)
+yf:function(a){if(!!a.$iskuS)return new H.kuS(a.a7)
 throw H.b("Capability not serializable: "+a.bu(0))}},
-hq:{
+EU:{
 "^":"fPc;Bw",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
@@ -954,19 +959,19 @@
 if(v==null)return
 u=v.hV(w)
 if(u==null)return
-return new H.VU(u,x)}else return new H.bM(y,w,x)},
-Op:function(a){return new H.iV(J.UQ(a,1))}},
+return new H.Kg(u,x)}else return new H.bM(y,w,x)},
+Op:function(a){return new H.kuS(J.UQ(a,1))}},
 m3:{
-"^":"a;Vz",
+"^":"a;At",
 t:function(a,b){return b.__MessageTraverser__attached_info__},
-u:function(a,b,c){this.Vz.push(b)
+u:function(a,b,c){this.At.push(b)
 b.__MessageTraverser__attached_info__=c},
-CH:function(a){this.Vz=[]},
+CH:function(a){this.At=[]},
 F4:function(){var z,y,x
-for(z=this.Vz.length,y=0;y<z;++y){x=this.Vz
+for(z=this.At.length,y=0;y<z;++y){x=this.At
 if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.Vz=null}},
-cx:{
+x[y].__MessageTraverser__attached_info__=null}this.At=null}},
+oV:{
 "^":"a;",
 t:function(a,b){return},
 u:function(a,b,c){},
@@ -974,18 +979,18 @@
 F4:function(){}},
 HU5:{
 "^":"a;",
-Zo:function(a){var z
+h7:function(a){var z
 if(H.vM(a))return this.Wp(a)
 this.dZ.CH(0)
 z=null
-try{z=this.GP(a)}finally{this.dZ.F4()}return z},
-GP:function(a){var z
+try{z=this.B3(a)}finally{this.dZ.F4()}return z},
+B3:function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Wp(a)
 z=J.x(a)
 if(!!z.$isWO)return this.wb(a)
-if(!!z.$isT8)return this.pi(a)
-if(!!z.$isRZ)return this.DE(a)
-if(!!z.$isXY)return this.yf(a)
+if(!!z.$isT8)return this.TI(a)
+if(!!z.$ispW)return this.DE(a)
+if(!!z.$ishq)return this.yf(a)
 return this.N1(a)},
 N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 ooy:{
@@ -999,9 +1004,9 @@
 z=Array(x)
 z.fixed$length=init
 this.dZ.u(0,a,z)
-for(w=0;w<x;++w)z[w]=this.GP(y.t(a,w))
+for(w=0;w<x;++w)z[w]=this.B3(y.t(a,w))
 return z},
-pi:function(a){var z,y
+TI:function(a){var z,y
 z={}
 y=this.dZ.t(0,a)
 z.a=y
@@ -1016,9 +1021,9 @@
 RK:{
 "^":"TpZ:81;a,b",
 $2:[function(a,b){var z=this.b
-J.qQ(this.a.a,z.GP(a),z.GP(b))},"$2",null,4,0,null,79,80,"call"],
+J.kW(this.a.a,z.B3(a),z.B3(b))},"$2",null,4,0,null,79,80,"call"],
 $isEH:true},
-jP1:{
+hz:{
 "^":"HU5;",
 Wp:function(a){return a},
 wb:function(a){var z,y
@@ -1027,26 +1032,26 @@
 y=this.uP++
 this.dZ.u(0,a,y)
 return["list",y,this.IP(a)]},
-pi:function(a){var z,y,x
+TI:function(a){var z,y,x
 z=this.dZ.t(0,a)
 if(z!=null)return["ref",z]
 y=this.uP++
 this.dZ.u(0,a,y)
 x=J.RE(a)
-return["map",y,this.IP(J.qA(x.gvc(a))),this.IP(J.qA(x.gUQ(a)))]},
+return["map",y,this.IP(J.Nd(x.gvc(a))),this.IP(J.Nd(x.gUQ(a)))]},
 IP:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
 x=[]
 C.Nm.sB(x,y)
-for(w=0;w<y;++w){v=this.GP(z.t(a,w))
+for(w=0;w<y;++w){v=this.B3(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
 x[w]=v}return x},
 DE:function(a){return H.vh(P.nO(null))},
 yf:function(a){return H.vh(P.nO(null))}},
 fPc:{
 "^":"a;",
-ug:function(a){if(H.ZR(a))return a
+QS:function(a){if(H.ZR(a))return a
 this.Bw=P.YM(null,null,null,null,null)
 return this.H6(a)},
 H6:function(a){var z,y
@@ -1086,12 +1091,12 @@
 return z},
 fp:function(a){throw H.b("Unexpected serialized object")}},
 Oe:{
-"^":"a;zY,TD,Iw",
+"^":"a;bf,TD,Iw",
 Gv:function(){if(self.setTimeout!=null){if(this.TD)throw H.b(P.f("Timer in event loop cannot be canceled."))
 if(this.Iw==null)return
 H.cv()
 var z=this.Iw
-if(this.zY)self.clearTimeout(z)
+if(this.bf)self.clearTimeout(z)
 else self.clearInterval(z)
 this.Iw=null}else throw H.b(P.f("Canceling a timer."))},
 WI:function(a,b){if(self.setTimeout!=null){++init.globalState.Xz.kv
@@ -1107,7 +1112,7 @@
 this.Iw=self.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))},
 static:{cy:function(a,b){var z=new H.Oe(!0,!1,null)
 z.Qa(a,b)
-return z},jW:function(a,b){var z=new H.Oe(!1,!1,null)
+return z},zw:function(a,b){var z=new H.Oe(!1,!1,null)
 z.WI(a,b)
 return z}}},
 Av:{
@@ -1125,10 +1130,10 @@
 "^":"TpZ:76;a,b",
 $0:[function(){this.b.$1(this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
-iV:{
-"^":"a;UL>",
+kuS:{
+"^":"a;a7>",
 giO:function(a){var z,y,x
-z=this.UL
+z=this.a7
 y=J.Wx(z)
 x=y.m(z,0)
 y=y.Z(z,4294967296)
@@ -1141,11 +1146,11 @@
 n:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-if(!!J.x(b).$isiV){z=this.UL
-y=b.UL
+if(!!J.x(b).$iskuS){z=this.a7
+y=b.a7
 return z==null?y==null:z===y}return!1},
-$isiV:true,
-$isXY:true}}],["","",,H,{
+$iskuS:true,
+$ishq:true}}],["","",,H,{
 "^":"",
 Gp:function(a,b){var z
 if(b!=null){z=b.x
@@ -1161,9 +1166,9 @@
 eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-nN:[function(a){throw H.b(P.rr(a,null,null))},"$1","UR",2,0,3],
+rj:[function(a){throw H.b(P.cD(a,null,null))},"$1","kk",2,0,3],
 BU:function(a,b,c){var z,y,x,w,v,u
-if(c==null)c=H.UR()
+if(c==null)c=H.kk()
 if(typeof a!=="string")H.vh(P.u(a))
 z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
 if(b==null){if(z!=null){y=z.length
@@ -1190,10 +1195,10 @@
 return parseInt(a,b)},
 RR:function(a,b){var z,y
 if(typeof a!=="string")H.vh(P.u(a))
-if(b==null)b=H.UR()
+if(b==null)b=H.kk()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
-if(isNaN(z)){y=J.iY(a)
+if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
 return b.$1(a)}return z},
 lh:function(a){var z,y
@@ -1203,7 +1208,7 @@
 return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
 a5:function(a){return"Instance of '"+H.lh(a)+"'"},
 Qn:[function(){return Date.now()},"$0","EY",0,0,4],
-w4:function(){var z,y
+Xe:function(){var z,y
 if($.xG!=null)return
 $.xG=1000
 $.hG=H.EY()
@@ -1226,13 +1231,13 @@
 z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.u3(a,0)]
-for(;y.G();){x=y.lo
+for(;y.G();){x=y.Ff
 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.wG(x-65536,10)&1023))
 z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},
-LY:function(a){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
+eT:function(a){var z,y
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.Ff
 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.RF(a)},
@@ -1261,7 +1266,7 @@
 KL:function(a){return a.aL?H.o2(a).getUTCHours()+0:H.o2(a).getHours()+0},
 ch:function(a){return a.aL?H.o2(a).getUTCMinutes()+0:H.o2(a).getMinutes()+0},
 Sw:function(a){return a.aL?H.o2(a).getUTCSeconds()+0:H.o2(a).getSeconds()+0},
-of:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+vA:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 return a[b]},
 wV:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 a[b]=c},
@@ -1306,7 +1311,7 @@
 if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.tM})
 z.name=""}else z.toString=H.tM
 return z},
-tM:[function(){return J.AG(this.dartException)},"$0","nR",0,0,null],
+tM:[function(){return J.AG(this.dartException)},"$0","p3",0,0,null],
 vh:function(a){throw H.b(a)},
 Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=new H.Hk(a)
@@ -1320,11 +1325,11 @@
 if((C.jn.wG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.T3(H.d(y)+" (Error "+w+")",null))
 case 445:case 5007:v=H.d(y)+" (Error "+w+")"
 return z.$1(new H.W0(v,null))}}if(a instanceof TypeError){v=$.WD()
-u=$.bN()
+u=$.Up()
 t=$.PH()
 s=$.D1()
 r=$.BN()
-q=$.Y9()
+q=$.Kr()
 p=$.W6()
 $.PB()
 o=$.eA()
@@ -1407,22 +1412,22 @@
 case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
 default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
 CW:function(a,b,c){var z,y,x,w,v,u
-if(c)return H.na(a,b)
+if(c)return H.Kv(a,b)
 z=b.$stubName
 y=b.length
 x=a[z]
 w=b==null?x==null:b===x
 if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
-if(y===0){w=$.bf
-if(w==null){w=H.Iq("self")
-$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+if(y===0){w=$.mJs
+if(w==null){w=H.B3("self")
+$.mJs=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
 v=$.OK
 $.OK=J.WB(v,1)
 return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
 w="return function("+u+"){return this."
-v=$.bf
-if(v==null){v=H.Iq("self")
-$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+v=$.mJs
+if(v==null){v=H.B3("self")
+$.mJs=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
 $.OK=J.WB(w,1)
 return new Function(v+H.d(w)+"}")()},
@@ -1439,10 +1444,10 @@
 default:return function(e,f,g,h){return function(){h=[g(this)]
 Array.prototype.push.apply(h,arguments)
 return e.apply(f(this),h)}}(d,z,y)}},
-na:function(a,b){var z,y,x,w,v,u,t,s
+Kv:function(a,b){var z,y,x,w,v,u,t,s
 z=H.bO()
 y=$.P4
-if(y==null){y=H.Iq("receiver")
+if(y==null){y=H.B3("receiver")
 $.P4=y}x=b.$stubName
 w=b.length
 v=typeof dart_precompiled=="function"
@@ -1470,16 +1475,16 @@
 eQK:function(a){throw H.b(P.mE("Cyclic initialization for static "+H.d(a)))},
 KT:function(a,b,c){return new H.GN(a,b,c,null)},
 Ogz:function(a,b){var z=a.name
-if(b==null||b.length===0)return new H.Fp(z)
+if(b==null||b.length===0)return new H.tu(z)
 return new H.KEA(z,b,null)},
 G3:function(){return C.Kn},
-t4:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
+rp:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
 Kxv:function(a){return new H.cu(a,null)},
 VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
 return a},
 oX:function(a){if(a==null)return
 return a.$builtinTypeInfo},
-IM:function(a,b){return H.Z9(a["$as"+H.d(b)],H.oX(a))},
+IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
 W8:function(a,b,c){var z=H.IM(a,b)
 return z==null?null:z[c]},
 u3:function(a,b){var z=H.oX(a)
@@ -1501,7 +1506,7 @@
 wO:function(a){var z=J.x(a).constructor.builtin$cls
 if(a==null)return z
 return z+H.ia(a.$builtinTypeInfo,0,null)},
-Z9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+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},
@@ -1510,7 +1515,7 @@
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Z9(y[d],z),c)},
+return H.hv(H.Y9(y[d],z),c)},
 hv:function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
@@ -1542,7 +1547,7 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Z9(t,y),w)},
+return H.hv(H.Y9(t,y),w)},
 Hc:function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
@@ -1684,8 +1689,7 @@
 z.KF(c)
 for(x=0;x<y;++x){w=a[x]
 w=z.IN+=w
-z.IN=w+c}w=z.IN
-return w.charCodeAt(0)==0?w:w}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
+z.IN=w+c}return z.IN}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
 ysD:{
 "^":"a;",
 gl0:function(a){return J.xC(this.gB(this),0)},
@@ -1710,18 +1714,18 @@
 z=this.md
 for(y=0;y<z.length;++y){x=z[y]
 b.$2(x,this.Uf(x))}},
-gvc:function(a){return H.VM(new H.dZ(this),[H.u3(this,0)])},
+gvc:function(a){return H.VM(new H.Ns(this),[H.u3(this,0)])},
 gUQ:function(a){return H.K1(this.md,new H.hY(this),H.u3(this,0),H.u3(this,1))},
 $isyN:true},
 hY:{
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.Uf(a)},"$1",null,2,0,null,79,"call"],
 $isEH:true},
-dZ:{
+Ns:{
 "^":"mW;Nt",
 gA:function(a){return J.mY(this.Nt.md)}},
 LI:{
-"^":"a;r9,yV,Jt,TX,Y2,Ok",
+"^":"a;r9,yl,Jt,TX,Y2,Ok",
 gWa:function(){return this.r9},
 gUA:function(){return this.Jt===0},
 gnd:function(){var z,y,x,w
@@ -1749,7 +1753,7 @@
 v.u(0,new H.tx(t),x[s])}return v},
 static:{"^":"hAw,eHF,De4"}},
 FD:{
-"^":"a;mr,Rn>,xm,Rv,hG,Mo,AM,NE",
+"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
 XL:function(a){var z=this.Rn[a+this.hG+3]
 return init.metadata[z]},
 BX:function(a,b){var z=this.Rv
@@ -1827,7 +1831,7 @@
 x=this.lT
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,xq,Re,fN,GK,rZ,BX,tt,dt,Ai",cM:function(a){var z,y,x,w,v,u
+static:{"^":"lm,k1,Re,fN,GK,rZ,BX,tt,dt,Ai",cM: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)
 if(z==null)z=[]
@@ -1907,7 +1911,7 @@
 Bp:{
 "^":"TpZ;"},
 v:{
-"^":"Bp;tx,J6,lT,N7",
+"^":"Bp;tx,J6,lT,JL",
 n:function(a,b){if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isv)return!1
@@ -1918,9 +1922,9 @@
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.J6))},
 $isv:true,
-static:{"^":"bf,P4",DVi:function(a){return a.tx},HY:function(a){return a.lT},bO:function(){var z=$.bf
-if(z==null){z=H.Iq("self")
-$.bf=z}return z},Iq:function(a){var z,y,x,w,v
+static:{"^":"mJs,P4",DVi:function(a){return a.tx},HY:function(a){return a.lT},bO:function(){var z=$.mJs
+if(z==null){z=H.B3("self")
+$.mJs=z}return z},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
@@ -1932,10 +1936,10 @@
 bu:[function(a){return this.G1},"$0","gCR",0,0,73],
 $isXS:true,
 static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
-rg:{
+bb:{
 "^":"XS;G1>",
 bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gCR",0,0,73],
-static:{S3:function(a){return new H.rg(a)}}},
+static:{S3:function(a){return new H.bb(a)}}},
 lbp:{
 "^":"a;"},
 GN:{
@@ -1984,7 +1988,7 @@
 bu:[function(a){return"dynamic"},"$0","gCR",0,0,73],
 za:function(){return},
 $isi6:true},
-Fp:{
+tu:{
 "^":"lbp;oc>",
 za:function(){var z,y
 z=this.oc
@@ -2001,7 +2005,7 @@
 y=[init.allClasses[z]]
 if(0>=y.length)return H.e(y,0)
 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.u3(z,0)]);z.G();)y.push(z.lo.za())
+for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)y.push(z.Ff.za())
 this.Et=y
 return y},
 bu:[function(a){return H.d(this.oc)+"<"+J.ZG(this.re,", ")+">"},"$0","gCR",0,0,73]},
@@ -2035,13 +2039,13 @@
 gHc:function(){var z=this.HN
 if(z!=null)return z
 z=this.Yr
-z=H.Vq(this.zO,z.multiline,!z.ignoreCase,!0)
+z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
 this.HN=z
 return z},
 gIa:function(){var z=this.mV
 if(z!=null)return z
 z=this.Yr
-z=H.Vq(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
+z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
 this.mV=z
 return z},
 ik:function(a){var z
@@ -2051,7 +2055,7 @@
 return H.yx(this,z)},
 B0:function(a){if(typeof a!=="string")H.vh(P.u(a))
 return this.Yr.test(a)},
-ii:function(a){var z,y
+e5:function(a){var z,y
 z=this.ik(a)
 if(z!=null){y=z.pX
 if(0>=y.length)return H.e(y,0)
@@ -2085,14 +2089,14 @@
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 $iswL:true,
-static:{Vq:function(a,b,c,d){var z,y,x,w,v
+static:{v4:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
 x=d?"g":""
 w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.rr("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
 EK:{
 "^":"a;zO,pX",
 t:function(a,b){var z=this.pX
@@ -2104,17 +2108,17 @@
 z.fw(a,b)
 return z}}},
 KW:{
-"^":"mW;ve,vF,wQ",
-gA:function(a){return new H.Pb(this.ve,this.vF,this.wQ,null)},
+"^":"mW;ve,BZ,wQ",
+gA:function(a){return new H.Pb(this.ve,this.BZ,this.wQ,null)},
 $asmW:function(){return[P.Od]},
 $asQV:function(){return[P.Od]}},
 Pb:{
-"^":"a;UW,vF,XB,Jz",
+"^":"a;UW,BZ,Ij,Jz",
 gl:function(){return this.Jz},
 G:function(){var z,y,x,w,v
-z=this.vF
+z=this.BZ
 if(z==null)return!1
-y=this.XB
+y=this.Ij
 if(y<=z.length){x=this.UW.UZ(z,y)
 if(x!=null){this.Jz=x
 z=x.pX
@@ -2123,9 +2127,9 @@
 w=J.q8(z[0])
 if(typeof w!=="number")return H.s(w)
 v=y+w
-this.XB=z.index===v?v+1:v
+this.Ij=z.index===v?v+1:v
 return!0}}this.Jz=null
-this.vF=null
+this.BZ=null
 return!1}},
 Vo:{
 "^":"a;M,f1,zO",
@@ -2134,7 +2138,7 @@
 $isOd:true}}],["","",,X,{
 "^":"",
 hV:{
-"^":"LPc;IF,Qw,cw,yQ,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"LPc;IF,Qw,cw,oX,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gO9:function(a){return a.IF},
 sO9:function(a,b){a.IF=this.ct(a,C.S4,a.IF,b)},
 gFR:function(a){return a.Qw},
@@ -2143,12 +2147,12 @@
 sFR:function(a,b){a.Qw=this.ct(a,C.AV,a.Qw,b)},
 gph:function(a){return a.cw},
 sph:function(a,b){a.cw=this.ct(a,C.hf,a.cw,b)},
-gih:function(a){return a.yQ},
-sih:function(a,b){a.yQ=this.ct(a,C.mJ,a.yQ,b)},
+gih:function(a){return a.oX},
+sih:function(a,b){a.oX=this.ct(a,C.mJ,a.oX,b)},
 pp:[function(a,b,c,d){var z=a.IF
 if(z===!0)return
 if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
-this.LY(a,null).wM(new X.IB(a))}},"$3","gMN",6,0,84,49,50,85],
+this.LY(a,null).wM(new X.jE(a))}},"$3","gYi",6,0,84,49,50,85],
 static:{zy:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -2158,8 +2162,8 @@
 a.IF=!1
 a.Qw=null
 a.cw="action"
-a.yQ=null
-a.Iy=[]
+a.oX=null
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -2172,10 +2176,10 @@
 LPc:{
 "^":"xc+Pi;",
 $isd3:true},
-IB:{
+jE:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
+z.IF=J.NB(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["","",,G,{
 "^":"",
 m7:[function(a){var z
@@ -2183,23 +2187,23 @@
 z=J.UQ(J.UQ($.Xw(),"google"),"visualization")
 $.BY=z
 return z},"$1","vN",2,0,12,13],
-DU:function(a){var z=$.Vy().getItem(a)
+DUC:function(a){var z=$.Vy().getItem(a)
 if(z==null)return
-return C.xr.kV(z)},
-QX:function(a){if(a==null)return P.t5(null,null,null)
-return W.Kz("/crdptargets/"+H.d(P.Mp(C.yD,a,C.xM,!1)),null,null).ml(new G.KF()).OA(new G.XN())},
-dj:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"},
+return C.xr.iQ(z)},
+n8:function(a){if(a==null)return P.pz(null,null,null)
+return W.Og("/crdptargets/"+P.jW(C.Fa,a,C.xM,!1),null,null).ml(new G.KF()).OA(new G.XN())},
+G0:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"},
 o1:function(a,b){var z
 for(z="";b>1;){--b
 if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
-le:[function(a){var z,y,x
+avE:[function(a){var z,y,x
 z=J.Wx(a)
 if(z.C(a,1000))return z.bu(a)
 y=z.Y(a,1000)
 a=z.Z(a,1000)
 x=G.o1(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.o1(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","nI",2,0,14],
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","OA",2,0,14],
 J8:function(a){var z,y,x,w
 z=C.CD.yu(C.CD.RE(a*1000))
 y=C.jn.BU(z,3600000)
@@ -2210,15 +2214,15 @@
 z=C.jn.Y(z,1000)
 if(y>0)return G.o1(y,2)+":"+G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)
 else return G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)},
-XzS:[function(a){var z=J.Wx(a)
+Xz:[function(a){var z=J.Wx(a)
 if(z.C(a,1024))return H.d(a)+"B"
 else if(z.C(a,1048576))return C.CD.Sy(z.V(a,1024),1)+"KB"
 else if(z.C(a,1073741824))return C.CD.Sy(z.V(a,1048576),1)+"MB"
 else if(z.C(a,1099511627776))return C.CD.Sy(z.V(a,1073741824),1)+"GB"
-else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","RC",2,0,14,15],
-mGl:function(a){var z,y,x,w
+else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","Gt",2,0,14,15],
+M5:function(a){var z,y,x,w
 if(a==null)return"-"
-z=J.NQ(J.vX(a,1000))
+z=J.Dv(J.vX(a,1000))
 y=C.jn.BU(z,3600000)
 z=C.jn.Y(z,3600000)
 x=C.jn.BU(z,60000)
@@ -2228,34 +2232,34 @@
 if(x!==0)return""+x+"m "+w+"s"
 return""+w+"s"},
 mL:{
-"^":"Pi;k5,Ef,Z6,Nv,m2<,bn,HJ,Pv,cC,Vg,ij",
+"^":"Pi;wc,fN,Z6,Nv,m2<,bn,HJ,Pv,cC,Vg,fn",
 gwv:function(a){return this.Nv},
 swv:function(a,b){var z,y
 if(J.xC(this.Nv,b))return
-if(this.Nv!=null){J.U2(this.cC)
-J.tw(this.Nv)}if(b!=null){N.QM("").To("Registering new VM callbacks")
-b.gEH().ml(this.gEX())
+if(this.Nv!=null){J.Z8(this.cC)
+J.of(this.Nv)}if(b!=null){N.QM("").To("Registering new VM callbacks")
+b.gEH().ml(this.gAQ())
 z=J.RE(b)
 z.giG(b).ml(this.gm6())
 y=b.gG2()
-H.VM(new P.rk(y),[H.u3(y,0)]).yI(this.gbf())
-J.HL(z.gRk(b)).yI(this.gfF())
+H.VM(new P.Ik(y),[H.u3(y,0)]).yI(this.gtb())
+J.Sr(z.gRk(b)).yI(this.gR7())
 z=b.gLi()
-H.VM(new P.rk(z),[H.u3(z,0)]).yI(this.geO())}this.Nv=b},
+H.VM(new P.Ik(z),[H.u3(z,0)]).yI(this.geO())}this.Nv=b},
 gvK:function(){return this.cC},
 svK:function(a){this.cC=F.Wi(this,C.c6,this.cC,a)},
-of:function(a){var z,y
+KO:function(a){var z,y
 $.Kh=this
-z=this.k5
+z=this.wc
 z.push(new G.t9(this,null,null,null,null))
 z.push(new G.ki(this,null,null,null,null))
-z.push(new G.lO(this,null,null,null,null))
-z.push(G.b2(this))
+z.push(new G.Sy(this,null,null,null,null))
+z.push(G.Gi(this))
 z.push(new G.by(this,null,null,null,null))
 z=this.Z6
 z.By=this
-y=H.VM(new W.vG(window,"popstate",!1),[null])
-H.VM(new W.Ov(0,y.bi,y.fA,W.Yt(z.gTk()),y.el),[H.u3(y,0)]).DN()
+y=H.VM(new W.RO(window,C.yf.fA,!1),[null])
+H.VM(new W.Ov(0,y.bi,y.fA,W.Yt(z.gnt()),y.el),[H.u3(y,0)]).DN()
 z.VA()},
 pZ:function(a){J.Ei(this.cC,new G.xE(a,new G.cE()))},
 rG:[function(a){var z=J.RE(a)
@@ -2265,28 +2269,28 @@
 case"BreakpointResolved":z.god(a).Xb()
 break
 case"BreakpointReached":case"IsolateInterrupted":case"ExceptionThrown":this.pZ(z.god(a))
-J.dH(this.cC,a)
+J.bi(this.cC,a)
 break
 case"GC":break
-default:N.QM("").YX("Unrecognized event: "+H.d(a))
-break}},"$1","gfF",2,0,86,87],
+default:N.QM("").hh("Unrecognized event: "+H.d(a))
+break}},"$1","gR7",2,0,86,87],
 kj:[function(a){this.Pv=a
-this.aX("error/",null)},"$1","gbf",2,0,88,23],
+this.aX("error/",null)},"$1","gtb",2,0,88,23],
 m0:[function(a){this.Pv=a
 if(J.xC(J.Iz(a),"NetworkException"))this.Z6.bo(0,"#/vm-connect/")
 else this.aX("error/",null)},"$1","geO",2,0,89,90],
 aX:function(a,b){var z,y,x,w,v,u
-z=b==null?P.Fl(null,null):P.WX(b,C.xM)
+z=b==null?P.Fl(null,null):P.Ms(b,C.xM)
 y=J.U6(z)
 if(y.t(z,"trace")!=null){x=y.t(z,"trace")
 y=J.x(x)
-if(y.n(x,"on")){if($.hm==null)$.hm=Z.JQ()}else if(y.n(x,"off")){y=$.hm
+if(y.n(x,"on")){if($.ax==null)$.ax=Z.JQ()}else if(y.n(x,"off")){y=$.ax
 if(y!=null){y.RV.Gv()
-$.hm=null}}}y=$.hm
+$.ax=null}}}y=$.ax
 if(y!=null){y.NP.CH(0)
-J.U2(y.Rk)}y=this.HJ
-if(y!=null)J.La(y,$.hm)
-for(y=this.k5,w=0;w<y.length;++w){v=y[w]
+J.Z8(y.Rk)}y=this.HJ
+if(y!=null)J.La(y,$.ax)
+for(y=this.wc,w=0;w<y.length;++w){v=y[w]
 if(v.VU(a)){this.yN(v)
 y=R.tB(z)
 u=v.fz
@@ -2296,43 +2300,43 @@
 v.Q0(a)
 return}}throw H.b(P.a9())},
 yN:function(a){var z,y,x,w
-if(J.xC(this.Ef,a))return
-if(this.Ef!=null){N.QM("").To("Uninstalling page: "+H.d(this.Ef))
-this.Ef.oV()
+if(J.xC(this.fN,a))return
+if(this.fN!=null){N.QM("").To("Uninstalling page: "+H.d(this.fN))
+this.fN.oV()
 J.Wf(this.bn)}N.QM("").To("Installing page: "+H.d(a))
-try{a.ci()}catch(y){x=H.Ru(y)
+try{a.ak()}catch(y){x=H.Ru(y)
 z=x
-N.QM("").YX("Failed to install page: "+H.d(z))}x=this.bn
+N.QM("").hh("Failed to install page: "+H.d(z))}x=this.bn
 x.appendChild(a.gyF())
 w=W.r3("trace-view",null)
 this.HJ=w
-J.La(w,$.hm)
+J.La(w,$.ax)
 x.appendChild(this.HJ)
 x=a
-w=this.Ef
+w=this.fN
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.RG,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Ef=x},
-vW:function(){J.Ei(this.cC,new G.cw())},
+this.nq(this,w)}this.fN=x},
+vW:function(){J.Ei(this.cC,new G.z5())},
 rY:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)
-this.vW()},"$1","gEX",2,0,91,92],
+this.vW()},"$1","gAQ",2,0,91,92],
 T0:[function(a){var z,y
 if(!J.xC(this.Nv,a))return
 this.swv(0,null)
 z=this.cC
 y=new D.Mk(null,null,null,null,null,null,null,null,null,null,!1,null,null,null,null,null)
 y.eq=F.Wi(y,C.qR,null,"VMDisconnected")
-J.dH(z,y)},"$1","gm6",2,0,91,92],
+J.bi(z,y)},"$1","gm6",2,0,91,92],
 Ty:function(a){var z=this.m2.TY
-z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.Z8),P.L5(null,null,null,P.qU,L.Z8),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 this.swv(0,z)
-this.of(!1)},
-E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A5),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+this.KO(!1)},
+E0:function(a){var z=new U.dS(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),P.L5(null,null,null,P.qU,P.A0),0,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.ZH()
 this.swv(0,z)
-this.of(!0)},
+this.KO(!0)},
 static:{"^":"Kh<"}},
 cE:{
 "^":"TpZ:93;",
@@ -2341,22 +2345,22 @@
 $isEH:true},
 xE:{
 "^":"TpZ:12;a,b",
-$1:[function(a){return J.xC(J.wg(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,94,"call"],
+$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,94,"call"],
 $isEH:true},
-cw:{
+z5:{
 "^":"TpZ:12;",
-$1:[function(a){return J.xC(J.iiZ(a),"VMDisconnected")},"$1",null,2,0,null,94,"call"],
+$1:[function(a){return J.xC(J.Ts(a),"VMDisconnected")},"$1",null,2,0,null,94,"call"],
 $isEH:true},
-eM:{
+Kf:{
 "^":"a;Yb",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gvp:function(a){return this.Yb.nQ("getNumberOfRows")},
 Ai:function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
-QS:function(a,b){var z=[]
+Id:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
 this.Yb.V7("addRow",[H.VM(new P.GD(z),[null])])}},
-qu:{
+yD:{
 "^":"a;vR,bG",
 Am:function(a,b){var z=P.jT(this.bG)
 this.vR.V7("draw",[b.Yb,z])}},
@@ -2381,94 +2385,94 @@
 Cz:function(a,b,c){var z,y,x
 z=J.Vs(c).dA.getAttribute("href")
 y=J.RE(a)
-x=y.gAy(a)
+x=y.gEV(a)
 if(typeof x!=="number")return x.D()
-if(x>0||y.gNl(a)===!0||y.gTu(a)===!0||y.gkA(a)===!0||y.gw4(a)===!0)return
+if(x>0||y.gNl(a)===!0||y.gEX(a)===!0||y.gqx(a)===!0||y.gYK(a)===!0)return
 this.bo(0,z)
-y.TI(a)}},
-OR:{
-"^":"yVe;Zz,By,BE,ro,XY,iS",
+y.e6(a)}},
+ng:{
+"^":"yVe;Zz,By,BE,ro,XY,cU",
 VA:function(){var z=H.d(window.location.hash)
 if(window.location.hash===""||window.location.hash==="#")z="#"+this.Zz
 window.history.pushState(z,document.title,z)
 this.UJ(window.location.hash)},
-fH:[function(a){this.UJ(window.location.hash)},"$1","gTk",2,0,95,13],
+fH:[function(a){this.UJ(window.location.hash)},"$1","gnt",2,0,95,13],
 wa:function(a){return"#"+H.d(a)}},
-MQ:{
+OS:{
 "^":"Pi;i6>,yF<",
 gFL:function(a){return this.yF},
 sFL:function(a,b){this.yF=F.Wi(this,C.GP,this.yF,b)},
 gl6:function(a){return this.fz},
 sl6:function(a,b){this.fz=F.Wi(this,C.Zg,this.fz,b)},
 oV:function(){this.yF=F.Wi(this,C.GP,this.yF,null)},
-$isMQ:true},
+$isOS:true},
 by:{
-"^":"MQ;i6,yF,fz,Vg,ij",
-ci:function(){if(this.yF==null){var z=W.r3("service-view",null)
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("service-view",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){if(J.xC(a,""))return
-this.i6.Nv.cv(a).ml(new G.GL(this)).OA(new G.mo())},
+this.i6.Nv.cv(a).ml(new G.mo(this)).OA(new G.Go5())},
 VU:function(a){return!0}},
-GL:{
+mo:{
 "^":"TpZ:12;a",
 $1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-mo:{
+Go5:{
 "^":"TpZ:12;",
-$1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
+$1:[function(a){N.QM("").hh("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 t9:{
-"^":"MQ;i6,yF,fz,Vg,ij",
-ci:function(){if(this.yF==null){var z=W.r3("class-tree",null)
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("class-tree",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){a=J.ZZ(a,11)
-this.i6.Nv.cv(a).ml(new G.Za(this)).OA(new G.hh())},
+this.i6.Nv.cv(a).ml(new G.Hb(this)).OA(new G.ZaW())},
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"rjk"}},
-Za:{
+Hb:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a.yF
 if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-hh:{
+ZaW:{
 "^":"TpZ:12;",
-$1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
+$1:[function(a){N.QM("").hh("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-lO:{
-"^":"MQ;i6,yF,fz,Vg,ij",
-ci:function(){if(this.yF==null){var z=W.r3("service-view",null)
+Sy:{
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("service-view",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){var z,y
 z=H.Go(this.yF,"$isTi")
 y=this.i6.Pv
-z.Ll=J.Q5(z,C.td,z.Ll,y)},
+z.Ll=J.NB(z,C.td,z.Ll,y)},
 VU:function(a){return J.co(a,"error/")}},
 ki:{
-"^":"MQ;i6,yF,fz,Vg,ij",
-ci:function(){if(this.yF==null){var z=W.r3("vm-connect",null)
+"^":"OS;i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("vm-connect",null)
 this.yF=F.Wi(this,C.GP,this.yF,z)}},
 Q0:function(a){},
 VU:function(a){return J.co(a,"vm-connect/")}},
 JM:{
-"^":"MQ;cX@,K3,i6,yF,fz,Vg,ij",
-ci:function(){if(this.yF==null){var z=W.r3("metrics-page",null)
+"^":"OS;cX@,K3,i6,yF,fz,Vg,fn",
+ak:function(){if(this.yF==null){var z=W.r3("metrics-page",null)
 z=F.Wi(this,C.GP,this.yF,z)
 this.yF=z
 H.Go(z,"$isqn")
-z.GC=J.Q5(z,C.EP,z.GC,this)}},
+z.GC=J.NB(z,C.EP,z.GC,this)}},
 ZW:function(a,b){var z
 if(b.gmw()!=null){if(J.cj(b.gmw()).gVs()===a)return
-C.Nm.Rz(b.gmw().gfj(),b)
+C.Nm.Rz(b.gmw().gJb(),b)
 b.smw(null)}if(J.xC(a,0))return
 z=this.K3.t(0,a)
-if(z!=null){z.gfj().push(b)
+if(z!=null){z.gJb().push(b)
 b.smw(z)
 return}throw H.b(P.a9())},
 Q0:function(a){var z,y,x
 z=this.i6.Nv
-y=$.Il().ii(a)
+y=$.qL().e5(a)
 x=J.U6(y)
-z.cv(x.Nj(y,0,J.bI(x.gB(y),1))).ml(new G.VP(this))},
+z.cv(x.Nj(y,0,J.bI(x.gB(y),1))).ml(new G.YhF(this))},
 VU:function(a){var z=$.NP().Yr
 if(typeof a!=="string")H.vh(P.u(a))
 return z.test(a)},
@@ -2480,21 +2484,21 @@
 w=new D.W1(w,v,null)
 w.Cb=P.SZ(v,w.gia(w))
 z.u(0,x,w)}},
-static:{"^":"lZ,M2,Bw",b2:function(a){var z=new G.JM(null,P.L5(null,null,null,P.KN,D.W1),a,null,null,null,null)
+static:{"^":"lZ,AX,Bw",Gi:function(a){var z=new G.JM(null,P.L5(null,null,null,P.KN,D.W1),a,null,null,null,null)
 z.LS(a)
 return z}}},
-VP:{
+YhF:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=H.Go(this.a.yF,"$isqn")
-z.OM=J.Q5(z,C.rB,z.OM,a)},"$1",null,2,0,null,97,"call"],
+z.OM=J.NB(z,C.rB,z.OM,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
 V3:{
 "^":"a;IU",
-cv:function(a){return G.DU(this.IU+"."+H.d(a))}},
+cv:function(a){return G.DUC(this.IU+"."+H.d(a))}},
 KF:{
 "^":"TpZ:3;",
 $1:[function(a){var z,y,x,w
-z=C.xr.kV(a)
+z=C.xr.iQ(a)
 if(z==null)return z
 y=J.U6(z)
 x=0
@@ -2507,10 +2511,10 @@
 "^":"TpZ:12;",
 $1:[function(a){},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-uh:{
-"^":"d3;wo,bq>,TY,ro,XY,iS",
+nD:{
+"^":"d3;wo,bq>,TY,ro,XY,cU",
 k6:function(){return"ws://"+H.d(window.location.host)+"/ws"},
-J8:function(a){var z=this.Xk(a)
+TP:function(a){var z=this.Xk(a)
 if(z!=null)return z
 z=new L.Z5(0,!1,null,a)
 z.oc=a
@@ -2542,7 +2546,7 @@
 A7:function(){var z,y,x,w,v
 z=this.bq
 z.V1(z)
-y=G.DU(this.wo.IU+".history")
+y=G.DUC(this.wo.IU+".history")
 if(y==null)return
 x=J.U6(y)
 w=0
@@ -2551,8 +2555,8 @@
 if(!(w<v))break
 x.u(y,w,L.K9(x.t(y,w)));++w}z.FV(0,y)
 this.TV()},
-vs:function(){this.A7()
-var z=this.J8(this.k6())
+lK:function(){this.A7()
+var z=this.TP(this.k6())
 this.TY=z
 this.h(0,z)},
 static:{"^":"lGN"}},
@@ -2562,42 +2566,42 @@
 $isEH:true},
 jQ:{
 "^":"TpZ:99;",
-$2:function(a,b){return J.FW(b.gFH(),a.gFH())},
+$2:function(a,b){return J.FW(b.geX(),a.geX())},
 $isEH:true},
 Y2:{
-"^":"Pi;eT>,yt<,qu>,oH<",
+"^":"Pi;eT>,yt<,ks>,oH<",
 gyX:function(a){return this.PU},
-grm:function(){return this.aZ},
+gty:function(){return this.aZ},
 goE:function(a){return this.Lk},
 soE:function(a,b){var z=J.xC(this.Lk,b)
 this.Lk=b
 if(!z){z=this.PU
 if(b===!0){this.PU=F.Wi(this,C.Ek,z,"\u21b3")
 this.Pz(0)}else{this.PU=F.Wi(this,C.Ek,z,"\u2192")
-this.aY()}}},
+this.cO()}}},
 r8:function(){this.soE(0,this.Lk!==!0)
 return this.Lk},
 k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
 $isY2:true},
 ih:{
-"^":"Pi;vp>,Vg,ij",
-rT:function(a){var z,y
+"^":"Pi;vp>,Vg,fn",
+G7:function(a){var z,y
 z=this.vp
 y=J.w1(z)
 y.V1(z)
 a.Pz(0)
-y.FV(z,a.qu)},
-qU:function(a){var z,y,x
+y.FV(z,a.ks)},
+lo:function(a){var z,y,x
 z=this.vp
 y=J.U6(z)
 x=y.t(z,a)
-if(x.r8()===!0)y.UG(z,y.OY(z,x)+1,J.dd(x))
+if(x.r8()===!0)y.UG(z,y.OY(z,x)+1,J.Mx(x))
 else this.nm(x)},
 nm:function(a){var z,y,x,w,v
 z=J.RE(a)
-y=J.q8(z.gqu(a))
+y=J.q8(z.gks(a))
 if(y===0)return
-for(x=0;x<y;++x)if(J.IL(J.UQ(z.gqu(a),x))===!0)this.nm(J.UQ(z.gqu(a),x))
+for(x=0;x<y;++x)if(J.IL(J.UQ(z.gks(a),x))===!0)this.nm(J.UQ(z.gks(a),x))
 z.soE(a,!1)
 z=this.vp
 w=J.U6(z)
@@ -2605,15 +2609,15 @@
 w.oq(z,v,v+y)}},
 Kt:{
 "^":"a;ph>,xy<",
-static:{mbk:[function(a){return a!=null?J.AG(a):"<null>"},"$1","NZt",2,0,16]}},
-c0:{
+static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,16]}},
+Ni:{
 "^":"a;UQ>",
-$isc0:true},
+$isNi:true},
 Vz:{
-"^":"Pi;oH<,vp>,GD<",
-sn4:function(a){this.pT=a
+"^":"Pi;oH<,vp>,zz<",
+sxp:function(a){this.pT=a
 F.Wi(this,C.JB,0,1)},
-gn4:function(){return this.pT},
+gxp:function(){return this.pT},
 gT3:function(){return this.Rj},
 sT3:function(a){this.Rj=a
 F.Wi(this,C.JB,0,1)},
@@ -2622,19 +2626,19 @@
 return J.UQ(J.hI(z[a]),b)},
 oa:[function(a,b){var z=this.Ey(a,this.pT)
 return J.FW(this.Ey(b,this.pT),z)},"$2","gMG",4,0,100],
-iJ8:[function(a,b){return J.FW(this.Ey(a,this.pT),this.Ey(b,this.pT))},"$2","gfL",4,0,100],
+ws:[function(a,b){return J.FW(this.Ey(a,this.pT),this.Ey(b,this.pT))},"$2","gfL",4,0,100],
 Jd:function(a){var z,y
-H.w4()
+H.Xe()
 $.Ji=$.xG
-new P.VV(null,null).wE(0)
-z=this.GD
+new P.VV(null,null).D5(0)
+z=this.zz
 if(this.Rj){y=this.gMG()
 H.ig(z,y)}else{y=this.gfL()
 H.ig(z,y)}},
 Ai:function(){C.Nm.sB(this.vp,0)
-C.Nm.sB(this.GD,0)},
-QS:function(a,b){var z=this.vp
-this.GD.push(z.length)
+C.Nm.sB(this.zz,0)},
+Id:function(a,b){var z=this.vp
+this.zz.push(z.length)
 z.push(b)},
 Gu:function(a,b){var z,y
 z=this.vp
@@ -2646,25 +2650,25 @@
 ra:[function(a){var z
 if(!J.xC(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.WB(J.ZC(z[a]),"\u2003")}z=this.oH
+return J.WB(J.Yq(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-z=J.ZC(z[a])
+z=J.Yq(z[a])
 return J.WB(z,this.Rj?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,101]}}],["","",,E,{
 "^":"",
 Jz:[function(){var z,y,x
 z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.Wq,new E.wa(),C.ET,new E.Or(),C.BE,new E.YL(),C.WC,new E.wf(),C.hR,new E.Oa(),C.S4,new E.emv(),C.Ro,new E.Lbd(),C.hN,new E.QAa(),C.AV,new E.CvS(),C.bV,new E.edy(),C.C0,new E.waE(),C.eZ,new E.Ore(),C.bk,new E.YLa(),C.lH,new E.wfa(),C.am,new E.Oaa(),C.oE,new E.e0(),C.kG,new E.e1(),C.OI,new E.e2(),C.Wt,new E.e3(),C.I9,new E.e4(),C.To,new E.e5(),C.mM,new E.e6(),C.aw,new E.e7(),C.XA,new E.e8(),C.i4,new E.e9(),C.mJ,new E.e10(),C.qt,new E.e11(),C.p1,new E.e12(),C.yJ,new E.e13(),C.la,new E.e14(),C.yL,new E.e15(),C.nr,new E.e16(),C.bJ,new E.e17(),C.ox,new E.e18(),C.Je,new E.e19(),C.kI,new E.e20(),C.vY,new E.e21(),C.Rs,new E.e22(),C.hJ,new E.e23(),C.yC,new E.e24(),C.Lw,new E.e25(),C.eR,new E.e26(),C.LS,new E.e27(),C.iE,new E.e28(),C.f4,new E.e29(),C.VK,new E.e30(),C.aH,new E.e31(),C.aK,new E.e32(),C.GP,new E.e33(),C.mw,new E.e34(),C.vs,new E.e35(),C.Gr,new E.e36(),C.TU,new E.e37(),C.Fe,new E.e38(),C.tP,new E.e39(),C.yh,new E.e40(),C.Zb,new E.e41(),C.u7,new E.e42(),C.p8,new E.e43(),C.qR,new E.e44(),C.ld,new E.e45(),C.ne,new E.e46(),C.B0,new E.e47(),C.r1,new E.e48(),C.mr,new E.e49(),C.Ek,new E.e50(),C.Pn,new E.e51(),C.YT,new E.e52(),C.h7,new E.e53(),C.R3,new E.e54(),C.cJ,new E.e55(),C.WQ,new E.e56(),C.fV,new E.e57(),C.jU,new E.e58(),C.OO,new E.e59(),C.Mc,new E.e60(),C.FP,new E.e61(),C.kF,new E.e62(),C.UD,new E.e63(),C.Aq,new E.e64(),C.DS,new E.e65(),C.C9,new E.e66(),C.VF,new E.e67(),C.uU,new E.e68(),C.YJ,new E.e69(),C.eF,new E.e70(),C.oI,new E.e71(),C.ST,new E.e72(),C.QH,new E.e73(),C.qX,new E.e74(),C.rE,new E.e75(),C.nf,new E.e76(),C.EI,new E.e77(),C.JB,new E.e78(),C.RY,new E.e79(),C.d4,new E.e80(),C.cF,new E.e81(),C.ft,new E.e82(),C.dr,new E.e83(),C.SI,new E.e84(),C.zS,new E.e85(),C.YA,new E.e86(),C.Ge,new E.e87(),C.A7,new E.e88(),C.He,new E.e89(),C.im,new E.e90(),C.Ss,new E.e91(),C.k6,new E.e92(),C.oj,new E.e93(),C.PJ,new E.e94(),C.Yb,new E.e95(),C.q2,new E.e96(),C.d2,new E.e97(),C.kN,new E.e98(),C.uO,new E.e99(),C.fn,new E.e100(),C.yB,new E.e101(),C.eJ,new E.e102(),C.iG,new E.e103(),C.Py,new E.e104(),C.pC,new E.e105(),C.uu,new E.e106(),C.qs,new E.e107(),C.XH,new E.e108(),C.XJ,new E.e109(),C.tJ,new E.e110(),C.F8,new E.e111(),C.fy,new E.e112(),C.C1,new E.e113(),C.Nr,new E.e114(),C.nL,new E.e115(),C.a0,new E.e116(),C.Yg,new E.e117(),C.bR,new E.e118(),C.ai,new E.e119(),C.ob,new E.e120(),C.dR,new E.e121(),C.MY,new E.e122(),C.Wg,new E.e123(),C.tD,new E.e124(),C.QS,new E.e125(),C.C7,new E.e126(),C.nZ,new E.e127(),C.Of,new E.e128(),C.Vl,new E.e129(),C.pY,new E.e130(),C.XL,new E.e131(),C.LA,new E.e132(),C.Iw,new E.e133(),C.tz,new E.e134(),C.AT,new E.e135(),C.Lk,new E.e136(),C.GS,new E.e137(),C.rB,new E.e138(),C.bz,new E.e139(),C.Jx,new E.e140(),C.b5,new E.e141(),C.z6,new E.e142(),C.SY,new E.e143(),C.Lc,new E.e144(),C.hf,new E.e145(),C.uk,new E.e146(),C.Zi,new E.e147(),C.TN,new E.e148(),C.GI,new E.e149(),C.Wn,new E.e150(),C.ur,new E.e151(),C.VN,new E.e152(),C.EV,new E.e153(),C.VI,new E.e154(),C.eh,new E.e155(),C.SA,new E.e156(),C.uG,new E.e157(),C.kV,new E.e158(),C.vp,new E.e159(),C.cc,new E.e160(),C.DY,new E.e161(),C.Lx,new E.e162(),C.M3,new E.e163(),C.wT,new E.e164(),C.JK,new E.e165(),C.SR,new E.e166(),C.t6,new E.e167(),C.rP,new E.e168(),C.qi,new E.e169(),C.pX,new E.e170(),C.kB,new E.e171(),C.LH,new E.e172(),C.a2,new E.e173(),C.VD,new E.e174(),C.NN,new E.e175(),C.UX,new E.e176(),C.YS,new E.e177(),C.pu,new E.e178(),C.uw,new E.e179(),C.BJ,new E.e180(),C.c6,new E.e181(),C.td,new E.e182(),C.Gn,new E.e183(),C.zO,new E.e184(),C.vg,new E.e185(),C.Yp,new E.e186(),C.YV,new E.e187(),C.If,new E.e188(),C.Ys,new E.e189(),C.zm,new E.e190(),C.EP,new E.e191(),C.nX,new E.e192(),C.BV,new E.e193(),C.xP,new E.e194(),C.XM,new E.e195(),C.Ic,new E.e196(),C.yG,new E.e197(),C.uI,new E.e198(),C.O9,new E.e199(),C.ba,new E.e200(),C.tW,new E.e201(),C.CG,new E.e202(),C.Jf,new E.e203(),C.Wj,new E.e204(),C.vb,new E.e205(),C.UL,new E.e206(),C.AY,new E.e207(),C.QK,new E.e208(),C.AO,new E.e209(),C.Xd,new E.e210(),C.I7,new E.e211(),C.kY,new E.e212(),C.Wm,new E.e213(),C.vK,new E.e214(),C.Tc,new E.e215(),C.GR,new E.e216(),C.KX,new E.e217(),C.ja,new E.e218(),C.mn,new E.e219(),C.Dj,new E.e220(),C.ir,new E.e221(),C.dx,new E.e222(),C.ni,new E.e223(),C.X2,new E.e224(),C.F3,new E.e225(),C.UY,new E.e226(),C.Aa,new E.e227(),C.nY,new E.e228(),C.tg,new E.e229(),C.HD,new E.e230(),C.iU,new E.e231(),C.eN,new E.e232(),C.ue,new E.e233(),C.nh,new E.e234(),C.L2,new E.e235(),C.vm,new E.e236(),C.Gs,new E.e237(),C.bE,new E.e238(),C.YD,new E.e239(),C.PX,new E.e240(),C.N8,new E.e241(),C.EA,new E.e242(),C.oW,new E.e243(),C.KC,new E.e244(),C.tf,new E.e245(),C.da,new E.e246(),C.Jd,new E.e247(),C.Y4,new E.e248(),C.Si,new E.e249(),C.pH,new E.e250(),C.Ve,new E.e251(),C.jM,new E.e252(),C.rd,new E.e253(),C.W5,new E.e254(),C.uX,new E.e255(),C.nt,new E.e256(),C.IT,new E.e257(),C.li,new E.e258(),C.PM,new E.e259(),C.ks,new E.e260(),C.Om,new E.e261(),C.iC,new E.e262(),C.Nv,new E.e263(),C.Wo,new E.e264(),C.FZ,new E.e265(),C.TW,new E.e266(),C.xS,new E.e267(),C.pD,new E.e268(),C.QF,new E.e269(),C.mi,new E.e270(),C.zz,new E.e271(),C.eO,new E.e272(),C.hO,new E.e273(),C.ei,new E.e274(),C.HK,new E.e275(),C.je,new E.e276(),C.Ef,new E.e277(),C.QL,new E.e278(),C.RH,new E.e279(),C.SP,new E.e280(),C.Q1,new E.e281(),C.ID,new E.e282(),C.dA,new E.e283(),C.bc,new E.e284(),C.kw,new E.e285(),C.nE,new E.e286(),C.ep,new E.e287(),C.hB,new E.e288(),C.J2,new E.e289(),C.hx,new E.e290(),C.zU,new E.e291(),C.OU,new E.e292(),C.bn,new E.e293(),C.mh,new E.e294(),C.Fh,new E.e295(),C.yv,new E.e296(),C.LP,new E.e297(),C.jh,new E.e298(),C.zd,new E.e299(),C.Db,new E.e300(),C.aF,new E.e301(),C.l4,new E.e302(),C.fj,new E.e303(),C.xw,new E.e304(),C.zn,new E.e305(),C.RJ,new E.e306(),C.Sk,new E.e307(),C.KS,new E.e308(),C.MA,new E.e309(),C.YE,new E.e310(),C.Uy,new E.e311()],null,null)
 y=P.EF([C.aP,new E.e312(),C.cg,new E.e313(),C.Zg,new E.e314(),C.S4,new E.e315(),C.AV,new E.e316(),C.bk,new E.e317(),C.lH,new E.e318(),C.am,new E.e319(),C.oE,new E.e320(),C.kG,new E.e321(),C.Wt,new E.e322(),C.mM,new E.e323(),C.aw,new E.e324(),C.XA,new E.e325(),C.i4,new E.e326(),C.mJ,new E.e327(),C.yL,new E.e328(),C.nr,new E.e329(),C.bJ,new E.e330(),C.kI,new E.e331(),C.vY,new E.e332(),C.yC,new E.e333(),C.VK,new E.e334(),C.aH,new E.e335(),C.GP,new E.e336(),C.vs,new E.e337(),C.Gr,new E.e338(),C.Fe,new E.e339(),C.tP,new E.e340(),C.yh,new E.e341(),C.Zb,new E.e342(),C.p8,new E.e343(),C.ld,new E.e344(),C.ne,new E.e345(),C.B0,new E.e346(),C.mr,new E.e347(),C.YT,new E.e348(),C.cJ,new E.e349(),C.WQ,new E.e350(),C.jU,new E.e351(),C.OO,new E.e352(),C.Mc,new E.e353(),C.QH,new E.e354(),C.rE,new E.e355(),C.nf,new E.e356(),C.ft,new E.e357(),C.Ge,new E.e358(),C.A7,new E.e359(),C.He,new E.e360(),C.oj,new E.e361(),C.d2,new E.e362(),C.uO,new E.e363(),C.fn,new E.e364(),C.yB,new E.e365(),C.Py,new E.e366(),C.uu,new E.e367(),C.qs,new E.e368(),C.rB,new E.e369(),C.z6,new E.e370(),C.hf,new E.e371(),C.uk,new E.e372(),C.Zi,new E.e373(),C.TN,new E.e374(),C.ur,new E.e375(),C.EV,new E.e376(),C.VI,new E.e377(),C.eh,new E.e378(),C.SA,new E.e379(),C.uG,new E.e380(),C.kV,new E.e381(),C.vp,new E.e382(),C.SR,new E.e383(),C.t6,new E.e384(),C.kB,new E.e385(),C.UX,new E.e386(),C.YS,new E.e387(),C.c6,new E.e388(),C.td,new E.e389(),C.zO,new E.e390(),C.Yp,new E.e391(),C.YV,new E.e392(),C.If,new E.e393(),C.Ys,new E.e394(),C.EP,new E.e395(),C.nX,new E.e396(),C.BV,new E.e397(),C.XM,new E.e398(),C.Ic,new E.e399(),C.O9,new E.e400(),C.tW,new E.e401(),C.Wj,new E.e402(),C.vb,new E.e403(),C.QK,new E.e404(),C.Xd,new E.e405(),C.kY,new E.e406(),C.vK,new E.e407(),C.Tc,new E.e408(),C.GR,new E.e409(),C.KX,new E.e410(),C.ja,new E.e411(),C.Dj,new E.e412(),C.X2,new E.e413(),C.UY,new E.e414(),C.Aa,new E.e415(),C.nY,new E.e416(),C.tg,new E.e417(),C.HD,new E.e418(),C.iU,new E.e419(),C.eN,new E.e420(),C.Gs,new E.e421(),C.bE,new E.e422(),C.YD,new E.e423(),C.PX,new E.e424(),C.tf,new E.e425(),C.Jd,new E.e426(),C.pH,new E.e427(),C.Ve,new E.e428(),C.jM,new E.e429(),C.rd,new E.e430(),C.uX,new E.e431(),C.nt,new E.e432(),C.IT,new E.e433(),C.PM,new E.e434(),C.ks,new E.e435(),C.Om,new E.e436(),C.iC,new E.e437(),C.Nv,new E.e438(),C.FZ,new E.e439(),C.TW,new E.e440(),C.pD,new E.e441(),C.mi,new E.e442(),C.zz,new E.e443(),C.dA,new E.e444(),C.kw,new E.e445(),C.nE,new E.e446(),C.hx,new E.e447(),C.zU,new E.e448(),C.OU,new E.e449(),C.zd,new E.e450(),C.RJ,new E.e451(),C.YE,new E.e452()],null,null)
 x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.ou,C.Mt,C.oT,C.il,C.jR,C.Mt,C.XW,C.il,C.kH,C.Mt,C.Lg,C.qJ,C.Bi,C.il,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.Qb,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.uC,C.Mt,C.Wz,C.il,C.Ke,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.qZ,C.il,C.Zj,C.Mt,C.he,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.mK,C.il,C.IZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.ca,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.EG,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.fU,C.Mt,C.pi,C.Mt,C.Fn,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.Mz,C.ms,C.Mt,C.FA,C.Mt,C.Qt,C.Mt,C.a8,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.rC,C.Mt,C.kq,C.Mt,C.Dl,C.Mt,C.Mz,C.qJ,C.Nw,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.R9,C.Mt,C.OZ,C.il,C.il,C.Mt,C.QJ,C.Mt,C.u4,C.Mt,C.X8,C.Mt,C.kt,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.tQ,C.Mt,C.bC,C.Mt,C.ws,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.Mz,C.al,C.il],null,null)
-y=O.rH(!1,P.EF([C.K4,P.EF([C.S4,C.aj,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,P.Fl(null,null),C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.XW,P.Fl(null,null),C.kH,P.EF([C.nr,C.BO],null,null),C.Lg,P.EF([C.S4,C.aj,C.AV,C.Qp,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz],null,null),C.Bi,P.Fl(null,null),C.KO,P.EF([C.yh,C.tO],null,null),C.wk,P.EF([C.AV,C.k1,C.eh,C.jO,C.Aa,C.k5,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.aj,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,P.Fl(null,null),C.Az,P.EF([C.WQ,C.on],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.P9],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.bG],null,null),C.uC,P.EF([C.uO,C.KK,C.kY,C.rT],null,null),C.Wz,P.Fl(null,null),C.Ke,P.EF([C.fn,C.Kk],null,null),C.pF,P.Fl(null,null),C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,P.Fl(null,null),C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.xV],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,P.Fl(null,null),C.oG,P.EF([C.jU,C.bw],null,null),C.mK,P.Fl(null,null),C.IZ,P.EF([C.vp,C.o0],null,null),C.FG,P.Fl(null,null),C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,P.Fl(null,null),C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.fz,C.vb,C.Mq,C.UL,C.bG,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.hd,C.zz,C.lS],null,null),C.UJ,P.Fl(null,null),C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,P.Fl(null,null),C.PT,P.EF([C.EV,C.ZQ],null,null),C.fU,P.EF([C.kB,C.nq,C.LH,C.oB,C.EP,C.db],null,null),C.pi,P.EF([C.rB,C.xY,C.kB,C.nq,C.LH,C.oB],null,null),C.Fn,P.EF([C.rB,C.xY,C.bz,C.Bk,C.EP,C.GO,C.tf,C.q6],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.rY],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.rY],null,null),C.vw,P.EF([C.uk,C.rY,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Cg],null,null),C.NW,P.Fl(null,null),C.ms,P.EF([C.cg,C.ll,C.uk,C.rY,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.oh,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.rY],null,null),C.rC,P.EF([C.uO,C.JT,C.td,C.Zk,C.XM,C.Tt,C.tg,C.DC],null,null),C.kq,P.EF([C.td,C.Zk],null,null),C.Dl,P.EF([C.VK,C.lW],null,null),C.Mz,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.aj,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.Bf,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.Df,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.It,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.bp],null,null),C.R9,P.EF([C.kY,C.TO,C.Wm,C.QW],null,null),C.OZ,P.Fl(null,null),C.il,P.EF([C.uu,C.NJ,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.EF([C.B0,C.iH,C.vp,C.Rz],null,null),C.u4,P.EF([C.B0,C.iH,C.SR,C.xR],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.EF([C.nE,C.FM],null,null),C.Y3,P.EF([C.bk,C.NS,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.B0,C.iH,C.rE,C.B7],null,null),C.tQ,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.pD,C.Gz],null,null),C.cK,P.Fl(null,null),C.jK,P.EF([C.yh,C.tO,C.RJ,C.BP],null,null)],null,null),z,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.Wq,"asStringLiteral",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.Wt,"clazz",C.I9,"closeItem",C.To,"closing",C.mM,"closureCtxt",C.aw,"closureFunc",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.nr,"context",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.hJ,"dartMetrics",C.yC,"declaredType",C.Lw,"deleteVm",C.eR,"deoptimizations",C.LS,"description",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.mw,"elements",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.cJ,"fetchInboundReferences",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.ft,"guardClass",C.dr,"guardNullable",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Yb,"id",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.uO,"inboundReferences",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.XJ,"isAbstractType",C.tJ,"isBool",C.F8,"isChromeTarget",C.fy,"isClosure",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.dR,"isFinal",C.MY,"isInlinable",C.Wg,"isInt",C.tD,"isList",C.QS,"isMap",C.C7,"isMirrorReference",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Iw,"isPlainInstance",C.tz,"isSentinel",C.AT,"isStatic",C.Lk,"isString",C.GS,"isWeakProperty",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.z6,"key",C.SY,"keys",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.qi,"max",C.pX,"message",C.kB,"metric",C.LH,"metricChanged",C.a2,"min",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.uw,"nativeFields",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Yp,"owner",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.EP,"page",C.nX,"parent",C.BV,"parentContext",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.vK,"reference",C.Tc,"referent",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.mn,"refreshRateChange",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.vm,"sampleBufferSizeChange",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.KC,"selectMetric",C.tf,"selectedMetric",C.da,"size",C.Jd,"slot",C.Y4,"slotIsArrayIndex",C.Si,"slotIsField",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.rd,"source",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.Nv,"subclass",C.Wo,"subclasses",C.FZ,"superclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.pD,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.eO,"timeStamp",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.dA,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.nE,"tracer",C.ep,"tree",C.hB,"type",C.J2,"typeChecksEnabled",C.hx,"typeClass",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.zd,"value",C.Db,"valueAsString",C.aF,"valueAsStringIsTruncated",C.l4,"values",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Sk,"vmMetrics",C.KS,"vmName",C.MA,"vmType",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),x,y,null)
+y=O.rH(!1,P.EF([C.K4,P.EF([C.S4,C.aj,C.AV,C.Qp,C.mJ,C.Qu,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,P.Fl(null,null),C.nw,P.EF([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.EF([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.aJ],null,null),C.XW,P.Fl(null,null),C.kH,P.EF([C.nr,C.BO],null,null),C.Lg,P.EF([C.S4,C.aj,C.AV,C.Qp,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz],null,null),C.Bi,P.Fl(null,null),C.KO,P.EF([C.yh,C.tO],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.jO,C.Aa,C.k5,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.aj,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,P.Fl(null,null),C.Az,P.EF([C.WQ,C.on],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.Qb,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.QK,C.P9],null,null),C.te,P.EF([C.nf,C.wR],null,null),C.iD,P.EF([C.QH,C.C4,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.bG],null,null),C.uC,P.EF([C.uO,C.KK,C.kY,C.rT],null,null),C.Wz,P.Fl(null,null),C.Ke,P.EF([C.fn,C.Kk],null,null),C.pF,P.Fl(null,null),C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.qZ,P.Fl(null,null),C.Zj,P.EF([C.oj,C.GT],null,null),C.he,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.xV],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,P.Fl(null,null),C.oG,P.EF([C.jU,C.bw],null,null),C.mK,P.Fl(null,null),C.IZ,P.EF([C.vp,C.o0],null,null),C.FG,P.Fl(null,null),C.pJ,P.EF([C.Ve,C.X4],null,null),C.tU,P.EF([C.qs,C.MN],null,null),C.DD,P.EF([C.vp,C.o0],null,null),C.Yy,P.Fl(null,null),C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.w3,C.He,C.fz,C.vb,C.Mq,C.UL,C.bG,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.hd,C.zz,C.lS],null,null),C.UJ,P.Fl(null,null),C.ca,P.EF([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.RU],null,null),C.j4,P.EF([C.rB,C.RU],null,null),C.EG,P.EF([C.rB,C.RU],null,null),C.CT,P.EF([C.rB,C.RU],null,null),C.mq,P.EF([C.rB,C.RU],null,null),C.Tq,P.EF([C.SR,C.S9,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,P.Fl(null,null),C.PT,P.EF([C.EV,C.ZQ],null,null),C.fU,P.EF([C.kB,C.nq,C.LH,C.oB,C.EP,C.db],null,null),C.pi,P.EF([C.rB,C.xY,C.kB,C.nq,C.LH,C.oB],null,null),C.Fn,P.EF([C.rB,C.xY,C.bz,C.Bk,C.EP,C.GO,C.tf,C.q6],null,null),C.Ey,P.EF([C.XA,C.dq,C.uk,C.rY],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.rY],null,null),C.vw,P.EF([C.uk,C.rY,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Cg],null,null),C.NW,P.Fl(null,null),C.ms,P.EF([C.cg,C.ll,C.uk,C.rY,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.Qt,P.EF([C.ld,C.Gw],null,null),C.a8,P.EF([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.EF([C.aP,C.oh,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.rY],null,null),C.rC,P.EF([C.uO,C.JT,C.td,C.Zk,C.XM,C.Tt,C.tg,C.DC],null,null),C.kq,P.EF([C.td,C.Zk],null,null),C.Dl,P.EF([C.VK,C.lW],null,null),C.Mz,P.EF([C.O9,C.q9,C.ba,C.kQ],null,null),C.Nw,P.EF([C.S4,C.aj,C.VI,C.w6],null,null),C.ON,P.EF([C.kI,C.Bf,C.vY,C.ZS,C.Rs,C.EW,C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.A7,C.SD,C.SA,C.KI,C.uG,C.Df,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS,C.IT,C.NL,C.li,C.Tz],null,null),C.Sb,P.EF([C.tW,C.It,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.jz],null,null),C.wH,P.EF([C.yh,C.lJ],null,null),C.pK,P.EF([C.ne,C.bp],null,null),C.R9,P.EF([C.kY,C.TO,C.Wm,C.QW],null,null),C.OZ,P.Fl(null,null),C.il,P.EF([C.uu,C.NJ,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.EF([C.B0,C.iH,C.vp,C.Rz],null,null),C.u4,P.EF([C.B0,C.iH,C.SR,C.xR],null,null),C.X8,P.EF([C.Zg,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.EF([C.nE,C.FM],null,null),C.Y3,P.EF([C.bk,C.NS,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.B0,C.iH,C.rE,C.B7],null,null),C.tQ,P.EF([C.kw,C.oC],null,null),C.bC,P.EF([C.am,C.JD,C.oE,C.r2,C.uX,C.Eb],null,null),C.ws,P.EF([C.pD,C.Gz],null,null),C.cK,P.Fl(null,null),C.jK,P.EF([C.yh,C.tO,C.RJ,C.BP],null,null)],null,null),z,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.Zg,"args",C.Wq,"asStringLiteral",C.ET,"assertsEnabled",C.BE,"averageCollectionPeriodInMillis",C.WC,"bpt",C.hR,"breakpoint",C.S4,"busy",C.Ro,"buttonClick",C.hN,"bytes",C.AV,"callback",C.bV,"capacity",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.am,"chromeTargets",C.oE,"chromiumAddress",C.kG,"classTable",C.OI,"classes",C.Wt,"clazz",C.I9,"closeItem",C.To,"closing",C.mM,"closureCtxt",C.aw,"closureFunc",C.XA,"cls",C.i4,"code",C.mJ,"color",C.qt,"coloring",C.p1,"columns",C.yJ,"connectStandalone",C.la,"connectToVm",C.yL,"connection",C.nr,"context",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.kI,"currentLine",C.vY,"currentPos",C.Rs,"currentPosChanged",C.hJ,"dartMetrics",C.yC,"declaredType",C.Lw,"deleteVm",C.eR,"deoptimizations",C.LS,"description",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.mw,"elements",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.Fe,"endTokenPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.p8,"event",C.qR,"eventType",C.ld,"events",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.h7,"external",C.R3,"fd",C.cJ,"fetchInboundReferences",C.WQ,"field",C.fV,"fields",C.jU,"file",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.EI,"functions",C.JB,"getColumnLabel",C.RY,"getTabs",C.d4,"goto",C.cF,"gotoLink",C.ft,"guardClass",C.dr,"guardNullable",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.Ge,"hashLinkWorkaround",C.A7,"height",C.He,"hideTagsChecked",C.im,"history",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Yb,"id",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.uO,"inboundReferences",C.fn,"instance",C.yB,"instances",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.XH,"isAbstract",C.XJ,"isAbstractType",C.tJ,"isBool",C.F8,"isChromeTarget",C.fy,"isClosure",C.C1,"isComment",C.Nr,"isConst",C.nL,"isCurrentTarget",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.dR,"isFinal",C.MY,"isInlinable",C.Wg,"isInt",C.tD,"isList",C.QS,"isMap",C.C7,"isMirrorReference",C.nZ,"isNotEmpty",C.Of,"isNull",C.Vl,"isOptimizable",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Iw,"isPlainInstance",C.tz,"isSentinel",C.AT,"isStatic",C.Lk,"isString",C.GS,"isWeakProperty",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.z6,"key",C.SY,"keys",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.uG,"linesReady",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.JK,"makeLineId",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.qi,"max",C.pX,"message",C.kB,"metric",C.LH,"metricChanged",C.a2,"min",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.uw,"nativeFields",C.BJ,"newSpace",C.c6,"notifications",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Yp,"owner",C.YV,"owningClass",C.If,"owningLibrary",C.Ys,"pad",C.zm,"padding",C.EP,"page",C.nX,"parent",C.BV,"parentContext",C.xP,"parseInt",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.O9,"pollPeriod",C.ba,"pollPeriodChanged",C.tW,"pos",C.CG,"posChanged",C.Jf,"possibleBpt",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.Xd,"reachable",C.I7,"readClosed",C.kY,"ref",C.Wm,"refChanged",C.vK,"reference",C.Tc,"referent",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.mn,"refreshRateChange",C.Dj,"refreshTime",C.ir,"relativeLink",C.dx,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.tg,"retainedBytes",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.vm,"sampleBufferSizeChange",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.KC,"selectMetric",C.tf,"selectedMetric",C.da,"size",C.Jd,"slot",C.Y4,"slotIsArrayIndex",C.Si,"slotIsField",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.rd,"source",C.W5,"standalone",C.uX,"standaloneVmAddress",C.nt,"startLine",C.IT,"startPos",C.li,"startPosChanged",C.PM,"status",C.ks,"stepInto",C.Om,"stepOut",C.iC,"stepOver",C.Nv,"subclass",C.Wo,"subclasses",C.FZ,"superclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.pD,"target",C.QF,"targets",C.mi,"text",C.zz,"timeSpan",C.eO,"timeStamp",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.QL,"toString",C.RH,"toStringAsFixed",C.SP,"toggleBreakpoint",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.dA,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.nE,"tracer",C.ep,"tree",C.hB,"type",C.J2,"typeChecksEnabled",C.hx,"typeClass",C.zU,"uncheckedText",C.OU,"unoptimizedCode",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.yv,"usageCounter",C.LP,"used",C.jh,"v",C.zd,"value",C.Db,"valueAsString",C.aF,"valueAsStringIsTruncated",C.l4,"values",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Sk,"vmMetrics",C.KS,"vmName",C.MA,"vmType",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),x,y,null)
 $.j8=new O.fH(y)
 $.Yv=new O.bY(y)
 $.qe=new O.ut(y)
 $.M6=[new E.e453(),new E.e454(),new E.e455(),new E.e456(),new E.e457(),new E.e458(),new E.e459(),new E.e460(),new E.e461(),new E.e462(),new E.e463(),new E.e464(),new E.e465(),new E.e466(),new E.e467(),new E.e468(),new E.e469(),new E.e470(),new E.e471(),new E.e472(),new E.e473(),new E.e474(),new E.e475(),new E.e476(),new E.e477(),new E.e478(),new E.e479(),new E.e480(),new E.e481(),new E.e482(),new E.e483(),new E.e484(),new E.e485(),new E.e486(),new E.e487(),new E.e488(),new E.e489(),new E.e490(),new E.e491(),new E.e492(),new E.e493(),new E.e494(),new E.e495(),new E.e496(),new E.e497(),new E.e498(),new E.e499(),new E.e500(),new E.e501(),new E.e502(),new E.e503(),new E.e504(),new E.e505(),new E.e506(),new E.e507(),new E.e508(),new E.e509(),new E.e510(),new E.e511(),new E.e512(),new E.e513(),new E.e514(),new E.e515(),new E.e516(),new E.e517(),new E.e518(),new E.e519(),new E.e520(),new E.e521(),new E.e522(),new E.e523(),new E.e524(),new E.e525(),new E.e526(),new E.e527(),new E.e528(),new E.e529(),new E.e530(),new E.e531(),new E.e532(),new E.e533(),new E.e534(),new E.e535(),new E.e536(),new E.e537(),new E.e538(),new E.e539(),new E.e540(),new E.e541(),new E.e542(),new E.e543(),new E.e544(),new E.e545()]
 $.UG=!0
-F.E2()},"$0","V7A",0,0,17],
+F.E2()},"$0","jk",0,0,17],
 em:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jp9(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Lb:{
 "^":"TpZ:12;",
@@ -2676,11 +2680,11 @@
 $isEH:true},
 Cv:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zC(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.r0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 ed:{
 "^":"TpZ:12;",
-$1:[function(a){return J.H3(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.D8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wa:{
 "^":"TpZ:12;",
@@ -2692,7 +2696,7 @@
 $isEH:true},
 YL:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gUH()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gqZ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wf:{
 "^":"TpZ:12;",
@@ -2700,7 +2704,7 @@
 $isEH:true},
 Oa:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gYZ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gQ1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 emv:{
 "^":"TpZ:12;",
@@ -2708,11 +2712,11 @@
 $isEH:true},
 Lbd:{
 "^":"TpZ:12;",
-$1:[function(a){return J.rS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.aA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 QAa:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gET()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gfj()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 CvS:{
 "^":"TpZ:12;",
@@ -2720,11 +2724,11 @@
 $isEH:true},
 edy:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gbZ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gkV()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 waE:{
 "^":"TpZ:12;",
-$1:[function(a){return J.XB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Wp(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Ore:{
 "^":"TpZ:12;",
@@ -2732,23 +2736,23 @@
 $isEH:true},
 YLa:{
 "^":"TpZ:12;",
-$1:[function(a){return J.rp(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.K0(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 wfa:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jg(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.hn(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 Oaa:{
 "^":"TpZ:12;",
-$1:[function(a){return J.LL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.HP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e0:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ze(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e1:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Hd(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yz(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e2:{
 "^":"TpZ:12;",
@@ -2760,11 +2764,11 @@
 $isEH:true},
 e4:{
 "^":"TpZ:12;",
-$1:[function(a){return J.us(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.RC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e5:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gmy()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gaP()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e6:{
 "^":"TpZ:12;",
@@ -2776,15 +2780,15 @@
 $isEH:true},
 e8:{
 "^":"TpZ:12;",
-$1:[function(a){return J.L6(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.E3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e9:{
 "^":"TpZ:12;",
-$1:[function(a){return J.tX(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Nk(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e10:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.yI(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e11:{
 "^":"TpZ:12;",
@@ -2796,7 +2800,7 @@
 $isEH:true},
 e13:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ad(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.dw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e14:{
 "^":"TpZ:12;",
@@ -2812,11 +2816,11 @@
 $isEH:true},
 e17:{
 "^":"TpZ:12;",
-$1:[function(a){return J.xk(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.OT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e18:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Okq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ok(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e19:{
 "^":"TpZ:12;",
@@ -2828,7 +2832,7 @@
 $isEH:true},
 e21:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yW(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jr(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e22:{
 "^":"TpZ:12;",
@@ -2848,11 +2852,11 @@
 $isEH:true},
 e26:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gOs()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.guh()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e27:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gQZ()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gGB()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e28:{
 "^":"TpZ:12;",
@@ -2864,15 +2868,15 @@
 $isEH:true},
 e30:{
 "^":"TpZ:12;",
-$1:[function(a){return J.CNb(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.GF(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e31:{
 "^":"TpZ:12;",
-$1:[function(a){return J.NC(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.BT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e32:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Nx(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.H2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e33:{
 "^":"TpZ:12;",
@@ -2880,7 +2884,7 @@
 $isEH:true},
 e34:{
 "^":"TpZ:12;",
-$1:[function(a){return J.BB(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Hg(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e35:{
 "^":"TpZ:12;",
@@ -2888,11 +2892,11 @@
 $isEH:true},
 e36:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yr(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.rw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e37:{
 "^":"TpZ:12;",
-$1:[function(a){return J.MV(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.wt(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e38:{
 "^":"TpZ:12;",
@@ -2912,15 +2916,15 @@
 $isEH:true},
 e42:{
 "^":"TpZ:12;",
-$1:[function(a){return J.nEe(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.kv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e43:{
 "^":"TpZ:12;",
-$1:[function(a){return J.qf(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.a3(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e44:{
 "^":"TpZ:12;",
-$1:[function(a){return J.iiZ(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ts(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e45:{
 "^":"TpZ:12;",
@@ -2936,7 +2940,7 @@
 $isEH:true},
 e48:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ak(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Gl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e49:{
 "^":"TpZ:12;",
@@ -2944,15 +2948,15 @@
 $isEH:true},
 e50:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ur(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.nb(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e51:{
 "^":"TpZ:12;",
-$1:[function(a){return a.grm()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gty()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e52:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ua(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.IR(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e53:{
 "^":"TpZ:12;",
@@ -2960,15 +2964,15 @@
 $isEH:true},
 e54:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gq2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gki()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e55:{
 "^":"TpZ:12;",
-$1:[function(a){return J.E1(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.LY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e56:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Nb(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.pm(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e57:{
 "^":"TpZ:12;",
@@ -2976,19 +2980,19 @@
 $isEH:true},
 e58:{
 "^":"TpZ:12;",
-$1:[function(a){return J.vE(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ec(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e59:{
 "^":"TpZ:12;",
-$1:[function(a){return J.tdY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.PK(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e60:{
 "^":"TpZ:12;",
-$1:[function(a){return J.AU(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.YH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e61:{
 "^":"TpZ:12;",
-$1:[function(a){return J.WX7(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.WX(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e62:{
 "^":"TpZ:12;",
@@ -3004,15 +3008,15 @@
 $isEH:true},
 e65:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Oi(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.xo(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e66:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gqE()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gkA()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e67:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gAX()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gGK()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e68:{
 "^":"TpZ:12;",
@@ -3028,11 +3032,11 @@
 $isEH:true},
 e71:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gP3()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gmE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e72:{
 "^":"TpZ:12;",
-$1:[function(a){return J.BT(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.PY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e73:{
 "^":"TpZ:12;",
@@ -3040,7 +3044,7 @@
 $isEH:true},
 e74:{
 "^":"TpZ:12;",
-$1:[function(a){return J.iq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.eU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e75:{
 "^":"TpZ:12;",
@@ -3060,11 +3064,11 @@
 $isEH:true},
 e79:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yf(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e80:{
 "^":"TpZ:12;",
-$1:[function(a){return J.i2U(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.tw(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e81:{
 "^":"TpZ:12;",
@@ -3080,7 +3084,7 @@
 $isEH:true},
 e84:{
 "^":"TpZ:12;",
-$1:[function(a){return a.ghR()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gX1()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e85:{
 "^":"TpZ:12;",
@@ -3096,7 +3100,7 @@
 $isEH:true},
 e88:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.OB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e89:{
 "^":"TpZ:12;",
@@ -3116,7 +3120,7 @@
 $isEH:true},
 e93:{
 "^":"TpZ:12;",
-$1:[function(a){return J.hW(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.aB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e94:{
 "^":"TpZ:12;",
@@ -3144,15 +3148,15 @@
 $isEH:true},
 e100:{
 "^":"TpZ:12;",
-$1:[function(a){return J.HP(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.fh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e101:{
 "^":"TpZ:12;",
-$1:[function(a){return J.US(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.NDJ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e102:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gtI()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gNI()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e103:{
 "^":"TpZ:12;",
@@ -3188,7 +3192,7 @@
 $isEH:true},
 e111:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ho(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.bL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e112:{
 "^":"TpZ:12;",
@@ -3200,11 +3204,11 @@
 $isEH:true},
 e114:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gRh()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gRs()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e115:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ls(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ix(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e116:{
 "^":"TpZ:12;",
@@ -3212,7 +3216,7 @@
 $isEH:true},
 e117:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gqy()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gcE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e118:{
 "^":"TpZ:12;",
@@ -3228,11 +3232,11 @@
 $isEH:true},
 e121:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Z6(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.EM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e122:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gxL()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gho()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e123:{
 "^":"TpZ:12;",
@@ -3248,7 +3252,7 @@
 $isEH:true},
 e126:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gOC()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gJE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e127:{
 "^":"TpZ:12;",
@@ -3296,11 +3300,11 @@
 $isEH:true},
 e138:{
 "^":"TpZ:12;",
-$1:[function(a){return J.wg(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.aT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e139:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Hq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.KG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e140:{
 "^":"TpZ:12;",
@@ -3308,7 +3312,7 @@
 $isEH:true},
 e141:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gnp()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gEB()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e142:{
 "^":"TpZ:12;",
@@ -3316,7 +3320,7 @@
 $isEH:true},
 e143:{
 "^":"TpZ:12;",
-$1:[function(a){return J.iYM(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.iY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e144:{
 "^":"TpZ:12;",
@@ -3324,11 +3328,11 @@
 $isEH:true},
 e145:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ZC(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Yq(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e146:{
 "^":"TpZ:12;",
-$1:[function(a){return J.OH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.MQ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e147:{
 "^":"TpZ:12;",
@@ -3336,7 +3340,7 @@
 $isEH:true},
 e148:{
 "^":"TpZ:12;",
-$1:[function(a){return J.IR(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Kj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e149:{
 "^":"TpZ:12;",
@@ -3348,15 +3352,15 @@
 $isEH:true},
 e151:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gcI()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.ghX()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e152:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gpd()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gvU()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e153:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ik(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jl(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e154:{
 "^":"TpZ:12;",
@@ -3396,7 +3400,7 @@
 $isEH:true},
 e163:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gbB()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gfJ()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e164:{
 "^":"TpZ:12;",
@@ -3404,7 +3408,7 @@
 $isEH:true},
 e165:{
 "^":"TpZ:12;",
-$1:[function(a){return J.HS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.c7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e166:{
 "^":"TpZ:12;",
@@ -3412,15 +3416,15 @@
 $isEH:true},
 e167:{
 "^":"TpZ:12;",
-$1:[function(a){return J.kv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ol(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e168:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yb(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Y7(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e169:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jE(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.PR(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e170:{
 "^":"TpZ:12;",
@@ -3432,11 +3436,11 @@
 $isEH:true},
 e172:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Kv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.dj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e173:{
 "^":"TpZ:12;",
-$1:[function(a){return J.LY4(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.GL(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e174:{
 "^":"TpZ:12;",
@@ -3448,7 +3452,7 @@
 $isEH:true},
 e176:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Zv(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.X6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e177:{
 "^":"TpZ:12;",
@@ -3456,11 +3460,11 @@
 $isEH:true},
 e178:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Cs(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Pf(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e179:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gDm()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gbA()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e180:{
 "^":"TpZ:12;",
@@ -3472,7 +3476,7 @@
 $isEH:true},
 e182:{
 "^":"TpZ:12;",
-$1:[function(a){return J.mk(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Jj(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e183:{
 "^":"TpZ:12;",
@@ -3492,7 +3496,7 @@
 $isEH:true},
 e187:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gP2()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gEl()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e188:{
 "^":"TpZ:12;",
@@ -3500,7 +3504,7 @@
 $isEH:true},
 e189:{
 "^":"TpZ:12;",
-$1:[function(a){return J.qN(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.iB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e190:{
 "^":"TpZ:12;",
@@ -3544,15 +3548,15 @@
 $isEH:true},
 e200:{
 "^":"TpZ:12;",
-$1:[function(a){return J.os(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Tm(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e201:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Yd(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e202:{
 "^":"TpZ:12;",
-$1:[function(a){return J.xlH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.L6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e203:{
 "^":"TpZ:12;",
@@ -3564,15 +3568,15 @@
 $isEH:true},
 e205:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Zl(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Tv(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e206:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Q0(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.CN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e207:{
 "^":"TpZ:12;",
-$1:[function(a){return J.u5(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ql(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e208:{
 "^":"TpZ:12;",
@@ -3584,7 +3588,7 @@
 $isEH:true},
 e210:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ks(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.id(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e211:{
 "^":"TpZ:12;",
@@ -3596,7 +3600,7 @@
 $isEH:true},
 e213:{
 "^":"TpZ:12;",
-$1:[function(a){return J.xi(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.H1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e214:{
 "^":"TpZ:12;",
@@ -3612,11 +3616,11 @@
 $isEH:true},
 e217:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ph(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.dZ(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e218:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Xp(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.GH(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e219:{
 "^":"TpZ:12;",
@@ -3624,7 +3628,7 @@
 $isEH:true},
 e220:{
 "^":"TpZ:12;",
-$1:[function(a){return J.n8(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.bS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e221:{
 "^":"TpZ:12;",
@@ -3648,27 +3652,27 @@
 $isEH:true},
 e226:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ma(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.uW(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e227:{
 "^":"TpZ:12;",
-$1:[function(a){return J.W2H(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.W2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e228:{
 "^":"TpZ:12;",
-$1:[function(a){return J.nl(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.UT(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e229:{
 "^":"TpZ:12;",
-$1:[function(a){return J.I1(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Kd(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e230:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.pU(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e231:{
 "^":"TpZ:12;",
-$1:[function(a){return J.jo(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Tg(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e232:{
 "^":"TpZ:12;",
@@ -3676,19 +3680,19 @@
 $isEH:true},
 e233:{
 "^":"TpZ:12;",
-$1:[function(a){return a.geH()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gpF()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e234:{
 "^":"TpZ:12;",
-$1:[function(a){return J.x3(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.TY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e235:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gLd()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gGL()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e236:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Hm(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.X9(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e237:{
 "^":"TpZ:12;",
@@ -3696,15 +3700,15 @@
 $isEH:true},
 e238:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Fi(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.UP(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e239:{
 "^":"TpZ:12;",
-$1:[function(a){return J.zD(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.UA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e240:{
 "^":"TpZ:12;",
-$1:[function(a){return J.fx(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.zE(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e241:{
 "^":"TpZ:12;",
@@ -3716,35 +3720,35 @@
 $isEH:true},
 e243:{
 "^":"TpZ:12;",
-$1:[function(a){return J.P5(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.uN(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e244:{
 "^":"TpZ:12;",
-$1:[function(a){return J.bL(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.le(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e245:{
 "^":"TpZ:12;",
-$1:[function(a){return J.wS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.bh(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e246:{
 "^":"TpZ:12;",
-$1:[function(a){return J.fY(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Y5(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e247:{
 "^":"TpZ:12;",
-$1:[function(a){return J.YH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Ue(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e248:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jh(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Cs(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e249:{
 "^":"TpZ:12;",
-$1:[function(a){return J.be(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.dK(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e250:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Cr(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.U8(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e251:{
 "^":"TpZ:12;",
@@ -3752,11 +3756,11 @@
 $isEH:true},
 e252:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gV8()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gip()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e253:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Jq(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.M2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e254:{
 "^":"TpZ:12;",
@@ -3772,19 +3776,19 @@
 $isEH:true},
 e257:{
 "^":"TpZ:12;",
-$1:[function(a){return J.yI(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.fM(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e258:{
 "^":"TpZ:12;",
-$1:[function(a){return J.H1(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.ay(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e259:{
 "^":"TpZ:12;",
-$1:[function(a){return J.LF(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.jB(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e260:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Ff(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.lA(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e261:{
 "^":"TpZ:12;",
@@ -3800,7 +3804,7 @@
 $isEH:true},
 e264:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gup()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gLT()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e265:{
 "^":"TpZ:12;",
@@ -3808,7 +3812,7 @@
 $isEH:true},
 e266:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Xa(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.j1(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e267:{
 "^":"TpZ:12;",
@@ -3832,11 +3836,11 @@
 $isEH:true},
 e272:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Dc(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.Xr(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e273:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gki()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gzg()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e274:{
 "^":"TpZ:12;",
@@ -3844,7 +3848,7 @@
 $isEH:true},
 e275:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gmj()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gvs()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e276:{
 "^":"TpZ:12;",
@@ -3856,15 +3860,15 @@
 $isEH:true},
 e278:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ug(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.PS(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e279:{
 "^":"TpZ:12;",
-$1:[function(a){return J.d5(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.As(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e280:{
 "^":"TpZ:12;",
-$1:[function(a){return J.SS(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.YG(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e281:{
 "^":"TpZ:12;",
@@ -3884,11 +3888,11 @@
 $isEH:true},
 e285:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Kf(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.K2(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e286:{
 "^":"TpZ:12;",
-$1:[function(a){return J.ql(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.p6(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e287:{
 "^":"TpZ:12;",
@@ -3904,11 +3908,11 @@
 $isEH:true},
 e290:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gQR()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gCY()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e291:{
 "^":"TpZ:12;",
-$1:[function(a){return J.Gt(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.un(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e292:{
 "^":"TpZ:12;",
@@ -3936,7 +3940,7 @@
 $isEH:true},
 e298:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gFc()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.ghW()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e299:{
 "^":"TpZ:12;",
@@ -3964,7 +3968,7 @@
 $isEH:true},
 e305:{
 "^":"TpZ:12;",
-$1:[function(a){return J.pU(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.NV(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e306:{
 "^":"TpZ:12;",
@@ -3976,7 +3980,7 @@
 $isEH:true},
 e308:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gzz()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gTE()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e309:{
 "^":"TpZ:12;",
@@ -3984,11 +3988,11 @@
 $isEH:true},
 e310:{
 "^":"TpZ:12;",
-$1:[function(a){return J.GH(a)},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return J.NC(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e311:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gSY()},"$1",null,2,0,null,63,"call"],
+$1:[function(a){return a.gaU()},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 e312:{
 "^":"TpZ:81;",
@@ -4016,7 +4020,7 @@
 $isEH:true},
 e318:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.m8(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e319:{
 "^":"TpZ:81;",
@@ -4028,7 +4032,7 @@
 $isEH:true},
 e321:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Kw(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e322:{
 "^":"TpZ:81;",
@@ -4072,7 +4076,7 @@
 $isEH:true},
 e332:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.U8(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e333:{
 "^":"TpZ:81;",
@@ -4080,7 +4084,7 @@
 $isEH:true},
 e334:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Nh(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e335:{
 "^":"TpZ:81;",
@@ -4096,7 +4100,7 @@
 $isEH:true},
 e338:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.AE(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e339:{
 "^":"TpZ:81;",
@@ -4116,7 +4120,7 @@
 $isEH:true},
 e343:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Wy(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e344:{
 "^":"TpZ:81;",
@@ -4152,7 +4156,7 @@
 $isEH:true},
 e352:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.UU(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.MI(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e353:{
 "^":"TpZ:81;",
@@ -4244,7 +4248,7 @@
 $isEH:true},
 e375:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.scI(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.shX(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e376:{
 "^":"TpZ:81;",
@@ -4264,7 +4268,7 @@
 $isEH:true},
 e380:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Mh(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e381:{
 "^":"TpZ:81;",
@@ -4288,11 +4292,11 @@
 $isEH:true},
 e386:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.oJ(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.o3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e387:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.DF(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e388:{
 "^":"TpZ:81;",
@@ -4312,7 +4316,7 @@
 $isEH:true},
 e392:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sP2(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sEl(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e393:{
 "^":"TpZ:81;",
@@ -4364,7 +4368,7 @@
 $isEH:true},
 e405:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.jy(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.J0(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e406:{
 "^":"TpZ:81;",
@@ -4388,7 +4392,7 @@
 $isEH:true},
 e411:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Co(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e412:{
 "^":"TpZ:81;",
@@ -4436,7 +4440,7 @@
 $isEH:true},
 e423:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.Rx(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.uH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e424:{
 "^":"TpZ:81;",
@@ -4448,7 +4452,7 @@
 $isEH:true},
 e426:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.lF(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.pq(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e427:{
 "^":"TpZ:81;",
@@ -4460,7 +4464,7 @@
 $isEH:true},
 e429:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sV8(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sip(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e430:{
 "^":"TpZ:81;",
@@ -4472,7 +4476,7 @@
 $isEH:true},
 e432:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.xH(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.Hn(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e433:{
 "^":"TpZ:81;",
@@ -4492,7 +4496,7 @@
 $isEH:true},
 e437:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.cS(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.o8(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e438:{
 "^":"TpZ:81;",
@@ -4504,7 +4508,7 @@
 $isEH:true},
 e440:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.ix(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.H3(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e441:{
 "^":"TpZ:81;",
@@ -4532,7 +4536,7 @@
 $isEH:true},
 e447:{
 "^":"TpZ:81;",
-$2:[function(a,b){a.sQR(b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){a.sCY(b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e448:{
 "^":"TpZ:81;",
@@ -4552,7 +4556,7 @@
 $isEH:true},
 e452:{
 "^":"TpZ:81;",
-$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,63,66,"call"],
+$2:[function(a,b){J.tH(a,b)},"$2",null,4,0,null,63,66,"call"],
 $isEH:true},
 e453:{
 "^":"TpZ:76;",
@@ -4928,9 +4932,9 @@
 $isEH:true}},1],["","",,B,{
 "^":"",
 G6:{
-"^":"Vfx;BW,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-grs:function(a){return a.BW},
-srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
+"^":"Vfx;BW,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gjD:function(a){return a.BW},
+sjD:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
 pA:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,19,102],
 static:{KU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -4938,7 +4942,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -4953,43 +4957,43 @@
 $isd3:true}}],["","",,Q,{
 "^":"",
 eW:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{rt:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.YZz.LX(a)
-C.YZz.XI(a)
+C.i3.LX(a)
+C.i3.XI(a)
 return a}}}}],["","",,O,{
 "^":"",
-TY:{
-"^":"Y2;od>,Ru>,eT,yt,qu,oH,PU,aZ,Lk,Vg,ij",
+CZ:{
+"^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,Lk,Vg,fn",
 Pz:function(a){var z,y,x,w,v,u,t
-z=this.qu
+z=this.ks
 if(z.length>0)return
-for(y=this.Ru.gup(),y=y.gA(y),x=this.od,w=this.yt+1;y.G();){v=y.lo
+for(y=this.Ru.gLT(),y=y.gA(y),x=this.od,w=this.yt+1;y.G();){v=y.Ff
 if(v.geh()===!0)continue
 u=[]
 u.$builtinTypeInfo=[G.Y2]
-t=new O.TY(x,v,this,w,u,[],"\u2192","cursor: pointer;",!1,null,null)
+t=new O.CZ(x,v,this,w,u,[],"\u2192","cursor: pointer;",!1,null,null)
 if(!t.Nh()){u=t.aZ
 if(t.gnz(t)&&!J.xC(u,"visibility:hidden;")){u=new T.qI(t,C.Pn,u,"visibility:hidden;")
 u.$builtinTypeInfo=[null]
 t.nq(t,u)}t.aZ="visibility:hidden;"}z.push(t)}},
-aY:function(){},
-Nh:function(){return this.Ru.gup().xN.length>0}},
+cO:function(){},
+Nh:function(){return this.Ru.gLT().XG.length>0}},
 eo:{
-"^":"tuj;CA,Hm=,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"tuj;CA,Hm=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.CA},
 sod:function(a,b){a.CA=this.ct(a,C.rB,a.CA,b)},
 Es:function(a){var z
@@ -4998,46 +5002,46 @@
 a.Hm=new G.ih(z,null,null)
 z=a.CA
 if(z!=null)this.hP(a,z.gDZ())},
-vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","grV",2,0,12,59],
+vD:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,12,59],
 hP:function(a,b){var z,y,x,w,v,u,t,s,r,q
 try{w=a.CA
 v=H.VM([],[G.Y2])
-u=new O.TY(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
+u=new O.CZ(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
 u.k7(null)
 z=u
-w=J.dd(z)
+w=J.Mx(z)
 v=a.CA
 t=z
 s=H.VM([],[G.Y2])
 r=t!=null?t.gyt()+1:0
-s=new O.TY(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
+s=new O.CZ(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
 s.k7(t)
 w.push(s)
-a.Hm.rT(z)}catch(q){w=H.Ru(q)
+a.Hm.G7(z)}catch(q){w=H.Ru(q)
 y=w
 x=new H.oP(q,null)
-N.QM("").OW("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
+N.QM("").r0("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.lo(0)
 this.ct(a,C.ep,null,a.Hm)},
 Ui:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,103,104],
-ZZ:[function(a,b){return C.Jp[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
 wn:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$isIv)try{w=a.Hm
-v=J.JC(z)
+v=J.IO(z)
 if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
+w.lo(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.oP(u,null)
-N.QM("").OW("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
+N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
 static:{l0:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5056,27 +5060,27 @@
 $isEH:true}}],["","",,Z,{
 "^":"",
 ak:{
-"^":"Vct;Wf,ef,QI,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"Vct;Wf,ef,QI,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRu:function(a){return a.Wf},
 sRu:function(a,b){a.Wf=this.ct(a,C.XA,a.Wf,b)},
 gWt:function(a){return a.ef},
 sWt:function(a,b){a.ef=this.ct(a,C.yB,a.ef,b)},
 gCF:function(a){return a.QI},
 sCF:function(a,b){a.QI=this.ct(a,C.tg,a.QI,b)},
-vV:[function(a,b){return a.Wf.cv("eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
-Be:[function(a,b){return a.Wf.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gPe",2,0,111,112],
-Cq:[function(a,b){return a.Wf.cv("retained").ml(new Z.Rc(a))},"$1","ghN",2,0,111,113],
+vV:[function(a,b){return a.Wf.cv("eval?expr="+P.jW(C.Fa,b,C.xM,!1))},"$1","gZ2",2,0,109,110],
+Be:[function(a,b){return a.Wf.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,111,112],
+zs:[function(a,b){return a.Wf.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,111,113],
 pA:[function(a,b){a.ef=this.ct(a,C.yB,a.ef,null)
 a.QI=this.ct(a,C.tg,a.QI,null)
 J.LE(a.Wf).wM(b)},"$1","gvC",2,0,19,102],
-Da:[function(a,b){J.y9(a.Wf).wM(b)},"$1","gDX",2,0,19,102],
-static:{zB:function(a){var z,y,x,w
+m4:[function(a,b){J.y9(a.Wf).wM(b)},"$1","gDX",2,0,19,102],
+static:{TH:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5092,29 +5096,29 @@
 Ob:{
 "^":"TpZ:114;a",
 $1:[function(a){var z=this.a
-z.ef=J.Q5(z,C.yB,z.ef,a)},"$1",null,2,0,null,96,"call"],
+z.ef=J.NB(z,C.yB,z.ef,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-Rc:{
+SS:{
 "^":"TpZ:115;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(a.gPE(),null,null)
-z.QI=J.Q5(z,C.tg,z.QI,y)},"$1",null,2,0,null,96,"call"],
+z.QI=J.NB(z,C.tg,z.QI,y)},"$1",null,2,0,null,96,"call"],
 $isEH:true}}],["","",,O,{
 "^":"",
 VY:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gtT:function(a){return a.tY},
 Qj:[function(a,b){Q.xI.prototype.Qj.call(this,a,b)
-this.ct(a,C.i4,0,1)},"$1","gBj",2,0,12,59],
+this.ct(a,C.i4,0,1)},"$1","gLe",2,0,12,59],
 static:{E3U:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5126,14 +5130,14 @@
 return a}}}}],["","",,F,{
 "^":"",
 Be:{
-"^":"D13;Xx,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"D13;Xx,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gtT:function(a){return a.Xx},
 stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z).ml(new F.Jr())},
+J.SK(z).ml(new F.fS())},
 pA:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,19,102],
 lE:function(a,b){var z,y,x
 z=J.Vs(b).dA.getAttribute("data-jump-target")
@@ -5148,13 +5152,13 @@
 QT:[function(a,b,c,d){var z=this.lE(a,d)
 if(z==null)return
 J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,116,2,106,107],
-static:{FeK:function(a){var z,y,x,w
+static:{fm:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5167,16 +5171,16 @@
 D13:{
 "^":"uL+Pi;",
 $isd3:true},
-Jr:{
+fS:{
 "^":"TpZ:117;",
 $1:[function(a){a.QW()},"$1",null,2,0,null,85,"call"],
 $isEH:true}}],["","",,T,{
 "^":"",
 uV:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){var z=a.tY
-if(b===!0)J.LE(z).ml(new T.WW(a)).wM(c)
+if(b===!0)J.LE(z).ml(new T.zG(a)).wM(c)
 else{z.sZ3(null)
 c.$0()}},"$2","gus",4,0,118,119,120],
 static:{CvM:function(a){var z,y,x,w
@@ -5185,8 +5189,8 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5196,7 +5200,7 @@
 C.vS.LX(a)
 C.vS.XI(a)
 return a}}},
-WW:{
+zG:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=this.a
@@ -5206,17 +5210,17 @@
 $isEH:true}}],["","",,U,{
 "^":"",
 NY:{
-"^":"WZq;AE,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"WZq;AE,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 geo:function(a){return a.AE},
 seo:function(a,b){a.AE=this.ct(a,C.nr,a.AE,b)},
 pA:[function(a,b){J.LE(a.AE).wM(b)},"$1","gvC",2,0,122,120],
-static:{ui:function(a){var z,y,x,w
+static:{q5n:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5231,9 +5235,9 @@
 $isd3:true}}],["","",,R,{
 "^":"",
 JI:{
-"^":"SaM;GV,uo,nx,oM,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-goE:function(a){return a.GV},
-soE:function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},
+"^":"SaM;tH,uo,nx,oM,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+goE:function(a){return a.tH},
+soE:function(a,b){a.tH=this.ct(a,C.mr,a.tH,b)},
 gO9:function(a){return a.uo},
 sO9:function(a,b){a.uo=this.ct(a,C.S4,a.uo,b)},
 gFR:function(a){return a.nx},
@@ -5243,26 +5247,26 @@
 git:function(a){return a.oM},
 sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
 tn:[function(a,b){var z=a.oM
-a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,19,59],
-WM:[function(a){var z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)
+a.tH=this.ct(a,C.mr,a.tH,z)},"$1","ghy",2,0,19,59],
+Db:[function(a){var z=a.tH
+a.tH=this.ct(a,C.mr,z,z!==!0)
 a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","goJ",0,0,17],
 AZ:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
 if(a.nx!=null){a.uo=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)}},"$3","gDI",6,0,84,49,50,85],
+this.AV(a,a.tH!==!0,this.goJ(a))}else{z=a.tH
+a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,84,49,50,85],
 static:{U9:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.GV=!1
+a.tH=!1
 a.uo=!1
 a.nx=null
 a.oM=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -5276,7 +5280,7 @@
 "^":"xc+Pi;",
 $isd3:true}}],["","",,H,{
 "^":"",
-Wp:function(){return new P.lj("No element")},
+DU:function(){return new P.lj("No element")},
 ar:function(){return new P.lj("Too few elements")},
 tb:function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
@@ -5286,7 +5290,8 @@
 if(c>=a.length)return-1
 for(z=c;z<d;++z){if(z>=a.length)return H.e(a,z)
 if(J.xC(a[z],b))return z}return-1},
-EHn:function(a,b,c){var z,y
+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
@@ -5403,9 +5408,9 @@
 for(;y<z;++y){b.$1(this.Zv(0,y))
 if(z!==this.gB(this))throw H.b(P.a4(this))}},
 gl0:function(a){return J.xC(this.gB(this),0)},
-gtH:function(a){if(J.xC(this.gB(this),0))throw H.b(H.Wp())
+gqG:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
 return this.Zv(0,0)},
-grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.Wp())
+grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
 return this.Zv(0,J.bI(this.gB(this),1))},
 tg:function(a,b){var z,y
 z=this.gB(this)
@@ -5431,16 +5436,14 @@
 for(;v<z;++v){w.IN+=b
 u=this.Zv(0,v)
 w.IN+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}y=w.IN
-return y.charCodeAt(0)==0?y:y}else{w=P.p9("")
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.IN}else{w=P.p9("")
 if(typeof z!=="number")return H.s(z)
 v=0
 for(;v<z;++v){u=this.Zv(0,v)
 w.IN+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}y=w.IN
-return y.charCodeAt(0)==0?y:y}},
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.IN}},
 ad:function(a,b){return P.mW.prototype.ad.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"MQ",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},30],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"Uy",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},30],
 es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -5463,8 +5466,8 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=y;++x}return z},
 br:function(a){return this.tt(a,!0)},
-Oe:function(a){var z,y,x
-z=P.fM(null,null,null,H.W8(this,"aL",0))
+zH:function(a){var z,y,x
+z=P.Ls(null,null,null,H.W8(this,"aL",0))
 y=0
 while(!0){x=this.gB(this)
 if(typeof x!=="number")return H.s(x)
@@ -5472,44 +5475,44 @@
 z.h(0,this.Zv(0,y));++y}return z},
 $isyN:true},
 bX:{
-"^":"aL;Hb,bS,Hx",
+"^":"aL;Hb,ay,Hx",
 gUD:function(){var z,y
 z=J.q8(this.Hb)
 y=this.Hx
 if(y==null||J.xZ(y,z))return z
 return y},
-gAs:function(){var z,y
+gdM:function(){var z,y
 z=J.q8(this.Hb)
-y=this.bS
+y=this.ay
 if(J.xZ(y,z))return z
 return y},
 gB:function(a){var z,y,x
 z=J.q8(this.Hb)
-y=this.bS
+y=this.ay
 if(J.J5(y,z))return 0
 x=this.Hx
 if(x==null||J.J5(x,z))return J.bI(z,y)
 return J.bI(x,y)},
-Zv:function(a,b){var z=J.WB(this.gAs(),b)
+Zv:function(a,b){var z=J.WB(this.gdM(),b)
 if(J.u6(b,0)||J.J5(z,this.gUD()))throw H.b(P.TE(b,0,this.gB(this)))
 return J.i9(this.Hb,z)},
 eR:function(a,b){var z,y
 if(J.u6(b,0))throw H.b(P.N(b))
-z=J.WB(this.bS,b)
+z=J.WB(this.ay,b)
 y=this.Hx
 if(y!=null&&J.J5(z,y)){y=new H.MB()
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y}return H.c1(this.Hb,z,y,H.u3(this,0))},
-qZ:function(a,b){var z,y,x
+rh:function(a,b){var z,y,x
 if(b<0)throw H.b(P.N(b))
 z=this.Hx
-y=this.bS
+y=this.ay
 if(z==null)return H.c1(this.Hb,y,J.WB(y,b),H.u3(this,0))
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
 return H.c1(this.Hb,y,x,H.u3(this,0))}},
 Hd:function(a,b,c,d){var z,y,x
-z=this.bS
+z=this.ay
 y=J.Wx(z)
 if(y.C(z,0))throw H.b(P.N(z))
 x=this.Hx
@@ -5519,17 +5522,17 @@
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
-"^":"a;Hb,SW,QX,lo",
-gl:function(){return this.lo},
+"^":"a;Hb,bd,QX,Ff",
+gl:function(){return this.Ff},
 G:function(){var z,y,x,w
 z=this.Hb
 y=J.U6(z)
 x=y.gB(z)
-if(!J.xC(this.SW,x))throw H.b(P.a4(z))
+if(!J.xC(this.bd,x))throw H.b(P.a4(z))
 w=this.QX
 if(typeof x!=="number")return H.s(x)
-if(w>=x){this.lo=null
-return!1}this.lo=y.Zv(z,w);++this.QX
+if(w>=x){this.Ff=null
+return!1}this.Ff=y.Zv(z,w);++this.QX
 return!0}},
 i1:{
 "^":"mW;Hb,Oh",
@@ -5539,8 +5542,8 @@
 return z},
 gB:function(a){return J.q8(this.Hb)},
 gl0:function(a){return J.FN(this.Hb)},
-gtH:function(a){return this.Mi(J.Es(this.Hb))},
-grZ:function(a){return this.Mi(J.OH(this.Hb))},
+gqG:function(a){return this.Mi(J.bT(this.Hb))},
+grZ:function(a){return this.Mi(J.MQ(this.Hb))},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 static:{K1:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
@@ -5549,13 +5552,13 @@
 "^":"i1;Hb,Oh",
 $isyN:true},
 MH:{
-"^":"Anv;lo,CL,Oh",
+"^":"Anv;Ff,CL,Oh",
 Mi:function(a){return this.Oh.$1(a)},
 G:function(){var z=this.CL
-if(z.G()){this.lo=this.Mi(z.gl())
-return!0}this.lo=null
+if(z.G()){this.Ff=this.Mi(z.gl())
+return!0}this.Ff=null
 return!1},
-gl:function(){return this.lo},
+gl:function(){return this.Ff},
 $asAnv:function(a,b){return[b]}},
 A8:{
 "^":"aL;ON,Oh",
@@ -5568,47 +5571,47 @@
 $isyN:true},
 U5:{
 "^":"mW;Hb,Oh",
-gA:function(a){var z=new H.Mo(J.mY(this.Hb),this.Oh)
+gA:function(a){var z=new H.vG(J.mY(this.Hb),this.Oh)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
-Mo:{
+vG:{
 "^":"Anv;CL,Oh",
 Mi:function(a){return this.Oh.$1(a)},
 G:function(){for(var z=this.CL;z.G();)if(this.Mi(z.gl())===!0)return!0
 return!1},
 gl:function(){return this.CL.gl()}},
-Fm:{
+oA:{
 "^":"mW;Hb,Oh",
-gA:function(a){var z=new H.P8(J.mY(this.Hb),this.Oh,C.MS,null)
+gA:function(a){var z=new H.yY(J.mY(this.Hb),this.Oh,C.MS,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]}},
-P8:{
-"^":"a;CL,Oh,Qc,lo",
+yY:{
+"^":"a;CL,Oh,WL,Ff",
 Mi:function(a){return this.Oh.$1(a)},
-gl:function(){return this.lo},
+gl:function(){return this.Ff},
 G:function(){var z,y
-z=this.Qc
+z=this.WL
 if(z==null)return!1
-for(y=this.CL;!z.G();){this.lo=null
-if(y.G()){this.Qc=null
+for(y=this.CL;!z.G();){this.Ff=null
+if(y.G()){this.WL=null
 z=J.mY(this.Mi(y.gl()))
-this.Qc=z}else return!1}this.lo=this.Qc.gl()
+this.WL=z}else return!1}this.Ff=this.WL.gl()
 return!0}},
 AM:{
 "^":"mW;Hb,u3",
 eR:function(a,b){if(b<0)throw H.b(P.N(b))
-return H.p6(this.Hb,this.u3+b,H.u3(this,0))},
+return H.ke(this.Hb,this.u3+b,H.u3(this,0))},
 gA:function(a){var z=this.Hb
-z=new H.Lh(z.gA(z),this.u3)
+z=new H.b2(z.gA(z),this.u3)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 jb:function(a,b,c){if(this.u3<0)throw H.b(P.KP(this.u3))},
-static:{p6:function(a,b,c){var z
+static:{ke:function(a,b,c){var z
 if(!!a.$isyN){z=H.VM(new H.wB(a,b),[c])
 z.jb(a,b,c)
-return z}return H.Xn(a,b,c)},Xn:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
+return z}return H.GJ(a,b,c)},GJ:function(a,b,c){var z=H.VM(new H.AM(a,b),[c])
 z.jb(a,b,c)
 return z}}},
 wB:{
@@ -5619,7 +5622,7 @@
 if(J.J5(y,0))return y
 return 0},
 $isyN:true},
-Lh:{
+b2:{
 "^":"Anv;CL,u3",
 G:function(){var z,y
 for(z=this.CL,y=0;y<this.u3;++y)z.G()
@@ -5632,13 +5635,13 @@
 aN:function(a,b){},
 gl0:function(a){return!0},
 gB:function(a){return 0},
-gtH:function(a){throw H.b(H.Wp())},
-grZ:function(a){throw H.b(H.Wp())},
+gqG:function(a){throw H.b(H.DU())},
+grZ:function(a){throw H.b(H.DU())},
 tg:function(a,b){return!1},
 Vr:function(a,b){return!1},
 zV:function(a,b){return""},
 ad:function(a,b){return this},
-ez:[function(a,b){return C.Ar},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQO",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"MB")},30],
+ez:[function(a,b){return C.Ar},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"MQ",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"MB")},30],
 eR:function(a,b){if(b<0)throw H.b(P.N(b))
 return this},
 tt:function(a,b){var z
@@ -5647,19 +5650,19 @@
 z.fixed$length=init
 z=H.VM(z,[H.u3(this,0)])}return z},
 br:function(a){return this.tt(a,!0)},
-Oe:function(a){return P.fM(null,null,null,H.u3(this,0))},
+zH:function(a){return P.Ls(null,null,null,H.u3(this,0))},
 $isyN:true},
 FuS:{
 "^":"a;",
 G:function(){return!1},
 gl:function(){return}},
-TNQ:{
+wb:{
 "^":"a;",
 static:{bQ:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.lo)},Ck:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b.$1(z.Ff)},Ck:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)if(b.$1(z.Ff)===!0)return!0
 return!1},n3:function(a,b,c){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.lo)
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)b=c.$2(b,z.Ff)
 return b},DQ:function(a,b){var z,y,x,w,v
 z=[]
 y=a.length
@@ -5670,14 +5673,14 @@
 if(y!==x)throw H.b(P.a4(a))}x=z.length
 if(x===y)return
 C.Nm.sB(a,x)
-for(w=0;w<z.length;++w)C.Nm.u(a,w,z[w])},Sz:function(a,b,c){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.lo
-if(b.$1(y)===!0)return y}throw H.b(H.Wp())},ig:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},K0:function(a,b,c){var z=J.Wx(b)
+for(w=0;w<z.length;++w)C.Nm.u(a,w,z[w])},FU:function(a,b,c){var z,y
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){y=z.Ff
+if(b.$1(y)===!0)return y}throw H.b(H.DU())},ig:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},xF: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))},qG:function(a,b,c,d,e){var z,y,x,w
-H.K0(a,b,c)
+H.xF(a,b,c)
 z=J.bI(c,b)
 if(J.xC(z,0))return
 if(J.u6(e,0))throw H.b(P.u(e))
@@ -5706,20 +5709,20 @@
 "^":"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"))},
-aP:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 uk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
 oq:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-ReL:{
+JJ:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
 Mh:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-aP:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
@@ -5736,7 +5739,7 @@
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ark+ReL;",
+"^":"ark+JJ;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -5783,10 +5786,10 @@
 z=H.KT(z,[z,z]).Zg(a)
 if(z)return b.O8(a)
 else return b.cR(a)},
-nd:function(a,b){var z=P.Dt(b)
-P.cH(C.ny,new P.Sv(a,z))
+DJ:function(a,b){var z=P.Dt(b)
+P.cH(C.ny,new P.w4(a,z))
 return z},
-hz:function(a,b){var z,y,x,w,v
+Ne:function(a,b){var z,y,x,w,v
 z={}
 z.a=null
 z.b=null
@@ -5794,7 +5797,7 @@
 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.u3(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
+for(x=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);x.G();)x.Ff.Rx(new P.Tw(z,b,z.c++),y)
 y=z.c
 if(y===0)return P.Ab(C.xD,null)
 w=Array(y)
@@ -5833,7 +5836,7 @@
 $.X3.hk(y,x)}},
 QEz:[function(a){},"$1","yy",2,0,19,20],
 Z0:[function(a,b){$.X3.hk(a,b)},function(a){return P.Z0(a,null)},null,"$2","$1","bx",2,2,21,22,23,24],
-ax:[function(){},"$0","No",0,0,17],
+dL:[function(){},"$0","v3",0,0,17],
 FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
@@ -5844,20 +5847,20 @@
 else b.ZL(c,d)},
 TB:function(a,b){return new P.uR(a,b)},
 Bb:function(a,b,c){var z=a.Gv()
-if(!!J.x(z).$isb8)z.wM(new P.Ry(b,c))
+if(!!J.x(z).$isb8)z.wM(new P.QX(b,c))
 else b.In(c)},
 cH:function(a,b){var z
 if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
 SZ:function(a,b){var z
-if(J.xC($.X3,C.NU))return $.X3.lB(a,b)
+if(J.xC($.X3,C.NU))return $.X3.Ud(a,b)
 z=$.X3
-return z.lB(a,z.rO(b,!0))},
+return z.Ud(a,z.rO(b,!0))},
 YF:function(a,b){var z=a.gVs()
 return H.cy(z<0?0:z,b)},
 dp:function(a,b){var z=a.gVs()
-return H.jW(z<0?0:z,b)},
+return H.zw(z<0?0:z,b)},
 Us:function(a){var z=$.X3
 $.X3=a
 return z},
@@ -5891,8 +5894,8 @@
 z=P.Us(c)
 try{y=d.$2(e,f)
 return y}finally{$.X3=z}},"$6","xd",12,0,33,26,27,28,30,8,9],
-MU:[function(a,b,c,d){return d},"$4","u3Q",8,0,34,26,27,28,30],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,35,26,27,28,30],
+nI:[function(a,b,c,d){return d},"$4","W7",8,0,34,26,27,28,30],
+cQt:[function(a,b,c,d){return d},"$4","H9",8,0,35,26,27,28,30],
 bD:[function(a,b,c,d){return d},"$4","Dk",8,0,36,26,27,28,30],
 ZK:[function(a,b,c,d){var z,y
 if(C.NU!==c)d=c.ce(d)
@@ -5903,18 +5906,18 @@
 $.k8.aw=y
 $.k8=y}},"$4","yA",8,0,37,26,27,28,30],
 h8X:[function(a,b,c,d,e){return P.YF(d,C.NU!==c?c.ce(e):e)},"$5","zci",10,0,38,26,27,28,39,40],
-Gi:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.mS(e):e)},"$5","Uwa",10,0,41,26,27,28,39,40],
+HwS:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.mS(e):e)},"$5","RN",10,0,41,26,27,28,39,40],
 JjS:[function(a,b,c,d){H.qw(H.d(d))},"$4","uy1",8,0,42,26,27,28,43],
 CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,44],
-qc:[function(a,b,c,d,e){var z,y
+E1:[function(a,b,c,d,e){var z,y
 $.oK=P.jt()
-if(d==null)d=C.Qq
+if(d==null)d=C.zb
 else if(!J.x(d).$isyQ)throw H.b(P.u("ZoneSpecifications must be instantiated with the provided constructor."))
 if(e==null)z=!!J.x(c).$ism0?c.gSe():P.YM(null,null,null,null,null)
 else{z=P.YM(null,null,null,null,null)
-z.FV(0,e)}y=new P.FQ(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
-y.Ij(c,d,z)
-return y},"$5","xN",10,0,45,26,27,28,46,47],
+z.FV(0,e)}y=new P.l7(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
+y.bC(c,d,z)
+return y},"$5","OjX",10,0,45,26,27,28,46,47],
 th:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
@@ -5949,10 +5952,10 @@
 static:{Uz:function(a,b){return new P.O6(a,P.HR(a,b))},HR:function(a,b){if(b!=null)return b
 if(!!J.x(a).$isXS)return a.gI4()
 return}}},
-rk:{
+Ik:{
 "^":"u2;BT"},
-JIw:{
-"^":"Bx;ru@,iE@,SJ@,BT,dB,Tv,EU,t9,YM,Qe,LT",
+LR:{
+"^":"Bx;ru@,iE@,SJ@,BT,dB,Tv,EU,t9,YM,Qe,fk",
 gBT:function(){return this.BT},
 uO:function(a){var z=this.ru
 if(typeof z!=="number")return z.i()
@@ -5960,7 +5963,7 @@
 fc:function(){var z=this.ru
 if(typeof z!=="number")return z.w()
 this.ru=z^1},
-ga3:function(){var z=this.ru
+gh0:function(){var z=this.ru
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
 Pa:function(){var z=this.ru
@@ -5971,10 +5974,10 @@
 return(z&4)!==0},
 jy:[function(){},"$0","gb9",0,0,17],
 ie:[function(){},"$0","gxl",0,0,17],
-static:{"^":"E2b,HCK,id"}},
+static:{"^":"E2b,HCK,VCd"}},
 WVu:{
 "^":"a;iE@,SJ@",
-gvq:function(a){var z=new P.rk(this)
+gvq:function(a){var z=new P.Ik(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gUF:function(){return!1},
@@ -5991,13 +5994,13 @@
 a.sSJ(a)
 a.siE(a)},
 MI:function(a,b,c,d){var z,y,x
-if((this.YM&4)!==0){if(c==null)c=P.No()
-z=new P.EM($.X3,0,c)
+if((this.YM&4)!==0){if(c==null)c=P.v3()
+z=new P.to($.X3,0,c)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.q1()
 return z}z=$.X3
 y=d?1:0
-x=new P.JIw(null,null,null,this,null,null,null,z,y,null,null)
+x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
 x.$builtinTypeInfo=this.$builtinTypeInfo
 x.Cy(a,b,c,d,H.u3(this,0))
 x.SJ=x
@@ -6008,14 +6011,14 @@
 y.siE(x)
 this.SJ=x
 x.ru=this.YM&1
-if(this.iE===x)P.ot(this.bA)
+if(this.iE===x)P.ot(this.Ld)
 return x},
 rR:function(a){if(a.giE()===a)return
-if(a.ga3())a.Pa()
+if(a.gh0())a.Pa()
 else{this.pW(a)
 if((this.YM&2)===0&&this.iE===this)this.hg()}return},
-EB:function(a){},
-Mt:function(a){},
+Pm:function(a){},
+Bu:function(a){},
 Pq:function(){if((this.YM&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")},
 h:[function(a,b){if(this.YM>=4)throw H.b(this.Pq())
@@ -6026,14 +6029,14 @@
 if(z>=4)throw H.b(this.Pq())
 this.YM=z|4
 y=this.WH()
-this.Dd()
+this.PS()
 return y},
 Rg:function(a,b){this.MW(b)},
 MR:function(a,b){this.y7(a,b)},
-EC:function(){var z=this.Hz
+AN:function(){var z=this.Hz
 this.Hz=null
 this.YM&=4294967287
-C.bP.tZ(z)},
+C.jN.dS(z)},
 HI:function(a){var z,y,x,w
 z=this.YM
 if((z&2)!==0)throw H.b(P.w("Cannot fire new event. Controller is already firing an event"))
@@ -6057,7 +6060,7 @@
 hg:function(){if((this.YM&4)!==0&&this.Kj.YM===0)this.Kj.Xf(null)
 P.ot(this.Ro)}},
 zW:{
-"^":"WVu;bA,Ro,YM,iE,SJ,Hz,Kj",
+"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
 MW:function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.YM|=2
@@ -6066,39 +6069,39 @@
 if(this.iE===this)this.hg()
 return}this.HI(new P.tK(this,a))},
 y7:function(a,b){if(this.iE===this)return
-this.HI(new P.QG(this,a,b))},
-Dd:function(){if(this.iE!==this)this.HI(new P.Bg(this))
+this.HI(new P.OR(this,a,b))},
+PS:function(){if(this.iE!==this)this.HI(new P.Bg(this))
 else this.Kj.Xf(null)}},
 tK:{
 "^":"TpZ;a,b",
 $1:function(a){a.Rg(0,this.b)},
 $isEH:true,
 $signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
-QG:{
+OR:{
 "^":"TpZ;a,b,c",
 $1:function(a){a.MR(this.b,this.c)},
 $isEH:true,
 $signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 Bg:{
 "^":"TpZ;a",
-$1:function(a){a.EC()},
+$1:function(a){a.AN()},
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Mc",args:[[P.JIw,a]]}},this.a,"zW")}},
+$signature:function(){return H.oZ(function(a){return{func:"GJ",args:[[P.LR,a]]}},this.a,"zW")}},
 DL:{
-"^":"WVu;bA,Ro,YM,iE,SJ,Hz,Kj",
+"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
 MW:function(a){var z,y
-for(z=this.iE;z!==this;z=z.giE()){y=new P.LV(a,null)
+for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
 y.$builtinTypeInfo=[null]
 z.C2(y)}},
 y7:function(a,b){var z
 for(z=this.iE;z!==this;z=z.giE())z.C2(new P.Dn(a,b,null))},
-Dd:function(){var z=this.iE
+PS:function(){var z=this.iE
 if(z!==this)for(;z!==this;z=z.giE())z.C2(C.ZB)
 else this.Kj.Xf(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
-Sv:{
+w4:{
 "^":"TpZ:76;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.In(this.a.$0())}catch(x){w=H.Ru(x)
@@ -6130,17 +6133,17 @@
 if(z.YM!==0)H.vh(P.w("Future already completed"))
 z.Xf(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
-A5:{
+A0:{
 "^":"a;",
-$isA5:true},
+$isA0:true},
 Pf0:{
 "^":"a;",
-$isA5:true},
+$isA0:true},
 Zf:{
 "^":"Pf0;MM",
 j3:[function(a,b){var z=this.MM
 if(z.YM!==0)throw H.b(P.w("Future already completed"))
-z.Xf(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,128,22,20],
+z.Xf(b)},function(a){return this.j3(a,null)},"dS","$1","$0","gv6",0,2,128,22,20],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
@@ -6215,13 +6218,13 @@
 Nk:function(a,b){if(this.YM!==0)H.vh(P.w("Future already completed"))
 this.YM=1
 this.t9.wr(new P.ZL(this,a,b))},
-J9:function(a,b){this.Xf(a)},
 X8:function(a,b,c){this.Nk(a,b)},
+J9:function(a,b){this.Xf(a)},
 $isGc:true,
 $isb8:true,
 static:{"^":"ewM,JE,C3n,oN1,NKU",Dt:function(a){return H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[b])
 z.J9(a,b)
-return z},t5:function(a,b,c){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[c])
+return z},pz:function(a,b,c){var z=H.VM(new P.Gc(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
 return z},k3:function(a,b){b.sKl(!0)
 a.Rx(new P.U7(b),new P.VL(b))},A9:function(a,b){b.sKl(!0)
@@ -6379,11 +6382,11 @@
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
-cb:{
+wS:{
 "^":"a;",
-ad:function(a,b){return H.VM(new P.fk(b,this),[H.W8(this,"cb",0)])},
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.W8(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"bp",ret:P.cb,args:[{func:"Pw",args:[a]}]}},this.$receiver,"cb")},133],
-yx:[function(a,b){return H.VM(new P.Bgk(b,this),[H.W8(this,"cb",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"T6w",ret:P.cb,args:[{func:"ZSr",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},133],
+ad:function(a,b){return H.VM(new P.fk(b,this),[H.W8(this,"wS",0)])},
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.W8(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},133],
+lM:[function(a,b){return H.VM(new P.AE(b,this),[H.W8(this,"wS",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"xv",ret:P.wS,args:[{func:"ZSr",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},133],
 zV:function(a,b){var z,y,x
 z={}
 y=P.Dt(P.qU)
@@ -6396,7 +6399,7 @@
 z={}
 y=P.Dt(P.SQ)
 z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.tG(y),y.gFa())
+z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.DO(y),y.gFa())
 return y},
 aN:function(a,b){var z,y
 z={}
@@ -6408,13 +6411,13 @@
 z={}
 y=P.Dt(P.SQ)
 z.a=null
-z.a=this.KR(new P.Ia(z,this,b,y),!0,new P.BSd(y),y.gFa())
+z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gFa())
 return y},
 gB:function(a){var z,y
 z={}
 y=P.Dt(P.KN)
 z.a=0
-this.KR(new P.B5(z),!0,new P.PI(z,y),y.gFa())
+this.KR(new P.PI(z),!0,new P.hh(z,y),y.gFa())
 return y},
 gl0:function(a){var z,y
 z={}
@@ -6423,32 +6426,32 @@
 z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gFa())
 return y},
 br:function(a){var z,y
-z=H.VM([],[H.W8(this,"cb",0)])
-y=P.Dt([P.WO,H.W8(this,"cb",0)])
+z=H.VM([],[H.W8(this,"wS",0)])
+y=P.Dt([P.WO,H.W8(this,"wS",0)])
 this.KR(new P.lv(this,z),!0,new P.Ul(z,y),y.gFa())
 return y},
-Oe:function(a){var z,y
-z=P.fM(null,null,null,H.W8(this,"cb",0))
-y=P.Dt([P.z5,H.W8(this,"cb",0)])
+zH:function(a){var z,y
+z=P.Ls(null,null,null,H.W8(this,"wS",0))
+y=P.Dt([P.Ol,H.W8(this,"wS",0)])
 this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gFa())
 return y},
 eR:function(a,b){var z=H.VM(new P.pt(b,this),[null])
-z.qI(this,b,null)
+z.mh(this,b,null)
 return z},
-gtH:function(a){var z,y
+gqG:function(a){var z,y
 z={}
-y=P.Dt(H.W8(this,"cb",0))
+y=P.Dt(H.W8(this,"wS",0))
 z.a=null
 z.a=this.KR(new P.lU(z,this,y),!0,new P.xp(y),y.gFa())
 return y},
 grZ:function(a){var z,y
 z={}
-y=P.Dt(H.W8(this,"cb",0))
+y=P.Dt(H.W8(this,"wS",0))
 z.a=null
 z.b=!1
 this.KR(new P.UH(z,this),!0,new P.eI(z,y),y.gFa())
 return y},
-$iscb:true},
+$iswS:true},
 dW3:{
 "^":"TpZ;a,b,c,d,e",
 $1:[function(a){var z,y,x,w,v
@@ -6460,25 +6463,24 @@
 y=new H.oP(w,null)
 P.NX(x.a,this.d,z,y)}},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 QCh:{
 "^":"TpZ:12;f",
 $1:[function(a){this.f.yk(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Lp0:{
 "^":"TpZ:76;UI,bK",
-$0:[function(){var z=this.bK.IN
-this.UI.In(z.charCodeAt(0)==0?z:z)},"$0",null,0,0,null,"call"],
+$0:[function(){this.UI.In(this.bK.IN)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Sd:{
 "^":"TpZ;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.bi(this.c,a),new P.z2(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
+P.FE(new P.LB(this.c,a),new P.z2(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
-bi:{
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+LB:{
 "^":"TpZ:76;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
@@ -6486,20 +6488,20 @@
 "^":"TpZ:135;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-tG:{
+DO:{
 "^":"TpZ:76;bK",
 $0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"TpZ;a,b,c,d",
-$1:[function(a){P.FE(new P.at(this.c,a),new P.mj(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,134,"call"],
+$1:[function(a){P.FE(new P.Rl(this.c,a),new P.at(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
-at:{
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+Rl:{
 "^":"TpZ:76;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
-mj:{
+at:{
 "^":"TpZ:12;",
 $1:function(a){},
 $isEH:true},
@@ -6507,14 +6509,14 @@
 "^":"TpZ:76;UI",
 $0:[function(){this.UI.In(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Ia:{
+Ee:{
 "^":"TpZ;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
 P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 WN:{
 "^":"TpZ:76;e,f",
 $0:function(){return this.e.$1(this.f)},
@@ -6523,15 +6525,15 @@
 "^":"TpZ:135;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-BSd:{
+Ia:{
 "^":"TpZ:76;bK",
 $0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
-B5:{
+PI:{
 "^":"TpZ:12;a",
 $1:[function(a){++this.a.a},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-PI:{
+hh:{
 "^":"TpZ:76;a,b",
 $0:[function(){this.b.In(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -6547,7 +6549,7 @@
 "^":"TpZ;a,b",
 $1:[function(a){this.b.push(a)},"$1",null,2,0,null,124,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
 Ul:{
 "^":"TpZ:76;c,d",
 $0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
@@ -6556,7 +6558,7 @@
 "^":"TpZ;a,b",
 $1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,124,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
 yZ:{
 "^":"TpZ:76;c,d",
 $0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
@@ -6565,11 +6567,11 @@
 "^":"TpZ;a,b,c",
 $1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 xp:{
 "^":"TpZ:76;d",
 $0:[function(){var z,y,x,w
-try{x=H.Wp()
+try{x=H.DU()
 throw H.b(x)}catch(w){x=H.Ru(w)
 z=x
 y=new H.oP(w,null)
@@ -6581,13 +6583,13 @@
 z.b=!0
 z.a=a},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 eI:{
 "^":"TpZ:76;a,c",
 $0:[function(){var z,y,x,w
 x=this.a
 if(x.b){this.c.In(x.a)
-return}try{x=H.Wp()
+return}try{x=H.DU()
 throw H.b(x)}catch(w){x=H.Ru(w)
 z=x
 y=new H.oP(w,null)
@@ -6597,7 +6599,7 @@
 "^":"a;",
 $isyX:true},
 u2:{
-"^":"aN;",
+"^":"ezY;",
 k0:function(a,b,c,d){return this.BT.MI(a,b,c,d)},
 giO:function(a){return(H.eQ(this.BT)^892482866)>>>0},
 n:function(a,b){if(b==null)return!1
@@ -6608,30 +6610,30 @@
 Bx:{
 "^":"KA;BT<",
 cZ:function(){return this.gBT().rR(this)},
-jy:[function(){this.gBT().EB(this)},"$0","gb9",0,0,17],
-ie:[function(){this.gBT().Mt(this)},"$0","gxl",0,0,17]},
+jy:[function(){this.gBT().Pm(this)},"$0","gb9",0,0,17],
+ie:[function(){this.gBT().Bu(this)},"$0","gxl",0,0,17]},
 NOT:{
 "^":"a;"},
 KA:{
-"^":"a;dB,Tv<,EU,t9<,YM,Qe,LT",
+"^":"a;dB,Tv<,EU,t9<,YM,Qe,fk",
 fm:function(a,b){if(b==null)b=P.bx()
 this.Tv=P.VH(b,this.t9)},
 Fv:[function(a,b){var z=this.YM
 if((z&8)!==0)return
 this.YM=(z+128|4)>>>0
 if(b!=null)b.wM(this.gDQ(this))
-if(z<128&&this.LT!=null)this.LT.b7()
-if((z&4)===0&&(this.YM&32)===0)this.uz(this.gb9())},function(a){return this.Fv(a,null)},"zd","$1","$0","gX0",0,2,136,22,137],
+if(z<128&&this.fk!=null)this.fk.IO()
+if((z&4)===0&&(this.YM&32)===0)this.Ge(this.gb9())},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,136,22,137],
 QE:[function(a){var z=this.YM
 if((z&8)!==0)return
 if(z>=128){z-=128
 this.YM=z
-if(z<128){if((z&64)!==0){z=this.LT
+if(z<128){if((z&64)!==0){z=this.fk
 z=!z.gl0(z)}else z=!1
-if(z)this.LT.t2(this)
+if(z)this.fk.t2(this)
 else{z=(this.YM&4294967291)>>>0
 this.YM=z
-if((z&32)===0)this.uz(this.gxl())}}}},"$0","gDQ",0,0,17],
+if((z&32)===0)this.Ge(this.gxl())}}}},"$0","gDQ",0,0,17],
 Gv:function(){var z=(this.YM&4294967279)>>>0
 this.YM=z
 if((z&8)!==0)return this.Qe
@@ -6640,39 +6642,39 @@
 gUF:function(){return this.YM>=128},
 WN:function(){var z=(this.YM|8)>>>0
 this.YM=z
-if((z&64)!==0)this.LT.b7()
-if((this.YM&32)===0)this.LT=null
+if((z&64)!==0)this.fk.IO()
+if((this.YM&32)===0)this.fk=null
 this.Qe=this.cZ()},
 Rg:function(a,b){var z=this.YM
 if((z&8)!==0)return
 if(z<32)this.MW(b)
-else this.C2(H.VM(new P.LV(b,null),[null]))},
+else this.C2(H.VM(new P.fZ(b,null),[null]))},
 MR:function(a,b){var z=this.YM
 if((z&8)!==0)return
 if(z<32)this.y7(a,b)
 else this.C2(new P.Dn(a,b,null))},
-EC:function(){var z=this.YM
+AN:function(){var z=this.YM
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.YM=z
-if(z<32)this.Dd()
+if(z<32)this.PS()
 else this.C2(C.ZB)},
 jy:[function(){},"$0","gb9",0,0,17],
 ie:[function(){},"$0","gxl",0,0,17],
 cZ:function(){return},
 C2:function(a){var z,y
-z=this.LT
+z=this.fk
 if(z==null){z=new P.Qk(null,null,0)
-this.LT=z}z.h(0,a)
+this.fk=z}z.h(0,a)
 y=this.YM
 if((y&64)===0){y=(y|64)>>>0
 this.YM=y
-if(y<128)this.LT.t2(this)}},
+if(y<128)this.fk.t2(this)}},
 MW:function(a){var z=this.YM
 this.YM=(z|32)>>>0
 this.t9.m1(this.dB,a)
 this.YM=(this.YM&4294967263)>>>0
-this.QV((z&4)!==0)},
+this.Iy((z&4)!==0)},
 y7:function(a,b){var z,y
 z=this.YM
 y=new P.x1(this,a,b)
@@ -6681,42 +6683,42 @@
 z=this.Qe
 if(!!J.x(z).$isb8)z.wM(y)
 else y.$0()}else{y.$0()
-this.QV((z&4)!==0)}},
-Dd:function(){var z,y
-z=new P.yP(this)
+this.Iy((z&4)!==0)}},
+PS:function(){var z,y
+z=new P.qB(this)
 this.WN()
 this.YM=(this.YM|16)>>>0
 y=this.Qe
 if(!!J.x(y).$isb8)y.wM(z)
 else z.$0()},
-uz:function(a){var z=this.YM
+Ge:function(a){var z=this.YM
 this.YM=(z|32)>>>0
 a.$0()
 this.YM=(this.YM&4294967263)>>>0
-this.QV((z&4)!==0)},
-QV:function(a){var z,y
-if((this.YM&64)!==0){z=this.LT
+this.Iy((z&4)!==0)},
+Iy:function(a){var z,y
+if((this.YM&64)!==0){z=this.fk
 z=z.gl0(z)}else z=!1
 if(z){z=(this.YM&4294967231)>>>0
 this.YM=z
-if((z&4)!==0)if(z<128){z=this.LT
+if((z&4)!==0)if(z<128){z=this.fk
 z=z==null||z.gl0(z)}else z=!1
 else z=!1
 if(z)this.YM=(this.YM&4294967291)>>>0}for(;!0;a=y){z=this.YM
-if((z&8)!==0){this.LT=null
+if((z&8)!==0){this.fk=null
 return}y=(z&4)!==0
 if(a===y)break
 this.YM=(z^32)>>>0
 if(y)this.jy()
 else this.ie()
 this.YM=(this.YM&4294967263)>>>0}z=this.YM
-if((z&64)!==0&&z<128)this.LT.t2(this)},
+if((z&64)!==0&&z<128)this.fk.t2(this)},
 Cy:function(a,b,c,d,e){var z=this.t9
 this.dB=z.cR(a)
 this.fm(0,b)
-this.EU=z.Al(c==null?P.No():c)},
+this.EU=z.Al(c==null?P.v3():c)},
 $isyX:true,
-static:{"^":"Xx,kMJ,Q9e,Ir9,nav,Dr,JAK,N3S,bsZ",T6:function(a,b,c,d,e){var z,y
+static:{"^":"Xx,kMJ,Q9e,Ir9,nav,lkp,JAK,N3S,bsZ",MG:function(a,b,c,d,e){var z,y
 z=$.X3
 y=d?1:0
 y=H.VM(new P.KA(null,null,null,z,y,null,null),[e])
@@ -6739,7 +6741,7 @@
 else w.m1(u,v)
 z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
-yP:{
+qB:{
 "^":"TpZ:17;a",
 $0:[function(){var z,y
 z=this.a
@@ -6749,15 +6751,15 @@
 z.t9.ww(z.EU)
 z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
-aN:{
-"^":"cb;",
+ezY:{
+"^":"wS;",
 KR:function(a,b,c,d){return this.k0(a,d,c,!0===b)},
 yI:function(a){return this.KR(a,null,null,null)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
-k0:function(a,b,c,d){return P.T6(a,b,c,d,H.u3(this,0))}},
+k0:function(a,b,c,d){return P.MG(a,b,c,d,H.u3(this,0))}},
 fIm:{
 "^":"a;aw@"},
-LV:{
+fZ:{
 "^":"fIm;P>,aw",
 dP:function(a){a.MW(this.P)}},
 Dn:{
@@ -6765,7 +6767,7 @@
 dP:function(a){a.y7(this.kc,this.I4)}},
 yRf:{
 "^":"a;",
-dP:function(a){a.Dd()},
+dP:function(a){a.PS()},
 gaw:function(){return},
 saw:function(a){throw H.b(P.w("No events after a done."))}},
 B3P:{
@@ -6773,17 +6775,17 @@
 t2:function(a){var z=this.YM
 if(z===1)return
 if(z>=1){this.YM=1
-return}P.rb(new P.lg(this,a))
+return}P.rb(new P.CR(this,a))
 this.YM=1},
-b7:function(){if(this.YM===1)this.YM=3}},
-lg:{
+IO:function(){if(this.YM===1)this.YM=3}},
+CR:{
 "^":"TpZ:76;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.YM
 z.YM=0
 if(y===3)return
-z.Ge(this.b)},"$0",null,0,0,null,"call"],
+z.vG(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Qk:{
 "^":"B3P;zR,N6,YM",
@@ -6792,7 +6794,7 @@
 if(z==null){this.N6=b
 this.zR=b}else{z.saw(b)
 this.N6=b}},
-Ge:function(a){var z,y
+vG:function(a){var z,y
 z=this.zR
 y=z.gaw()
 this.zR=y
@@ -6801,25 +6803,26 @@
 V1:function(a){if(this.YM===1)this.YM=3
 this.N6=null
 this.zR=null}},
-EM:{
+to:{
 "^":"a;t9<,YM,EU",
 gUF:function(){return this.YM>=4},
 q1:function(){if((this.YM&2)!==0)return
-this.t9.wr(this.gpx())
+this.t9.wr(this.gKS())
 this.YM=(this.YM|2)>>>0},
 fm:function(a,b){},
 Fv:[function(a,b){this.YM+=4
-if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"zd","$1","$0","gX0",0,2,136,22,137],
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,136,22,137],
 QE:[function(a){var z=this.YM
 if(z>=4){z-=4
 this.YM=z
 if(z<4&&(z&1)===0)this.q1()}},"$0","gDQ",0,0,17],
 Gv:function(){return},
-Dd:[function(){var z=(this.YM&4294967293)>>>0
+PS:[function(){var z=(this.YM&4294967293)>>>0
 this.YM=z
 if(z>=4)return
 this.YM=(z|1)>>>0
-this.t9.ww(this.EU)},"$0","gpx",0,0,17],
+z=this.EU
+if(z!=null)this.t9.ww(z)},"$0","gKS",0,0,17],
 $isyX:true,
 static:{"^":"FkV,ED7,ELg"}},
 ap:{
@@ -6830,12 +6833,12 @@
 "^":"TpZ:138;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
-Ry:{
+QX:{
 "^":"TpZ:76;a,b",
 $0:[function(){return this.a.In(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 og:{
-"^":"cb;",
+"^":"wS;",
 KR:function(a,b,c,d){var z,y,x,w
 b=!0===b
 z=H.W8(this,"og",0)
@@ -6849,29 +6852,29 @@
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
 FC:function(a,b){b.Rg(0,a)},
-$ascb:function(a,b){return[b]}},
+$aswS:function(a,b){return[b]}},
 fB:{
-"^":"KA;HQ,lI,dB,Tv,EU,t9,YM,Qe,LT",
+"^":"KA;m7,lI,dB,Tv,EU,t9,YM,Qe,fk",
 Rg:function(a,b){if((this.YM&2)!==0)return
 P.KA.prototype.Rg.call(this,this,b)},
 MR:function(a,b){if((this.YM&2)!==0)return
 P.KA.prototype.MR.call(this,a,b)},
 jy:[function(){var z=this.lI
 if(z==null)return
-z.zd(0)},"$0","gb9",0,0,17],
+z.WJ(0)},"$0","gb9",0,0,17],
 ie:[function(){var z=this.lI
 if(z==null)return
 z.QE(0)},"$0","gxl",0,0,17],
 cZ:function(){var z=this.lI
 if(z!=null){this.lI=null
 z.Gv()}return},
-Iu:[function(a){this.HQ.FC(a,this)},"$1","gwU",2,0,function(){return H.oZ(function(a,b){return{func:"XJ",void:true,args:[a]}},this.$receiver,"fB")},124],
-wK:[function(a,b){this.MR(a,b)},"$2","gPr",4,0,139,23,24],
-oZ:[function(){this.EC()},"$0","gos",0,0,17],
+Iu:[function(a){this.m7.FC(a,this)},"$1","gwU",2,0,function(){return H.oZ(function(a,b){return{func:"XJ",void:true,args:[a]}},this.$receiver,"fB")},124],
+SW:[function(a,b){this.MR(a,b)},"$2","gPr",4,0,139,23,24],
+oZ:[function(){this.AN()},"$0","gos",0,0,17],
 JC:function(a,b,c,d,e,f,g){var z,y
 z=this.gwU()
 y=this.gPr()
-this.lI=this.HQ.Sb.zC(z,this.gos(),y)},
+this.lI=this.m7.Sb.zC(z,this.gos(),y)},
 $asKA:function(a,b){return[b]},
 $asyX:function(a,b){return[b]}},
 fk:{
@@ -6885,7 +6888,7 @@
 b.MR(y,x)
 return}if(z===!0)J.wx(b,a)},
 $asog:function(a){return[a,a]},
-$ascb:null},
+$aswS:null},
 c9:{
 "^":"og;xj,Sb",
 Eh:function(a){return this.xj.$1(a)},
@@ -6896,11 +6899,11 @@
 x=new H.oP(w,null)
 b.MR(y,x)
 return}J.wx(b,z)}},
-Bgk:{
+AE:{
 "^":"og;yj,Sb",
-hq:function(a){return this.yj.$1(a)},
+bZ:function(a){return this.yj.$1(a)},
 FC:function(a,b){var z,y,x,w,v
-try{for(w=J.mY(this.hq(a));w.G();){z=w.gl()
+try{for(w=J.mY(this.bZ(a));w.G();){z=w.gl()
 J.wx(b,z)}}catch(v){w=H.Ru(v)
 y=w
 x=new H.oP(v,null)
@@ -6910,28 +6913,28 @@
 FC:function(a,b){var z=this.Km
 if(z>0){this.Km=z-1
 return}b.Rg(0,a)},
-qI:function(a,b,c){if(b<0)throw H.b(P.u(b))},
+mh:function(a,b,c){if(b<0)throw H.b(P.u(b))},
 $asog:function(a){return[a,a]},
-$ascb:null},
+$aswS:null},
 kWp:{
 "^":"a;"},
-Ls:{
+Uf:{
 "^":"a;M5,ig>"},
 n7:{
 "^":"a;"},
 yQ:{
-"^":"a;lR,cP,Jl,jH,Ka,Xp,o2,yS,Zqn,ib,JS,nw",
+"^":"a;lR,cP,U1,jH,Ka,Xp,fbF,rb,Zqn,rFb,JS,nw",
 hk:function(a,b){return this.lR.$2(a,b)},
 Gr:function(a){return this.cP.$1(a)},
-FI:function(a,b){return this.Jl.$2(a,b)},
+FI:function(a,b){return this.U1.$2(a,b)},
 mg:function(a,b,c){return this.jH.$3(a,b,c)},
 Al:function(a){return this.Ka.$1(a)},
 cR:function(a){return this.Xp.$1(a)},
-O8:function(a){return this.o2.$1(a)},
-wr:function(a){return this.yS.$1(a)},
-RK:function(a,b){return this.yS.$2(a,b)},
+O8:function(a){return this.fbF.$1(a)},
+wr:function(a){return this.rb.$1(a)},
+RK:function(a,b){return this.rb.$2(a,b)},
 uN:function(a,b){return this.Zqn.$2(a,b)},
-lB:function(a,b){return this.ib.$2(a,b)},
+Ud:function(a,b){return this.rFb.$2(a,b)},
 Ch:function(a,b){return this.JS.$1(b)},
 iT:function(a){return this.nw.$1$specification(a)},
 $isyQ:true},
@@ -6949,8 +6952,8 @@
 "^":"a;",
 fC:function(a){return this.gF7()===a.gF7()},
 $ism0:true},
-FQ:{
-"^":"m0;JY<,W7<,HG<,O5<,kX<,c5<,Of<,x6<,Jy<,kP<,Gt<,pB<,ye,eT>,Se<",
+l7:{
+"^":"m0;JY<,vr<,HG<,Tr<,kX<,c5<,Of<,x6<,Jy<,kP<,uI<,pB<,ye,eT>,Se<",
 gyL:function(){var z=this.ye
 if(z!=null)return z
 z=new P.Id(this)
@@ -6980,12 +6983,12 @@
 else return new P.Yn(this,z)},
 ce:function(a){return this.xi(a,!0)},
 rO:function(a,b){var z=this.cR(a)
-if(b)return new P.CN(this,z)
-else return new P.eP(this,z)},
+if(b)return new P.eP(this,z)
+else return new P.aQ(this,z)},
 mS:function(a){return this.rO(a,!0)},
 PT:function(a,b){var z=this.O8(a)
 if(b)return new P.N9(this,z)
-else return new P.aR(this,z)},
+else return new P.lHf(this,z)},
 t:function(a,b){var z,y,x,w
 z=this.Se
 y=z.t(0,b)
@@ -7000,13 +7003,13 @@
 x=P.Cw(y)
 return z.ig.$5(y,x,this,a,b)},
 c6:function(a,b){var z,y,x
-z=this.Gt
+z=this.uI
 y=z.M5
 x=P.Cw(y)
 return z.ig.$5(y,x,this,a,b)},
 iT:function(a){return this.c6(a,null)},
 Gr:function(a){var z,y,x
-z=this.W7
+z=this.vr
 y=z.M5
 x=P.Cw(y)
 return z.ig.$4(y,x,this,a)},
@@ -7021,7 +7024,7 @@
 x=P.Cw(y)
 return z.ig.$6(y,x,this,a,b,c)},
 Al:function(a){var z,y,x
-z=this.O5
+z=this.Tr
 y=z.M5
 x=P.Cw(y)
 return z.ig.$4(y,x,this,a)},
@@ -7045,7 +7048,7 @@
 y=z.M5
 x=P.Cw(y)
 return z.ig.$5(y,x,this,a,b)},
-lB:function(a,b){var z,y,x
+Ud:function(a,b){var z,y,x
 z=this.Jy
 y=z.M5
 x=P.Cw(y)
@@ -7055,20 +7058,20 @@
 y=z.M5
 x=P.Cw(y)
 return z.ig.$4(y,x,this,b)},
-Ij:function(a,b,c){var z
-this.W7=this.eT.gW7()
+bC:function(a,b,c){var z
+this.vr=this.eT.gvr()
 this.JY=this.eT.gJY()
 this.HG=this.eT.gHG()
 z=b.Ka
-this.O5=z!=null?new P.Ls(this,z):this.eT.gO5()
+this.Tr=z!=null?new P.Uf(this,z):this.eT.gTr()
 z=b.Xp
-this.kX=z!=null?new P.Ls(this,z):this.eT.gkX()
+this.kX=z!=null?new P.Uf(this,z):this.eT.gkX()
 this.c5=this.eT.gc5()
 this.Of=this.eT.gOf()
 this.x6=this.eT.gx6()
 this.Jy=this.eT.gJy()
 this.kP=this.eT.gkP()
-this.Gt=this.eT.gGt()
+this.uI=this.eT.guI()
 this.pB=this.eT.gpB()}},
 OJ:{
 "^":"TpZ:76;a,b",
@@ -7078,11 +7081,11 @@
 "^":"TpZ:76;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
-CN:{
+eP:{
 "^":"TpZ:12;a,b",
 $1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
-eP:{
+aQ:{
 "^":"TpZ:12;c,d",
 $1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
@@ -7090,7 +7093,7 @@
 "^":"TpZ:81;a,b",
 $2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true},
-aR:{
+lHf:{
 "^":"TpZ:81;c,d",
 $2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true},
@@ -7100,20 +7103,20 @@
 $isEH:true},
 R81:{
 "^":"m0;",
-gW7:function(){return C.lk},
+gvr:function(){return C.lk},
 gJY:function(){return C.Yl},
 gHG:function(){return C.Gu},
-gO5:function(){return C.pj},
-gkX:function(){return C.pm},
+gTr:function(){return C.pj},
+gkX:function(){return C.F6},
 gc5:function(){return C.Xk},
 gOf:function(){return C.Zc},
 gx6:function(){return C.Sq},
-gJy:function(){return C.rj},
+gJy:function(){return C.NA},
 gkP:function(){return C.uo},
-gGt:function(){return C.mc},
+guI:function(){return C.mc},
 gpB:function(){return C.Rt},
 geT:function(a){return},
-gSe:function(){return $.wb()},
+gSe:function(){return $.OL()},
 gyL:function(){var z=$.Cb
 if(z!=null)return z
 z=new P.Id(this)
@@ -7147,11 +7150,11 @@
 rO:function(a,b){if(b)return new P.pQ(this,a)
 else return new P.Ky(this,a)},
 mS:function(a){return this.rO(a,!0)},
-PT:function(a,b){if(b)return new P.SJ(this,a)
-else return new P.Ze(this,a)},
+PT:function(a,b){if(b)return new P.Ze(this,a)
+else return new P.dM(this,a)},
 t:function(a,b){return},
 hk:function(a,b){return P.CK(null,null,this,a,b)},
-c6:function(a,b){return P.qc(null,null,this,a,b)},
+c6:function(a,b){return P.E1(null,null,this,a,b)},
 iT:function(a){return this.c6(a,null)},
 Gr:function(a){if($.X3===C.NU)return a.$0()
 return P.Ki(null,null,this,a)},
@@ -7164,7 +7167,7 @@
 O8:function(a){return a},
 wr:function(a){P.ZK(null,null,this,a)},
 uN:function(a,b){return P.YF(a,b)},
-lB:function(a,b){return P.dp(a,b)},
+Ud:function(a,b){return P.dp(a,b)},
 Ch:function(a,b){H.qw(b)},
 static:{"^":"ln,Cb"}},
 hj:{
@@ -7183,25 +7186,25 @@
 "^":"TpZ:12;c,d",
 $1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
-SJ:{
+Ze:{
 "^":"TpZ:81;a,b",
 $2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true},
-Ze:{
+dM:{
 "^":"TpZ:81;c,d",
 $2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
 $isEH:true}}],["","",,P,{
 "^":"",
 EF:function(a,b,c){return H.dJ(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-Ou4:[function(a,b){return J.xC(a,b)},"$2","bUo",4,0,48,49,50],
+TQ:[function(a,b){return J.xC(a,b)},"$2","fc",4,0,48,49,50],
 T9:[function(a){return J.v1(a)},"$1","py",2,0,51,49],
 YM:function(a,b,c,d,e){var z
 if(a==null){z=new P.bA(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
 return z}b=P.py()
 return P.uP(a,b,c,d,e)},
-l1:function(a,b,c,d){return H.VM(new P.Rr(0,null,null,null,null),[d])},
+l1:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
 B4:function(a,b,c){var z,y
 if(P.nH(a)){if(b==="("&&c===")")return"(...)"
 return b+"..."+c}z=[]
@@ -7211,8 +7214,7 @@
 y.pop()}y=P.p9(b)
 y.We(z,", ")
 y.KF(c)
-y=y.IN
-return y.charCodeAt(0)==0?y:y},
+return y.IN},
 WE:function(a,b,c){var z,y
 if(P.nH(a))return b+"..."+c
 z=P.p9(b)
@@ -7220,8 +7222,7 @@
 y.push(a)
 try{z.We(a,", ")}finally{if(0>=y.length)return H.e(y,0)
 y.pop()}z.KF(c)
-y=z.gIN()
-return y.charCodeAt(0)==0?y:y},
+return z.gIN()},
 nH:function(a){var z,y
 for(z=0;y=$.Ex(),z<y.length;++z)if(a===y[z])return!0
 return!1},
@@ -7258,13 +7259,9 @@
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
 b.push(v)},
-L5:function(a,b,c,d,e){var z=new P.YB(0,null,null,null,null,null,0)
-z.$builtinTypeInfo=[d,e]
-return z},
-fM:function(a,b,c,d){var z=new P.D0(0,null,null,null,null,null,0)
-z.$builtinTypeInfo=[d]
-return z},
-fd:function(a,b,c){var z,y,x,w,v
+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.D0(0,null,null,null,null,null,0),[d])},
+Vi:function(a,b,c){var z,y,x,w,v
 z=[]
 y=J.U6(a)
 x=y.gB(a)
@@ -7282,8 +7279,7 @@
 J.Me(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.Ex()
 if(0>=z.length)return H.e(z,0)
-z.pop()}z=y.gIN()
-return z.charCodeAt(0)==0?z:z},
+z.pop()}return y.gIN()},
 bA:{
 "^":"a;X5,Mb,cG,Cs,MV",
 gB:function(a){return this.X5},
@@ -7298,7 +7294,7 @@
 KY:function(a){var z=this.Cs
 if(z==null)return!1
 return this.DF(z[this.rk(a)],a)>=0},
-FV:function(a,b){J.Me(b,new P.DJ(this))},
+FV:function(a,b){J.Me(b,new P.ef(this))},
 t:function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
 if(z==null)y=null
@@ -7329,11 +7325,6 @@
 if(w>=0)x[w+1]=b
 else{x.push(a,b);++this.X5
 this.MV=null}}},
-to:function(a,b,c){var z
-if(this.NZ(0,b))return this.t(0,b)
-z=c.$0()
-this.u(0,b,z)
-return z},
 Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.Mb,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.cG,b)
 else return this.qg(b)},
@@ -7399,7 +7390,7 @@
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
-DJ:{
+ef:{
 "^":"TpZ;a",
 $2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true,
@@ -7623,12 +7614,12 @@
 return!1}else{this.fD=z.gv8(z)
 this.Qx=this.Qx.gtL()
 return!0}}}},
-Rr:{
+jg:{
 "^":"u3T;X5,Mb,cG,Cs,vw",
-iL:function(){var z=new P.Rr(0,null,null,null,null)
+iL:function(){var z=new P.jg(0,null,null,null,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gA:function(a){var z=new P.cN(this,this.Ed(),0,null)
+gA:function(a){var z=new P.cN(this,this.ij(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gB:function(a){return this.X5},
@@ -7645,8 +7636,8 @@
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
-return this.Ix(a)},
-Ix:function(a){var z,y,x
+return this.GP(a)},
+GP:function(a){var z,y,x
 z=this.Cs
 if(z==null)return
 y=z[this.rk(a)]
@@ -7667,7 +7658,7 @@
 x=y}return this.bQ(x,b)}else return this.B7(0,b)},
 B7:function(a,b){var z,y,x
 z=this.Cs
-if(z==null){z=P.Ym()
+if(z==null){z=P.yT()
 this.Cs=z}y=this.rk(b)
 x=z[y]
 if(x==null)z[y]=[b]
@@ -7694,7 +7685,7 @@
 this.cG=null
 this.Mb=null
 this.X5=0}},
-Ed:function(){var z,y,x,w,v,u,t,s,r,q,p,o
+ij:function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.vw
 if(z!=null)return z
 y=Array(this.X5)
@@ -7726,11 +7717,11 @@
 z=a.length
 for(y=0;y<z;++y)if(J.xC(a[y],b))return y
 return-1},
-$isz5:true,
+$isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{Ym:function(){var z=Object.create(null)
+static:{yT:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
@@ -7770,21 +7761,21 @@
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
-else return this.Ix(a)},
-Ix:function(a){var z,y,x
+else return this.GP(a)},
+GP:function(a){var z,y,x
 z=this.Cs
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
 if(x<0)return
-return J.JU(J.UQ(y,x))},
+return J.Nq(J.UQ(y,x))},
 aN:function(a,b){var z,y
 z=this.HH
 y=this.HU
 for(;z!=null;){b.$1(z.gGc(z))
 if(y!==this.HU)throw H.b(P.a4(this))
 z=z.gtL()}},
-gtH:function(a){var z=this.HH
+gqG:function(a){var z=this.HH
 if(z==null)throw H.b(P.w("No elements"))
 return z.gGc(z)},
 grZ:function(a){var z=this.Nz
@@ -7868,9 +7859,9 @@
 DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.xC(J.JU(a[y]),b))return y
+for(y=0;y<z;++y)if(J.xC(J.Nq(a[y]),b))return y
 return-1},
-$isz5:true,
+$isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
@@ -7898,14 +7889,14 @@
 return z[b]}},
 u3T:{
 "^":"Vj5;",
-Oe:function(a){var z=this.iL()
+zH:function(a){var z=this.iL()
 z.FV(0,this)
 return z}},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.W8(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"xPo",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
+ez:[function(a,b){return H.K1(this,b,H.W8(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQO",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
 ad:function(a,b){return H.VM(new H.U5(this,b),[H.W8(this,"mW",0)])},
-yx:[function(a,b){return H.VM(new H.Fm(this,b),[H.W8(this,"mW",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Uj",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.W8(this,"mW",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Uj",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
@@ -7919,14 +7910,13 @@
 y.IN+=x}while(z.G())}else{y.KF(H.d(z.gl()))
 for(;z.G();){y.IN+=b
 x=H.d(z.gl())
-y.IN+=x}}x=y.IN
-return x.charCodeAt(0)==0?x:x},
+y.IN+=x}}return y.IN},
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
 tt:function(a,b){return P.F(this,b,H.W8(this,"mW",0))},
 br:function(a){return this.tt(a,!0)},
-Oe:function(a){var z=P.fM(null,null,null,H.W8(this,"mW",0))
+zH:function(a){var z=P.Ls(null,null,null,H.W8(this,"mW",0))
 z.FV(0,this)
 return z},
 gB:function(a){var z,y
@@ -7935,13 +7925,13 @@
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-eR:function(a,b){return H.p6(this,b,H.W8(this,"mW",0))},
-gtH:function(a){var z=this.gA(this)
-if(!z.G())throw H.b(H.Wp())
+eR:function(a,b){return H.ke(this,b,H.W8(this,"mW",0))},
+gqG:function(a){var z=this.gA(this)
+if(!z.G())throw H.b(H.DU())
 return z.gl()},
 grZ:function(a){var z,y
 z=this.gA(this)
-if(!z.G())throw H.b(H.Wp())
+if(!z.G())throw H.b(H.DU())
 do y=z.gl()
 while(z.G())
 return y},
@@ -7955,8 +7945,8 @@
 $isQV:true,
 $asQV:null},
 ark:{
-"^":"E9h;"},
-E9h:{
+"^":"eD;"},
+eD:{
 "^":"a+lD;",
 $isWO:true,
 $asWO:null,
@@ -7973,7 +7963,7 @@
 if(z!==this.gB(a))throw H.b(P.a4(a))}},
 gl0:function(a){return this.gB(a)===0},
 gor:function(a){return!this.gl0(a)},
-gtH:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
+gqG:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
 return this.t(a,0)},
 grZ:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
 return this.t(a,this.gB(a)-1)},
@@ -7985,15 +7975,14 @@
 z=this.gB(a)
 for(y=0;y<z;++y){if(b.$1(this.t(a,y))===!0)return!0
 if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
-zV:function(a,b){var z,y
+zV:function(a,b){var z
 if(this.gB(a)===0)return""
 z=P.p9("")
 z.We(a,b)
-y=z.IN
-return y.charCodeAt(0)==0?y:y},
+return z.IN},
 ad:function(a,b){return H.VM(new H.U5(a,b),[H.W8(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kYt",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
-yx:[function(a,b){return H.VM(new H.Fm(a,b),[H.W8(a,"lD",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"nf",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"xPo",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
+lM:[function(a,b){return H.VM(new H.oA(a,b),[H.W8(a,"lD",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"nf",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
 eR:function(a,b){return H.c1(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.W8(a,"lD",0)])
@@ -8003,15 +7992,15 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=y}return z},
 br:function(a){return this.tt(a,!0)},
-Oe:function(a){var z,y
-z=P.fM(null,null,null,H.W8(a,"lD",0))
+zH:function(a){var z,y
+z=P.Ls(null,null,null,H.W8(a,"lD",0))
 for(y=0;y<this.gB(a);++y)z.h(0,this.t(a,y))
 return z},
 h:function(a,b){var z=this.gB(a)
 this.sB(a,z+1)
 this.u(a,z,b)},
 FV:function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.lo
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.G();){y=z.Ff
 x=this.gB(a)
 this.sB(a,x+1)
 this.u(a,x,y)}},
@@ -8019,7 +8008,7 @@
 for(z=0;z<this.gB(a);++z)if(J.xC(this.t(a,z),b)){this.YW(a,z,this.gB(a)-1,a,z+1)
 this.sB(a,this.gB(a)-1)
 return!0}return!1},
-uk:function(a,b){P.fd(a,b,!1)},
+uk:function(a,b){P.Vi(a,b,!1)},
 V1:function(a){this.sB(a,0)},
 GT:function(a,b){if(b==null)b=P.n4()
 H.ZE(a,0,this.gB(a)-1,b)},
@@ -8067,7 +8056,7 @@
 for(z=c;z>=0;--z)if(J.xC(this.t(a,z),b))return z
 return-1},
 cn:function(a,b){return this.Pk(a,b,null)},
-aP:function(a,b,c){if(b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
+xe:function(a,b,c){if(b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
 if(b===this.gB(a)){this.h(a,c)
 return}this.sB(a,this.gB(a)+1)
 this.YW(a,b+1,this.gB(a),a,b)
@@ -8107,11 +8096,11 @@
 gB:function(a){return J.q8(this.gvc(this))},
 gl0:function(a){return J.FN(this.gvc(this))},
 gor:function(a){return J.pO(this.gvc(this))},
-gUQ:function(a){return H.VM(new P.NV(this),[H.W8(this,"Yk",1)])},
+gUQ:function(a){return H.VM(new P.wU(this),[H.W8(this,"Yk",1)])},
 bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isT8:true,
 $asT8:null},
-NV:{
+wU:{
 "^":"mW;ZD",
 gB:function(a){var z=this.ZD
 return J.q8(z.gvc(z))},
@@ -8119,10 +8108,10 @@
 return J.FN(z.gvc(z))},
 gor:function(a){var z=this.ZD
 return J.pO(z.gvc(z))},
-gtH:function(a){var z=this.ZD
-return z.t(0,J.Es(z.gvc(z)))},
+gqG:function(a){var z=this.ZD
+return z.t(0,J.bT(z.gvc(z)))},
 grZ:function(a){var z=this.ZD
-return z.t(0,J.OH(z.gvc(z)))},
+return z.t(0,J.MQ(z.gvc(z)))},
 gA:function(a){var z=this.ZD
 z=new P.Uq(J.mY(z.gvc(z)),z,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -8176,9 +8165,9 @@
 z.KF(": ")
 z.KF(b)},"$2",null,4,0,null,141,66,"call"],
 $isEH:true},
-Fw:{
+nd:{
 "^":"mW;E3,QN,Bq,Z1",
-gA:function(a){var z=new P.KG(this,this.Bq,this.Z1,this.QN,null)
+gA:function(a){var z=new P.fO(this,this.Bq,this.Z1,this.QN,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 aN:function(a,b){var z,y,x
@@ -8189,16 +8178,16 @@
 if(z!==this.Z1)H.vh(P.a4(this))}},
 gl0:function(a){return this.QN===this.Bq},
 gB:function(a){return(this.Bq-this.QN&this.E3.length-1)>>>0},
-gtH:function(a){var z,y
+gqG:function(a){var z,y
 z=this.QN
-if(z===this.Bq)throw H.b(H.Wp())
+if(z===this.Bq)throw H.b(H.DU())
 y=this.E3
 if(z>=y.length)return H.e(y,z)
 return y[z]},
 grZ:function(a){var z,y,x
 z=this.QN
 y=this.Bq
-if(z===y)throw H.b(H.Wp())
+if(z===y)throw H.b(H.DU())
 z=this.E3
 x=z.length
 y=(y-1&x-1)>>>0
@@ -8260,7 +8249,7 @@
 bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
 AR:function(){var z,y,x,w
 z=this.QN
-if(z===this.Bq)throw H.b(H.Wp());++this.Z1
+if(z===this.Bq)throw H.b(H.DU());++this.Z1
 y=this.E3
 x=y.length
 if(z>=x)return H.e(y,z)
@@ -8331,14 +8320,12 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"TNe",NZ2:function(a,b){var z=H.VM(new P.Fw(null,0,0,0),[b])
-z.Eo(a,b)
-return z},uay:function(a){var z
+static:{"^":"TNe",uay: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}}}},
-KG:{
+fO:{
 "^":"a;dk,pP,Z1,Dc,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
@@ -8360,7 +8347,7 @@
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(0,z.gl())},
 Ex:function(a){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.lo)},
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();)this.Rz(0,z.Ff)},
 uk:function(a,b){var z,y,x
 z=[]
 for(y=this.gA(this);y.G();){x=y.gl()
@@ -8374,12 +8361,12 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=w}return z},
 br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"UyD",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.u3(this,0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kYt",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
 bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
 ad:function(a,b){var z=new H.U5(this,b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-yx:[function(a,b){return H.VM(new H.Fm(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gba",ret:P.QV,args:[{func:"hTl",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.u3(this,0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gba",ret:P.QV,args:[{func:"hTl",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
 zV:function(a,b){var z,y,x
@@ -8390,22 +8377,21 @@
 y.IN+=x}while(z.G())}else{y.KF(H.d(z.gl()))
 for(;z.G();){y.IN+=b
 x=H.d(z.gl())
-y.IN+=x}}x=y.IN
-return x.charCodeAt(0)==0?x:x},
+y.IN+=x}}return y.IN},
 Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
 return!1},
-eR:function(a,b){return H.p6(this,b,H.u3(this,0))},
-gtH:function(a){var z=this.gA(this)
-if(!z.G())throw H.b(H.Wp())
+eR:function(a,b){return H.ke(this,b,H.u3(this,0))},
+gqG:function(a){var z=this.gA(this)
+if(!z.G())throw H.b(H.DU())
 return z.gl()},
 grZ:function(a){var z,y
 z=this.gA(this)
-if(!z.G())throw H.b(H.Wp())
+if(!z.G())throw H.b(H.DU())
 do y=z.gl()
 while(z.G())
 return y},
-$isz5:true,
+$isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -8417,7 +8403,7 @@
 jp:{
 "^":"oz;P*,nl,Bb,T8",
 $asoz:function(a,b){return[a]}},
-Xt:{
+vX1:{
 "^":"a;",
 oB:function(a){var z,y,x,w,v,u,t,s
 z=this.VR
@@ -8477,7 +8463,7 @@
 a.Bb=y.Bb
 y.Bb=null}this.VR=a}},
 Ba:{
-"^":"Xt;V2s,z4,VR,fu,hm,Z1,wq",
+"^":"vX1;V2s,z4,VR,fu,hm,Z1,wq",
 L4:function(a,b){return this.V2s.$2(a,b)},
 Bc:function(a){return this.z4.$1(a)},
 R2:function(a,b){return this.L4(a,b)},
@@ -8495,13 +8481,13 @@
 z=this.oB(b)
 if(J.xC(z,0)){this.VR.P=c
 return}this.Oa(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
-FV:function(a,b){H.bQ(b,new P.pn(this))},
+FV:function(a,b){H.bQ(b,new P.QG(this))},
 gl0:function(a){return this.VR==null},
 gor:function(a){return this.VR!=null},
 aN:function(a,b){var z,y,x
 z=H.u3(this,0)
 y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.Z1,this.wq,null),[z])
-y.ls(this,[P.oz,z])
+y.Dd(this,[P.oz,z])
 for(;y.G();){x=y.gl()
 z=J.RE(x)
 b.$2(z.gnl(x),z.gP(x))}},
@@ -8515,7 +8501,7 @@
 return z},
 bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 $isBa:true,
-$asXt:function(a,b){return[a]},
+$asvX1:function(a,b){return[a]},
 $asT8:null,
 $isT8:true,
 static:{GV:function(a,b,c,d){var z,y
@@ -8527,7 +8513,7 @@
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
-pn:{
+QG:{
 "^":"TpZ;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
@@ -8541,7 +8527,7 @@
 for(z=this.x5;a!=null;){z.push(a)
 a=a.Bb}},
 G:function(){var z,y,x
-z=this.xp
+z=this.OC
 if(this.Z1!==z.Z1)throw H.b(P.a4(z))
 y=this.x5
 if(y.length===0){this.Ju=null
@@ -8554,16 +8540,16 @@
 this.Ju=z
 this.Zq(z.T8)
 return!0},
-ls:function(a,b){this.Zq(a.VR)}},
+Dd:function(a,b){this.Zq(a.VR)}},
 nF:{
-"^":"mW;xp",
-gB:function(a){return this.xp.hm},
-gl0:function(a){return this.xp.hm===0},
+"^":"mW;OC",
+gB:function(a){return this.OC.hm},
+gl0:function(a){return this.OC.hm===0},
 gA:function(a){var z,y
-z=this.xp
+z=this.OC
 y=new P.DN(z,H.VM([],[P.oz]),z.Z1,z.wq,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.ls(z,H.u3(this,0))
+y.Dd(z,H.u3(this,0))
 return y},
 $isyN:true},
 JO:{
@@ -8574,20 +8560,20 @@
 z=this.ZD
 y=new P.ZM(z,H.VM([],[P.oz]),z.Z1,z.wq,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.ls(z,H.u3(this,1))
+y.Dd(z,H.u3(this,1))
 return y},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 $isyN:true},
 DN:{
-"^":"S6B;xp,x5,Z1,wq,Ju",
+"^":"S6B;OC,x5,Z1,wq,Ju",
 Gf:function(a){return a.nl}},
 ZM:{
-"^":"S6B;xp,x5,Z1,wq,Ju",
+"^":"S6B;OC,x5,Z1,wq,Ju",
 Gf:function(a){return a.P},
 $asS6B:function(a,b){return[b]}},
 HW:{
-"^":"S6B;xp,x5,Z1,wq,Ju",
+"^":"S6B;OC,x5,Z1,wq,Ju",
 Gf:function(a){return a},
 $asS6B:function(a){return[[P.oz,a]]}}}],["","",,P,{
 "^":"",
@@ -8604,7 +8590,7 @@
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.rr(String(y),null,null))}if(b==null)return P.KH(z)
+throw H.b(P.cD(String(y),null,null))}if(b==null)return P.KH(z)
 else return P.VQ(z,b)},
 tp:[function(a){return a.Lt()},"$1","Jn",2,0,52,0],
 f1:{
@@ -8642,16 +8628,16 @@
 gvc:function(a){var z
 if(this.LK==null){z=this.Mq
 return z.gvc(z)}z=this.oD()
-return H.c1(z,0,null,H.u3(H.VM(new H.TNQ(),[H.u3(z,0)]),0))},
+return H.c1(z,0,null,H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0))},
 gUQ:function(a){var z
 if(this.LK==null){z=this.Mq
-return z.gUQ(z)}return H.K1(this.oD(),new P.Ni(this),null,null)},
+return z.gUQ(z)}return H.K1(this.oD(),new P.A5(this),null,null)},
 u:function(a,b,c){var z,y
 if(this.LK==null)this.Mq.u(0,b,c)
 else if(this.NZ(0,b)){z=this.LK
 z[b]=c
 y=this.PF
-if(y==null?z!=null:y!==z)y[b]=null}else this.XK().u(0,b,c)},
+if(y==null?z!=null:y!==z)y[b]=null}else this.tZ().u(0,b,c)},
 FV:function(a,b){H.bQ(b,new P.E5(this))},
 NZ:function(a,b){if(this.LK==null)return this.Mq.NZ(0,b)
 if(typeof b!=="string")return!1
@@ -8662,11 +8648,11 @@
 this.u(0,b,z)
 return z},
 Rz:function(a,b){if(this.LK!=null&&!this.NZ(0,b))return
-return this.XK().Rz(0,b)},
+return this.tZ().Rz(0,b)},
 V1:function(a){var z
 if(this.LK==null)this.Mq.V1(0)
 else{z=this.Mq
-if(z!=null)J.U2(z)
+if(z!=null)J.Z8(z)
 this.LK=null
 this.PF=null
 this.Mq=P.Fl(null,null)}},
@@ -8682,7 +8668,7 @@
 oD:function(){var z=this.Mq
 if(z==null){z=Object.keys(this.PF)
 this.Mq=z}return z},
-XK:function(){var z,y,x,w,v
+tZ:function(){var z,y,x,w,v
 if(this.LK==null)return this.Mq
 z=P.Fl(null,null)
 y=this.oD()
@@ -8701,7 +8687,7 @@
 $asFo:function(){return[null,null]},
 $isT8:true,
 $asT8:function(){return[null,null]}},
-Ni:{
+A5:{
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
@@ -8709,41 +8695,41 @@
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
-Ukr:{
+Uk:{
 "^":"a;"},
 wIe:{
 "^":"a;"},
 Ziv:{
-"^":"Ukr;",
-$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
+"^":"Uk;",
+$asUk:function(){return[P.qU,[P.WO,P.KN]]}},
 Ud:{
 "^":"XS;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."},"$0","gCR",0,0,73],
-static:{Gy:function(a,b){return new P.Ud(a,b)}}},
+static:{NM:function(a,b){return new P.Ud(a,b)}}},
 K8:{
 "^":"Ud;Ct,FN",
 bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gCR",0,0,73],
 static:{ko:function(a){return new P.K8(a,null)}}},
 byg:{
-"^":"Ukr;J2<,xq",
-cW:function(a,b){return P.jc(a,this.gJh().J2)},
-kV:function(a){return this.cW(a,null)},
-Co:function(a,b){var z=this.gZE()
+"^":"Uk;Fs<,Ha",
+cW:function(a,b){return P.jc(a,this.gP1().Fs)},
+iQ:function(a){return this.cW(a,null)},
+N7:function(a,b){var z=this.gZE()
 return P.Vg(a,z.Wl,z.UM)},
-KP:function(a){return this.Co(a,null)},
-gZE:function(){return C.Sr},
-gJh:function(){return C.A3},
-$asUkr:function(){return[P.a,P.qU]}},
+KP:function(a){return this.N7(a,null)},
+gZE:function(){return C.cb},
+gP1:function(){return C.A3},
+$asUk:function(){return[P.a,P.qU]}},
 ojF:{
 "^":"wIe;UM,Wl",
 $aswIe:function(){return[P.a,P.qU]}},
-Mx:{
-"^":"wIe;J2<",
+c5:{
+"^":"wIe;Fs<",
 $aswIe:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;xq,qR,SK",
-HT:function(a){return this.xq.$1(a)},
+"^":"a;Ha,qR,SK",
+HT:function(a){return this.Ha.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
@@ -8797,15 +8783,15 @@
 rl:function(a){var z,y,x,w
 if(!this.Jc(a)){this.WD(a)
 try{z=this.HT(a)
-if(!this.Jc(z)){x=P.Gy(a,null)
+if(!this.Jc(z)){x=P.NM(a,null)
 throw H.b(x)}x=this.SK
 if(0>=x.length)return H.e(x,0)
 x.pop()}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.Gy(a,y))}}},
+throw H.b(P.NM(a,y))}}},
 Jc:function(a){var z,y,x,w
 z={}
-if(typeof a==="number"){if(!C.CD.gx8(a))return!1
+if(typeof a==="number"){if(!C.CD.gzr(a))return!1
 this.qR.KF(C.CD.bu(a))
 return!0}else if(a===!0){this.qR.KF("true")
 return!0}else if(a===!1){this.qR.KF("false")
@@ -8833,12 +8819,11 @@
 E5:function(a){var z=this.SK
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"Gsm,hyY,IE,Jyf,fc,HVe,Wk,BLm,vk,i6A,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z,y
+static:{"^":"Gsm,hyY,Ta6,Jyf,No,HVe,Wk,BLm,vk,i6A,mrt,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
 b=P.Jn()
 z=P.p9("")
 P.xl(z,b,c).rl(a)
-y=z.IN
-return y.charCodeAt(0)==0?y:y}}},
+return z.IN}}},
 tF:{
 "^":"TpZ:82;a,b",
 $2:[function(a,b){var z,y,x
@@ -8852,19 +8837,21 @@
 z.rl(b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true},
 u5F:{
-"^":"Ziv;ns",
+"^":"Ziv;QA",
 goc:function(a){return"utf-8"},
-gZE:function(){return new P.E3()}},
-E3:{
+gZE:function(){return new P.om()}},
+om:{
 "^":"wIe;",
-WJ:function(a){var z,y,x
+Sw:function(a){var z,y,x
 z=J.U6(a)
 y=J.vX(z.gB(a),3)
-if(typeof y!=="number"||Math.floor(y)!==y)H.vh(P.u("Invalid length "+H.d(y)))
-y=new Uint8Array(y)
+if(typeof y!=="number")return H.s(y)
+y=Array(y)
+y.fixed$length=init
+y=H.VM(y,[P.KN])
 x=new P.Rw(0,0,y)
 if(x.Gx(a,0,z.gB(a))!==z.gB(a))x.O6(z.j(a,J.bI(z.gB(a),1)),0)
-return C.Jm.aM(y,0,x.o9)},
+return C.Nm.aM(y,0,x.o9)},
 $aswIe:function(){return[P.qU,[P.WO,P.KN]]}},
 Rw:{
 "^":"a;UfS,o9,Zj",
@@ -8936,19 +8923,18 @@
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}},
 GY:{
-"^":"wIe;ns",
-WJ:function(a){var z,y,x
+"^":"wIe;QA",
+Sw:function(a){var z,y
 z=P.p9("")
-y=new P.Dd(this.ns,z,!0,0,0,0)
+y=new P.Dd(this.QA,z,!0,0,0,0)
 y.ME(a,0,J.q8(a))
 y.fZ()
-x=z.IN
-return x.charCodeAt(0)==0?x:x},
+return z.IN},
 $aswIe:function(){return[[P.WO,P.KN],P.qU]}},
 Dd:{
-"^":"a;ns,C4,YN,Dp,rw,pt",
+"^":"a;QA,C4,YN,Dp,rw,pt",
 xO:function(a){this.fZ()},
-fZ:function(){if(this.rw>0){if(!this.ns)throw H.b(P.rr("Unfinished UTF-8 octet sequence",null,null))
+fZ:function(){if(this.rw>0){if(this.QA!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence",null,null))
 this.C4.KF(H.mx(65533))
 this.Dp=0
 this.rw=0
@@ -8962,10 +8948,10 @@
 this.pt=0
 w=new P.wh(c)
 v=new P.yn(this,a,b,c)
-$loop$0:for(u=this.C4,t=!this.ns,s=J.U6(a),r=b;!0;r=n){$multibyte$2:{if(y>0){do{if(r===c)break $loop$0
+$loop$0:for(u=this.C4,t=this.QA!==!0,s=J.U6(a),r=b;!0;r=n){$multibyte$2:{if(y>0){do{if(r===c)break $loop$0
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.i(q,192)!==128){if(t)throw H.b(P.rr("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
 this.YN=!1
 p=H.mx(65533)
 u.IN+=p
@@ -8973,10 +8959,10 @@
 break $multibyte$2}else{z=(z<<6|p.i(q,63))>>>0;--y;++r}}while(y>0)
 p=x-1
 if(p<0||p>=4)return H.e(C.Gb,p)
-if(z<=C.Gb[p]){if(t)throw H.b(P.rr("Overlong encoding of 0x"+C.jn.WZ(z,16),null,null))
+if(z<=C.Gb[p]){if(t)throw H.b(P.cD("Overlong encoding of 0x"+C.jn.WZ(z,16),null,null))
 z=65533
 y=0
-x=0}if(z>1114111){if(t)throw H.b(P.rr("Character outside valid Unicode range: 0x"+C.jn.WZ(z,16),null,null))
+x=0}if(z>1114111){if(t)throw H.b(P.cD("Character outside valid Unicode range: 0x"+C.jn.WZ(z,16),null,null))
 z=65533}if(!this.YN||z!==65279){p=H.mx(z)
 u.IN+=p}this.YN=!1}}for(;r<c;r=n){o=w.$2(a,r)
 if(J.xZ(o,0)){this.YN=!1
@@ -8987,7 +8973,7 @@
 r=n}n=r+1
 q=s.t(a,r)
 p=J.Wx(q)
-if(p.C(q,0)){if(t)throw H.b(P.rr("Negative UTF-8 code unit: -0x"+J.u1(p.J(q),16),null,null))
+if(p.C(q,0)){if(t)throw H.b(P.cD("Negative UTF-8 code unit: -0x"+J.u1(p.J(q),16),null,null))
 p=H.mx(65533)
 u.IN+=p}else{if(p.i(q,224)===192){z=p.i(q,31)
 y=1
@@ -8998,7 +8984,7 @@
 continue $loop$0}if(p.i(q,248)===240&&p.C(q,245)){z=p.i(q,7)
 y=3
 x=3
-continue $loop$0}if(t)throw H.b(P.rr("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
 this.YN=!1
 p=H.mx(65533)
 u.IN+=p
@@ -9021,8 +9007,8 @@
 z=a===0&&b===J.q8(this.c)
 y=this.b
 x=this.c
-if(z)y.C4.KF(P.nB(x))
-else y.C4.KF(P.nB(J.Fd(x,a,b)))},
+if(z)y.C4.KF(P.HM(x))
+else y.C4.KF(P.HM(J.Fd(x,a,b)))},
 $isEH:true}}],["","",,P,{
 "^":"",
 Te:function(a){return},
@@ -9044,7 +9030,7 @@
 else{w=H.mx(v)
 w=z.IN+=w}}y=w+"\""
 z.IN=y
-return y.charCodeAt(0)==0?y:y}return"Instance of '"+H.lh(a)+"'"},
+return y}return"Instance of '"+H.lh(a)+"'"},
 eG:function(a){return new P.HG(a)},
 kC:[function(a,b){return a==null?b==null:a===b},"$2","XK",4,0,54],
 xvm:[function(a){return H.CU(a)},"$1","mbf",2,0,55],
@@ -9059,7 +9045,7 @@
 y=$.oK
 if(y==null)H.qw(z)
 else y.$1(z)},
-nB:function(a){return H.LY(a.constructor!==Array?P.F(a,!0,null):a)},
+HM:function(a){return H.eT(a.constructor!==Array?P.F(a,!0,null):a)},
 Y25:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.u(0,a.gOB(a),b)},
@@ -9097,14 +9083,14 @@
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
 else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gCR",0,0,73],
 h:function(a,b){return P.Wu(J.WB(this.rq,b.gVs()),this.aL)},
-gX3:function(){return H.KL(this)},
-gcO:function(){return H.ch(this)},
-gIv:function(){return H.Sw(this)},
+gGt:function(){return H.KL(this)},
+gS6:function(){return H.ch(this)},
+gBM:function(){return H.Sw(this)},
 EK:function(){H.o2(this)},
 RM:function(a,b){if(J.xZ(J.yH(a),8640000000000000))throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"bS,Vp,Eu,p2W,h2,QC3,EQe,NXt,tp1,Gio,zM3,cRS,E03,KeL,Cgd,NrX,bmS,o4I,T3F,ek0,yfk,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("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.Vq("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
+static:{"^":"Oj2,Vp,dfk,p2W,oXf,QC3,EQe,NXt,tp1,Gio,zM3,cRS,E03,KeL,Cgd,NrX,LD,o4I,T3F,ek0,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z=new H.VR("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
 if(z!=null){y=new P.ci()
 x=z.pX
 if(1>=x.length)return H.e(x,1)
@@ -9120,7 +9106,7 @@
 if(6>=x.length)return H.e(x,6)
 r=y.$1(x[6])
 if(7>=x.length)return H.e(x,7)
-q=J.NQ(J.vX(new P.Rq().$1(x[7]),1000))
+q=J.Dv(J.vX(new P.Rq().$1(x[7]),1000))
 if(q===1000){p=!0
 q=999}else p=!1
 o=x.length
@@ -9137,8 +9123,8 @@
 if(typeof l!=="number")return H.s(l)
 s=J.bI(s,n*l)}k=!0}else k=!1
 j=H.fu(w,v,u,t,s,r,q,k)
-if(j==null)throw H.b(P.rr("Time out of range",a,null))
-return P.Wu(p?j+1:j,k)}else throw H.b(P.rr("Invalid date format",a,null))},Wu:function(a,b){var z=new P.iP(a,b)
+if(j==null)throw H.b(P.cD("Time out of range",a,null))
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD("Invalid date format",a,null))},Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
 return z},Gq:function(a){var z,y
 z=Math.abs(a)
@@ -9160,9 +9146,9 @@
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
-CP:{
-"^":"FK;",
-$isCP:true},
+Vf:{
+"^":"lf;",
+$isVf:true},
 "+double":0,
 a6:{
 "^":"a;m5<",
@@ -9194,7 +9180,7 @@
 Vy:function(a){return P.ii(0,0,Math.abs(this.m5),0,0,0)},
 J:function(a){return P.ii(0,0,-this.m5,0,0,0)},
 $isa6:true,
-static:{"^":"Bp7,S4d,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,Wr,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"Bp7,zi,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,VkA,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
 "^":"TpZ:14;",
 $1:function(a){if(a>=100000)return H.d(a)
@@ -9240,7 +9226,7 @@
 if(x<0)return H.e(y,x)
 u=P.hl(y[x])
 v.IN+=typeof u==="string"?u:H.d(u)}this.ae.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+this.vI.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+H.d(z.a)+"]"},"$0","gCR",0,0,73],
+return"NoSuchMethodError : method not found: '"+this.vI.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.IN+"]"},"$0","gCR",0,0,73],
 $isJS:true,
 static:{lr:function(a,b,c,d,e){return new P.JS(a,b,c,d,e)}}},
 ub:{
@@ -9324,7 +9310,7 @@
 l=""}k=z.Nj(w,n,o)
 if(typeof n!=="number")return H.s(n)
 return y+m+k+l+"\n"+C.yo.U(" ",x-n+m.length)+"^\n"},"$0","gCR",0,0,73],
-static:{rr:function(a,b,c){return new P.oe(a,b,c)}}},
+static:{cD:function(a,b,c){return new P.oe(a,b,c)}}},
 eV:{
 "^":"a;",
 bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gCR",0,0,73],
@@ -9332,13 +9318,13 @@
 qo:{
 "^":"a;oc>",
 bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gCR",0,0,73],
-t:function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.V2())},
-u:function(a,b,c){var z=H.of(b,"expando$values")
+t:function(a,b){var z=H.vA(b,"expando$values")
+return z==null?null:H.vA(z,this.V2())},
+u:function(a,b,c){var z=H.vA(b,"expando$values")
 if(z==null){z=new P.a()
 H.wV(b,"expando$values",z)}H.wV(z,this.V2(),c)},
 V2:function(){var z,y
-z=H.of(this,"expando$key")
+z=H.vA(this,"expando$key")
 if(z==null){y=$.Km
 $.Km=y+1
 z="expando$key$"+y
@@ -9348,7 +9334,7 @@
 "^":"a;",
 $isEH:true},
 KN:{
-"^":"FK;",
+"^":"lf;",
 $isKN:true},
 "+int":0,
 QV:{
@@ -9373,9 +9359,9 @@
 "^":"a;",
 bu:[function(a){return"null"},"$0","gCR",0,0,73]},
 "+Null":0,
-FK:{
+lf:{
 "^":"a;",
-$isFK:true},
+$islf:true},
 "+num":0,
 a:{
 "^":";",
@@ -9388,15 +9374,15 @@
 Od:{
 "^":"a;",
 $isOd:true},
-z5:{
+Ol:{
 "^":"mW;",
-$isz5:true,
+$isOl:true,
 $isyN:true},
 BpP:{
 "^":"a;"},
 VV:{
 "^":"a;n2,Mw",
-wE:function(a){var z,y
+D5:function(a){var z,y
 z=this.n2==null
 if(!z&&this.Mw==null)return
 y=$.hG
@@ -9418,17 +9404,17 @@
 "^":"a;",
 $isqU:true},
 "+String":0,
-Kg:{
-"^":"a;Y4,R7,So,ft",
+hM:{
+"^":"a;Y4,R0,So,ft",
 gl:function(){return this.ft},
 G:function(){var z,y,x,w,v,u
 z=this.So
-this.R7=z
+this.R0=z
 y=this.Y4
 x=J.U6(y)
 if(z===x.gB(y)){this.ft=null
-return!1}w=x.j(y,this.R7)
-v=this.R7+1
+return!1}w=x.j(y,this.R0)
+v=this.R0+1
 if((w&64512)===55296&&v<x.gB(y)){u=x.j(y,v)
 if((u&64512)===56320){this.So=v+1
 this.ft=65536+((w&1023)<<10>>>0)+(u&1023)
@@ -9450,8 +9436,7 @@
 y=z.gl()
 this.IN+=typeof y==="string"?y:H.d(y)}}},
 V1:function(a){this.IN=""},
-bu:[function(a){var z=this.IN
-return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,73],
+bu:[function(a){return this.IN},"$0","gCR",0,0,73],
 PD:function(a){if(typeof a==="string")this.IN=a
 else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
@@ -9464,27 +9449,23 @@
 "^":"a;",
 $isLz:true},
 q5:{
-"^":"a;Kk,Ni,Ee,Fi,ku,xu,ys,o6,nO",
-gJf:function(a){var z,y
-z=this.Kk
+"^":"a;Kk,QB,Ee,Fi,ku,xu,ys,o6,nO",
+gJf:function(a){var z=this.Kk
 if(z==null)return""
-y=J.Qe(z)
-if(y.nC(z,"["))return y.Nj(z,1,J.bI(y.gB(z),1))
+if(J.Qe(z).nC(z,"["))return C.yo.Nj(z,1,z.length-1)
 return z},
-gtp:function(a){var z=this.Ni
-if(z==null)return P.SN(this.Fi)
+gtp:function(a){var z=this.QB
+if(z==null)return P.Co(this.Fi)
 return z},
 gIi:function(a){return this.Ee},
-Bs:function(a,b){var z=J.x(a)
-if(z.n(a,""))return"/"+H.d(b)
-return z.Nj(a,0,z.cn(a,"/")+1)+H.d(b)},
-jI:function(a){var z=J.U6(a)
-if(J.xZ(z.gB(a),0)&&z.j(a,0)===58)return!0
-return z.OY(a,"/.")!==-1},
-mE:function(a){var z,y,x,w,v
+pi:function(a,b){if(a==="")return"/"+b
+return C.yo.Nj(a,0,C.yo.cn(a,"/")+1)+b},
+jI:function(a){if(a.length>0&&C.yo.j(a,0)===58)return!0
+return C.yo.OY(a,"/.")!==-1},
+jn:function(a){var z,y,x,w,v
 if(!this.jI(a))return a
 z=[]
-for(y=J.BQ(a,"/"),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(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.u3(y,0)]),x=!1;y.G();){w=y.Ff
 if(J.xC(w,"..")){v=z.length
 if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
 v=!J.xC(z[0],"")}else v=!0
@@ -9500,38 +9481,38 @@
 if(""!==y){z.KF(y)
 z.KF(":")}x=this.Kk
 w=x==null
-if(!w||J.co(this.Ee,"//")||y==="file"){z.KF("//")
+if(!w||C.yo.nC(this.Ee,"//")||y==="file"){z.KF("//")
 y=this.ku
-if(J.pO(y)){z.KF(y)
+if(C.yo.gor(y)){z.KF(y)
 z.KF("@")}if(!w)z.KF(x)
-y=this.Ni
+y=this.QB
 if(y!=null){z.KF(":")
 z.KF(y)}}z.KF(this.Ee)
 y=this.xu
 if(y!=null){z.KF("?")
 z.KF(y)}y=this.ys
 if(y!=null){z.KF("#")
-z.KF(y)}y=z.IN
-return y.charCodeAt(0)==0?y:y},"$0","gCR",0,0,73],
+z.KF(y)}return z.IN},"$0","gCR",0,0,73],
 n:function(a,b){var z,y,x,w
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isq5)return!1
-if(this.Fi===b.Fi)if(this.Kk!=null===(b.Kk!=null))if(J.xC(this.ku,b.ku))if(J.xC(this.gJf(this),z.gJf(b))){y=this.gtp(this)
+if(this.Fi===b.Fi)if(this.Kk!=null===(b.Kk!=null))if(this.ku===b.ku){y=this.gJf(this)
+x=z.gJf(b)
+if(y==null?x==null:y===x){y=this.gtp(this)
 z=z.gtp(b)
-if(y==null?z==null:y===z)if(J.xC(this.Ee,b.Ee)){z=this.xu
+if(y==null?z==null:y===z)if(this.Ee===b.Ee){z=this.xu
 y=z==null
 x=b.xu
 w=x==null
 if(!y===!w){if(y)z=""
-if(J.xC(z,w?"":x)){z=this.ys
+if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.ys
 y=z==null
 x=b.ys
 w=x==null
 if(!y===!w){if(y)z=""
-z=J.xC(z,w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
-else z=!1}else z=!1
-else z=!1
+z=z==null?(w?"":x)==null:z===(w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
+else z=!1}else z=!1}else z=!1
 else z=!1
 else z=!1
 return z},
@@ -9544,7 +9525,7 @@
 v=this.ys
 return z.$2(this.Fi,z.$2(this.ku,z.$2(y,z.$2(x,z.$2(this.Ee,z.$2(w,z.$2(v==null?"":v,1)))))))},
 $isq5:true,
-static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,tC,GpR,Q5W,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,OP,Qxt,Vho,WTp,Hiw,H5,zst,VFG,xF,SpW,GPf,JA7,iTk,Uo0,wo,SQU,rvM,fbQ",SN:function(a){if(a==="http")return 80
+static:{"^":"QqF,q7,tvi,uCX,zk,ilf,tC,GpR,Q5W,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,OP,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo,yw1,SQU,rvM,fbQ",Co:function(a){if(a==="http")return 80
 if(a==="https")return 443
 return 0},hK:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z={}
@@ -9565,7 +9546,7 @@
 x=0
 break}if(u===47){x=v===0?2:1
 y=0
-break}if(u===58){if(v===0)P.Xz(a,0,"Invalid empty scheme")
+break}if(u===58){if(v===0)P.iV(a,0,"Invalid empty scheme")
 z.a=P.iy(a,v);++v
 if(v===w){z.f=-1
 x=0}else{if(v>=w)H.vh(P.N(v))
@@ -9590,69 +9571,73 @@
 if(u===63||u===35)break
 z.f=-1}s=z.a
 r=z.c
-q=P.re(a,y,z.e,null,r!=null,s==="file")
+q=P.qd(a,y,z.e,null,r!=null,s==="file")
 s=z.f
 if(s===63){p=C.yo.XU(a,"#",z.e+1)
 s=z.e+1
 if(p<0){o=P.AN(a,s,w,null)
 n=null}else{o=P.AN(a,s,p,null)
-n=P.o6(a,p+1,w)}}else{n=s===35?P.o6(a,z.e+1,w):null
+n=P.jr(a,p+1,w)}}else{n=s===35?P.jr(a,z.e+1,w):null
 o=null}w=z.a
 s=z.b
-return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},Xz:function(a,b,c){throw H.b(P.rr(c,a,b))},Ec:function(a,b){if(a!=null&&a===P.SN(b))return
+return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},iV:function(a,b,c){throw H.b(P.cD(c,a,b))},JF:function(a,b){if(a!=null&&a===P.Co(b))return
 return a},L7:function(a,b,c,d){var z,y
 if(a==null)return
 if(b===c)return""
 if(C.yo.j(a,b)===91){z=c-1
-if(C.yo.j(a,z)!==93)P.Xz(a,b,"Missing end `]` to match `[` in host")
+if(C.yo.j(a,z)!==93)P.iV(a,b,"Missing end `]` to match `[` in host")
 P.eg(a,b+1,z)
 return C.yo.Nj(a,b,c).toLowerCase()}if(!d)for(z=a.length,y=b;y<c;++y){if(y<0)H.vh(P.N(y))
 if(y>=z)H.vh(P.N(y))
 if(a.charCodeAt(y)===58){P.eg(a,b,c)
-return"["+a+"]"}}return P.WU(a,b,c)},WU:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
-for(z=a.length,y=b,x=y,w=null,v=!0;y<c;){if(y<0)H.vh(P.N(y))
-if(y>=z)H.vh(P.N(y))
-u=a.charCodeAt(y)
-if(u===37){t=P.Yi(a,y,!0)
-s=t==null
-if(s&&v){y+=3
-continue}if(w==null){w=new P.Rn("")
-w.IN=""}r=C.yo.Nj(a,x,y)
-if(!v)r=r.toLowerCase()
-w.IN=w.IN+r
-if(s){t=C.yo.Nj(a,y,y+3)
-q=3}else if(t==="%"){t="%25"
-q=1}else q=3
-w.IN+=t
-y+=q
-x=y
-v=!0}else{if(u<127){s=u>>>4
-if(s>=8)return H.e(C.aa,s)
-s=(C.aa[s]&C.jn.iK(1,u&15))!==0}else s=!1
-if(s){if(v&&65<=u&&90>=u){if(w==null){w=new P.Rn("")
-w.IN=""}if(x<y){s=C.yo.Nj(a,x,y)
-w.IN=w.IN+s
-x=y}v=!1}++y}else{if(u<=93){s=u>>>4
-if(s>=8)return H.e(C.rz,s)
-s=(C.rz[s]&C.jn.iK(1,u&15))!==0}else s=!1
-if(s)P.Xz(a,y,"Invalid character")
-else{if((u&64512)===55296&&y+1<c){s=y+1
-if(s<0)H.vh(P.N(s))
-if(s>=z)H.vh(P.N(s))
-p=a.charCodeAt(s)
+return"["+a+"]"}}return P.cq(a,b,c)},cq:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+for(z=b,y=z,x=null,w=!0;z<c;){a.toString
+if(z<0)H.vh(P.N(z))
+v=a.length
+if(z>=v)H.vh(P.N(z))
+u=a.charCodeAt(z)
+if(u===37){t=P.Yi(a,z,!0)
+v=t==null
+if(v&&w){z+=3
+continue}if(x==null){x=new P.Rn("")
+x.IN=""}s=C.yo.Nj(a,y,z)
+if(!w)s=s.toLowerCase()
+x.toString
+x.IN=x.IN+s
+if(v){t=C.yo.Nj(a,z,z+3)
+r=3}else if(t==="%"){t="%25"
+r=1}else r=3
+x.IN+=t
+z+=r
+y=z
+w=!0}else{if(u<127){q=u>>>4
+if(q>=8)return H.e(C.aa,q)
+q=(C.aa[q]&C.jn.iK(1,u&15))!==0}else q=!1
+if(q){if(w&&65<=u&&90>=u){if(x==null){x=new P.Rn("")
+x.IN=""}if(y<z){v=C.yo.Nj(a,y,z)
+x.toString
+x.IN=x.IN+v
+y=z}w=!1}++z}else{if(u<=93){q=u>>>4
+if(q>=8)return H.e(C.rz,q)
+q=(C.rz[q]&C.jn.iK(1,u&15))!==0}else q=!1
+if(q)P.iV(a,z,"Invalid character")
+else{if((u&64512)===55296&&z+1<c){q=z+1
+if(q<0)H.vh(P.N(q))
+if(q>=v)H.vh(P.N(q))
+p=a.charCodeAt(q)
 if((p&64512)===56320){u=(65536|(u&1023)<<10|p&1023)>>>0
-q=2}else q=1}else q=1
-if(w==null){w=new P.Rn("")
-w.IN=""}r=C.yo.Nj(a,x,y)
-if(!v)r=r.toLowerCase()
-w.IN=w.IN+r
-s=P.xo(u)
-w.IN+=s
-y+=q
-x=y}}}}if(w==null)return C.yo.Nj(a,b,c)
-if(x<c){r=C.yo.Nj(a,x,c)
-w.KF(!v?r.toLowerCase():r)}z=w.IN
-return z.charCodeAt(0)==0?z:z},iy:function(a,b){var z,y,x,w,v,u,t,s
+r=2}else r=1}else r=1
+if(x==null){x=new P.Rn("")
+x.IN=""}s=C.yo.Nj(a,y,z)
+if(!w)s=s.toLowerCase()
+x.toString
+x.IN=x.IN+s
+v=P.mC(u)
+x.IN+=v
+z+=r
+y=z}}}}if(x==null)return J.Nj(a,b,c)
+if(y<c){s=J.Nj(a,y,c)
+x.KF(!w?s.toLowerCase():s)}return x.bu(0)},iy:function(a,b){var z,y,x,w,v,u,t,s
 if(b===0)return""
 a.toString
 z=a.length
@@ -9661,22 +9646,21 @@
 x=y>=97
 if(!(x&&y<=122))w=y>=65&&y<=90
 else w=!0
-if(!w)P.Xz(a,0,"Scheme not starting with alphabetic character")
+if(!w)P.iV(a,0,"Scheme not starting with alphabetic character")
 for(w=97<=y,v=122>=y,u=0;u<b;++u){if(u>=z)H.vh(P.N(u))
 t=a.charCodeAt(u)
 if(t<128){s=t>>>4
-if(s>=8)return H.e(C.mKy,s)
-s=(C.mKy[s]&C.jn.iK(1,t&15))!==0}else s=!1
-if(!s)P.Xz(a,u,"Illegal scheme character")
+if(s>=8)return H.e(C.qq,s)
+s=(C.qq[s]&C.jn.iK(1,t&15))!==0}else s=!1
+if(!s)P.iV(a,u,"Illegal scheme character")
 if(w&&v)x=!1}a=J.Nj(a,0,b)
 return!x?a.toLowerCase():a},ua:function(a,b,c){if(a==null)return""
-return P.Xc(a,b,c,C.jx)},re:function(a,b,c,d,e,f){var z,y
+return P.Xc(a,b,c,C.jx)},qd:function(a,b,c,d,e,f){var z,y
 z=a==null
 if(z&&!0)return f?"/":""
 z=!z
-if(z);y=z?P.Xc(a,b,c,C.ZJ):C.bP.ez(d,new P.Kd()).zV(0,"/")
-z=J.U6(y)
-if(z.gl0(y)===!0){if(f)return"/"}else if((f||e)&&z.j(y,0)!==47)return"/"+H.d(y)
+if(z);y=z?P.Xc(a,b,c,C.ZJ):C.jN.ez(d,new P.UU()).zV(0,"/")
+if(C.yo.gl0(y)){if(f)return"/"}else if((f||e)&&C.yo.j(y,0)!==47)return"/"+y
 return y},AN:function(a,b,c,d){var z,y,x
 z={}
 y=a==null
@@ -9685,9 +9669,8 @@
 if(y);if(y)return P.Xc(a,b,c,C.o5)
 x=P.p9("")
 z.a=!0
-C.bP.aN(d,new P.Ue(z,x))
-z=x.IN
-return z.charCodeAt(0)==0?z:z},o6:function(a,b,c){if(a==null)return
+C.jN.aN(d,new P.Sz(z,x))
+return x.IN},jr:function(a,b,c){if(a==null)return
 return P.Xc(a,b,c,C.o5)},qr:function(a){if(57>=a)return 48<=a
 a|=32
 return 97<=a&&102>=a},RD:function(a){if(57>=a)return a-48
@@ -9696,6 +9679,7 @@
 y=a.length
 if(z>=y)return"%"
 x=b+1
+a.toString
 if(x<0)H.vh(P.N(x))
 if(x>=y)H.vh(P.N(x))
 w=a.charCodeAt(x)
@@ -9707,8 +9691,8 @@
 if(z>=8)return H.e(C.B2,z)
 z=(C.B2[z]&C.jn.iK(1,u&15))!==0}else z=!1
 if(z)return H.mx(c&&65<=u&&90>=u?(u|32)>>>0:u)
-if(w>=97||v>=97)return C.yo.Nj(a,b,b+3).toUpperCase()
-return},xo:function(a){var z,y,x,w,v,u,t,s
+if(w>=97||v>=97)return J.Nj(a,b,b+3).toUpperCase()
+return},mC:function(a){var z,y,x,w,v,u,t,s
 if(a<128){z=Array(3)
 z.fixed$length=init
 z[0]=37
@@ -9734,44 +9718,46 @@
 t="0123456789ABCDEF".charCodeAt(u&15)
 if(s>=y)return H.e(z,s)
 z[s]=t
-v+=3}}return H.LY(z)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
-for(z=a.length,y=b,x=y,w=null;y<c;){if(y<0)H.vh(P.N(y))
-if(y>=z)H.vh(P.N(y))
-v=a.charCodeAt(y)
+v+=3}}return H.eT(z)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+for(z=b,y=z,x=null;z<c;){a.toString
+if(z<0)H.vh(P.N(z))
+w=a.length
+if(z>=w)H.vh(P.N(z))
+v=a.charCodeAt(z)
 if(v<127){u=v>>>4
 if(u>=8)return H.e(d,u)
 u=(d[u]&C.jn.iK(1,v&15))!==0}else u=!1
-if(u)++y
-else{if(v===37){t=P.Yi(a,y,!1)
-if(t==null){y+=3
+if(u)++z
+else{if(v===37){t=P.Yi(a,z,!1)
+if(t==null){z+=3
 continue}if("%"===t){t="%25"
 s=1}else s=3}else{if(v<=93){u=v>>>4
 if(u>=8)return H.e(C.rz,u)
 u=(C.rz[u]&C.jn.iK(1,v&15))!==0}else u=!1
-if(u){P.Xz(a,y,"Invalid character")
+if(u){P.iV(a,z,"Invalid character")
 t=null
-s=null}else{if((v&64512)===55296){u=y+1
+s=null}else{if((v&64512)===55296){u=z+1
 if(u<c){if(u<0)H.vh(P.N(u))
-if(u>=z)H.vh(P.N(u))
+if(u>=w)H.vh(P.N(u))
 r=a.charCodeAt(u)
 if((r&64512)===56320){v=(65536|(v&1023)<<10|r&1023)>>>0
 s=2}else s=1}else s=1}else s=1
-t=P.xo(v)}}if(w==null){w=new P.Rn("")
-w.IN=""}u=C.yo.Nj(a,x,y)
-w.IN=w.IN+u
-w.IN+=typeof t==="string"?t:H.d(t)
+t=P.mC(v)}}if(x==null){x=new P.Rn("")
+x.IN=""}w=C.yo.Nj(a,y,z)
+x.toString
+x.IN=x.IN+w
+x.IN+=typeof t==="string"?t:H.d(t)
 if(typeof s!=="number")return H.s(s)
-y+=s
-x=y}}if(w==null)return C.yo.Nj(a,b,c)
-if(x<c)w.KF(C.yo.Nj(a,x,c))
-z=w.IN
-return z.charCodeAt(0)==0?z:z},WX:function(a,b){return H.n3(J.BQ(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
+z+=s
+y=z}}if(x==null)return J.Nj(a,b,c)
+if(y<c)x.KF(J.Nj(a,y,c))
+return x.bu(0)},Ms:function(a,b){return H.n3(J.BQ(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
 z=new P.JV()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.to(z)),[null,null]).br(0)},eg:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+return H.VM(new H.A8(y,new P.C9P(z)),[null,null]).br(0)},eg:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 if(c==null)c=J.q8(a)
-z=new P.kZ(a)
+z=new P.x8(a)
 y=new P.ZN(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
 x=[]
@@ -9782,32 +9768,34 @@
 if(typeof s!=="number")return H.s(s)
 if(!(u<s))break
 s=a
+s.toString
 if(u<0)H.vh(P.N(u))
 r=J.q8(s)
 if(typeof r!=="number")return H.s(r)
 if(u>=r)H.vh(P.N(u))
 if(s.charCodeAt(u)===58){if(u===b){++u
 s=a
+s.toString
 if(u<0)H.vh(P.N(u))
 if(u>=J.q8(s))H.vh(P.N(u))
 if(s.charCodeAt(u)!==58)z.$2("invalid start colon.",u)
 w=u}if(u===w){if(t)z.$2("only one wildcard `::` is allowed",u)
-J.dH(x,-1)
-t=!0}else J.dH(x,y.$2(w,u))
+J.bi(x,-1)
+t=!0}else J.bi(x,y.$2(w,u))
 w=u+1}++u}if(J.q8(x)===0)z.$1("too few parts")
 q=J.xC(w,c)
-p=J.xC(J.OH(x),-1)
+p=J.xC(J.MQ(x),-1)
 if(q&&!p)z.$2("expected a part after last `:`",c)
-if(!q)try{J.dH(x,y.$2(w,c))}catch(o){H.Ru(o)
+if(!q)try{J.bi(x,y.$2(w,c))}catch(o){H.Ru(o)
 try{v=P.Dy(J.Nj(a,w,c))
-s=J.lf(J.UQ(v,0),8)
+s=J.Eh(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
-J.dH(x,(s|r)>>>0)
-r=J.lf(J.UQ(v,2),8)
+J.bi(x,(s|r)>>>0)
+r=J.Eh(J.UQ(v,2),8)
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
-J.dH(x,(r|s)>>>0)}catch(o){H.Ru(o)
+J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
 z.$2("invalid end of IPv6 address.",w)}}if(t){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 n=Array(16)
 n.$builtinTypeInfo=[P.KN]
@@ -9831,20 +9819,20 @@
 s=s.i(l,255)
 if(r>=16)return H.e(n,r)
 n[r]=s
-m+=2}++u}return n},Mp:function(a,b,c,d){var z,y,x,w,v,u,t
+m+=2}++u}return n},jW:function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
-x=c.gZE().WJ(b)
-for(w=x.length,v=0;v<w;++v){u=x[v]
-if(u<128){t=u>>>4
+x=c.gZE().Sw(b)
+for(w=0;w<x.length;++w){v=x[w]
+u=J.Wx(v)
+if(u.C(v,128)){t=u.m(v,4)
 if(t>=8)return H.e(a,t)
-t=(a[t]&C.jn.iK(1,u&15))!==0}else t=!1
-if(t){t=H.mx(u)
-y.IN+=t}else if(d&&u===32){t=H.mx(43)
-y.IN+=t}else{t=H.mx(37)
-y.IN+=t
-z.$2(u,y)}}z=y.IN
-return z.charCodeAt(0)==0?z:z},tN:function(a,b){var z,y,x,w
+t=(a[t]&C.jn.iK(1,u.i(v,15)))!==0}else t=!1
+if(t){u=H.mx(v)
+y.IN+=u}else if(d&&u.n(v,32)){u=H.mx(43)
+y.IN+=u}else{u=H.mx(37)
+y.IN+=u
+z.$2(v,y)}}return y.IN},tN:function(a,b){var z,y,x,w
 for(z=J.Qe(a),y=0,x=0;x<2;++x){w=z.j(a,b+x)
 if(48<=w&&w<=57)y=y*16+w-48
 else{w|=32
@@ -9871,8 +9859,8 @@
 if(x+3>w)throw H.b(P.u("Truncated URI"))
 u.push(P.tN(a,x+1))
 x+=2}else if(c&&v===43)u.push(32)
-else u.push(v);++x}}t=b.ns
-return new P.GY(t).WJ(u)}}},
+else u.push(v);++x}}t=b.QA
+return new P.GY(t).Sw(u)}}},
 hP2:{
 "^":"TpZ:147;",
 $1:function(a){a.C(0,128)
@@ -9905,49 +9893,47 @@
 y=t+1}if(u>=0){o=u+1
 if(o<z.e)for(n=0;o<z.e;++o){if(o>=w)H.vh(P.N(o))
 m=x.charCodeAt(o)
-if(48>m||57<m)P.Xz(x,o,"Invalid port number")
+if(48>m||57<m)P.iV(x,o,"Invalid port number")
 n=n*10+(m-48)}else n=null
-z.d=P.Ec(n,z.a)
+z.d=P.JF(n,z.a)
 p=u}z.c=P.L7(x,y,p,!0)
 s=z.e
 if(s<w)z.f=C.yo.j(x,s)},
 $isEH:true},
-Kd:{
+UU:{
 "^":"TpZ:12;",
-$1:function(a){return P.Mp(C.jr,a,C.xM,!1)},
+$1:function(a){return P.jW(C.yk,a,C.xM,!1)},
 $isEH:true},
-Ue:{
+Sz:{
 "^":"TpZ:81;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
 z=this.b
-z.KF(P.Mp(C.B2,a,C.xM,!0))
+z.KF(P.jW(C.B2,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.Mp(C.B2,b,C.xM,!0))},
+z.KF(P.jW(C.B2,b,C.xM,!0))},
 $isEH:true},
 XZ:{
 "^":"TpZ:148;",
-$2:function(a,b){var z=J.v1(a)
-if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},
+$2:function(a,b){return b*31+J.v1(a)&1073741823},
 $isEH:true},
 qz:{
 "^":"TpZ:81;a",
 $2:function(a,b){var z,y,x,w
 z=J.U6(b)
 y=z.OY(b,"=")
-if(y===-1){if(!z.n(b,""))J.qQ(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
+if(y===-1){if(!z.n(b,""))J.kW(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
 w=z.yn(b,y+1)
 z=this.a
-J.qQ(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
+J.kW(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
 $isEH:true},
 JV:{
 "^":"TpZ:44;",
-$1:function(a){throw H.b(P.rr("Illegal IPv4 address, "+a,null,null))},
+$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a,null,null))},
 $isEH:true},
-to:{
+C9P:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=H.BU(a,null,null)
@@ -9955,16 +9941,16 @@
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
 return z},"$1",null,2,0,null,149,"call"],
 $isEH:true},
-kZ:{
+x8:{
 "^":"TpZ:150;a",
-$2:function(a,b){throw H.b(P.rr("Illegal IPv6 address, "+a,this.a,b))},
+$2:function(a,b){throw H.b(P.cD("Illegal IPv6 address, "+a,this.a,b))},
 $1:function(a){return this.$2(a,null)},
 $isEH:true},
 ZN:{
 "^":"TpZ:100;b,c",
 $2:function(a,b){var z,y
 if(b-a>4)this.c.$2("an IPv6 part can only contain a maximum of 4 hex digits",a)
-z=H.BU(C.yo.Nj(this.b,a,b),16,null)
+z=H.BU(J.Nj(this.b,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.c.$2("each part must be in the range of `0x0..0xFFFF`",a)
 return z},
@@ -9983,25 +9969,25 @@
 if(typeof y!=="string"){y=d
 y=typeof y==="number"}else y=!0}else y=!0
 else y=!0
-if(y)try{d=P.jl(d)
+if(y)try{d=P.pf(d)
 J.z7Y(z,a,b,c,d)}catch(x){H.Ru(x)
 J.z7Y(z,a,b,c,null)}else J.z7Y(z,a,b,c,null)
 return z},
 r3:function(a,b){return document.createElement(a)},
-Kz:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
+Og:function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},
 lt:function(a,b,c,d,e,f,g,h){var z,y,x
-z=W.O7
+z=W.fJ
 y=H.VM(new P.Zf(P.Dt(z)),[z])
 x=new XMLHttpRequest()
 C.W3.i3(x,"GET",a,!0)
-z=H.VM(new W.vG(x,"load",!1),[null])
+z=H.VM(new W.RO(x,C.LF.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new W.bU(y,x)),z.el),[H.u3(z,0)]).DN()
-z=H.VM(new W.vG(x,"error",!1),[null])
+z=H.VM(new W.RO(x,C.JN.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(y.gYJ()),z.el),[H.u3(z,0)]).DN()
 x.send()
 return y.MM},
-Ws:function(a){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(a),2))},
-D7:function(a,b){var z,y
+Ws:function(a){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.Iq(a),2))},
+P0:function(a,b){var z,y
 z=typeof a!=="string"
 if((!z||a==null)&&!0)return new WebSocket(a)
 y=H.RB(b,"$isWO",[P.qU],"$asWO")
@@ -10010,39 +9996,39 @@
 z=!z||a==null
 if(z)return new WebSocket(a,b)
 throw H.b(P.u("Incorrect number or type of arguments"))},
-Zm:function(a,b){a=536870911&a+b
+VC:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
 Pv:function(a){if(a==null)return
 return W.P1(a)},
-xj:function(a){var z
+qc:function(a){var z
 if(a==null)return
 if("postMessage" in a){z=W.P1(a)
-if(!!J.x(z).$isFU)return z
+if(!!J.x(z).$isPZ)return z
 return}else return a},
-Pd:function(a){if(!!J.x(a).$isSy)return a
+Pd:function(a){if(!!J.x(a).$isYN)return a
 return P.o7(a,!0)},
-Rl:function(a,b){return new W.uY(a,b)},
+v8:function(a,b){return new W.uY(a,b)},
 z9:[function(a){return J.N1(a)},"$1","b4",2,0,12,56],
-Hx:[function(a){return J.qq(a)},"$1","HM",2,0,12,56],
-Hw:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","NB",8,0,57,56,58,59,60],
-wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
-z=J.Xr(d)
+IV:[function(a){return J.o6(a)},"$1","hb",2,0,12,56],
+Hw:[function(a,b,c,d){return J.L1(a,b,c,d)},"$4","SN",8,0,57,56,58,59,60],
+Ct:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
+z=J.Dc(d)
 if(z==null)throw H.b(P.u(d))
 y=z.prototype
-x=J.YC(d,"created")
+x=J.KE(d,"created")
 if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.MZ(W.r3("article",null))
+J.aN(W.r3("article",null))
 w=z.$nativeSuperclassTag
 if(w==null)throw H.b(P.u(d))
 v=e==null
 if(v){if(!J.xC(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
 u=a[w]
 t={}
-t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Rl(x,y),1))}
+t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.v8(x,y),1))}
 t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.b4(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.HM(),1))}
-t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.NB(),4))}
+t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.hb(),1))}
+t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.SN(),4))}
 s=Object.create(u.prototype,t)
 r=H.Va(y)
 Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
@@ -10050,8 +10036,9 @@
 if(!v)q.extends=e
 b.registerElement(c,q)},
 Yt:function(a){if(J.xC($.X3,C.NU))return a
+if(a==null)return
 return $.X3.rO(a,!0)},
-K2:function(a){if(J.xC($.X3,C.NU))return a
+Iq:function(a){if(J.xC($.X3,C.NU))return a
 return $.X3.PT(a,!0)},
 Bo:{
 "^":"h4;",
@@ -10059,34 +10046,34 @@
 Yyn:{
 "^":"Gv;",
 $isWO:true,
-$asWO:function(){return[W.M5K]},
+$asWO:function(){return[W.QI]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[W.M5K]},
+$asQV:function(){return[W.QI]},
 "%":"EntryArray"},
 Ps:{
-"^":"Bo;N:target%,t5:type=,LU:href%,A8:protocol=",
+"^":"Bo;N:target%,t5:type=,mH:href%,aB:protocol=",
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"HTMLAnchorElement"},
-fYK:{
-"^":"Bo;N:target%,LU:href%,A8:protocol=",
+fY:{
+"^":"Bo;N:target%,mH:href%,aB:protocol=",
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"HTMLAreaElement"},
 rZg:{
-"^":"Bo;LU:href%,N:target%",
+"^":"Bo;mH:href%,N:target%",
 "%":"HTMLBaseElement"},
 O4:{
-"^":"Gv;ky:size=,t5:type=",
+"^":"Gv;yT:size=,t5:type=",
 $isO4:true,
 "%":";Blob"},
 QPB:{
 "^":"Bo;",
-$isFU:true,
+$isPZ:true,
 "%":"HTMLBodyElement"},
-IFv:{
+Ox:{
 "^":"Bo;oc:name%,t5:type=,P:value%",
 "%":"HTMLButtonElement"},
-Nu:{
+Ny9:{
 "^":"Bo;fg:height%,R:width}",
 gVE:function(a){return a.getContext("2d")},
 "%":"HTMLCanvasElement"},
@@ -10095,7 +10082,7 @@
 "%":";CanvasRenderingContext"},
 Gcw:{
 "^":"Y5K;",
-kN:function(a,b,c,d,e,f,g,h){var z
+A8:function(a,b,c,d,e,f,g,h){var z
 if(g!=null)z=!0
 else z=!1
 if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
@@ -10106,17 +10093,18 @@
 "%":"Comment;CharacterData"},
 BI:{
 "^":"ea;tT:code=",
+$isBI:true,
 "%":"CloseEvent"},
 y4f:{
 "^":"w6O;Rn:data=",
 "%":"CompositionEvent"},
-Rb:{
+DG4:{
 "^":"ea;NJ:_dartDetail}",
 gey:function(a){var z=a._dartDetail
 if(z!=null)return z
 return P.o7(a.detail,!0)},
 GM:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
-$isRb:true,
+$isDG4:true,
 "%":"CustomEvent"},
 vHT:{
 "^":"Bo;bG:options=",
@@ -10129,66 +10117,66 @@
 "^":"Bo;",
 TR:function(a,b){return a.open.$1(b)},
 "%":"HTMLDialogElement"},
-Sy:{
+YN:{
 "^":"KV;",
 JP:function(a){return a.createDocumentFragment()},
 Kb:function(a,b){return a.getElementById(b)},
-ek:function(a,b,c){return a.importNode(b,c)},
-Wk:function(a,b){return a.querySelector(b)},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isSy:true,
+d2:function(a,b,c){return a.importNode(b,c)},
+XT:function(a,b){return a.querySelector(b)},
+VG:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+$isYN:true,
 "%":"XMLDocument;Document"},
 hsw:{
 "^":"KV;",
-gqu:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.P0(a,new W.OB(a)),[null])
+gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
 return a._docChildren},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Wk:function(a,b){return a.querySelector(b)},
+VG:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+XT:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
 cmJ:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
-Nh:{
+BK:{
 "^":"Gv;G1:message=",
 goc:function(a){var z=a.name
 if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
 if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
 return z},
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
-$isNh:true,
+$isBK:true,
 "%":"DOMException"},
 h4:{
-"^":"KV;ka:title},xr:className%,jO:id=,q5:tagName=,ke:nextElementSibling=",
+"^":"KV;mk:title},xr:className%,jO:id=,ns:tagName=,ke:nextElementSibling=",
 gQg:function(a){return new W.E9(a)},
-gqu:function(a){return new W.VG(a,a.children)},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+gks:function(a){return new W.VG(a,a.children)},
+VG:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
 gD7:function(a){return P.T7(C.CD.yu(C.CD.RE(a.offsetLeft)),C.CD.yu(C.CD.RE(a.offsetTop)),C.CD.yu(C.CD.RE(a.offsetWidth)),C.CD.yu(C.CD.RE(a.offsetHeight)),null)},
 Es:function(a){},
-dQ:function(a){},
-aC:function(a,b,c,d){},
+Lx:function(a){},
+wN:function(a,b,c,d){},
 gqn:function(a){return a.localName},
 gKD:function(a){return a.namespaceURI},
 bu:[function(a){return a.localName},"$0","gCR",0,0,73],
-WO:function(a,b){if(!!a.matches)return a.matches(b)
+xZ:function(a,b){if(!!a.matches)return a.matches(b)
 else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
 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"))},
-jn:function(a,b){var z=a
-do{if(J.YN(z,b))return!0
+X3:function(a,b){var z=a
+do{if(J.wK(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
-er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
+TL:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
 PN:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
-Wk:function(a,b){return a.querySelector(b)},
-gVY:function(a){return H.VM(new W.eu(a,"mousedown",!1),[null])},
-gf0:function(a){return H.VM(new W.eu(a,"mousemove",!1),[null])},
+XT:function(a,b){return a.querySelector(b)},
+gVY:function(a){return H.VM(new W.Cqa(a,C.Whw.fA,!1),[null])},
+gf0:function(a){return H.VM(new W.Cqa(a,C.Kq.fA,!1),[null])},
 LX:function(a){},
 $ish4:true,
-$isFU:true,
+$isPZ:true,
 "%":";Element"},
 fC:{
 "^":"Bo;fg:height%,oc:name%,t5:type=,R:width}",
@@ -10198,17 +10186,17 @@
 "%":"ErrorEvent"},
 ea:{
 "^":"Gv;dl:_selector},Ii:path=,Ea:timeStamp=,t5:type=",
-gXQ:function(a){return W.xj(a.currentTarget)},
-gN:function(a){return W.xj(a.target)},
-TI:function(a){return a.preventDefault()},
+gF0:function(a){return W.qc(a.currentTarget)},
+gN:function(a){return W.qc(a.target)},
+e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
-FU:{
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
+PZ:{
 "^":"Gv;",
 On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-jR:function(a,b){return a.dispatchEvent(b)},
+Ph:function(a,b){return a.dispatchEvent(b)},
 Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isFU:true,
+$isPZ:true,
 "%":";EventTarget"},
 Ao:{
 "^":"Bo;P9:elements=,oc:name%,t5:type=",
@@ -10217,22 +10205,22 @@
 "^":"O4;oc:name=",
 $ishH:true,
 "%":"File"},
-AaI:{
+QU:{
 "^":"cmJ;tT:code=",
 "%":"FileError"},
 H05:{
-"^":"FU;kc:error=",
+"^":"PZ;kc:error=",
 gyG:function(a){var z=a.result
-if(!!J.x(z).$isaI)return H.GG(z,0,null)
+if(!!J.x(z).$isaI)return H.z4(z,0,null)
 return z},
 "%":"FileReader"},
-YuD:{
+jH:{
 "^":"Bo;B:length=,oc:name%,N:target%",
 "%":"HTMLFormElement"},
 iGN:{
 "^":"Bo;ih:color%",
 "%":"HTMLHRElement"},
-UT:{
+us:{
 "^":"Gv;B:length=",
 "%":"History"},
 xnd:{
@@ -10243,7 +10231,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gtH:function(a){if(a.length>0)return a[0]
+gqG:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -10258,20 +10246,20 @@
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 Vbi:{
-"^":"Sy;",
+"^":"YN;",
 gQr:function(a){return a.head},
-ska:function(a,b){a.title=b},
+smk:function(a,b){a.title=b},
 "%":"HTMLDocument"},
-O7:{
+fJ:{
 "^":"waV;il:responseText=,pf:status=",
 gn9:function(a){return W.Pd(a.response)},
 Yh:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
 i3:function(a,b,c,d){return a.open(b,c,d)},
 wR:function(a,b){return a.send(b)},
-$isO7:true,
+$isfJ:true,
 "%":"XMLHttpRequest"},
 waV:{
-"^":"FU;",
+"^":"PZ;",
 "%":";XMLHttpRequestEventTarget"},
 tbE:{
 "^":"Bo;fg:height%,oc:name%,R:width}",
@@ -10285,53 +10273,53 @@
 j3:function(a,b){return a.complete.$1(b)},
 "%":"HTMLImageElement"},
 Sc:{
-"^":"Bo;d4:checked%,fg:height%,jx:list=,A5:max=,Bp:min=,oc:name%,ky:size=,t5:type=,P:value%,R:width}",
+"^":"Bo;d4:checked%,fg:height%,jx:list=,A5:max=,Bp:min=,oc:name%,yT:size=,t5:type=,P:value%,R:width}",
 RR:function(a,b){return a.accept.$1(b)},
 $isSc:true,
 $ish4:true,
-$isFU:true,
+$isPZ:true,
 $isKV:true,
 "%":"HTMLInputElement"},
 AD:{
-"^":"w6O;w4:altKey=,Tu:ctrlKey=,Nl:metaKey=,kA:shiftKey=",
+"^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 "%":"KeyboardEvent"},
 In:{
 "^":"Bo;oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-pL:{
+wPF:{
 "^":"Bo;P:value%",
 "%":"HTMLLIElement"},
 Ogt:{
-"^":"Bo;LU:href%,t5:type=",
+"^":"Bo;mH:href%,t5:type=",
 "%":"HTMLLinkElement"},
 u8r:{
-"^":"Gv;LU:href=,A8:protocol=",
+"^":"Gv;mH:href=,aB:protocol=",
 VD:function(a){return a.reload()},
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 "%":"Location"},
-M6O:{
+jJ:{
 "^":"Bo;oc:name%",
 "%":"HTMLMapElement"},
 ftg:{
 "^":"Bo;kc:error=",
 xW:function(a){return a.load()},
-zd:[function(a){return a.pause()},"$0","gX0",0,0,17],
+WJ:[function(a){return a.pause()},"$0","gX0",0,0,17],
 "%":"HTMLAudioElement;HTMLMediaElement",
 static:{"^":"dZ5<"}},
 mCi:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
-Y7:{
+Wyx:{
 "^":"Gv;tT:code=",
 "%":"MediaKeyError"},
-wq:{
+aBv:{
 "^":"ea;G1:message=",
 "%":"MediaKeyEvent"},
 fJn:{
 "^":"ea;G1:message=",
 "%":"MediaKeyMessageEvent"},
 D80:{
-"^":"FU;jO:id=,ph:label=",
+"^":"PZ;jO:id=,ph:label=",
 "%":"MediaStream"},
 VhH:{
 "^":"ea;vq:stream=",
@@ -10339,7 +10327,8 @@
 cxu:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
-gFF:function(a){return W.xj(a.source)},
+gFF:function(a){return W.qc(a.source)},
+$iscxu:true,
 "%":"MessageEvent"},
 EeC:{
 "^":"Bo;rz:content=,oc:name%",
@@ -10347,28 +10336,33 @@
 QbE:{
 "^":"Bo;A5:max=,Bp:min=,P:value%",
 "%":"HTMLMeterElement"},
+PGY:{
+"^":"ea;",
+$isPGY:true,
+"%":"MIDIConnectionEvent"},
 F3S:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bnE:{
 "^":"Imr;",
-LV:function(a,b,c){return a.send(b,c)},
+EZ:function(a,b,c){return a.send(b,c)},
 wR:function(a,b){return a.send(b)},
 "%":"MIDIOutput"},
 Imr:{
-"^":"FU;jO:id=,oc:name=,t5:type=,Ye:version=",
-giG:function(a){return H.VM(new W.vG(a,"disconnect",!1),[null])},
+"^":"PZ;jO:id=,oc:name=,t5:type=,Ye:version=",
+giG:function(a){return H.VM(new W.RO(a,C.iw.fA,!1),[null])},
 "%":"MIDIInput;MIDIPort"},
-v3:{
-"^":"w6O;w4:altKey=,Ay:button=,Tu:ctrlKey=,Nl:metaKey=,kA:shiftKey=",
+N2:{
+"^":"w6O;YK:altKey=,EV:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 gD7:function(a){var z,y
 if(!!a.offsetX)return H.VM(new P.hL(a.offsetX,a.offsetY),[null])
-else{if(!J.x(W.xj(a.target)).$ish4)throw H.b(P.f("offsetX is only supported on elements"))
-z=W.xj(a.target)
-y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.Yq(J.mB(z)))
+else{if(!J.x(W.qc(a.target)).$ish4)throw H.b(P.f("offsetX is only supported on elements"))
+z=W.qc(a.target)
+y=H.VM(new P.hL(a.clientX,a.clientY),[null]).W(0,J.nN(J.tG(z)))
 return H.VM(new P.hL(J.XHl(y.x),J.XHl(y.y)),[null])}},
+$isN2:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-H9:{
+x76:{
 "^":"Gv;",
 je:function(a){return a.disconnect()},
 jh:function(a,b,c,d,e,f,g,h,i){var z,y
@@ -10392,16 +10386,16 @@
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
-"^":"FU;NL:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,Ad:parentNode=,a4:textContent%",
-gdH:function(a){return new W.OB(a)},
+"^":"PZ;NL:firstChild=,uD:nextSibling=,J8:ownerDocument=,eT:parentElement=,Ad:parentNode=,a4:textContent%",
+gUN:function(a){return new W.wi(a)},
 wg:function(a){var z=a.parentNode
 if(z!=null)z.removeChild(a)},
-YP:function(a,b){var z,y
+Tk:function(a,b){var z,y
 try{z=a.parentNode
-J.jk(z,b,a)}catch(y){H.Ru(y)}return a},
+J.LW(z,b,a)}catch(y){H.Ru(y)}return a},
 aD:function(a,b,c){var z,y,x
 z=J.x(b)
-if(!!z.$isOB){z=b.uR
+if(!!z.$iswi){z=b.uR
 if(z===a)throw H.b(P.u(b))
 for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},
 D4:function(a){var z
@@ -10410,8 +10404,8 @@
 return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gCR",0,0,73],
 mx:function(a,b){return a.appendChild(b)},
 tg:function(a,b){return a.contains(b)},
-mK:function(a,b,c){return a.insertBefore(b,c)},
-OP:function(a,b,c){return a.replaceChild(b,c)},
+FO:function(a,b,c){return a.insertBefore(b,c)},
+AS:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
 BH3:{
@@ -10422,7 +10416,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gtH:function(a){if(a.length>0)return a[0]
+gqG:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -10445,11 +10439,11 @@
 l9:{
 "^":"Bo;ph:label%",
 "%":"HTMLOptGroupElement"},
-Qlt:{
+lq:{
 "^":"Bo;vH:index=,ph:label%,P:value%",
-$isQlt:true,
+$islq:true,
 "%":"HTMLOptionElement"},
-wL2:{
+Xp:{
 "^":"Bo;oc:name%,t5:type=,P:value%",
 "%":"HTMLOutputElement"},
 HDy:{
@@ -10457,6 +10451,7 @@
 "%":"HTMLParamElement"},
 niR:{
 "^":"ea;",
+$isniR:true,
 "%":"PopStateEvent"},
 S8:{
 "^":"Gv;tT:code=,G1:message=",
@@ -10469,6 +10464,7 @@
 "%":"HTMLProgressElement"},
 ew7:{
 "^":"ea;ox:loaded=",
+$isew7:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 bXi:{
 "^":"ew7;O3:url=",
@@ -10476,12 +10472,12 @@
 j24:{
 "^":"Bo;t5:type=",
 "%":"HTMLScriptElement"},
-zk:{
-"^":"Bo;B:length%,oc:name%,Mj:selectedIndex},ky:size=,t5:type=,P:value%",
+bs:{
+"^":"Bo;B:length%,oc:name%,Mj:selectedIndex},yT:size=,t5:type=,P:value%",
 gbG:function(a){var z=W.vD(a.querySelectorAll("option"),null)
 z=z.ad(z,new W.xv())
 return H.VM(new P.Ui(P.F(z,!0,H.W8(z,"mW",0))),[null])},
-$iszk:true,
+$isbs:true,
 "%":"HTMLSelectElement"},
 I0:{
 "^":"hsw;",
@@ -10494,18 +10490,18 @@
 zD9:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
-r5:{
+y0:{
 "^":"ea;Cf:results=",
 "%":"SpeechRecognitionEvent"},
 vKL:{
 "^":"Gv;V5:isFinal=,B:length=",
 "%":"SpeechRecognitionResult"},
-KKC:{
+er:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
 AsS:{
 "^":"Gv;",
-FV:function(a,b){H.bQ(b,new W.lN(a))},
+FV:function(a,b){H.bQ(b,new W.AA(a))},
 NZ:function(a,b){return a.getItem(b)!=null},
 t:function(a,b){return a.getItem(b)},
 u:function(a,b,c){a.setItem(b,c)},
@@ -10521,7 +10517,7 @@
 this.aN(a,new W.wQ(z))
 return z},
 gUQ:function(a){var z=[]
-this.aN(a,new W.We(z))
+this.aN(a,new W.rs(z))
 return z},
 gB:function(a){return a.length},
 gl0:function(a){return a.key(0)==null},
@@ -10544,7 +10540,7 @@
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.Iv])},
 "%":"HTMLTableElement"},
 Iv:{
-"^":"Bo;Cw:rowIndex=",
+"^":"Bo;RH:rowIndex=",
 iF:function(a,b){return a.insertCell(b)},
 $isIv:true,
 "%":"HTMLTableRowElement"},
@@ -10552,13 +10548,13 @@
 "^":"Bo;",
 gvp:function(a){return H.VM(new W.uB(a.rows),[W.Iv])},
 "%":"HTMLTableSectionElement"},
-yY:{
+OH:{
 "^":"Bo;rz:content=",
-$isyY:true,
-"%":";HTMLTemplateElement;GLL|k5d|G0"},
-kJ:{
+$isOH:true,
+"%":";HTMLTemplateElement;GLL|k5d|hg"},
+Un:{
 "^":"nx;",
-$iskJ:true,
+$isUn:true,
 "%":"CDATASection|Text"},
 FBi:{
 "^":"Bo;oc:name%,vp:rows=,t5:type=,P:value%",
@@ -10567,7 +10563,7 @@
 "^":"w6O;Rn:data=",
 "%":"TextEvent"},
 y6:{
-"^":"w6O;w4:altKey=,Tu:ctrlKey=,Nl:metaKey=,kA:shiftKey=",
+"^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 "%":"TouchEvent"},
 RHt:{
 "^":"Bo;fY:kind=,ph:label%",
@@ -10580,14 +10576,14 @@
 "^":"ftg;fg:height%,R:width}",
 "%":"HTMLVideoElement"},
 EKW:{
-"^":"FU;A8:protocol=,O3:url=",
+"^":"PZ;aB:protocol=,O3:url=",
 XW:function(a,b,c){return a.close(b,c)},
 xO:function(a){return a.close()},
 wR:function(a,b){return a.send(b)},
 "%":"WebSocket"},
 K5:{
-"^":"FU;bq:history=,oc:name%,pf:status%",
-ne:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
+"^":"PZ;bq:history=,oc:name%,pf:status%",
+rK:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
 Wq:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return;(function(b){var z=['ms','moz','webkit','o']
 for(var y=0;y<z.length&&!b.requestAnimationFrame;++y){b.requestAnimationFrame=b[z[y]+'RequestAnimationFrame']
 b.cancelAnimationFrame=b[z[y]+'CancelAnimationFrame']||b[z[y]+'CancelRequestAnimationFrame']}if(b.requestAnimationFrame&&b.cancelAnimationFrame)return
@@ -10595,14 +10591,14 @@
 b.cancelAnimationFrame=function(c){clearTimeout(c)}})(a)},
 geT:function(a){return W.Pv(a.parent)},
 xO:function(a){return a.close()},
-xc:function(a,b,c,d){a.postMessage(P.jl(b),c)
+xc:function(a,b,c,d){a.postMessage(P.pf(b),c)
 return},
 X6:function(a,b,c){return this.xc(a,b,c,null)},
 bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
 $isK5:true,
-$isFU:true,
+$isPZ:true,
 "%":"DOMWindow|Window"},
-UM:{
+U3:{
 "^":"KV;oc:name=,P:value%",
 "%":"Attr"},
 FR:{
@@ -10627,19 +10623,19 @@
 y=J.v1(a.top)
 x=J.v1(a.width)
 w=J.v1(a.height)
-w=W.Zm(W.Zm(W.Zm(W.Zm(0,z),y),x),w)
+w=W.VC(W.VC(W.VC(W.VC(0,z),y),x),w)
 v=536870911&w+((67108863&w)<<3>>>0)
 v^=v>>>11
 return 536870911&v+((16383&v)<<15>>>0)},
-gSR:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
+gTt:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
 $istn:true,
 $astn:function(){return[null]},
 "%":"ClientRect|DOMRect"},
 NfA:{
 "^":"Bo;",
-$isFU:true,
+$isPZ:true,
 "%":"HTMLFrameSetElement"},
-rhM:{
+Cy:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -10647,7 +10643,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gtH:function(a){if(a.length>0)return a[0]
+gqG:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -10669,7 +10665,7 @@
 return a[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-gtH:function(a){if(a.length>0)return a[0]
+gqG:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -10700,22 +10696,22 @@
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.dA;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.dA;z.G();)y.appendChild(z.Ff)},
 GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
 Jd:function(a){return this.GT(a,null)},
 uk:function(a,b){this.aO(b,!1)},
 aO:function(a,b){var z,y,x
 z=this.dA
-if(b){z=J.dd(z)
-y=z.ad(z,new W.dz(a))}else{z=J.dd(z)
-y=z.ad(z,a)}for(z=H.VM(new H.Mo(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),x=z.CL;z.G();)J.Rv(x.gl())},
+if(b){z=J.Mx(z)
+y=z.ad(z,new W.dz(a))}else{z=J.Mx(z)
+y=z.ad(z,a)}for(z=H.VM(new H.vG(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),x=z.CL;z.G();)J.Mp(x.gl())},
 YW:function(a,b,c,d,e){throw H.b(P.nO(null))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 Rz:function(a,b){var z
 if(!!J.x(b).$ish4){z=this.dA
 if(b.parentNode===z){z.removeChild(b)
 return!0}}return!1},
-aP:function(a,b,c){var z,y,x
+xe:function(a,b,c){var z,y,x
 if(b>this.jS.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.jS
 y=z.length
@@ -10725,17 +10721,17 @@
 x.insertBefore(c,z[b])}},
 Mh:function(a,b,c){throw H.b(P.nO(null))},
 V1:function(a){J.Wf(this.dA)},
-f4:function(a){var z=this.grZ(this)
-this.dA.removeChild(z)
+mv:function(a){var z=this.grZ(this)
+if(z!=null)this.dA.removeChild(z)
 return z},
-gtH:function(a){var z=this.dA.firstElementChild
+gqG:function(a){var z=this.dA.firstElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 grZ:function(a){var z=this.dA.lastElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 $asark:function(){return[W.h4]},
-$asE9h:function(){return[W.h4]},
+$aseD:function(){return[W.h4]},
 $asWO:function(){return[W.h4]},
 $asQV:function(){return[W.h4]}},
 dz:{
@@ -10743,19 +10739,19 @@
 $1:function(a){return this.a.$1(a)!==!0},
 $isEH:true},
 wz:{
-"^":"ark;mk,xa",
-gB:function(a){return this.mk.length},
-t:function(a,b){var z=this.mk
+"^":"ark;jt,xa",
+gB:function(a){return this.jt.length},
+t:function(a,b){var z=this.jt
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){throw H.b(P.f("Cannot modify list"))},
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
 GT:function(a,b){throw H.b(P.f("Cannot sort list"))},
 Jd:function(a){return this.GT(a,null)},
-gtH:function(a){return C.z0.gtH(this.mk)},
-grZ:function(a){return C.z0.grZ(this.mk)},
-gDD:function(a){return W.Uk(this.xa)},
-S8:function(a,b){var z=C.z0.ad(this.mk,new W.ty())
+gqG:function(a){return C.t5.gqG(this.jt)},
+grZ:function(a){return C.t5.grZ(this.jt)},
+gDD:function(a){return W.or(this.xa)},
+S8:function(a,b){var z=C.t5.ad(this.jt,new W.ty())
 this.xa=P.F(z,!0,H.W8(z,"mW",0))},
 $isWO:true,
 $asWO:null,
@@ -10769,7 +10765,7 @@
 "^":"TpZ:12;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
-M5K:{
+QI:{
 "^":"Gv;"},
 RAp:{
 "^":"Gv+lD;",
@@ -10787,7 +10783,7 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"TpZ:12;",
-$1:[function(a){return J.CA(a)},"$1",null,2,0,null,151,"call"],
+$1:[function(a){return J.lN(a)},"$1",null,2,0,null,151,"call"],
 $isEH:true},
 bU2:{
 "^":"TpZ:81;a",
@@ -10809,9 +10805,9 @@
 "^":"TpZ:81;a",
 $2:function(a,b){if(b!=null)this.a[a]=b},
 $isEH:true},
-OB:{
+wi:{
 "^":"ark;uR",
-gtH:function(a){var z=this.uR.firstChild
+gqG:function(a){var z=this.uR.firstChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 grZ:function(a){var z=this.uR.lastChild
@@ -10819,8 +10815,8 @@
 return z},
 h:function(a,b){this.uR.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.uR;z.G();)y.appendChild(z.lo)},
-aP:function(a,b,c){var z,y,x
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.uR;z.G();)y.appendChild(z.Ff)},
+xe:function(a,b,c){var z,y,x
 if(b>this.uR.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=this.uR
 y=z.childNodes
@@ -10832,7 +10828,7 @@
 z=this.uR
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
+J.r5(z,c,y[b])},
 Mh:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
 Rz:function(a,b){var z
 if(!J.x(b).$isKV)return!1
@@ -10852,7 +10848,7 @@
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
 z.replaceChild(c,y[b])},
-gA:function(a){return C.z0.gA(this.uR.childNodes)},
+gA:function(a){return C.t5.gA(this.uR.childNodes)},
 GT:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
 Jd:function(a){return this.GT(a,null)},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},
@@ -10862,9 +10858,9 @@
 t:function(a,b){var z=this.uR.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-$isOB:true,
+$iswi:true,
 $asark:function(){return[W.KV]},
-$asE9h:function(){return[W.KV]},
+$aseD:function(){return[W.KV]},
 $asWO:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
 nNL:{
@@ -10883,9 +10879,9 @@
 $asQV:function(){return[W.KV]}},
 xv:{
 "^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$isQlt},
+$1:function(a){return!!J.x(a).$islq},
 $isEH:true},
-lN:{
+AA:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.setItem(a,b)},
 $isEH:true},
@@ -10893,7 +10889,7 @@
 "^":"TpZ:81;a",
 $2:function(a,b){return this.a.push(a)},
 $isEH:true},
-We:{
+rs:{
 "^":"TpZ:81;a",
 $2:function(a,b){return this.a.push(b)},
 $isEH:true},
@@ -10927,11 +10923,11 @@
 $asQV:function(){return[W.vKL]}},
 a7B:{
 "^":"a;",
-FV:function(a,b){J.Me(b,new W.ZcQ(this))},
+FV:function(a,b){J.Me(b,new W.Za(this))},
 V1:function(a){var z
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.lo)},
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)this.Rz(0,z.Ff)},
 aN:function(a,b){var z,y
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 b.$2(y,this.t(0,y))}},
 gvc:function(a){var z,y,x,w
 z=this.dA.attributes
@@ -10949,7 +10945,7 @@
 gor:function(a){return this.gB(this)!==0},
 $isT8:true,
 $asT8:function(){return[P.qU,P.qU]}},
-ZcQ:{
+Za:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
@@ -10966,25 +10962,25 @@
 gB:function(a){return this.gvc(this).length},
 O2:function(a){return a.namespaceURI==null}},
 nFk:{
-"^":"As3;a7,AL",
-DG:function(){var z=P.fM(null,null,null,P.qU)
-this.AL.aN(0,new W.pd(z))
+"^":"As3;RN,AL",
+DG:function(){var z=P.Ls(null,null,null,P.qU)
+this.AL.aN(0,new W.jL(z))
 return z},
 p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.a7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.fm(y.lo,z)},
+for(y=this.RN,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();)J.Pw(y.Ff,z)},
 H9:function(a){this.AL.aN(0,new W.uS(a))},
-Rz:function(a,b){return this.Fm(new W.FcD(b))},
-Fm:function(a){return this.AL.es(0,!1,new W.cf(a))},
-b1:function(a){this.AL=H.VM(new H.A8(P.F(this.a7,!0,null),new W.Zu()),[null,null])},
-static:{Uk:function(a){var z=new W.nFk(a,null)
+Rz:function(a,b){return this.jA(new W.FcD(b))},
+jA:function(a){return this.AL.es(0,!1,new W.hD(a))},
+b1:function(a){this.AL=H.VM(new H.A8(P.F(this.RN,!0,null),new W.FK()),[null,null])},
+static:{or:function(a){var z=new W.nFk(a,null)
 z.b1(a)
 return z}}},
-Zu:{
+FK:{
 "^":"TpZ:12;",
 $1:[function(a){return new W.I4(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-pd:{
+jL:{
 "^":"TpZ:12;a",
 $1:function(a){return this.a.FV(0,a.DG())},
 $isEH:true},
@@ -10996,38 +10992,40 @@
 "^":"TpZ:12;a",
 $1:function(a){return J.V1(a,this.a)},
 $isEH:true},
-cf:{
+hD:{
 "^":"TpZ:81;a",
 $2:function(a,b){return this.a.$1(b)===!0||a===!0},
 $isEH:true},
 I4:{
 "^":"As3;dA",
 DG:function(){var z,y,x
-z=P.fM(null,null,null,P.qU)
-for(y=J.ufU(this.dA).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.iY(y.lo)
+z=P.Ls(null,null,null,P.qU)
+for(y=J.uf(this.dA).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=J.rr(y.Ff)
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
-J.fm(this.dA,a.zV(0," "))}},
-vG:{
-"^":"cb;bi,fA,el",
+J.Pw(this.dA,a.zV(0," "))}},
+FkO:{
+"^":"a;fA"},
+RO:{
+"^":"wS;bi,fA,el",
 KR:function(a,b,c,d){var z=new W.Ov(0,this.bi,this.fA,W.Yt(a),this.el)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.DN()
 return z},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)}},
-eu:{
-"^":"vG;bi,fA,el",
-WO:function(a,b){var z=H.VM(new P.fk(new W.ie(b),this),[H.W8(this,"cb",0)])
-return H.VM(new P.c9(new W.tS(b),z),[H.W8(z,"cb",0),null])},
-$iscb:true},
+Cqa:{
+"^":"RO;bi,fA,el",
+xZ:function(a,b){var z=H.VM(new P.fk(new W.ie(b),this),[H.W8(this,"wS",0)])
+return H.VM(new P.c9(new W.tS(b),z),[H.W8(z,"wS",0),null])},
+$iswS:true},
 ie:{
 "^":"TpZ:12;a",
-$1:function(a){return J.vI(J.l2(a),this.a)},
+$1:function(a){return J.tPf(J.l2(a),this.a)},
 $isEH:true},
 tS:{
 "^":"TpZ:12;b",
-$1:[function(a){J.A6(a,this.b)
+$1:[function(a){J.A6L(a,this.b)
 return a},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Ov:{
@@ -11039,14 +11037,14 @@
 return},
 Fv:[function(a,b){if(this.bi==null)return;++this.UU
 this.EO()
-if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"zd","$1","$0","gX0",0,2,136,22,137],
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"WJ","$1","$0","gX0",0,2,136,22,137],
 gUF:function(){return this.UU>0},
 QE:[function(a){if(this.bi==null||this.UU<=0)return;--this.UU
 this.DN()},"$0","gDQ",0,0,17],
 DN:function(){var z=this.H2
 if(z!=null&&this.UU<=0)J.cZ(this.bi,this.fA,z,this.el)},
 EO:function(){var z=this.H2
-if(z!=null)J.GJ(this.bi,this.fA,z,this.el)}},
+if(z!=null)J.we(this.bi,this.fA,z,this.el)}},
 Gm:{
 "^":"a;",
 gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.W8(a,"Gm",0)])},
@@ -11054,7 +11052,7 @@
 FV:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
 GT:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
 Jd:function(a){return this.GT(a,null)},
-aP:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
 UG:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
 Mh:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
@@ -11068,44 +11066,44 @@
 $isQV:true,
 $asQV:null},
 uB:{
-"^":"ark;HA",
-gA:function(a){return H.VM(new W.Qg(J.mY(this.HA)),[null])},
-gB:function(a){return this.HA.length},
-h:function(a,b){J.dH(this.HA,b)},
-Rz:function(a,b){return J.V1(this.HA,b)},
-V1:function(a){J.U2(this.HA)},
-t:function(a,b){var z=this.HA
+"^":"ark;xN",
+gA:function(a){return H.VM(new W.LV(J.mY(this.xN)),[null])},
+gB:function(a){return this.xN.length},
+h:function(a,b){J.bi(this.xN,b)},
+Rz:function(a,b){return J.V1(this.xN,b)},
+V1:function(a){J.Z8(this.xN)},
+t:function(a,b){var z=this.xN
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.HA
+u:function(a,b,c){var z=this.xN
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},
-sB:function(a,b){J.Vw(this.HA,b)},
-GT:function(a,b){J.uF(this.HA,b)},
+sB:function(a,b){J.wg(this.xN,b)},
+GT:function(a,b){J.uF(this.xN,b)},
 Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.DP(this.HA,b,c)},
+XU:function(a,b,c){return J.DP(this.xN,b,c)},
 OY:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return J.ff(this.HA,b,c)},
+Pk:function(a,b,c){return J.ff(this.xN,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-aP:function(a,b,c){return J.V2(this.HA,b,c)},
-YW:function(a,b,c,d,e){J.L0(this.HA,b,c,d,e)},
+xe:function(a,b,c){return J.Vk(this.xN,b,c)},
+YW:function(a,b,c,d,e){J.CP(this.xN,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-oq:function(a,b,c){J.Cz(this.HA,b,c)}},
-Qg:{
-"^":"a;iB",
-G:function(){return this.iB.G()},
-gl:function(){return this.iB.Ff}},
+oq:function(a,b,c){J.Cz(this.xN,b,c)}},
+LV:{
+"^":"a;qD",
+G:function(){return this.qD.G()},
+gl:function(){return this.qD.QZ}},
 W9:{
-"^":"a;NX,bd,G3,Ff",
+"^":"a;NX,vN,G3,QZ",
 G:function(){var z,y
 z=this.G3+1
-y=this.bd
-if(z<y){this.Ff=J.UQ(this.NX,z)
+y=this.vN
+if(z<y){this.QZ=J.UQ(this.NX,z)
 this.G3=z
-return!0}this.Ff=null
+return!0}this.QZ=null
 this.G3=y
 return!1},
-gl:function(){return this.Ff}},
+gl:function(){return this.QZ}},
 uY:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z=H.Va(this.b)
@@ -11118,17 +11116,17 @@
 gbq:function(a){return W.zK(this.uU.history)},
 geT:function(a){return W.P1(this.uU.parent)},
 xO:function(a){return this.uU.close()},
-xc:function(a,b,c,d){this.uU.postMessage(P.jl(b),c)},
+xc:function(a,b,c,d){this.uU.postMessage(P.pf(b),c)},
 X6:function(a,b,c){return this.xc(a,b,c,null)},
 On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-$isFU:true,
+$isPZ:true,
 static:{P1:function(a){if(a===window)return a
 else return new W.dW(a)}}},
-IV:{
-"^":"a;nAT",
+VP:{
+"^":"a;nA",
 static:{zK:function(a){if(a===window.history)return a
-else return new W.IV(a)}}}}],["","",,P,{
+else return new W.VP(a)}}}}],["","",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -11136,10 +11134,10 @@
 "%":"IDBKeyRange"}}],["","",,P,{
 "^":"",
 Y0Y:{
-"^":"tpr;N:target=,LU:href=",
+"^":"tpr;N:target=,mH:href=",
 "%":"SVGAElement"},
 ZJQ:{
-"^":"dh;LU:href=",
+"^":"Rc;mH:href=",
 "%":"SVGAltGlyphElement"},
 jwG:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
@@ -11147,13 +11145,13 @@
 lvr:{
 "^":"d5G;t5:type=,UQ:values=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
-vA:{
+pfc:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
-pyf:{
+lF:{
 "^":"d5G;xS:operator=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFECompositeElement"},
-B3:{
+EfE:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
@@ -11169,7 +11167,7 @@
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
 meI:{
-"^":"d5G;fg:height=,yG:result=,x=,y=,LU:href=",
+"^":"d5G;fg:height=,yG:result=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
 oBW:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
@@ -11183,57 +11181,57 @@
 Ubr:{
 "^":"d5G;x=,y=",
 "%":"SVGFEPointLightElement"},
-zu:{
+bMB:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
 HAk:{
 "^":"d5G;x=,y=",
 "%":"SVGFESpotLightElement"},
-Qya:{
+Rg:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFETileElement"},
 juM:{
 "^":"d5G;t5:type=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 OE5:{
-"^":"d5G;fg:height=,x=,y=,LU:href=",
+"^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGFilterElement"},
 l6:{
 "^":"tpr;fg:height=,x=,y=",
 "%":"SVGForeignObjectElement"},
-d0D:{
+en:{
 "^":"tpr;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 tpr:{
 "^":"d5G;",
 "%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 rEM:{
-"^":"tpr;fg:height=,x=,y=,LU:href=",
+"^":"tpr;fg:height=,x=,y=,mH:href=",
 "%":"SVGImageElement"},
 NBZ:{
 "^":"d5G;fg:height=,x=,y=",
 "%":"SVGMaskElement"},
 Gr5:{
-"^":"d5G;fg:height=,x=,y=,LU:href=",
+"^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-fQ:{
-"^":"d0D;fg:height=,x=,y=",
+NJ3:{
+"^":"en;fg:height=,x=,y=",
 "%":"SVGRectElement"},
 qIR:{
-"^":"d5G;t5:type=,LU:href=",
+"^":"d5G;t5:type=,mH:href=",
 "%":"SVGScriptElement"},
 EUL:{
 "^":"d5G;t5:type=",
-ska:function(a,b){a.title=b},
+smk:function(a,b){a.title=b},
 "%":"SVGStyleElement"},
 d5G:{
 "^":"h4;",
-gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.Ci(a)
+gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
 return a._cssClassSet},
-gqu:function(a){return H.VM(new P.P0(a,new W.OB(a)),[W.h4])},
-gVY:function(a){return H.VM(new W.eu(a,"mousedown",!1),[null])},
-gf0:function(a){return H.VM(new W.eu(a,"mousemove",!1),[null])},
-$isFU:true,
+gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
+gVY:function(a){return H.VM(new W.Cqa(a,C.Whw.fA,!1),[null])},
+gf0:function(a){return H.VM(new W.Cqa(a,C.Kq.fA,!1),[null])},
+$isPZ:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
 static:{"^":"SHk<"}},
 hy:{
@@ -11245,24 +11243,24 @@
 "^":"tpr;",
 "%":";SVGTextContentElement"},
 Rk4:{
-"^":"mHq;LU:href=",
+"^":"mHq;mH:href=",
 "%":"SVGTextPathElement"},
-dh:{
+Rc:{
 "^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
-pyk:{
-"^":"tpr;fg:height=,x=,y=,LU:href=",
+o4:{
+"^":"tpr;fg:height=,x=,y=,mH:href=",
 "%":"SVGUseElement"},
 cuU:{
-"^":"d5G;LU:href=",
+"^":"d5G;mH:href=",
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-Ci:{
+O7:{
 "^":"As3;LO",
 DG:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
-y=P.fM(null,null,null,P.qU)
+y=P.Ls(null,null,null,P.qU)
 if(z==null)return y
-for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.iY(x.lo)
+for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=J.rr(x.Ff)
 if(w.length!==0)y.h(0,w)}return y},
 p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["","",,P,{
 "^":"",
@@ -11270,9 +11268,9 @@
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["","",,P,{
 "^":"",
-XY:{
+hq:{
 "^":"a;",
-$isXY:true}}],["","",,P,{
+$ishq:true}}],["","",,P,{
 "^":"",
 z8:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
@@ -11338,7 +11336,7 @@
 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())},kW:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
+return P.ND(new x())},XY:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
 return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(H.VM(new P.PL(0,null,null,null,null),[null,null])).$1(a)}}},
 Xb:{
 "^":"TpZ:12;a",
@@ -11364,7 +11362,7 @@
 $isr7:true,
 static:{mt:function(a){return new P.r7(P.z8(a,!0))}}},
 GD:{
-"^":"F6;S1",
+"^":"WkF;S1",
 t:function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
 else z=!1
@@ -11379,9 +11377,9 @@
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
 h:function(a,b){this.V7("push",[b])},
 FV:function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},
-aP:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
+xe:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
 this.V7("splice",[b,0,c])},
-oq:function(a,b,c){P.UP(b,c,this.gB(this))
+oq:function(a,b,c){P.ze(b,c,this.gB(this))
 this.V7("splice",[b,c-b])},
 YW:function(a,b,c,d,e){var z,y,x
 z=this.gB(this)
@@ -11391,14 +11389,14 @@
 if(y===0)return
 if(e<0)throw H.b(P.u(e))
 x=[b,y]
-C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
+C.Nm.FV(x,J.Ld(d,e).rh(0,y))
 this.V7("splice",x)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 GT:function(a,b){this.V7("sort",[])},
 Jd:function(a){return this.GT(a,null)},
-static:{UP:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
+static:{ze:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
 if(b<a||b>c)throw H.b(P.TE(b,a,c))}}},
-F6:{
+WkF:{
 "^":"E4+lD;",
 $isWO:true,
 $asWO:null,
@@ -11428,10 +11426,10 @@
 $1:function(a){return new P.E4(a)},
 $isEH:true}}],["","",,P,{
 "^":"",
-VC:function(a,b){a=536870911&a+b
+Zm:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
-Up:function(a){a=536870911&a+((67108863&a)<<3>>>0)
+xk:function(a){a=536870911&a+((67108863&a)<<3>>>0)
 a^=a>>>11
 return 536870911&a+((16383&a)<<15>>>0)},
 J:function(a,b){var z
@@ -11458,7 +11456,7 @@
 return Math.random()*a>>>0}},
 kh:{
 "^":"a;xx,vz",
-xv:function(){var z,y,x,w,v,u
+SR:function(){var z,y,x,w,v,u
 z=this.xx
 y=4294901760*z
 x=(y&4294967295)>>>0
@@ -11471,19 +11469,19 @@
 j1:function(a){var z,y,x
 if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.xv()
-return(this.xx&z)>>>0}do{this.xv()
+if((a&z)===0){this.SR()
+return(this.xx&z)>>>0}do{this.SR()
 y=this.xx
 x=y%a}while(y-x+a>=4294967296)
 return x},
-FO:function(a){var z,y,x,w,v,u,t,s
+mK:function(a){var z,y,x,w,v,u,t,s
 z=J.u6(a,0)?-1:0
 do{y=J.Wx(a)
 x=y.i(a,4294967295)
-a=J.Ts(y.W(a,x),4294967296)
+a=J.Cl(y.W(a,x),4294967296)
 y=J.Wx(a)
 w=y.i(a,4294967295)
-a=J.Ts(y.W(a,w),4294967296)
+a=J.Cl(y.W(a,w),4294967296)
 v=((~x&4294967295)>>>0)+(x<<21>>>0)
 u=(v&4294967295)>>>0
 w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.BU(v-u,4294967296)&4294967295
@@ -11506,12 +11504,12 @@
 this.xx=(t^u)>>>0
 this.vz=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
 if(this.vz===0&&this.xx===0)this.xx=23063
-this.xv()
-this.xv()
-this.xv()
-this.xv()},
-static:{"^":"dK,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
-z.FO(a)
+this.SR()
+this.SR()
+this.SR()
+this.SR()},
+static:{"^":"tgM,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
+z.mK(a)
 return z}}},
 hL:{
 "^":"a;x>,y>",
@@ -11529,7 +11527,7 @@
 giO:function(a){var z,y
 z=J.v1(this.x)
 y=J.v1(this.y)
-return P.Up(P.VC(P.VC(0,z),y))},
+return P.xk(P.Zm(P.Zm(0,z),y))},
 g:function(a,b){var z,y,x,w
 z=this.x
 y=J.RE(b)
@@ -11579,8 +11577,8 @@
 z=y===z.gG6(b)&&this.Bb+this.R===z.gT8(b)&&y+this.fg===z.gQG(b)}else z=!1
 return z},
 giO:function(a){var z=this.G6
-return P.Up(P.VC(P.VC(P.VC(P.VC(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Bb+this.R&0x1FFFFFFF),z+this.fg&0x1FFFFFFF))},
-gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
+return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Bb+this.R&0x1FFFFFFF),z+this.fg&0x1FFFFFFF))},
+gTt:function(a){var z=new P.hL(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 tn:{
@@ -11595,7 +11593,7 @@
 moY:{
 "^":"a;JH",
 static:{"^":"aRn,aLE,Rwl"}},
-Wy:{
+V2:{
 "^":"a;",
 $isAS:true}}],["","",,H,{
 "^":"",
@@ -11606,14 +11604,14 @@
 return a},
 aRu:function(a){a.toString
 return a},
-GG:function(a,b,c){H.Hj(a,b,c)
+z4:function(a,b,c){H.Hj(a,b,c)
 return new Uint8Array(a,b)},
-WZ:{
+bf:{
 "^":"Gv;H3:byteLength=",
-gbx:function(a){return C.E0},
+gbx:function(a){return C.uh},
 kq:function(a,b,c){H.Hj(a,b,c)
 return new DataView(a,b)},
-$isWZ:true,
+$isbf:true,
 $isaI:true,
 "%":"ArrayBuffer"},
 eH:{
@@ -11629,10 +11627,10 @@
 return c},
 $iseH:true,
 $isAS:true,
-"%":";ArrayBufferView;we|ObS|GVy|Dg|fjp|Ipv|Pg"},
+"%":";ArrayBufferView;b0B|ObS|Ip|Dg|fjp|GVy|Pg"},
 dfL:{
 "^":"eH;",
-gbx:function(a){return C.T1},
+gbx:function(a){return C.nW},
 mt:function(a,b,c){throw H.b(P.f("Uint64 accessor not supported by dart2js."))},
 $isAS:true,
 "%":"DataView"},
@@ -11641,20 +11639,20 @@
 gbx:function(a){return C.ra},
 $isAS:true,
 $isWO:true,
-$asWO:function(){return[P.CP]},
+$asWO:function(){return[P.Vf]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]},
+$asQV:function(){return[P.Vf]},
 "%":"Float32Array"},
 K8Q:{
 "^":"Dg;",
-gbx:function(a){return C.Ev},
+gbx:function(a){return C.nC},
 $isAS:true,
 $isWO:true,
-$asWO:function(){return[P.CP]},
+$asWO:function(){return[P.Vf]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]},
+$asQV:function(){return[P.Vf]},
 "%":"Float64Array"},
 xja:{
 "^":"Pg;",
@@ -11671,7 +11669,7 @@
 "%":"Int16Array"},
 dE5:{
 "^":"Pg;",
-gbx:function(a){return C.J0},
+gbx:function(a){return C.QP},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11684,7 +11682,7 @@
 "%":"Int32Array"},
 Zc5:{
 "^":"Pg;",
-gbx:function(a){return C.qB},
+gbx:function(a){return C.laj},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11695,9 +11693,9 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Int8Array"},
-wfF:{
+pd:{
 "^":"Pg;",
-gbx:function(a){return C.M5},
+gbx:function(a){return C.u9},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11708,7 +11706,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Uint16Array"},
-N2:{
+Pqh:{
 "^":"Pg;",
 gbx:function(a){return C.Vh},
 t:function(a,b){var z=a.length
@@ -11723,7 +11721,7 @@
 "%":"Uint32Array"},
 eEV:{
 "^":"Pg;",
-gbx:function(a){return C.hD},
+gbx:function(a){return C.YZ},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
@@ -11735,9 +11733,9 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"CanvasPixelArray|Uint8ClampedArray"},
-V6a:{
+V6:{
 "^":"Pg;",
-gbx:function(a){return C.HC},
+gbx:function(a){return C.Wr},
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
@@ -11750,7 +11748,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":";Uint8Array"},
-we:{
+b0B:{
 "^":"eH;",
 gB:function(a){return a.length},
 SM:function(a,b,c,d,e){var z,y,x
@@ -11766,7 +11764,7 @@
 a.set(d,b)},
 $isXj:true},
 Dg:{
-"^":"GVy;",
+"^":"Ip;",
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
@@ -11778,16 +11776,16 @@
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true},
 ObS:{
-"^":"we+lD;",
+"^":"b0B+lD;",
 $isWO:true,
-$asWO:function(){return[P.CP]},
+$asWO:function(){return[P.Vf]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.CP]}},
-GVy:{
+$asQV:function(){return[P.Vf]}},
+Ip:{
 "^":"ObS+SU7;"},
 Pg:{
-"^":"Ipv;",
+"^":"GVy;",
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 a[b]=c},
@@ -11801,13 +11799,13 @@
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 fjp:{
-"^":"we+lD;",
+"^":"b0B+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
-Ipv:{
+GVy:{
 "^":"fjp+SU7;"}}],["","",,H,{
 "^":"",
 qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
@@ -11817,27 +11815,27 @@
 return}throw"Unable to print message: "+String(a)}}],["","",,G,{
 "^":"",
 Tk:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{aMd:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{oo:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.vo.LX(a)
-C.vo.XI(a)
+C.BB.LX(a)
+C.BB.XI(a)
 return a}}}}],["","",,F,{
 "^":"",
 ZP:{
-"^":"pva;Ew,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"pva;Ew,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gkc:function(a){return a.Ew},
 skc:function(a,b){a.Ew=this.ct(a,C.yh,a.Ew,b)},
 static:{Yw:function(a){var z,y,x,w
@@ -11846,7 +11844,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -11861,9 +11859,9 @@
 $isd3:true}}],["","",,L,{
 "^":"",
 nJ:{
-"^":"cda;fn,Ek,Ln,y4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-ga4:function(a){return a.fn},
-sa4:function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},
+"^":"cda;a3,Ek,Ln,y4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+ga4:function(a){return a.a3},
+sa4:function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},
 gdu:function(a){return a.Ek},
 sdu:function(a,b){a.Ek=this.ct(a,C.eh,a.Ek,b)},
 gFR:function(a){return a.Ln},
@@ -11875,19 +11873,19 @@
 hE:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isSc").value
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
-if(J.xC(z,"1-line")){z=J.JA(a.fn,"\n"," ")
-a.fn=this.ct(a,C.mi,a.fn,z)}},"$3","gxb",6,0,116,2,106,107],
-jc:[function(a,b,c,d){var z,y,x
-J.jD(b)
-z=a.fn
-a.fn=this.ct(a,C.mi,z,"")
+if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,116,2,106,107],
+kk:[function(a,b,c,d){var z,y,x
+J.fD(b)
+z=a.a3
+a.a3=this.ct(a,C.mi,z,"")
 if(a.Ln!=null){y=P.Fl(null,null)
 x=R.tB(y)
-J.qQ(x,"expr",z)
-J.V2(a.y4,0,x)
+J.kW(x,"expr",z)
+J.Vk(a.y4,0,x)
 this.LY(a,z).ml(new L.YW(x))}},"$3","gZ2",6,0,116,2,106,107],
-o5:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.fn=this.ct(a,C.mi,a.fn,z)},"$1","gHo",2,0,152,2],
+o5:[function(a,b){var z=J.VU(J.l2(b),"expr")
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,152,2],
 static:{Rpj:function(a){var z,y,x,w,v
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -11897,26 +11895,26 @@
 v=P.Fl(null,null)
 a.Ek="1-line"
 a.y4=z
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.GhT.LX(a)
-C.GhT.XI(a)
+C.Jh.LX(a)
+C.Jh.XI(a)
 return a}}},
 cda:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
 "^":"TpZ:12;a",
-$1:[function(a){J.qQ(this.a,"value",a)},"$1",null,2,0,null,121,"call"],
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,R,{
 "^":"",
 Eg:{
-"^":"KAf;fe,l1,bY,jv,oy,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"KAf;fe,l1,bY,jv,oy,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gO9:function(a){return a.fe},
 sO9:function(a,b){a.fe=this.ct(a,C.S4,a.fe,b)},
 gph:function(a){return a.l1},
@@ -11933,7 +11931,7 @@
 if(z===!0)return
 if(a.bY!=null){a.fe=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Ou(a)).wM(new R.VO(a))}},"$3","gDf",6,0,84,49,50,85],
+this.LY(a,a.jv).ml(new R.Kz(a)).wM(new R.uv(a))}},"$3","gDf",6,0,84,49,50,85],
 static:{Ola:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11945,40 +11943,40 @@
 a.bY=null
 a.jv=""
 a.oy=null
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.qL.LX(a)
-C.qL.XI(a)
+C.lQ.LX(a)
+C.lQ.XI(a)
 return a}}},
 KAf:{
 "^":"xc+Pi;",
 $isd3:true},
-Ou:{
+Kz:{
 "^":"TpZ:153;a",
 $1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,96,"call"],
+z.oy=J.NB(z,C.UY,z.oy,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-VO:{
+uv:{
 "^":"TpZ:76;b",
 $0:[function(){var z=this.b
-z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
+z.fe=J.NB(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["","",,D,{
 "^":"",
 i7:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{hSW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -11990,7 +11988,7 @@
 return a}}}}],["","",,A,{
 "^":"",
 Gk:{
-"^":"waa;KV,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"waa;KV,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
 pA:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,19,102],
@@ -12000,22 +11998,22 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.D4.LX(a)
-C.D4.XI(a)
+C.LTI.LX(a)
+C.LTI.XI(a)
 return a}}},
 waa:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,X,{
 "^":"",
 J3:{
-"^":"V10;DC,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V10;DC,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
 pA:[function(a,b){J.LE(a.DC).wM(b)},"$1","gvC",2,0,19,102],
@@ -12025,45 +12023,45 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.N3.LX(a)
-C.N3.XI(a)
+C.n0.LX(a)
+C.n0.XI(a)
 return a}}},
 V10:{
 "^":"uL+Pi;",
 $isd3:true},
 MJ:{
-"^":"V11;Zc,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gng:function(a){return a.Zc},
-sng:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
+"^":"V11;Zc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gQR:function(a){return a.Zc},
+sQR:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
 static:{IfX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Hb.LX(a)
-C.Hb.XI(a)
+C.ls6.LX(a)
+C.ls6.XI(a)
 return a}}},
 V11:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,U,{
 "^":"",
 DK:{
-"^":"T53;PQ,Vg,ij,tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"T53;PQ,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gU4:function(a){return a.PQ},
 sU4:function(a,b){a.PQ=this.ct(a,C.QK,a.PQ,b)},
 static:{v9:function(a){var z,y,x,w
@@ -12073,8 +12071,8 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.PQ=!0
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12089,18 +12087,18 @@
 $isd3:true}}],["","",,N,{
 "^":"",
 BS:{
-"^":"V12;P6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V12;P6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
 pA:[function(a,b){J.LE(a.P6).wM(b)},"$1","gvC",2,0,19,102],
-Da:[function(a,b){J.y9(a.P6).wM(b)},"$1","gDX",2,0,19,102],
+m4:[function(a,b){J.y9(a.P6).wM(b)},"$1","gDX",2,0,19,102],
 static:{nz:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12132,9 +12130,9 @@
 if(typeof z!=="number")return H.s(z)
 return new O.Hz(a,(y*x+z)*4)}}},
 x2:{
-"^":"a;Yu<,ky>"},
+"^":"a;Yu<,yT>"},
 Vb:{
-"^":"V13;N2,WC,rn,Tl,GE,Cv,PA,oj,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V13;N2,WC,rn,Tl,GE,Cv,PA,oj,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gpf:function(a){return a.PA},
 spf:function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},
 gyw:function(a){return a.oj},
@@ -12145,10 +12143,10 @@
 a.N2=z
 z=J.Q9(z)
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(this.gL2(a)),z.el),[H.u3(z,0)]).DN()
-z=J.PQ(a.N2)
+z=J.GW(a.N2)
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(this.gok(a)),z.el),[H.u3(z,0)]).DN()},
 Zt:function(a,b){var z,y,x
-for(z=J.mY(b),y=0;z.G();){x=z.lo
+for(z=J.mY(b),y=0;z.G();){x=z.Ff
 if(typeof x!=="number")return H.s(x)
 y=y*256+x}return y},
 OU:function(a,b,c,d){var z=J.BQ(c,"@")
@@ -12159,7 +12157,7 @@
 DO:function(a,b,c){var z,y,x,w,v,u,t,s,r
 for(z=J.mY(J.UQ(b,"members")),y=a.Cv,x=a.Tl,w=a.GE;z.G();){v=z.gl()
 if(!J.x(v).$isdy){N.QM("").To(H.d(v))
-continue}u=H.BU(C.Nm.grZ(J.BQ(v.r0,"/")),null,null)
+continue}u=H.BU(C.Nm.grZ(J.BQ(v.TU,"/")),null,null)
 t=u==null?C.Xh:P.n2(u)
 s=[t.j1(128),t.j1(128),t.j1(128),255]
 r=J.BQ(v.bN,"@")
@@ -12167,7 +12165,7 @@
 y.u(0,u,r[0])
 x.u(0,u,s)
 w.u(0,this.Zt(a,s),u)}this.OU(a,c,"Free",$.R2())
-this.OU(a,0,"",$.vl())},
+this.OU(a,0,"",$.Qg())},
 Tm:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.rn
 y=J.eY(a.WC)
@@ -12203,15 +12201,15 @@
 bD:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y=this.Tm(a,z.gD7(b))
-x=H.d(y.ky)+"B @ 0x"+J.u1(y.Yu,16)
+x=H.d(y.yT)+"B @ 0x"+J.u1(y.Yu,16)
 z=z.gD7(b)
 z=O.x6(a.WC,z)
 w=z.y5
 v=a.Cv.t(0,a.GE.t(0,this.Zt(a,C.yp.Yc(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
 a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gL2",2,0,152,87],
-Vq:[function(a,b){var z=J.u1(this.Tm(a,J.op(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.wg(a.oj)))+"/address/"+z},"$1","gok",2,0,152,87],
+qM:[function(a,b){var z=J.u1(this.Tm(a,J.op(b)).Yu,16)
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gok",2,0,152,87],
 UV:function(a){var z,y,x,w,v
 z=a.oj
 if(z==null||a.N2==null)return
@@ -12220,19 +12218,19 @@
 z=a.N2.parentElement
 z.toString
 x=P.T7(C.CD.yu(C.CD.RE(z.clientLeft)),C.CD.yu(C.CD.RE(z.clientTop)),C.CD.yu(C.CD.RE(z.clientWidth)),C.CD.yu(C.CD.RE(z.clientHeight)),null).R
-z=J.Ts(J.Ts(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
+z=J.Cl(J.Cl(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
 if(typeof z!=="number")return H.s(z)
 z=4+z
 a.rn=z
 w=J.q8(y)
 if(typeof w!=="number")return H.s(w)
 v=P.J(z*w,6000)
-w=P.f9(J.rN(a.N2).createImageData(x,v))
+w=P.f9(J.Ry(a.N2).createImageData(x,v))
 a.WC=w
 J.vP(a.N2,J.eY(w))
-J.OE(a.N2,J.Jv(a.WC))
-this.JX(a,0)},
-JX:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+J.OE(a.N2,J.OB(a.WC))
+this.Ky(a,0)},
+Ky:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z=J.UQ(a.oj,"pages")
 y=J.U6(z)
 x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
@@ -12243,7 +12241,7 @@
 v=w+x
 x=y.gB(z)
 if(typeof x!=="number")return H.s(x)
-if(!(b>=x)){x=J.Jv(a.WC)
+if(!(b>=x)){x=J.OB(a.WC)
 if(typeof x!=="number")return H.s(x)
 x=v>x}else x=!0
 if(x)return
@@ -12273,18 +12271,18 @@
 l=C.CD.Z(x,l)
 new P.hL(m,l).$builtinTypeInfo=[null]
 if(!(l<v))break
-x=$.vl()
+x=$.Qg()
 m=y+4
 C.yp.zB(n.gRn(r),y,m,x)
-u=new O.Hz(r,m)}y=J.rN(a.N2)
+u=new O.Hz(r,m)}y=J.Ry(a.N2)
 x=a.WC
-J.nb(y,x,0,0,0,w,J.eY(x),v)
-P.nd(new O.nW(a,b),null)},
+J.kZ(y,x,0,0,0,w,J.eY(x),v)
+P.DJ(new O.R5(a,b),null)},
 pA:[function(a,b){var z=a.oj
 if(z==null)return
-J.wg(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).wM(b)},"$1","gvC",2,0,19,102],
-YS7:[function(a,b){P.nd(new O.oc(a),null)},"$1","gRs",2,0,19,59],
-static:{"^":"nK,dg,SoT,WBO",dF:function(a){var z,y,x,w,v,u,t
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.pM()).wM(b)},"$1","gvC",2,0,19,102],
+YS7:[function(a,b){P.DJ(new O.oc(a),null)},"$1","gRh",2,0,19,59],
+static:{"^":"nK,Os,SoT,WBO",teo:function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
@@ -12296,7 +12294,7 @@
 a.Tl=z
 a.GE=y
 a.Cv=x
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=w
@@ -12309,32 +12307,32 @@
 V13:{
 "^":"uL+Pi;",
 $isd3:true},
-nW:{
+R5:{
 "^":"TpZ:76;a,b",
-$0:function(){J.tE(this.a,this.b+1)},
+$0:function(){J.AC(this.a,this.b+1)},
 $isEH:true},
 aG:{
 "^":"TpZ:114;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,155,"call"],
+z.oj=J.NB(z,C.QH,z.oj,a)},"$1",null,2,0,null,155,"call"],
 $isEH:true},
-z4:{
+pM:{
 "^":"TpZ:81;",
 $2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,156,"call"],
 $isEH:true},
 oc:{
 "^":"TpZ:76;a",
-$0:function(){J.J2g(this.a)},
+$0:function(){J.oO(this.a)},
 $isEH:true}}],["","",,K,{
 "^":"",
 UC:{
-"^":"Vz;oH,vp,GD,pT,Rj,Vg,ij",
+"^":"Vz;oH,vp,zz,pT,Rj,Vg,fn",
 Ey:function(a,b){var z
 if(b===0){z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 return J.DA(J.UQ(J.hI(z[a]),b))}return G.Vz.prototype.Ey.call(this,a,b)}},
 Ly:{
-"^":"V14;MF,uY,Xe,JN,FX,qD,Rp,Na,Ol,Sk,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V14;MF,uY,Xe,jF,FX,Uv,Rp,Na,Ol,Sk,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gYt:function(a){return a.MF},
 sYt:function(a,b){a.MF=this.ct(a,C.TN,a.MF,b)},
 gcH:function(a){return a.uY},
@@ -12348,15 +12346,15 @@
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.qu(null,P.L5(null,null,null,null,null))
+y=new G.yD(null,P.L5(null,null,null,null,null))
 y.vR=P.zV(J.UQ($.BY,"PieChart"),[z])
-a.JN=y
+a.jF=y
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.qu(null,P.L5(null,null,null,null,null))
+z=new G.yD(null,P.L5(null,null,null,null,null))
 z.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-a.qD=z
+a.Uv=z
 a.Na=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
-Qf:function(a){var z,y,x,w
+Y1:function(a){var z,y,x,w
 for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 x=J.U6(y)
 w=x.t(y,"class")
@@ -12376,28 +12374,28 @@
 s=y.gxQ().gEJ().wf
 r=y.gxQ().gl().wY
 q=y.gxQ().gl().wf
-J.Ip(a.Rp,new G.c0([y,"",x,w,v,u,"",t,s,r,q]))}J.zq(a.Rp)},
-lD:function(a,b,c){var z,y,x,w,v,u
-z=J.UQ(J.x3(a.Rp),c)
+J.an(a.Rp,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.II(a.Rp)},
+As:function(a,b,c){var z,y,x,w,v,u
+z=J.UQ(J.TY(a.Rp),c)
 y=J.RE(b)
 x=J.RE(z)
-J.PP(J.UQ(J.dd(J.UQ(y.gqu(b),0)),0),J.UQ(x.gUQ(z),0))
+J.PP(J.UQ(J.Mx(J.UQ(y.gks(b),0)),0),J.UQ(x.gUQ(z),0))
 w=1
 while(!0){v=J.q8(x.gUQ(z))
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
-c$0:{if(C.Nm.tg(C.jb,w))break c$0
-u=J.UQ(y.gqu(b),w)
+c$0:{if(C.Nm.tg(C.Q5,w))break c$0
+u=J.UQ(y.gks(b),w)
 v=J.RE(u)
-v.ska(u,J.AG(J.UQ(x.gUQ(z),w)))
+v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
 v.sa4(u,a.Rp.Gu(c,w))}++w}},
 ya:function(a){var z,y,x,w,v,u,t,s
-z=J.dd(a.Na)
-if(z.gB(z)>a.Rp.gGD().length){z=J.dd(a.Na)
-y=z.gB(z)-a.Rp.gGD().length
-for(x=0;x<y;++x)J.dd(a.Na).f4(0)}else{z=J.dd(a.Na)
-if(z.gB(z)<a.Rp.gGD().length){z=a.Rp.gGD().length
-w=J.dd(a.Na)
+z=J.Mx(a.Na)
+if(z.gB(z)>a.Rp.gzz().length){z=J.Mx(a.Na)
+y=z.gB(z)-a.Rp.gzz().length
+for(x=0;x<y;++x)J.Mx(a.Na).mv(0)}else{z=J.Mx(a.Na)
+if(z.gB(z)<a.Rp.gzz().length){z=a.Rp.gzz().length
+w=J.Mx(a.Na)
 v=z-w.gB(w)
 for(x=0;x<v;++x){u=document.createElement("tr",null)
 z=J.RE(u)
@@ -12416,42 +12414,42 @@
 z.iF(u,-1)
 z.iF(u,-1)
 z.iF(u,-1)
-J.dd(a.Na).h(0,u)}}}for(x=0;x<a.Rp.gGD().length;++x){z=a.Rp.gGD()
+J.Mx(a.Na).h(0,u)}}}for(x=0;x<a.Rp.gzz().length;++x){z=a.Rp.gzz()
 if(x>=z.length)return H.e(z,x)
 s=z[x]
-this.lD(a,J.dd(a.Na).t(0,x),s)}},
+this.As(a,J.Mx(a.Na).t(0,x),s)}},
 BB:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.Rp.gn4()
+if(!!J.x(d).$isv6){z=a.Rp.gxp()
 y=d.cellIndex
 x=a.Rp
-if(z==null?y!=null:z!==y){x.sn4(y)
+if(z==null?y!=null:z!==y){x.sxp(y)
 a.Rp.sT3(!0)}else x.sT3(!x.gT3())
-J.zq(a.Rp)
+J.II(a.Rp)
 this.ya(a)}},"$3","gQq",6,0,105,2,106,107],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.wg(z).cv("/allocationprofile").ml(this.gbM(a)).wM(b)},"$1","gvC",2,0,19,102],
+J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).wM(b)},"$1","gvC",2,0,19,102],
 zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.wg(z).cv("/allocationprofile?gc=full").ml(this.gbM(a)).wM(b)},"$1","gzH",2,0,19,102],
+J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).wM(b)},"$1","gyW",2,0,19,102],
 eJ8:[function(a,b){var z=a.Ol
 if(z==null)return
-J.wg(z).cv("/allocationprofile?reset=true").ml(this.gbM(a)).wM(b)},"$1","gNb",2,0,19,102],
-un:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gbM",2,0,157,158],
+J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).wM(b)},"$1","gNb",2,0,19,102],
+Ed:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,157,158],
 n1:[function(a,b){var z,y,x,w,v
 z=a.Ol
 if(z==null)return
-z=J.wg(z)
+z=J.aT(z)
 z=this.ct(a,C.rB,a.Sk,z)
 a.Sk=z
-z.WU(J.UQ(a.Ol,"heaps"))
+z.Bs(J.UQ(a.Ol,"heaps"))
 y=H.BU(J.UQ(a.Ol,"dateLastAccumulatorReset"),null,null)
 if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
 a.uY=this.ct(a,C.Zi,a.uY,z)}y=H.BU(J.UQ(a.Ol,"dateLastServiceGC"),null,null)
 if(!J.xC(y,0)){z=P.Wu(y,!1).bu(0)
 a.MF=this.ct(a,C.TN,a.MF,z)}z=a.Xe.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-x=J.wg(a.Ol)
+x=J.aT(a.Ol)
 z=a.Xe
 w=x.gUY().gSU()
 z=z.Yb
@@ -12459,7 +12457,7 @@
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
 v=a.Xe
-z=J.bI(x.gUY().gbZ(),x.gUY().gSU())
+z=J.bI(x.gUY().gkV(),x.gUY().gSU())
 v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
@@ -12479,7 +12477,7 @@
 C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
 z.V7("addRow",[H.VM(new P.GD(v),[null])])
 v=a.FX
-z=J.bI(x.gxQ().gbZ(),x.gxQ().gSU())
+z=J.bI(x.gxQ().gkV(),x.gxQ().gSU())
 v=v.Yb
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
@@ -12490,42 +12488,42 @@
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
 w.V7("addRow",[H.VM(new P.GD(z),[null])])
-this.Qf(a)
+this.Y1(a)
 this.FS(a)
 this.ya(a)
-a.JN.Am(0,a.Xe)
-a.qD.Am(0,a.FX)
+a.jF.Am(0,a.Xe)
+a.Uv.Am(0,a.FX)
 this.ct(a,C.Aq,0,1)
 this.ct(a,C.ST,0,1)
-this.ct(a,C.DS,0,1)},"$1","gwh",2,0,19,59],
+this.ct(a,C.DS,0,1)},"$1","gd0",2,0,19,59],
 ps:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,159,160],
+return C.CD.Sy(J.L9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,159,160],
 NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gBo",2,0,159,160],
+return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,159,160],
 o7:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
 return J.cI((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,159,160],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.Xe=new G.eM(z)
+a.Xe=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
 a.Xe.Yb.V7("addColumn",["number","Size"])
 z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.FX=new G.eM(z)
+a.FX=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
 a.FX.Yb.V7("addColumn",["number","Size"])
-z=H.VM([],[G.c0])
-z=this.ct(a,C.kG,a.Rp,new K.UC([new G.Kt("Class",G.NZt()),new G.Kt("",G.NZt()),new G.Kt("Accumulated Size (New)",G.RC()),new G.Kt("Accumulated Instances",G.nI()),new G.Kt("Current Size",G.RC()),new G.Kt("Current Instances",G.nI()),new G.Kt("",G.NZt()),new G.Kt("Accumulator Size (Old)",G.RC()),new G.Kt("Accumulator Instances",G.nI()),new G.Kt("Current Size",G.RC()),new G.Kt("Current Instances",G.nI())],z,[],0,!0,null,null))
+z=H.VM([],[G.Ni])
+z=this.ct(a,C.kG,a.Rp,new K.UC([new G.Kt("Class",G.Tp()),new G.Kt("",G.Tp()),new G.Kt("Accumulated Size (New)",G.Gt()),new G.Kt("Accumulated Instances",G.OA()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.OA()),new G.Kt("",G.Tp()),new G.Kt("Accumulator Size (Old)",G.Gt()),new G.Kt("Accumulator Instances",G.OA()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.OA())],z,[],0,!0,null,null))
 a.Rp=z
-z.sn4(2)},
+z.sxp(2)},
 static:{EDe:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12534,7 +12532,7 @@
 w=P.Fl(null,null)
 a.MF="---"
 a.uY="---"
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12549,19 +12547,19 @@
 "^":"uL+Pi;",
 $isd3:true}}],["","",,P,{
 "^":"",
-jl:function(a){var z,y
+pf:function(a){var z,y
 z=[]
-y=new P.Tm(new P.wF([],z),new P.rG(z),new P.Os(z)).$1(a)
+y=new P.kd(new P.wF([],z),new P.rG(z),new P.yhO(z)).$1(a)
 new P.Qa().$0()
 return y},
 o7:function(a,b){var z=[]
-return new P.xL(b,new P.GW([],z),new P.D6(z),new P.m5(z)).$1(a)},
+return new P.xL(b,new P.CA([],z),new P.D6(z),new P.m5(z)).$1(a)},
 f9:function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},
-QO:function(a){if(!!J.x(a).$isqS)return{data:a.Rn,height:a.fg,width:a.R}
+y.BYTES_PER_ELEMENT=1}return a}return new P.nl(a.data,a.height,a.width)},
+QO:function(a){if(!!J.x(a).$isnl)return{data:a.Rn,height:a.fg,width:a.R}
 return a},
 F7:function(){var z=$.R6
 if(z==null){z=$.Qz
@@ -12584,7 +12582,7 @@
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
-Os:{
+yhO:{
 "^":"TpZ:162;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
@@ -12594,7 +12592,7 @@
 "^":"TpZ:76;",
 $0:function(){},
 $isEH:true},
-Tm:{
+kd:{
 "^":"TpZ:12;f,UI,bK",
 $1:function(a){var z,y,x,w,v,u
 z={}
@@ -12607,9 +12605,8 @@
 if(!!y.$iswL)throw H.b(P.nO("structured clone of RegExp"))
 if(!!y.$ishH)return a
 if(!!y.$isO4)return a
-if(!!y.$isXV)return a
 if(!!y.$isSg)return a
-if(!!y.$isWZ)return a
+if(!!y.$isbf)return a
 if(!!y.$iseH)return a
 if(!!y.$isT8){x=this.f.$1(a)
 w=this.UI.$1(x)
@@ -12633,7 +12630,7 @@
 "^":"TpZ:81;a,Gq",
 $2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,79,20,"call"],
 $isEH:true},
-GW:{
+CA:{
 "^":"TpZ:51;a,b",
 $1:function(a){var z,y,x,w
 z=this.a
@@ -12669,7 +12666,7 @@
 if(y!=null)return y
 y=P.Fl(null,null)
 this.bK.$2(z,y)
-for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
+for(x=Object.keys(a),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.Ff
 y.u(0,w,this.$1(a[w]))}return y}if(a instanceof Array){z=this.f.$1(a)
 y=this.UI.$1(z)
 if(y!=null)return y
@@ -12683,9 +12680,9 @@
 for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
 return y}return a},
 $isEH:true},
-qS:{
+nl:{
 "^":"a;Rn>,fg>,R>",
-$isqS:true,
+$isnl:true,
 $isSg:true},
 As3:{
 "^":"a;",
@@ -12700,8 +12697,8 @@
 return H.VM(new H.xy(z,b),[H.u3(z,0),null])},"$1","gIr",2,0,163,30],
 ad:function(a,b){var z=this.DG()
 return H.VM(new H.U5(z,b),[H.u3(z,0)])},
-yx:[function(a,b){var z=this.DG()
-return H.VM(new H.Fm(z,b),[H.u3(z,0),null])},"$1","git",2,0,164,30],
+lM:[function(a,b){var z=this.DG()
+return H.VM(new H.oA(z,b),[H.u3(z,0),null])},"$1","git",2,0,164,30],
 Vr:function(a,b){return this.DG().Vr(0,b)},
 gl0:function(a){return this.DG().X5===0},
 gor:function(a){return this.DG().X5!==0},
@@ -12717,7 +12714,7 @@
 return y},
 FV:function(a,b){this.H9(new P.rl(b))},
 uk:function(a,b){this.H9(new P.Jg(b))},
-gtH:function(a){var z=this.DG().HH
+gqG:function(a){var z=this.DG().HH
 if(z==null)H.vh(P.w("No elements"))
 return z.gGc(z)},
 grZ:function(a){var z=this.DG().Nz
@@ -12725,27 +12722,27 @@
 return z.gGc(z)},
 tt:function(a,b){return this.DG().tt(0,b)},
 br:function(a){return this.tt(a,!0)},
-Oe:function(a){var z,y
+zH:function(a){var z,y
 z=this.DG()
 y=z.iL()
 y.FV(0,z)
 return y},
 eR:function(a,b){var z=this.DG()
-return H.p6(z,b,H.u3(z,0))},
+return H.ke(z,b,H.u3(z,0))},
 V1:function(a){this.H9(new P.uQ())},
 H9:function(a){var z,y
 z=this.DG()
 y=a.$1(z)
 this.p5(z)
 return y},
-$isz5:true,
-$asz5:function(){return[P.qU]},
+$isOl:true,
+$asOl:function(){return[P.qU]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.qU]}},
 GE:{
 "^":"TpZ:12;a",
-$1:[function(a){return J.dH(a,this.a)},"$1",null,2,0,null,165,"call"],
+$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,165,"call"],
 $isEH:true},
 rl:{
 "^":"TpZ:12;a",
@@ -12757,23 +12754,23 @@
 $isEH:true},
 uQ:{
 "^":"TpZ:12;",
-$1:[function(a){return J.U2(a)},"$1",null,2,0,null,165,"call"],
+$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,165,"call"],
 $isEH:true},
-P0:{
-"^":"ark;im,vN",
-gd3:function(){var z=this.vN
+D7:{
+"^":"ark;im,kG",
+gd3:function(){var z=this.kG
 return P.F(z.ad(z,new P.hT()),!0,W.h4)},
 aN:function(a,b){H.bQ(this.gd3(),b)},
 u:function(a,b,c){var z=this.gd3()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.vR(z[b],c)},
+J.DG(z[b],c)},
 sB:function(a,b){var z=this.gd3().length
 if(b>=z)return
 else if(b<0)throw H.b(P.u("Invalid list length"))
 this.oq(0,b,z)},
-h:function(a,b){this.vN.uR.appendChild(b)},
+h:function(a,b){this.kG.uR.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.vN.uR;z.G();)y.appendChild(z.lo)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.kG.uR;z.G();)y.appendChild(z.Ff)},
 tg:function(a,b){if(!J.x(b).$ish4)return!1
 return b.parentNode===this.im},
 GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
@@ -12781,22 +12778,22 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 oq:function(a,b,c){H.bQ(C.Nm.aM(this.gd3(),b,c),new P.rK())},
-V1:function(a){J.Wf(this.vN.uR)},
-f4:function(a){var z=this.grZ(this)
-if(z!=null)J.Rv(z)
+V1:function(a){J.Wf(this.kG.uR)},
+mv:function(a){var z=this.grZ(this)
+if(z!=null)J.Mp(z)
 return z},
-aP:function(a,b,c){this.vN.aP(0,b,c)},
+xe:function(a,b,c){this.kG.xe(0,b,c)},
 UG:function(a,b,c){var z,y
-z=this.vN.uR
+z=this.kG.uR
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
+J.r5(z,c,y[b])},
 Rz:function(a,b){var z,y,x
 if(!J.x(b).$ish4)return!1
 for(z=0;z<this.gd3().length;++z){y=this.gd3()
 if(z>=y.length)return H.e(y,z)
 x=y[z]
-if(x===b){J.Rv(x)
+if(x===b){J.Mp(x)
 return!0}}return!1},
 gB:function(a){return this.gd3().length},
 t:function(a,b){var z=this.gd3()
@@ -12810,23 +12807,23 @@
 $isEH:true},
 rK:{
 "^":"TpZ:12;",
-$1:function(a){return J.Rv(a)},
+$1:function(a){return J.Mp(a)},
 $isEH:true}}],["","",,O,{
 "^":"",
 Im:{
-"^":"V15;ee,jw,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V15;ee,jw,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gnv:function(a){return a.ee},
 snv:function(a,b){a.ee=this.ct(a,C.kY,a.ee,b)},
-gnS:function(a){return J.UQ(a.ee,"slot")},
-guh:function(a){var z=J.UQ(a.ee,"slot")
+gV8:function(a){return J.UQ(a.ee,"slot")},
+gyg:function(a){var z=J.UQ(a.ee,"slot")
 return typeof z==="number"},
-gB3:function(a){return!!J.x(J.UQ(a.ee,"slot")).$isvO&&J.xC(J.UQ(J.UQ(a.ee,"slot"),"type"),"@Field")},
+gWk:function(a){return!!J.x(J.UQ(a.ee,"slot")).$isvO&&J.xC(J.UQ(J.UQ(a.ee,"slot"),"type"),"@Field")},
 gFF:function(a){return J.UQ(a.ee,"source")},
 gyK:function(a){return a.jw},
 syK:function(a,b){a.jw=this.ct(a,C.uO,a.jw,b)},
-yg:[function(a,b){return J.wg(J.UQ(a.ee,"source")).cv(J.WB(J.eS(J.UQ(a.ee,"source")),"/inbound_references?limit="+H.d(b))).ml(new O.cCu(a))},"$1","gi0",2,0,111,32],
+rT:[function(a,b){return J.aT(J.UQ(a.ee,"source")).cv(J.WB(J.eS(J.UQ(a.ee,"source")),"/inbound_references?limit="+H.d(b))).ml(new O.cC(a))},"$1","gi0",2,0,111,32],
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-vQ:[function(a,b,c){if(b===!0)this.yg(a,100).ml(new O.qm(a)).wM(c)
+vQ:[function(a,b,c){if(b===!0)this.rT(a,100).ml(new O.qm(a)).wM(c)
 else{a.jw=this.ct(a,C.uO,a.jw,null)
 c.$0()}},"$2","gus",4,0,118,119,120],
 static:{eka:function(a){var z,y,x,w
@@ -12835,7 +12832,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12848,22 +12845,22 @@
 V15:{
 "^":"uL+Pi;",
 $isd3:true},
-cCu:{
+cC:{
 "^":"TpZ:114;a",
 $1:[function(a){var z,y,x
 z=this.a
 y=J.UQ(a,"references")
 x=Q.pT(null,null)
 x.FV(0,y)
-z.jw=J.Q5(z,C.uO,z.jw,x)},"$1",null,2,0,null,155,"call"],
+z.jw=J.NB(z,C.uO,z.jw,x)},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 qm:{
 "^":"TpZ:12;a",
-$1:[function(a){J.Q5(this.a,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
+$1:[function(a){J.NB(this.a,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,B,{
 "^":"",
 pR:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gJp:function(a){var z=a.tY
 if(z!=null)if(J.xC(J.zH(z),"Sentinel"))if(J.xC(J.eS(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.xC(J.eS(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
@@ -12873,42 +12870,42 @@
 return Q.xI.prototype.gJp.call(this,a)},
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){var z=a.tY
-if(b===!0)J.LE(z).ml(new B.Js(a)).wM(c)
+if(b===!0)J.LE(z).ml(new B.tV(a)).wM(c)
 else{z.stJ(null)
-J.vF(z,null)
+J.Z6(z,null)
 c.$0()}},"$2","gus",4,0,118,119,120],
-static:{lu:function(a){var z,y,x,w
+static:{luW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.hM.LX(a)
-C.hM.XI(a)
+C.uRw.LX(a)
+C.uRw.XI(a)
 return a}}},
-Js:{
+tV:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
-if(a.gPE()!=null){J.WI(a,a.gPE())
-a.szz(a.gPE())}z=this.a
+if(a.gPE()!=null){J.DF(a,a.gPE())
+a.sTE(a.gPE())}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.kY,z.tY,a)
 y.ct(z,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,Z,{
 "^":"",
 EZ:{
-"^":"V16;VQ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V16;VQ,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 ghf:function(a){return a.VQ},
 shf:function(a,b){a.VQ=this.ct(a,C.fn,a.VQ,b)},
-vV:[function(a,b){return J.wg(a.VQ).cv(J.WB(J.eS(a.VQ),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
+vV:[function(a,b){return J.aT(a.VQ).cv(J.WB(J.eS(a.VQ),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
 pA:[function(a,b){J.LE(a.VQ).wM(b)},"$1","gvC",2,0,122,120],
 static:{CoW:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -12916,7 +12913,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12931,7 +12928,7 @@
 $isd3:true}}],["","",,E,{
 "^":"",
 L4:{
-"^":"V17;PM,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V17;PM,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
 pA:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,19,102],
@@ -12941,50 +12938,50 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.j1.LX(a)
-C.j1.XI(a)
+C.j1o.LX(a)
+C.j1o.XI(a)
 return a}}},
 V17:{
 "^":"uL+Pi;",
 $isd3:true},
 Mb:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{RVI:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.aj2.LX(a)
-C.aj2.XI(a)
+C.Ag.LX(a)
+C.Ag.XI(a)
 return a}}},
 mO:{
-"^":"V18;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V18;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
-static:{V6:function(a){var z,y,x,w
+static:{Ch:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -12998,15 +12995,15 @@
 "^":"uL+Pi;",
 $isd3:true},
 DE:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{lIg:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13017,62 +13014,62 @@
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V19;yR,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V19;yR,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
 pA:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,19,102],
-T9:[function(a){J.LE(a.yR).wM(new E.Jj(a))},"$0","gqw",0,0,17],
+nS:[function(a){J.LE(a.yR).wM(new E.XB(a))},"$0","gqw",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
 if(z!=null){z.Gv()
-a.mZ=null}},
+a.c3=null}},
 static:{TiU:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.x4.LX(a)
-C.x4.XI(a)
+C.VLs.LX(a)
+C.VLs.XI(a)
 return a}}},
 V19:{
 "^":"uL+Pi;",
 $isd3:true},
-Jj:{
+XB:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 H8:{
-"^":"V20;OS,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V20;OS,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gPB:function(a){return a.OS},
 sPB:function(a,b){a.OS=this.ct(a,C.yL,a.OS,b)},
 pA:[function(a,b){J.LE(a.OS).wM(b)},"$1","gvC",2,0,19,102],
-T9:[function(a){J.LE(a.OS).wM(new E.uN(a))},"$0","gqw",0,0,17],
+nS:[function(a){J.LE(a.OS).wM(new E.cP(a))},"$0","gqw",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gqw(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
 if(z!=null){z.Gv()
-a.mZ=null}},
+a.c3=null}},
 static:{ZhX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13085,51 +13082,51 @@
 V20:{
 "^":"uL+Pi;",
 $isd3:true},
-uN:{
+cP:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 WS:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{jS:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{l5s:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Ug.LX(a)
-C.Ug.XI(a)
+C.bP.LX(a)
+C.bP.XI(a)
 return a}}},
 qh:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{cua:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.wK.LX(a)
-C.wK.XI(a)
+C.IXz.LX(a)
+C.IXz.XI(a)
 return a}}},
 oF:{
-"^":"V21;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V21;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
@@ -13139,7 +13136,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13153,7 +13150,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Q6:{
-"^":"V22;uv,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V22;uv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
 pA:[function(a,b){J.LE(a.uv).wM(b)},"$1","gvC",2,0,19,102],
@@ -13163,7 +13160,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13177,36 +13174,36 @@
 "^":"uL+Pi;",
 $isd3:true},
 uE:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{egu:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.js.LX(a)
-C.js.XI(a)
+C.Fw.LX(a)
+C.Fw.XI(a)
 return a}}},
 Zn:{
-"^":"V23;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V23;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
-static:{n0:function(a){var z,y,x,w
+static:{kf:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13220,9 +13217,9 @@
 "^":"uL+Pi;",
 $isd3:true},
 n5:{
-"^":"V24;h1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gyW:function(a){return a.h1},
-syW:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
+"^":"V24;h1,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gHy:function(a){return a.h1},
+sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
 pA:[function(a,b){J.LE(a.h1).wM(b)},"$1","gvC",2,0,19,102],
 static:{iOo:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -13230,7 +13227,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13244,7 +13241,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ma:{
-"^":"V25;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V25;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
@@ -13254,7 +13251,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13268,15 +13265,15 @@
 "^":"uL+Pi;",
 $isd3:true},
 wN:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{wZ7:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{ML:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13287,25 +13284,25 @@
 C.RVQ.XI(a)
 return a}}},
 ds:{
-"^":"V26;wT,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V26;wT,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
 pA:[function(a,b){J.LE(a.wT).wM(b)},"$1","gvC",2,0,19,102],
-O7:[function(a){J.LE(a.wT).wM(new E.As(a))},"$0","gyT",0,0,17],
+O7:[function(a){J.LE(a.wT).wM(new E.mj(a))},"$0","gdH",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gyT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gdH(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
 if(z!=null){z.Gv()
-a.mZ=null}},
+a.c3=null}},
 static:{pIf:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13318,23 +13315,23 @@
 V26:{
 "^":"uL+Pi;",
 $isd3:true},
-As:{
+mj:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.Y5(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.Nb(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 qM:{
-"^":"V27;Cr,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V27;Cr,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
 pA:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,19,102],
-static:{TEI:function(a){var z,y,x,w
+static:{tX:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13348,7 +13345,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 av:{
-"^":"ZzR;CB,Vg,ij,tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"ZzR;CB,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gEQ:function(a){return a.CB},
 sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
 static:{R7:function(a){var z,y,x,w
@@ -13358,41 +13355,41 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.CB=!1
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Wa.LX(a)
-C.Wa.XI(a)
+C.OkI.LX(a)
+C.OkI.XI(a)
 return a}}},
 ZzR:{
 "^":"xI+Pi;",
 $isd3:true},
 uz:{
-"^":"V28;RX,mZ,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V28;RX,c3,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gpE:function(a){return a.RX},
 Fn:function(a){return this.gpE(a).$0()},
 spE:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
 pA:[function(a,b){J.LE(a.RX).wM(b)},"$1","gvC",2,0,19,102],
-O7:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","gyT",0,0,17],
+O7:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","gdH",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gyT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
+a.c3=P.cH(P.ii(0,0,0,0,0,1),this.gdH(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.c3
 if(z!=null){z.Gv()
-a.mZ=null}},
+a.c3=null}},
 static:{z1:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13408,40 +13405,40 @@
 Cc:{
 "^":"TpZ:76;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.Y5(z))},"$0",null,0,0,null,"call"],
+if(z.c3!=null)z.c3=P.cH(P.ii(0,0,0,0,0,1),J.Nb(z))},"$0",null,0,0,null,"call"],
 $isEH:true}}],["","",,X,{
 "^":"",
 Se:{
-"^":"Y2;B1>,X1,H,Zn<,mj<,ki<,Vh<,ZX<,eT,yt,qu,oH,PU,aZ,Lk,Vg,ij",
-gtT:function(a){return J.tX(this.H)},
-Pz:function(a){var z,y,x,w,v,u,t,s,r
+"^":"Y2;B1>,SF,H,Zn<,vs<,zg<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,Lk,Vg,fn",
+gtT:function(a){return J.Nk(this.H)},
+Pz:function(a){var z,y,x,w,v,u,t,s
 z=this.B1
 y=J.UQ(z,"threshold")
-x=this.qu
+x=this.ks
 if(x.length>0)return
-for(w=this.H,v=J.mY(J.dd(w)),u=this.X1,t=u.Av;v.G();){s=v.gl()
-r=J.X9(s.gAv(),w.gAv())
+for(w=this.H,v=J.mY(J.Mx(w)),u=this.SF;v.G();){t=v.gl()
+s=J.L9(t.gAv(),w.gAv())
 if(typeof y!=="number")return H.s(y)
-if(!(r>y||J.X9(J.tX(s).gDu(),t)>y))continue
-x.push(X.i3(z,u,s,this))}},
-aY:function(){},
-Nh:function(){return J.q8(J.dd(this.H))>0},
+if(!(s>y||J.L9(J.Nk(t).gDu(),u.Av)>y))continue
+x.push(X.SJ(z,u,t,this))}},
+cO:function(){},
+Nh:function(){return J.q8(J.Mx(this.H))>0},
 mW:function(a,b,c,d){var z,y
 z=this.H
 this.Vh=H.d(z.gAv())
-this.ZX=G.J8(J.X9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
+this.ZX=G.J8(J.L9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
 y=J.RE(z)
-if(J.xC(J.Iz(y.gtT(z)),C.oA)){this.Zn="Tag (category)"
-if(d==null)this.mj=G.dj(z.gAv(),this.X1.Av)
-else this.mj=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(z.gAv(),this.X1.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.AA))this.Zn="Garbage Collected Code"
+if(J.xC(J.Iz(y.gtT(z)),C.Z7)){this.Zn="Tag (category)"
+if(d==null)this.vs=G.G0(z.gAv(),this.SF.Av)
+else this.vs=G.G0(z.gAv(),d.H.gAv())
+this.zg=G.G0(z.gAv(),this.SF.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
 else this.Zn=H.d(J.Iz(y.gtT(z)))+" (Function)"
-if(d==null)this.mj=G.dj(z.gAv(),this.X1.Av)
-else this.mj=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(y.gtT(z).gDu(),this.X1.Av)}z=this.oH
-z.push(this.mj)
-z.push(this.ki)},
-static:{i3:function(a,b,c,d){var z,y
+if(d==null)this.vs=G.G0(z.gAv(),this.SF.Av)
+else this.vs=G.G0(z.gAv(),d.H.gAv())
+this.zg=G.G0(y.gtT(z).gDu(),this.SF.Av)}z=this.oH
+z.push(this.vs)
+z.push(this.zg)},
+static:{SJ:function(a,b,c,d){var z,y
 z=H.VM([],[G.Y2])
 y=d!=null?d.yt+1:0
 z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
@@ -13449,7 +13446,7 @@
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V29;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,Xg,Hm=,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V29;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,Xg,Hm=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gB1:function(a){return a.oi},
 sB1:function(a,b){a.oi=this.ct(a,C.vb,a.oi,b)},
 gPL:function(a){return a.TH},
@@ -13458,16 +13455,16 @@
 sLW:function(a,b){a.WT=this.ct(a,C.Gs,a.WT,b)},
 gUo:function(a){return a.Uw},
 sUo:function(a,b){a.Uw=this.ct(a,C.Dj,a.Uw,b)},
-gEl:function(a){return a.Ik},
-sEl:function(a,b){a.Ik=this.ct(a,C.YD,a.Ik,b)},
+gP2:function(a){return a.Ik},
+sP2:function(a,b){a.Ik=this.ct(a,C.YD,a.Ik,b)},
 gnZ:function(a){return a.oo},
 snZ:function(a,b){a.oo=this.ct(a,C.bE,a.oo,b)},
 gNG:function(a){return a.fE},
 sNG:function(a,b){a.fE=this.ct(a,C.aH,a.fE,b)},
 gQl:function(a){return a.ev},
 sQl:function(a,b){a.ev=this.ct(a,C.zz,a.ev,b)},
-gXc:function(a){return a.TM},
-sXc:function(a,b){a.TM=this.ct(a,C.TW,a.TM,b)},
+gZA:function(a){return a.TM},
+sZA:function(a,b){a.TM=this.ct(a,C.TW,a.TM,b)},
 n1:[function(a,b){var z,y,x,w,v
 z=a.oi
 if(z==null)return
@@ -13484,14 +13481,14 @@
 if(typeof w!=="number")return H.s(w)
 z=C.CD.Sy(1000000/w,0)
 a.Ik=this.ct(a,C.YD,a.Ik,z)
-z=G.mGl(J.UQ(a.oi,"timeSpan"))
+z=G.M5(J.UQ(a.oi,"timeSpan"))
 a.ev=this.ct(a,C.zz,a.ev,z)
 z=a.XX
 v=C.YI.bu(z*100)+"%"
 a.fE=this.ct(a,C.aH,a.fE,v)
-J.wg(a.oi).f9(a.oi)
-J.qQ(a.oi,"threshold",z)
-this.Zb(a)},"$1","gwh",2,0,19,59],
+J.aT(a.oi).N3(a.oi)
+J.kW(a.oi,"threshold",z)
+this.Zb(a)},"$1","gd0",2,0,19,59],
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
@@ -13499,31 +13496,31 @@
 this.Zb(a)},
 ov:[function(a,b){this.pA(a,null)},"$1","gb6",2,0,19,59],
 pA:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.wg(a.oi).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,19,102],
+J.aT(a.oi).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,19,102],
 Zb:function(a){if(a.oi==null)return
 this.FG(a)},
 FG:function(a){var z,y,x,w,v
-z=J.wg(a.oi).gqo()
+z=J.aT(a.oi).gqo()
 if(z==null)return
-try{a.Hm.rT(X.i3(a.oi,z,z,null))}catch(w){v=H.Ru(w)
+try{a.Hm.G7(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
 y=v
 x=new H.oP(w,null)
-N.QM("").OW("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
+N.QM("").r0("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.lo(0)
 this.ct(a,C.ep,null,a.Hm)},
 Ui:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,103,104],
-ZZ:[function(a,b){return C.Jp[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+ZZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
 wn:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
 z=J.Lp(d)
 if(!!J.x(z).$isIv)try{w=a.Hm
-v=J.JC(z)
+v=J.IO(z)
 if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
+w.lo(v-1)}catch(u){w=H.Ru(u)
 y=w
 x=new H.oP(u,null)
-N.QM("").OW("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
-static:{"^":"B6",CM:function(a){var z,y,x,w
+N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
+static:{"^":"B6",jD:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -13538,7 +13535,7 @@
 a.XX=0.0002
 a.TM="uv"
 a.Xg="#tableTree"
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13554,19 +13551,19 @@
 Xy:{
 "^":"TpZ:114;a",
 $1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,166,"call"],
+z.oi=J.NB(z,C.vb,z.oi,a)},"$1",null,2,0,null,166,"call"],
 $isEH:true}}],["","",,N,{
 "^":"",
 oa:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{Zgg:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13578,7 +13575,7 @@
 return a}}}}],["","",,D,{
 "^":"",
 St:{
-"^":"V30;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V30;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{N5:function(a){var z,y,x,w
@@ -13587,7 +13584,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13601,25 +13598,25 @@
 "^":"uL+Pi;",
 $isd3:true},
 IW:{
-"^":"V31;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V31;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return J.Ag(a.ow)},"$1","gX0",2,0,167,13],
+Fv:[function(a,b){return J.Ho(a.ow)},"$1","gX0",2,0,167,13],
 qW:[function(a,b){$.Kh.pZ(a.ow)
 return J.df(a.ow)},"$1","gDQ",2,0,167,13],
 PyB:[function(a,b){$.Kh.pZ(a.ow)
-return J.v7(a.ow)},"$1","gLc",2,0,167,13],
-lMu:[function(a,b){$.Kh.pZ(a.ow)
-return J.J1(a.ow)},"$1","gqF",2,0,167,13],
+return J.UR(a.ow)},"$1","gLc",2,0,167,13],
+XQ:[function(a,b){$.Kh.pZ(a.ow)
+return J.MU(a.ow)},"$1","gqF",2,0,167,13],
 Cx:[function(a,b){$.Kh.pZ(a.ow)
 return J.Fy(a.ow)},"$1","gZp",2,0,167,13],
-static:{v8:function(a){var z,y,x,w
+static:{dmb:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13633,7 +13630,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Qh:{
-"^":"V32;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V32;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{Qj:function(a){var z,y,x,w
@@ -13642,7 +13639,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13656,7 +13653,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Oz:{
-"^":"V33;ow,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V33;ow,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{TSH:function(a){var z,y,x,w
@@ -13665,7 +13662,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13678,10 +13675,10 @@
 V33:{
 "^":"uL+Pi;",
 $isd3:true},
-OD:{
-"^":"a;Y0,ZF",
+vT:{
+"^":"a;NK,aF",
 eC:function(a){var z,y,x,w,v,u
-z=this.Y0.Yb
+z=this.NK.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Name"])
 z.V7("addColumn",["number","Value"])}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 for(y=J.RE(a),x=J.mY(y.gvc(a));x.G();){w=x.gl()
@@ -13693,28 +13690,28 @@
 u.$builtinTypeInfo=[null]
 z.V7("addRow",[u])}}},
 Z4:{
-"^":"V34;wd,iw,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V34;wd,iw,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gXE:function(a){return a.wd},
 sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
 o4:[function(a,b){var z,y,x
 if(a.wd==null)return
-if($.Ib().MM.YM!==0&&a.iw==null)a.iw=new D.OD(new G.eM(P.zV(J.UQ($.BY,"DataTable"),null)),null)
+if($.Ib().MM.YM!==0&&a.iw==null)a.iw=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
 z=a.iw
 if(z==null)return
 z.eC(a.wd)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
 if(y!=null){z=a.iw
-x=z.ZF
-if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
+x=z.aF
+if(x==null){x=new G.yD(null,P.L5(null,null,null,null,null))
 x.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-z.ZF=x}x.Am(0,z.Y0)}},"$1","ghU",2,0,19,59],
+z.aF=x}x.Am(0,z.NK)}},"$1","ghU",2,0,19,59],
 static:{d7:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13729,14 +13726,14 @@
 $isd3:true}}],["","",,L,{
 "^":"",
 Lr:{
-"^":"a;Yi,S2",
+"^":"a;KK,S2",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.Yi.Yb
+z=this.KK.Yb
 if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
-for(y=J.mY(a.gfJ());y.G();){x=y.lo
+for(y=J.mY(a.gaf());y.G();){x=y.Ff
 if(J.xC(x,"Idle"))continue
 z.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-w=J.za(a.gfJ(),"Idle")
+w=J.Q0(a.gaf(),"Idle")
 v=a.gvh()
 for(u=0;u<a.gFw().length;++u){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
@@ -13761,29 +13758,29 @@
 if(u>=y.length)return H.e(y,u)
 y=y[u].XE
 if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.X9(y[q],r)*100))}++q}}y=[]
+s.push(C.CD.yu(J.L9(y[q],r)*100))}++q}}y=[]
 C.Nm.FV(y,C.Nm.ez(s,P.En()))
 y=new P.GD(y)
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}}},
 qk:{
-"^":"V35;TO,pF,e6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V35;TO,Cn,LR,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 god:function(a){return a.TO},
 sod:function(a,b){a.TO=this.ct(a,C.rB,a.TO,b)},
 vV:[function(a,b){var z=a.TO
-return z.cv(J.WB(J.eS(z.gVc()),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
-Pd:[function(a){a.TO.m7().ml(new L.LX(a))},"$0","gxD",0,0,17],
+return z.cv(J.WB(J.eS(z.gVc()),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+Pd:[function(a){a.TO.xB().ml(new L.LX(a))},"$0","gxD",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.pF=P.cH(P.ii(0,0,0,0,0,1),this.gxD(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.pF
+a.Cn=P.cH(P.ii(0,0,0,0,0,1),this.gxD(a))},
+Lx:function(a){var z
+Z.uL.prototype.Lx.call(this,a)
+z=a.Cn
 if(z!=null){z.Gv()
-a.pF=null}},
+a.Cn=null}},
 pA:[function(a,b){J.LE(a.TO).wM(b)},"$1","gvC",2,0,19,102],
-Da:[function(a,b){J.y9(a.TO).wM(b)},"$1","gDX",2,0,19,102],
+m4:[function(a,b){J.y9(a.TO).wM(b)},"$1","gDX",2,0,19,102],
 Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,167,13],
-qW:[function(a,b){return a.TO.cv("resume").ml(new L.CZ(a))},"$1","gDQ",2,0,167,13],
+qW:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,167,13],
 static:{Qtp:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -13791,16 +13788,16 @@
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 w=P.Fl(null,null)
 v=P.Fl(null,null)
-a.e6=new L.Lr(new G.eM(z),null)
-a.Iy=[]
+a.LR=new L.Lr(new G.Kf(z),null)
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.Xe.LX(a)
-C.Xe.XI(a)
+C.hys.LX(a)
+C.hys.XI(a)
 return a}}},
 V35:{
 "^":"uL+Pi;",
@@ -13809,29 +13806,29 @@
 "^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
-y=z.e6
+y=z.LR
 y.eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null){if(y.S2==null){w=P.L5(null,null,null,null,null)
-v=new G.qu(null,w)
+v=new G.yD(null,w)
 v.vR=P.zV(J.UQ($.BY,"SteppedAreaChart"),[x])
 y.S2=v
 w.u(0,"isStacked",!0)
 y.S2.bG.u(0,"connectSteps",!1)
-y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.Am(0,y.Yi)}if(z.pF!=null)z.pF=P.cH(P.ii(0,0,0,0,0,1),J.vc(z))},"$1",null,2,0,null,168,"call"],
+y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.Am(0,y.KK)}if(z.Cn!=null)z.Cn=P.cH(P.ii(0,0,0,0,0,1),J.vc(z))},"$1",null,2,0,null,168,"call"],
 $isEH:true},
 CV:{
 "^":"TpZ:12;a",
 $1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-CZ:{
+Vq:{
 "^":"TpZ:12;a",
 $1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,121,"call"],
 $isEH:true}}],["","",,Z,{
 "^":"",
 xh:{
 "^":"a;ue,GO",
-Qp:function(a,b){var z,y,x,w,v,u,t,s
+KW:function(a,b){var z,y,x,w,v,u,t,s
 z=this.GO
 if(z.tg(0,a))return
 z.h(0,a)
@@ -13842,7 +13839,7 @@
 w.IN+=s
 s="\""+H.d(u)+"\": {\n"
 w.IN+=s
-this.Qp(t,v)
+this.KW(t,v)
 s=C.yo.U("  ",b)
 s=w.IN+=s
 w.IN=s+"}\n"}else if(!!s.$isWO){s=C.yo.U("  ",b)
@@ -13866,7 +13863,7 @@
 if(!!u.$isT8){u=C.yo.U("  ",b)
 u=x.IN+=u
 x.IN=u+"{\n"
-this.Qp(v,w)
+this.KW(v,w)
 u=C.yo.U("  ",b)
 u=x.IN+=u
 x.IN=u+"}\n"}else if(!!u.$isWO){u=C.yo.U("  ",b)
@@ -13880,7 +13877,7 @@
 u=x.IN+=typeof v==="string"?v:H.d(v)
 x.IN=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V36;Ly,cs,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V36;Ly,cs,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gIr:function(a){return a.Ly},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
@@ -13888,22 +13885,21 @@
 slp:function(a,b){a.cs=this.ct(a,C.t6,a.cs,b)},
 oC:[function(a,b){var z,y,x
 z=P.p9("")
-y=P.fM(null,null,null,null)
+y=P.Ls(null,null,null,null)
 x=a.Ly
 z.IN=""
 z.KF("{\n")
-new Z.xh(z,y).Qp(x,0)
+new Z.xh(z,y).KW(x,0)
 z.KF("}\n")
 z=z.IN
-z=z.charCodeAt(0)==0?z:z
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","gWF",2,0,19,59],
+a.cs=this.ct(a,C.t6,a.cs,z)},"$1","gLU",2,0,19,59],
 static:{mA:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13918,15 +13914,15 @@
 $isd3:true}}],["","",,R,{
 "^":"",
 LU:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-static:{Le:function(a){var z,y,x,w
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+static:{bUN:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -13938,34 +13934,34 @@
 return a}}}}],["","",,M,{
 "^":"",
 CX:{
-"^":"V37;a1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gHt:function(a){return a.a1},
-sHt:function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},
-vV:[function(a,b){return J.wg(a.a1).cv(J.WB(J.eS(a.a1),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
-pA:[function(a,b){J.LE(a.a1).wM(b)},"$1","gvC",2,0,19,102],
-Da:[function(a,b){J.y9(a.a1).wM(b)},"$1","gDX",2,0,19,102],
-static:{ec:function(a){var z,y,x,w
+"^":"V37;px,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gHt:function(a){return a.px},
+sHt:function(a,b){a.px=this.ct(a,C.EV,a.px,b)},
+vV:[function(a,b){return J.aT(a.px).cv(J.WB(J.eS(a.px),"/eval?expr="+P.jW(C.Fa,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+pA:[function(a,b){J.LE(a.px).wM(b)},"$1","gvC",2,0,19,102],
+m4:[function(a,b){J.y9(a.px).wM(b)},"$1","gDX",2,0,19,102],
+static:{SPd:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.MG.LX(a)
-C.MG.XI(a)
+C.fQ.LX(a)
+C.fQ.XI(a)
 return a}}},
 V37:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,N,{
 "^":"",
 TJ:{
-"^":"a;oc>,eT>,cK,Zm>,qu>,z3",
+"^":"a;oc>,eT>,cK,Zm>,ks>,z3",
 gB8:function(){var z,y,x
 z=this.eT
 y=z==null||J.xC(J.DA(z),"")
@@ -13993,18 +13989,18 @@
 v=J.Lp(v)}else N.QM("").js(w)}},
 X2A:function(a,b,c){return this.Y6(C.EkO,a,b,c)},
 kS:function(a){return this.X2A(a,null,null)},
-TF:function(a,b,c){return this.Y6(C.R5,a,b,c)},
-Ny:function(a){return this.TF(a,null,null)},
+TF:function(a,b,c){return this.Y6(C.t4,a,b,c)},
+J4:function(a){return this.TF(a,null,null)},
 DH:function(a,b,c){return this.Y6(C.IF,a,b,c)},
 To:function(a){return this.DH(a,null,null)},
-OW:function(a,b,c){return this.Y6(C.nT,a,b,c)},
-j2:function(a){return this.OW(a,null,null)},
+r0:function(a,b,c){return this.Y6(C.nT,a,b,c)},
+j2:function(a){return this.r0(a,null,null)},
 WB:function(a,b,c){return this.Y6(C.cd,a,b,c)},
-YX:function(a){return this.WB(a,null,null)},
+hh:function(a){return this.WB(a,null,null)},
 qX:function(){if($.RL||this.eT==null){var z=this.z3
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.z3=z}z.toString
-return H.VM(new P.rk(z),[H.u3(z,0)])}else return N.QM("").qX()},
+return H.VM(new P.Ik(z),[H.u3(z,0)])}else return N.QM("").qX()},
 js:function(a){var z=this.z3
 if(z!=null){if(z.YM>=4)H.vh(z.Pq())
 z.MW(a)}},
@@ -14047,7 +14043,7 @@
 giO:function(a){return this.P},
 bu:[function(a){return this.oc},"$0","gCR",0,0,73],
 $isNg:true,
-static:{"^":"V7K,tmj,Enk,LkO,reI,kH8,hlK,MHK,Uu,lDu,uxc"}},
+static:{"^":"V7K,tmj,Enk,LkO,reI,kH8,hlK,MHK,Uu,wC,uxc"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"$0","gCR",0,0,73],
@@ -14076,13 +14072,13 @@
 "^":"TpZ:12;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
-try{A.Ok()}catch(y){x=H.Ru(y)
+try{A.Zw()}catch(y){x=H.Ru(y)
 z=x
-N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
+N.QM("").hh("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
 $isEH:true}}],["","",,N,{
 "^":"",
 qn:{
-"^":"V38;GC,OM,zv,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V38;GC,OM,zv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 guc:function(a){return a.GC},
 suc:function(a,b){a.GC=this.ct(a,C.EP,a.GC,b)},
 god:function(a){return a.OM},
@@ -14093,24 +14089,24 @@
 if(a.zv!=null)return
 if(a.OM!=null){z=a.GC
 z=z!=null&&z.gcX()!=null}else z=!1
-if(z){z=a.OM.gpG().tf.t(0,a.GC.gcX())
+if(z){z=a.OM.gpG().LL.t(0,a.GC.gcX())
 z=this.ct(a,C.tf,a.zv,z)
 a.zv=z
-if(z==null){z=a.OM.gSn().tf.t(0,a.GC.gcX())
-a.zv=this.ct(a,C.tf,a.zv,z)}}if(a.zv==null&&a.OM!=null){z=a.OM.gpG().tf
+if(z==null){z=a.OM.gSn().LL.t(0,a.GC.gcX())
+a.zv=this.ct(a,C.tf,a.zv,z)}}if(a.zv==null&&a.OM!=null){z=a.OM.gpG().LL
 y=z.gUQ(z)
-z=y.gtH(y)
+z=y.gqG(y)
 a.zv=this.ct(a,C.tf,a.zv,z)}},
 Es:function(a){this.Sd(a)},
 vD:[function(a,b){var z=a.OM
-if(z!=null)z.VT().ml(new N.QI(a))},"$1","grV",2,0,19,59],
+if(z!=null)z.VT().ml(new N.FQ(a))},"$1","guz",2,0,19,59],
 pA:[function(a,b){a.OM.VT().wM(b)},"$1","gvC",2,0,19,102],
 Cd9:[function(a,b,c,d){var z,y,x
 z=J.Vs(d).dA.getAttribute("data-id")
-y=a.OM.gpG().tf.t(0,z)
+y=a.OM.gpG().LL.t(0,z)
 y=this.ct(a,C.tf,a.zv,y)
 a.zv=y
-if(y==null){y=a.OM.gSn().tf.t(0,z)
+if(y==null){y=a.OM.gSn().LL.t(0,z)
 y=this.ct(a,C.tf,a.zv,y)
 a.zv=y}x=a.GC
 if(y!=null)x.scX(z)
@@ -14122,7 +14118,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14135,16 +14131,16 @@
 V38:{
 "^":"uL+Pi;",
 $isd3:true},
-QI:{
+FQ:{
 "^":"TpZ:12;a",
 $1:[function(a){J.O8(this.a)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 I2:{
-"^":"V39;GC,YE,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V39;GC,on,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 guc:function(a){return a.GC},
 suc:function(a,b){a.GC=this.ct(a,C.EP,a.GC,b)},
-gbe:function(a){return a.YE},
-sbe:function(a,b){a.YE=this.ct(a,C.kB,a.YE,b)},
+gbe:function(a){return a.on},
+sbe:function(a,b){a.on=this.ct(a,C.kB,a.on,b)},
 jV:function(a,b,c){var z,y
 if(b==null)return
 for(z=J.RE(b),y=0;y<J.q8(z.gbG(b));++y)if(J.xC(H.BU(J.Vm(J.UQ(z.gbG(b),y)),null,null),c))return y
@@ -14152,21 +14148,21 @@
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 this.hB(a)},
 hB:function(a){var z,y
-if(a.YE==null)return
+if(a.on==null)return
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#refreshrate")
 if(z==null)return
-J.yi(z,this.jV(a,z,a.YE.gmw()!=null?J.cj(a.YE.gmw()).gVs():0))
+J.yi(z,this.jV(a,z,a.on.gmw()!=null?J.cj(a.on.gmw()).gVs():0))
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#buffersize")
-J.yi(y,this.jV(a,y,a.YE.ghM()))},
+J.yi(y,this.jV(a,y,a.on.ghM()))},
 y3q:[function(a,b){this.hB(a)},"$1","gyZ",2,0,12,59],
-tC:[function(a,b,c,d){var z,y
-z=H.BU(H.Go(d,"$iszk").value,null,null)
-y=a.YE
+rm:[function(a,b,c,d){var z,y
+z=H.BU(H.Go(d,"$isbs").value,null,null)
+y=a.on
 if(y==null)return
 a.GC.ZW(z,y)},"$3","gIf",6,0,105,2,106,107],
 d7:[function(a,b,c,d){var z,y
-z=H.BU(H.Go(d,"$iszk").value,null,null)
-y=a.YE
+z=H.BU(H.Go(d,"$isbs").value,null,null)
+y=a.on
 if(y==null)return
 y.shM(z)},"$3","gTK",6,0,105,2,106,107],
 static:{rI3:function(a){var z,y,x,w
@@ -14175,7 +14171,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14189,9 +14185,9 @@
 "^":"uL+Pi;",
 $isd3:true},
 FB:{
-"^":"V40;Mu,aF,YE,OM,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gbe:function(a){return a.YE},
-sbe:function(a,b){a.YE=this.ct(a,C.kB,a.YE,b)},
+"^":"V40;lB,qV,on,OM,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gbe:function(a){return a.on},
+sbe:function(a,b){a.on=this.ct(a,C.kB,a.on,b)},
 god:function(a){return a.OM},
 sod:function(a,b){a.OM=this.ct(a,C.rB,a.OM,b)},
 Es:function(a){var z=P.ii(0,0,0,0,0,1)
@@ -14199,23 +14195,23 @@
 Z.uL.prototype.Es.call(this,a)},
 yY:function(a){this.T1(a)},
 T1:function(a){var z,y
-if(a.aF==null){z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#graph")
+if(a.qV==null){z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#graph")
 if(z==null)return
-y=new G.qu(null,P.L5(null,null,null,null,null))
+y=new G.yD(null,P.L5(null,null,null,null,null))
 y.vR=P.zV(J.UQ($.BY,"LineChart"),[z])
-a.aF=y}if(a.YE==null)return
-this.Ta(a)
-a.aF.Am(0,a.Mu)},
-Ta:function(a){var z,y,x,w,v,u,t
-z=a.Mu.Yb
+a.qV=y}if(a.on==null)return
+this.qt(a)
+a.qV.Am(0,a.lB)},
+qt:function(a){var z,y,x,w,v,u,t
+z=a.lB.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-for(y=0;y<a.YE.gJk().xN.length;++y){x=a.YE.gJk().xN
+for(y=0;y<a.on.gJk().XG.length;++y){x=a.on.gJk().XG
 if(y>=x.length)return H.e(x,y)
 w=x[y]
 x=w.gFl()
 v=J.Vm(w)
 u=[]
-C.Nm.FV(u,C.Nm.ez([x.gX3(),x.gcO(),x.gIv()],P.En()))
+C.Nm.FV(u,C.Nm.ez([x.gGt(),x.gS6(),x.gBM()],P.En()))
 t=new P.GD(u)
 t.$builtinTypeInfo=[null]
 x=[]
@@ -14224,10 +14220,10 @@
 x.$builtinTypeInfo=[null]
 z.V7("addRow",[x])}},
 y3q:[function(a,b){var z
-if(!J.xC(b,a.YE)){z=a.Mu.Yb
+if(!J.xC(b,a.on)){z=a.lB.Yb
 z.V7("removeColumns",[0,z.nQ("getNumberOfColumns")])
 z.V7("addColumn",["timeofday","time"])
-z.V7("addColumn",["number",J.DA(a.YE)])}},"$1","gyZ",2,0,12,59],
+z.V7("addColumn",["number",J.DA(a.on)])}},"$1","gyZ",2,0,12,59],
 static:{kUw:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -14235,23 +14231,23 @@
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
 w=P.Fl(null,null)
 v=P.Fl(null,null)
-a.Mu=new G.eM(z)
-a.Iy=[]
+a.lB=new G.Kf(z)
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.h1.LX(a)
-C.h1.XI(a)
+C.Mw.LX(a)
+C.Mw.XI(a)
 return a}}},
 V40:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,A,{
 "^":"",
 md:{
-"^":"V41;i4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V41;i4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 giC:function(a){return a.i4},
 siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
 static:{DCi:function(a){var z,y,x,w
@@ -14261,21 +14257,21 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.i4=!0
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.kD.LX(a)
-C.kD.XI(a)
+C.aV.LX(a)
+C.aV.XI(a)
 return a}}},
 V41:{
 "^":"uL+Pi;",
 $isd3:true},
 Bm:{
-"^":"V42;KU,V4,Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V42;KU,V4,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gwp:function(a){return a.V4},
@@ -14291,7 +14287,7 @@
 a.KU="#"
 a.V4="---"
 a.Jo=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14305,12 +14301,12 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ya:{
-"^":"V43;KU,V4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V43;KU,V4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gwp:function(a){return a.V4},
 swp:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-static:{P5Z:function(a){var z,y,x,w
+static:{JR:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -14318,7 +14314,7 @@
 w=P.Fl(null,null)
 a.KU="#"
 a.V4="---"
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14332,29 +14328,29 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":"V44;rU,SB,z2,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V44;rU,SB,Hq,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gFR:function(a){return a.rU},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
 sFR:function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},
 gjl:function(a){return a.SB},
 sjl:function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},
-gph:function(a){return a.z2},
-sph:function(a,b){a.z2=this.ct(a,C.hf,a.z2,b)},
-Kp:[function(a,b,c,d){var z=a.SB
+gph:function(a){return a.Hq},
+sph:function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},
+VV:[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.LY(a,this.gec(a))},"$3","gyr",6,0,116,2,106,107],
-uq:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gec",0,0,17],
-static:{wC:function(a){var z,y,x,w
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,116,2,106,107],
+uq:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,17],
+static:{ZC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.SB=!1
-a.z2="Refresh"
-a.Iy=[]
+a.Hq="Refresh"
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14368,14 +14364,14 @@
 "^":"uL+Pi;",
 $isd3:true},
 ye:{
-"^":"uL;tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"uL;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{mBQ:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14386,17 +14382,17 @@
 C.pl.XI(a)
 return a}}},
 G1:{
-"^":"V45;Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V45;Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{PU:function(a){var z,y,x,w
+static:{Br:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14410,24 +14406,24 @@
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":"V46;Jo,iy,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V46;Jo,iy,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","grV",2,0,19,59],
+vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,19,59],
 gu6:function(a){var z=a.iy
 if(z!=null)return J.Ds(z)
 else return""},
 su6:function(a,b){},
-static:{zf:function(a){var z,y,x,w
+static:{YtF:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14441,7 +14437,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 UK:{
-"^":"V47;VW,Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V47;VW,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gHt:function(a){return a.VW},
 sHt:function(a,b){a.VW=this.ct(a,C.EV,a.VW,b)},
 grZ:function(a){return a.Jo},
@@ -14453,7 +14449,7 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14467,7 +14463,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":"V48;Au,Jo,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V48;Au,Jo,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRu:function(a){return a.Au},
 sRu:function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},
 grZ:function(a){return a.Jo},
@@ -14479,7 +14475,7 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.Jo=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14493,16 +14489,16 @@
 "^":"uL+Pi;",
 $isd3:true},
 NK:{
-"^":"V49;rv,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V49;rv,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
-static:{kR:function(a){var z,y,x,w
+static:{Xii:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14516,27 +14512,27 @@
 "^":"uL+Pi;",
 $isd3:true},
 Zx:{
-"^":"V50;rv,Wx,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V50;rv,Wx,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRk:function(a){return a.rv},
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
-gMl:function(a){return a.Wx},
-sMl:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
-qW:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
-return J.df(J.wg(a.Wx))},"$1","gDQ",2,0,167,13],
-PyB:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
-return J.v7(J.wg(a.Wx))},"$1","gLc",2,0,167,13],
-lMu:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
-return J.J1(J.wg(a.Wx))},"$1","gqF",2,0,167,13],
-Cx:[function(a,b){$.Kh.pZ(J.wg(a.Wx))
-return J.Fy(J.wg(a.Wx))},"$1","gZp",2,0,167,13],
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gRN",6,0,171,2,106,107],
+gBk:function(a){return a.Wx},
+sBk:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
+qW:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.df(J.aT(a.Wx))},"$1","gDQ",2,0,167,13],
+PyB:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.UR(J.aT(a.Wx))},"$1","gLc",2,0,167,13],
+XQ:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.MU(J.aT(a.Wx))},"$1","gqF",2,0,167,13],
+Cx:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
+return J.Fy(J.aT(a.Wx))},"$1","gZp",2,0,167,13],
+cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,171,2,106,107],
 static:{yno:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14551,19 +14547,19 @@
 $isd3:true}}],["","",,L,{
 "^":"",
 qV:{
-"^":"V51;xt,qB,GI,wA,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gWA:function(a){return a.xt},
-sWA:function(a,b){a.xt=this.ct(a,C.td,a.xt,b)},
+"^":"V51;dV,qB,GI,wA,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gWA:function(a){return a.dV},
+sWA:function(a,b){a.dV=this.ct(a,C.td,a.dV,b)},
 gIi:function(a){return a.qB},
 sIi:function(a,b){a.qB=this.ct(a,C.XM,a.qB,b)},
 gyK:function(a){return a.GI},
 syK:function(a,b){a.GI=this.ct(a,C.uO,a.GI,b)},
 gCF:function(a){return a.wA},
 sCF:function(a,b){a.wA=this.ct(a,C.tg,a.wA,b)},
-Cq:[function(a,b){return J.wg(a.xt).cv(J.WB(J.eS(a.xt),"/retained")).ml(new L.uW(a))},"$1","ghN",2,0,111,113],
-Cc:[function(a,b){return J.wg(a.xt).cv(J.WB(J.eS(a.xt),"/retaining_path?limit="+H.d(b))).ml(new L.vT(a))},"$1","gCI",2,0,111,32],
-yg:[function(a,b){return J.wg(a.xt).cv(J.WB(J.eS(a.xt),"/inbound_references?limit="+H.d(b))).ml(new L.C1y(a))},"$1","gi0",2,0,111,32],
-pA:[function(a,b){J.LE(a.xt).wM(b)},"$1","gvC",2,0,122,120],
+zs:[function(a,b){return J.aT(a.dV).cv(J.WB(J.eS(a.dV),"/retained")).ml(new L.rQ(a))},"$1","ghN",2,0,111,113],
+Cc:[function(a,b){return J.aT(a.dV).cv(J.WB(J.eS(a.dV),"/retaining_path?limit="+H.d(b))).ml(new L.ky(a))},"$1","gCI",2,0,111,32],
+rT:[function(a,b){return J.aT(a.dV).cv(J.WB(J.eS(a.dV),"/inbound_references?limit="+H.d(b))).ml(new L.WZ(a))},"$1","gi0",2,0,111,32],
+pA:[function(a,b){J.LE(a.dV).wM(b)},"$1","gvC",2,0,122,120],
 static:{P5f:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -14571,7 +14567,7 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.wA=null
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14584,26 +14580,26 @@
 V51:{
 "^":"uL+Pi;",
 $isd3:true},
-uW:{
+rQ:{
 "^":"TpZ:115;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(a.gPE(),null,null)
-z.wA=J.Q5(z,C.tg,z.wA,y)},"$1",null,2,0,null,96,"call"],
+z.wA=J.NB(z,C.tg,z.wA,y)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-vT:{
+ky:{
 "^":"TpZ:153;a",
 $1:[function(a){var z=this.a
-z.qB=J.Q5(z,C.XM,z.qB,a)},"$1",null,2,0,null,96,"call"],
+z.qB=J.NB(z,C.XM,z.qB,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-C1y:{
+WZ:{
 "^":"TpZ:153;a",
 $1:[function(a){var z=this.a
-z.GI=J.Q5(z,C.uO,z.GI,a)},"$1",null,2,0,null,96,"call"],
+z.GI=J.NB(z,C.uO,z.GI,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true}}],["","",,L,{
 "^":"",
 NT:{
-"^":"V52;R6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V52;R6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gWA:function(a){return a.R6},
 sWA:function(a,b){a.R6=this.ct(a,C.td,a.R6,b)},
 static:{di:function(a){var z,y,x,w
@@ -14612,7 +14608,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14627,28 +14623,28 @@
 $isd3:true}}],["","",,V,{
 "^":"",
 F1:{
-"^":"V53;qC,i6=,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gd0:function(a){return a.qC},
-sd0:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
+"^":"V53;qC,i6=,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gz2:function(a){return a.qC},
+sz2:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
 Es:function(a){var z,y,x
 Z.uL.prototype.Es.call(this,a)
-if(a.qC===!0){z=new G.mL(H.VM([],[G.MQ]),null,new G.OR("/vm",null,null,null,null,null),null,null,a,null,null,Q.pT(null,D.Mk),null,null)
+if(a.qC===!0){z=new G.mL(H.VM([],[G.OS]),null,new G.ng("/vm",null,null,null,null,null),null,null,a,null,null,Q.pT(null,D.Mk),null,null)
 z.E0(a)
-a.i6=z}else{z=H.VM([],[G.MQ])
+a.i6=z}else{z=H.VM([],[G.OS])
 y=Q.pT(null,D.Mk)
-x=new G.uh(new G.V3("targetManager"),Q.pT(null,null),null,null,null,null)
-x.vs()
-y=new G.mL(z,null,new G.OR("/vm",null,null,null,null,null),null,x,a,null,null,y,null,null)
+x=new G.nD(new G.V3("targetManager"),Q.pT(null,null),null,null,null,null)
+x.lK()
+y=new G.mL(z,null,new G.ng("/vm",null,null,null,null,null),null,x,a,null,null,y,null,null)
 y.Ty(a)
 a.i6=y}},
-static:{Lu:function(a){var z,y,x,w
+static:{VO:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.qC=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -14663,44 +14659,44 @@
 $isd3:true}}],["","",,Z,{
 "^":"",
 uL:{
-"^":"Xfs;tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"Xfs;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gi6:function(a){return $.Kh},
-guc:function(a){return this.gi6(a).Ef},
-gl6:function(a){return J.H3(this.guc(a))},
+guc:function(a){return this.gi6(a).fN},
+gl6:function(a){return J.D8(this.guc(a))},
 Es:function(a){A.zs.prototype.Es.call(this,a)
 this.U2(a)},
-aC:function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},
-dQ:function(a){A.zs.prototype.dQ.call(this,a)
-this.mv(a)},
+wN:function(a,b,c,d){A.zs.prototype.wN.call(this,a,b,c,d)},
+Lx:function(a){A.zs.prototype.Lx.call(this,a)
+this.yM(a)},
 I9:function(a){A.zs.prototype.I9.call(this,a)},
 gMT:function(a){return a.tB},
 sMT:function(a,b){a.tB=this.ct(a,C.O9,a.tB,b)},
 yY:function(a){},
 JnB:[function(a,b){if(a.tB!=null)this.U2(a)
-else this.mv(a)},"$1","gqA",2,0,19,59],
+else this.yM(a)},"$1","grX",2,0,19,59],
 U2:function(a){var z
 if(a.tB==null)return
-z=a.IO
+z=a.Qf
 if(z!=null)z.Gv()
-a.IO=P.cH(a.tB,this.gPs(a))},
-mv:function(a){var z=a.IO
+a.Qf=P.cH(a.tB,this.gPs(a))},
+yM:function(a){var z=a.Qf
 if(z!=null)z.Gv()
-a.IO=null},
+a.Qf=null},
 Yl:[function(a){var z
 this.yY(a)
 z=a.tB
-if(z==null){this.mv(a)
-return}a.IO=P.cH(z,this.gPs(a))},"$0","gPs",0,0,17],
+if(z==null){this.yM(a)
+return}a.Qf=P.cH(z,this.gPs(a))},"$0","gPs",0,0,17],
 wW:[function(a,b,c,d){this.gi6(a).Z6.Cz(b,c,d)},"$3","gCK",6,0,171,87,106,107],
-XD:[function(a,b){this.gi6(a).Z6
+Gxe:[function(a,b){this.gi6(a).Z6
 return"#"+H.d(b)},"$1","gGs",2,0,172,173],
-hA:[function(a,b){return G.mGl(b)},"$1","gSs",2,0,174,175],
-Ze:[function(a,b){return G.XzS(b)},"$1","gbJ",2,0,14,15],
-Zl:[function(a,b){return H.BU(b,null,null)},"$1","gIb",2,0,145,20],
+Qb:[function(a,b){return G.M5(b)},"$1","gSs",2,0,174,175],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,14,15],
+YH:[function(a,b){return H.BU(b,null,null)},"$1","gIb",2,0,145,20],
 Rms:[function(a,b,c){var z,y,x,w
 z=[]
 z.push(C.yo.j("'",0))
-for(y=J.OX(b),y=y.gA(y);y.G();){x=y.lo
+for(y=J.GG(b),y=y.gA(y);y.G();){x=y.Ff
 w=J.x(x)
 if(w.n(x,"\n".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\n"))
 else if(w.n(x,"\r".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\r"))
@@ -14711,25 +14707,25 @@
 else if(w.n(x,"$".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\$"))
 else if(w.n(x,"\\".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\\\"))
 else if(w.n(x,"'".charCodeAt(0)))C.Nm.FV(z,new J.IA("'"))
-else if(w.C(x,32))C.Nm.FV(z,new J.IA("\\u"+C.yo.LL(w.WZ(x,16),4,"0")))
+else if(w.C(x,32))C.Nm.FV(z,new J.IA("\\u"+C.yo.YX(w.WZ(x,16),4,"0")))
 else z.push(x)}if(c===!0)C.Nm.FV(z,new J.IA("..."))
 else z.push(C.yo.j("'",0))
-return P.nB(z)},function(a,b){return this.Rms(a,b,!1)},"hD","$2","$1","gRO",2,2,176,69,20,177],
-static:{LD:function(a){var z,y,x,w
+return P.HM(z)},function(a,b){return this.Rms(a,b,!1)},"hD","$2","$1","gRO",2,2,176,69,20,177],
+static:{ew:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Pfz.LX(a)
-C.Pfz.XI(a)
+C.mk.LX(a)
+C.mk.XI(a)
 return a}}},
 Xfs:{
 "^":"xc+Pi;",
@@ -14747,12 +14743,12 @@
 if(z==null){z=this.gcm(a)
 z=P.bK(this.gym(a),z,!0,null)
 a.Vg=z}z.toString
-return H.VM(new P.rk(z),[H.u3(z,0)])},
-Tr:[function(a){},"$0","gcm",0,0,17],
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
+w37:[function(a){},"$0","gcm",0,0,17],
 dt:[function(a){a.Vg=null},"$0","gym",0,0,17],
 HC:[function(a){var z,y,x
-z=a.ij
-a.ij=null
+z=a.fn
+a.fn=null
 if(this.gnz(a)&&z!=null){y=a.Vg
 x=H.VM(new P.Ui(z),[T.yj])
 if(y.YM>=4)H.vh(y.Pq())
@@ -14765,8 +14761,8 @@
 return z},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
 nq:function(a,b){if(!this.gnz(a))return
-if(a.ij==null){a.ij=[]
-P.rb(this.gDx(a))}a.ij.push(b)},
+if(a.fn==null){a.fn=[]
+P.rb(this.gDx(a))}a.fn.push(b)},
 $isd3:true}}],["","",,T,{
 "^":"",
 yj:{
@@ -14777,7 +14773,7 @@
 bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
 $isqI:true}}],["","",,O,{
 "^":"",
-N0:function(){var z,y,x,w,v,u,t,s,r,q
+X0:function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
 if($.Oo==null)return
 $.Td=!0
@@ -14793,27 +14789,27 @@
 s=J.RE(t)
 if(s.gnz(t)){if(s.HC(t)){if(w)y.push([u,t])
 v=!0}$.Oo.push(t)}}}while(z<1000&&v)
-if(w&&v){w=$.aT()
+if(w&&v){w=$.S5()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.G();){r=s.lo
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.G();){r=s.Ff
 q=J.U6(r)
-w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.dL=$.Oo.length
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.Nc=$.Oo.length
 $.Td=!1},
 Ht:function(){var z={}
 z.a=!1
-z=new O.Nq(z)
-return new P.yQ(null,null,null,null,new O.zI(z),new O.bF(z),null,null,null,null,null,null)},
-Nq:{
+z=new O.YC(z)
+return new P.yQ(null,null,null,null,new O.zI(z),new O.hw(z),null,null,null,null,null,null)},
+YC:{
 "^":"TpZ:178;a",
 $2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.jB(z))},
+a.RK(b,new O.N0(z))},
 $isEH:true},
-jB:{
+N0:{
 "^":"TpZ:76;a",
 $0:[function(){this.a.a=!1
-O.N0()},"$0",null,0,0,null,"call"],
+O.X0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
 "^":"TpZ:29;b",
@@ -14825,18 +14821,18 @@
 $0:[function(){this.c.$2(this.d,this.e)
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
-bF:{
+hw:{
 "^":"TpZ:179;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.f6(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
+return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
-f6:{
+iu:{
 "^":"TpZ:12;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
 return this.w3.$1(a)},"$1",null,2,0,null,180,"call"],
 $isEH:true}}],["","",,G,{
 "^":"",
-LR:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=f-e+1
 y=J.WB(J.bI(c,b),1)
 x=Array(z)
@@ -14872,7 +14868,7 @@
 m=P.J(p+1,m+1)
 if(t>=o)return H.e(n,t)
 n[t]=m}}return x},
-Mw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
 if(0>=z)return H.e(a,0)
@@ -14906,8 +14902,8 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[H.u3(H.VM(new H.TNQ(),[H.u3(u,0)]),0)]).br(0)},
-uf:function(a,b,c){var z,y,x
+x=s}}}return H.VM(new H.iK(u),[H.u3(H.VM(new H.wb(),[H.u3(u,0)]),0)]).br(0)},
+rN:function(a,b,c){var z,y,x
 for(z=J.U6(a),y=0;y<c;++y){x=z.t(a,y)
 if(y>=b.length)return H.e(b,y)
 if(!J.xC(x,b[y]))return y}return c},
@@ -14925,7 +14921,7 @@
 z=J.Wx(c)
 y=P.J(z.W(c,b),f-e)
 x=J.x(b)
-w=x.n(b,0)&&e===0?G.uf(a,d,y):0
+w=x.n(b,0)&&e===0?G.rN(a,d,y):0
 v=z.n(c,J.q8(a))&&f===d.length?G.xU(a,d,y-w):0
 b=x.g(b,w)
 e+=w
@@ -14940,11 +14936,11 @@
 for(;e<f;e=s){z=t.kJ
 s=e+1
 if(e>>>0!==e||e>=d.length)return H.e(d,e)
-C.Nm.h(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
+J.bi(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
 u=[]
 x=new P.Ui(u)
 x.$builtinTypeInfo=[null]
-return[new G.Zq(a,x,u,b,z)]}r=G.Mw(G.LR(a,b,c,d,e,f))
+return[new G.Zq(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
 q=[]
 q.$builtinTypeInfo=[G.Zq]
 for(p=e,o=b,t=null,n=0;n<r.length;++n)switch(r[n]){case 0:if(t!=null){q.push(t)
@@ -14957,7 +14953,7 @@
 o=J.WB(o,1)
 z=t.kJ
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
-C.Nm.h(z,d[p]);++p
+J.bi(z,d[p]);++p
 break
 case 2:if(t==null){u=[]
 z=new P.Ui(u)
@@ -14970,15 +14966,16 @@
 z.$builtinTypeInfo=[null]
 t=new G.Zq(a,z,u,o,0)}z=t.kJ
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
-C.Nm.h(z,d[p]);++p
+J.bi(z,d[p]);++p
 break}if(t!=null)q.push(t)
 return q},
 m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
-x=C.Nm.br(b.gkJ())
+x=J.Nd(b.gkJ())
 w=b.gNg()
+if(w==null)w=0
 v=new P.Ui(x)
 v.$builtinTypeInfo=[null]
 u=new G.Zq(y,v,x,z,w)
@@ -15002,25 +14999,26 @@
 else{o=q.kJ
 if(J.u6(u.Ft,q.Ft)){z=u.HD
 z=z.Yc(z,0,J.bI(q.Ft,u.Ft))
-if(!!o.fixed$length)H.vh(P.f("insertAll"))
+o.toString
+if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
 H.IC(o,0,z)}if(J.xZ(J.WB(u.Ft,u.HD.G4.length),J.WB(q.Ft,q.wF))){z=u.HD
-C.Nm.FV(o,z.Yc(z,J.bI(J.WB(q.Ft,q.wF),u.Ft),u.HD.G4.length))}u.kJ=o
+J.bj(o,z.Yc(z,J.bI(J.WB(q.Ft,q.wF),u.Ft),u.HD.G4.length))}u.kJ=o
 u.HD=q.HD
 if(J.u6(q.Ft,u.Ft))u.Ft=q.Ft
-t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.aP(a,r,u);++r
+t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.xe(a,r,u);++r
 n=J.bI(u.wF,u.HD.G4.length)
 q.Ft=J.WB(q.Ft,n)
 if(typeof n!=="number")return H.s(n)
 s+=n
 t=!0}else t=!1}if(!t)a.push(u)},
-VT:function(a,b){var z,y
+hs:function(a,b){var z,y
 z=H.VM([],[G.Zq])
-for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.G();)G.m1(z,y.lo)
+for(y=H.VM(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.G();)G.m1(z,y.Ff)
 return z},
 Qi:function(a,b){var z,y,x,w,v,u
 if(b.length<=1)return b
 z=[]
-for(y=G.VT(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.xN;y.G();){w=y.lo
+for(y=G.hs(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.XG;y.G();){w=y.Ff
 if(J.xC(w.gNg(),1)&&w.gRt().G4.length===1){v=w.gRt().G4
 if(0>=v.length)return H.e(v,0)
 v=v[0]
@@ -15041,7 +15039,10 @@
 if(z)return!1
 if(!J.xC(this.wF,this.HD.G4.length))return!0
 return J.u6(a,J.WB(this.Ft,this.wF))},
-bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "+H.d(this.HD)+", addedCount: "+H.d(this.wF)+">"},"$0","gCR",0,0,73],
+bu:[function(a){var z,y
+z="#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "
+y=this.HD
+return z+y.bu(y)+", addedCount: "+H.d(this.wF)+">"},"$0","gCR",0,0,73],
 $isZq:true,
 static:{K6:function(a,b,c,d){var z
 if(d==null)d=[]
@@ -15055,17 +15056,17 @@
 vly:{
 "^":"a;"}}],["","",,F,{
 "^":"",
-kM:[function(){return O.N0()},"$0","Jy",0,0,17],
+kM:[function(){return O.X0()},"$0","Jy",0,0,17],
 Wi:function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.xC(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
 return d},
 d3:{
-"^":"a;R9:ro%,rJ:XY%,me:iS%",
+"^":"a;R9:ro%,rJ:XY%,xt:cU%",
 gqh:function(a){var z
 if(this.gR9(a)==null){z=this.gFW(a)
 this.sR9(a,P.bK(this.gEp(a),z,!0,null))}z=this.gR9(a)
 z.toString
-return H.VM(new P.rk(z),[H.u3(z,0)])},
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
 gnz:function(a){var z,y
 if(this.gR9(a)!=null){z=this.gR9(a)
 y=z.iE
@@ -15075,19 +15076,19 @@
 z=$.Oo
 if(z==null){z=H.VM([],[F.d3])
 $.Oo=z}z.push(a)
-$.dL=$.dL+1
+$.Nc=$.Nc+1
 y=P.L5(null,null,null,P.IN,P.a)
-for(z=this.gbx(a),z=$.II().Me(0,z,new A.rv(!0,!1,!0,C.AP,!1,!1,C.fo,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.DA(z.lo)
-w=$.cp().JE.E4.t(0,x)
-if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+H.d(a)))
+for(z=this.gbx(a),z=$.mX().Me(0,z,new A.rv(!0,!1,!0,C.AP,!1,!1,C.bfK,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=J.DA(z.Ff)
+w=$.cp().xV.II.t(0,x)
+if(w==null)H.vh(O.Fm("getter \""+H.d(x)+"\" in "+this.bu(a)))
 y.u(0,x,w.$1(a))}this.srJ(a,y)},"$0","gFW",0,0,17],
 dJx:[function(a){if(this.grJ(a)!=null)this.srJ(a,null)},"$0","gEp",0,0,17],
 HC:function(a){var z,y
 z={}
 if(this.grJ(a)==null||!this.gnz(a))return!1
-z.a=this.gme(a)
-this.sme(a,null)
-this.grJ(a).aN(0,new F.X6(z,a))
+z.a=this.gxt(a)
+this.sxt(a,null)
+this.grJ(a).aN(0,new F.D9(z,a))
 if(z.a==null)return!1
 y=this.gR9(a)
 z=H.VM(new P.Ui(z.a),[T.yj])
@@ -15096,14 +15097,14 @@
 return!0},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
 nq:function(a,b){if(!this.gnz(a))return
-if(this.gme(a)==null)this.sme(a,[])
-this.gme(a).push(b)},
+if(this.gxt(a)==null)this.sxt(a,[])
+this.gxt(a).push(b)},
 $isd3:true},
-X6:{
+D9:{
 "^":"TpZ:81;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
-y=$.cp().jD(z,a)
+y=$.cp().Gp(z,a)
 if(!J.xC(b,y)){x=this.a
 w=x.a
 if(w==null){v=[]
@@ -15120,14 +15121,14 @@
 bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.Xq)+">"},"$0","gCR",0,0,73]}}],["","",,Q,{
 "^":"",
 wn:{
-"^":"uFU;lr@,fN,xN,Vg,ij",
-gXF:function(){var z=this.fN
-if(z==null){z=P.bK(new Q.BjH(this),null,!0,null)
-this.fN=z}z.toString
-return H.VM(new P.rk(z),[H.u3(z,0)])},
-gB:function(a){return this.xN.length},
+"^":"uFU;lr@,Mu,XG,Vg,fn",
+gXF:function(){var z=this.Mu
+if(z==null){z=P.bK(new Q.xb(this),null,!0,null)
+this.Mu=z}z.toString
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
+gB:function(a){return this.XG.length},
 sB:function(a,b){var z,y,x,w,v
-z=this.xN
+z=this.XG
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
@@ -15135,10 +15136,10 @@
 w=b===0
 this.ct(this,C.ai,x,w)
 this.ct(this,C.nZ,!x,!w)
-x=this.fN
+x=this.Mu
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)if(b<y){x=new H.TNQ()
+if(x)if(b<y){x=new H.wb()
 x.$builtinTypeInfo=[H.u3(z,0)]
 if(b<0||b>z.length)H.vh(P.TE(b,0,z.length))
 if(y<b||y>z.length)H.vh(P.TE(y,b,z.length))
@@ -15154,14 +15155,14 @@
 x=new P.Ui(v)
 x.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,x,v,y,b-y))}C.Nm.sB(z,b)},
-t:function(a,b){var z=this.xN
+t:function(a,b){var z=this.XG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
 u:function(a,b,c){var z,y,x,w
-z=this.xN
+z=this.XG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.fN
+x=this.Mu
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x){x=[y]
@@ -15175,42 +15176,42 @@
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.fN
+z=this.Mu
 if(z!=null){x=z.iE
 z=x==null?z!=null:x!==z}else z=!1
-if(z&&y>0){z=this.xN
-x=H.VM(new H.TNQ(),[H.u3(z,0)])
-H.K0(z,b,y)
-this.E2(G.K6(this,b,y,H.c1(z,b,y,H.u3(x,0)).br(0)))}H.h8(this.xN,b,c)},
+if(z&&y>0){z=this.XG
+x=H.VM(new H.wb(),[H.u3(z,0)])
+H.xF(z,b,y)
+this.E2(G.K6(this,b,y,H.c1(z,b,y,H.u3(x,0)).br(0)))}H.h8(this.XG,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.xN
+z=this.XG
 y=z.length
 this.Xy(y,y+1)
-x=this.fN
+x=this.Mu
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)this.E2(G.K6(this,y,1,null))
 C.Nm.h(z,b)},
 FV:function(a,b){var z,y,x,w
-z=this.xN
+z=this.XG
 y=z.length
 C.Nm.FV(z,b)
 this.Xy(y,z.length)
 x=z.length-y
-z=this.fN
+z=this.Mu
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
 if(z&&x>0)this.E2(G.K6(this,y,x,null))},
 Rz:function(a,b){var z,y
-for(z=this.xN,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.oq(0,y,y+1)
+for(z=this.XG,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.oq(0,y,y+1)
 return!0}return!1},
 oq:function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
-if(!z||b>this.xN.length)H.vh(P.TE(b,0,this.gB(this)))
+if(!z||b>this.XG.length)H.vh(P.TE(b,0,this.gB(this)))
 y=!(c<b)
-if(!y||c>this.xN.length)H.vh(P.TE(c,b,this.gB(this)))
+if(!y||c>this.XG.length)H.vh(P.TE(c,b,this.gB(this)))
 x=c-b
-w=this.xN
+w=this.XG
 v=w.length
 u=v-x
 this.ct(this,C.Wn,v,u)
@@ -15218,10 +15219,10 @@
 u=u===0
 this.ct(this,C.ai,t,u)
 this.ct(this,C.nZ,!t,!u)
-u=this.fN
+u=this.Mu
 if(u!=null){t=u.iE
 u=t==null?u!=null:t!==u}else u=!1
-if(u&&x>0){u=new H.TNQ()
+if(u&&x>0){u=new H.wb()
 u.$builtinTypeInfo=[H.u3(w,0)]
 if(!z||b>w.length)H.vh(P.TE(b,0,w.length))
 if(!y||c>w.length)H.vh(P.TE(c,b,w.length))
@@ -15235,24 +15236,24 @@
 y.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,y,z,b,0))}C.Nm.oq(w,b,c)},
 UG:function(a,b,c){var z,y,x,w
-if(b<0||b>this.xN.length)throw H.b(P.TE(b,0,this.gB(this)))
+if(b<0||b>this.XG.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.xN
+z=this.XG
 x=z.length
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
 H.h8(z,b,c)
 this.Xy(x,z.length)
-z=this.fN
+z=this.Mu
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
 if(z&&y>0)this.E2(G.K6(this,b,y,null))},
-aP:function(a,b,c){var z,y,x
-if(b>this.xN.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.xN
+xe:function(a,b,c){var z,y,x
+if(b>this.XG.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.XG
 y=z.length
 if(b===y){this.h(0,c)
 return}C.Nm.sB(z,y+1)
@@ -15260,14 +15261,14 @@
 H.qG(z,b+1,y,this,b)
 y=z.length
 this.Xy(y-1,y)
-y=this.fN
+y=this.Mu
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
 if(y)this.E2(G.K6(this,b,1,null))
 if(b>=z.length)return H.e(z,b)
 z[b]=c},
 E2:function(a){var z,y
-z=this.fN
+z=this.Mu
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
@@ -15284,7 +15285,7 @@
 if(z==null)return!1
 y=G.Qi(this,z)
 this.lr=null
-z=this.fN
+z=this.Mu
 if(z!=null){x=z.iE
 x=x==null?z!=null:x!==z}else x=!1
 if(x&&y.length!==0){x=H.VM(new P.Ui(y),[G.Zq])
@@ -15293,7 +15294,7 @@
 return!0}return!1},"$0","gL6",0,0,131],
 $iswn:true,
 static:{pT:function(a,b){var z=H.VM([],[b])
-return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5p:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+return H.VM(new Q.wn(null,null,z,null,null),[b])},Oi:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(a===b)throw H.b(P.u("can't use same list for previous and current"))
 for(z=J.mY(c),y=J.w1(b);z.G();){x=z.gl()
 w=J.RE(x)
@@ -15326,38 +15327,38 @@
 uFU:{
 "^":"ark+Pi;",
 $isd3:true},
-BjH:{
+xb:{
 "^":"TpZ:76;a",
-$0:function(){this.a.fN=null},
+$0:function(){this.a.Mu=null},
 $isEH:true}}],["","",,V,{
 "^":"",
 ya:{
-"^":"yj;nl>,jL,zZ,Lv,w5",
+"^":"yj;nl>,jL,zZ,aC,w5",
 bu:[function(a){var z
-if(this.Lv)z="insert"
+if(this.aC)z="insert"
 else z=this.w5?"remove":"set"
 return"#<MapChangeRecord "+z+" "+H.d(this.nl)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
 $isya:true},
 qC:{
-"^":"Pi;tf,Vg,ij",
-gvc:function(a){var z=this.tf
+"^":"Pi;LL,Vg,fn",
+gvc:function(a){var z=this.LL
 return z.gvc(z)},
-gUQ:function(a){var z=this.tf
+gUQ:function(a){var z=this.LL
 return z.gUQ(z)},
-gB:function(a){var z=this.tf
+gB:function(a){var z=this.LL
 return z.gB(z)},
-gl0:function(a){var z=this.tf
+gl0:function(a){var z=this.LL
 return z.gB(z)===0},
-gor:function(a){var z=this.tf
+gor:function(a){var z=this.LL
 return z.gB(z)!==0},
-NZ:function(a,b){return this.tf.NZ(0,b)},
-t:function(a,b){return this.tf.t(0,b)},
+NZ:function(a,b){return this.LL.NZ(0,b)},
+t:function(a,b){return this.LL.t(0,b)},
 u:function(a,b,c){var z,y,x,w
 z=this.Vg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
-if(!z){this.tf.u(0,b,c)
-return}z=this.tf
+if(!z){this.LL.u(0,b,c)
+return}z=this.LL
 x=z.gB(z)
 w=z.t(0,b)
 z.u(0,b,c)
@@ -15367,7 +15368,7 @@
 this.nq(this,H.VM(new T.qI(this,C.l4,null,null),[null]))}},
 FV:function(a,b){J.Me(b,new V.zT(this))},
 Rz:function(a,b){var z,y,x,w,v
-z=this.tf
+z=this.LL
 y=z.gB(z)
 x=z.Rz(0,b)
 w=this.Vg
@@ -15377,7 +15378,7 @@
 F.Wi(this,C.Wn,y,z.gB(z))
 this.ld()}return x},
 V1:function(a){var z,y,x,w
-z=this.tf
+z=this.LL
 y=z.gB(z)
 x=this.Vg
 if(x!=null){w=x.iE
@@ -15385,7 +15386,7 @@
 if(x&&y>0){z.aN(0,new V.Lo(this))
 F.Wi(this,C.Wn,y,0)
 this.ld()}z.V1(0)},
-aN:function(a,b){return this.tf.aN(0,b)},
+aN:function(a,b){return this.LL.aN(0,b)},
 bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
 ld:function(){this.nq(this,H.VM(new T.qI(this,C.SY,null,null),[null]))
 this.nq(this,H.VM(new T.qI(this,C.l4,null,null),[null]))},
@@ -15409,30 +15410,30 @@
 $isEH:true}}],["","",,Y,{
 "^":"",
 cU:{
-"^":"Ap;nA,he,mD,TW,cl",
+"^":"Ap;Os,he,mD,Wv,XS",
 bl:function(a){return this.he.$1(a)},
-kk:function(a){return this.TW.$1(a)},
+xq:function(a){return this.Wv.$1(a)},
 TR:function(a,b){var z
-this.TW=b
-z=this.bl(J.mu(this.nA,this.giv()))
-this.cl=z
+this.Wv=b
+z=this.bl(J.mu(this.Os,this.gYZ()))
+this.XS=z
 return z},
-ab:[function(a){var z=this.bl(a)
-if(J.xC(z,this.cl))return
-this.cl=z
-return this.kk(z)},"$1","giv",2,0,12,60],
-xO:function(a){var z=this.nA
+pN:[function(a){var z=this.bl(a)
+if(J.xC(z,this.XS))return
+this.XS=z
+return this.xq(z)},"$1","gYZ",2,0,12,60],
+xO:function(a){var z=this.Os
 if(z!=null)J.yd(z)
-this.nA=null
+this.Os=null
 this.he=null
 this.mD=null
-this.TW=null
-this.cl=null},
-gP:function(a){var z=this.bl(J.Vm(this.nA))
-this.cl=z
+this.Wv=null
+this.XS=null},
+gP:function(a){var z=this.bl(J.Vm(this.Os))
+this.XS=z
 return z},
-sP:function(a,b){J.Fc(this.nA,b)},
-fR:function(){return this.nA.fR()}}}],["","",,L,{
+sP:function(a,b){J.Fc(this.Os,b)},
+fR:function(){return this.Os.fR()}}}],["","",,L,{
 "^":"",
 yfW:function(a,b){var z,y,x,w,v
 if(a==null)return
@@ -15444,40 +15445,40 @@
 if(!y){z=a
 y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z)return J.UQ(a,$.vu().JE.fJ.t(0,b))
+if(z)return J.UQ(a,$.vu().xV.af.t(0,b))
 try{z=a
 y=b
-x=$.cp().JE.E4.t(0,y)
-if(x==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+H.d(z)))
+x=$.cp().xV.II.t(0,y)
+if(x==null)H.vh(O.Fm("getter \""+H.d(y)+"\" in "+H.d(z)))
 z=x.$1(z)
 return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.bB(a)
-v=$.II().NW(z,C.OV)
-if(!(v!=null&&v.gUA()&&v.gFo()!==!0))throw w}else throw w}}}z=$.Nd()
+v=$.mX().NW(z,C.OV)
+if(!(v!=null&&v.gUA()&&v.gFo()!==!0))throw w}else throw w}}}z=$.YLt()
 if(z.mL(C.EkO))z.kS("can't get "+H.d(b)+" in "+H.d(a))
 return},
-iu:function(a,b,c){var z,y,x
+EX:function(a,b,c){var z,y,x
 if(a==null)return!1
 z=b
-if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.qQ(a,b,c)
+if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
 return!0}}else if(!!J.x(b).$isIN){z=a
 y=H.RB(z,"$isueT",[P.qU,null],"$asueT")
 if(!y){z=a
 y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z){J.qQ(a,$.vu().JE.fJ.t(0,b),c)
-return!0}try{$.cp().Q1(a,b,c)
+if(z){J.kW(a,$.vu().xV.af.t(0,b),c)
+return!0}try{$.cp().Cq(a,b,c)
 return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.bB(a)
-if(!$.II().UK(z,C.OV))throw x}else throw x}}z=$.Nd()
+if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.YLt()
 if(z.mL(C.EkO))z.kS("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 WR:{
-"^":"ARh;HS,Lq,IE,wN,dR,z7,KZ",
+"^":"ARh;HS,Lq,IE,zo,dR,z7,KZ",
 gIi:function(a){return this.HS},
 sP:function(a,b){var z=this.HS
 if(z!=null)z.rL(this.Lq,b)},
 gDJ:function(){return 2},
 TR:function(a,b){return L.ARh.prototype.TR.call(this,this,b)},
-Ej:function(a){this.IE=L.SE(this,this.Lq)
+Ej:function(a){this.IE=L.KJ(this,this.Lq)
 this.CG(!0)},
 U9:function(){this.z7=null
 this.HS=null
@@ -15492,7 +15493,7 @@
 return!0},
 mX:function(){return this.CG(!1)},
 $isAp:true},
-Tv:{
+Zl:{
 "^":"a;T7",
 gB:function(a){return this.T7.length},
 gl0:function(a){return this.T7.length===0},
@@ -15500,18 +15501,17 @@
 bu:[function(a){var z,y,x,w,v,u
 if(!this.gPu())return"<invalid path>"
 z=P.p9("")
-for(y=this.T7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.G();x=!1){w=y.lo
+for(y=this.T7,y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.G();x=!1){w=y.Ff
 v=J.x(w)
 if(!!v.$isIN){if(!x)z.IN+="."
-u=$.vu().JE.fJ.t(0,w)
+u=$.vu().xV.af.t(0,w)
 z.IN+=typeof u==="string"?u:H.d(u)}else if(typeof w==="number"&&Math.floor(w)===w){v="["+H.d(w)+"]"
-z.IN+=v}else{v="[\""+H.d(J.JA(v.bu(w),"\"","\\\""))+"\"]"
-z.IN+=v}}y=z.IN
-return y.charCodeAt(0)==0?y:y},"$0","gCR",0,0,73],
+z.IN+=v}else{v="[\""+J.JA(v.bu(w),"\"","\\\"")+"\"]"
+z.IN+=v}}return z.IN},"$0","gCR",0,0,73],
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
-if(!J.x(b).$isTv)return!1
+if(!J.x(b).$isZl)return!1
 if(this.gPu()!==b.gPu())return!1
 z=this.T7
 y=z.length
@@ -15532,7 +15532,7 @@
 return 536870911&x+((16383&x)<<15>>>0)},
 WK:function(a){var z,y
 if(!this.gPu())return
-for(z=this.T7,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+for(z=this.T7,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 if(a==null)return
 a=L.yfW(a,y)}return a},
 rL:function(a,b){var z,y,x
@@ -15542,7 +15542,7 @@
 for(x=0;x<y;++x){if(a==null)return!1
 if(x>=z.length)return H.e(z,x)
 a=L.yfW(a,z[x])}if(y>=z.length)return H.e(z,y)
-return L.iu(a,z[y],b)},
+return L.EX(a,z[y],b)},
 I5:function(a,b){var z,y,x,w
 if(!this.gPu()||this.T7.length===0)return
 z=this.T7
@@ -15553,42 +15553,42 @@
 w=x+1
 if(x>=z.length)return H.e(z,x)
 a=L.yfW(a,z[x])}},
-$isTv:true,
+$isZl:true,
 static:{hk:function(a){var z,y,x,w,v,u,t
 z=J.x(a)
-if(!!z.$isTv)return a
+if(!!z.$isZl)return a
 if(a!=null)z=!!z.$isWO&&z.gl0(a)
 else z=!0
 if(z)a=""
 if(!!J.x(a).$isWO){y=P.F(a,!1,null)
 z=new H.a7(y,y.length,0,null)
 z.$builtinTypeInfo=[H.u3(y,0)]
-for(;z.G();){x=z.lo
-if((typeof x!=="number"||Math.floor(x)!==x)&&typeof x!=="string"&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints, Strings, and Symbols"))}return new L.Tv(y)}z=$.aB()
+for(;z.G();){x=z.Ff
+if((typeof x!=="number"||Math.floor(x)!==x)&&typeof x!=="string"&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints, Strings, and Symbols"))}return new L.Zl(y)}z=$.Nu()
 w=z.t(0,a)
 if(w!=null)return w
-v=new L.Pw([],-1,null,P.EF(["beforePath",P.EF(["ws",["beforePath"],"ident",["inIdent","append"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"inPath",P.EF(["ws",["inPath"],".",["beforeIdent"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"beforeIdent",P.EF(["ws",["beforeIdent"],"ident",["inIdent","append"]],null,null),"inIdent",P.EF(["ident",["inIdent","append"],"0",["inIdent","append"],"number",["inIdent","append"],"ws",["inPath","push"],".",["beforeIdent","push"],"[",["beforeElement","push"],"eof",["afterPath","push"]],null,null),"beforeElement",P.EF(["ws",["beforeElement"],"0",["afterZero","append"],"number",["inIndex","append"],"'",["inSingleQuote","append",""],"\"",["inDoubleQuote","append",""]],null,null),"afterZero",P.EF(["ws",["afterElement","push"],"]",["inPath","push"]],null,null),"inIndex",P.EF(["0",["inIndex","append"],"number",["inIndex","append"],"ws",["afterElement"],"]",["inPath","push"]],null,null),"inSingleQuote",P.EF(["'",["afterElement"],"eof",["error"],"else",["inSingleQuote","append"]],null,null),"inDoubleQuote",P.EF(["\"",["afterElement"],"eof",["error"],"else",["inDoubleQuote","append"]],null,null),"afterElement",P.EF(["ws",["afterElement"],"]",["inPath","push"]],null,null)],null,null)).pI(a)
-if(v==null)return $.O3()
-w=new L.Tv(C.Nm.tt(v,!1))
+v=new L.iF([],-1,null,P.EF(["beforePath",P.EF(["ws",["beforePath"],"ident",["inIdent","append"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"inPath",P.EF(["ws",["inPath"],".",["beforeIdent"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"beforeIdent",P.EF(["ws",["beforeIdent"],"ident",["inIdent","append"]],null,null),"inIdent",P.EF(["ident",["inIdent","append"],"0",["inIdent","append"],"number",["inIdent","append"],"ws",["inPath","push"],".",["beforeIdent","push"],"[",["beforeElement","push"],"eof",["afterPath","push"]],null,null),"beforeElement",P.EF(["ws",["beforeElement"],"0",["afterZero","append"],"number",["inIndex","append"],"'",["inSingleQuote","append",""],"\"",["inDoubleQuote","append",""]],null,null),"afterZero",P.EF(["ws",["afterElement","push"],"]",["inPath","push"]],null,null),"inIndex",P.EF(["0",["inIndex","append"],"number",["inIndex","append"],"ws",["afterElement"],"]",["inPath","push"]],null,null),"inSingleQuote",P.EF(["'",["afterElement"],"eof",["error"],"else",["inSingleQuote","append"]],null,null),"inDoubleQuote",P.EF(["\"",["afterElement"],"eof",["error"],"else",["inDoubleQuote","append"]],null,null),"afterElement",P.EF(["ws",["afterElement"],"]",["inPath","push"]],null,null)],null,null)).pI(a)
+if(v==null)return $.ptP()
+w=new L.Zl(C.Nm.tt(v,!1))
 if(z.X5>=100){u=new P.i5(z)
 u.$builtinTypeInfo=[H.u3(z,0)]
 t=u.gA(u)
-if(!t.G())H.vh(H.Wp())
+if(!t.G())H.vh(H.DU())
 z.Rz(0,t.gl())}z.u(0,a,w)
 return w}}},
 vH:{
-"^":"Tv;T7",
+"^":"Zl;T7",
 gPu:function(){return!1},
-static:{"^":"l7"}},
-MdQ:{
+static:{"^":"HS"}},
+lPa:{
 "^":"TpZ:76;",
-$0:function(){return new H.VR("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",H.Vq("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",!1,!0,!1),null,null)},
+$0:function(){return new H.VR("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",H.v4("^[$_a-zA-Z]+[$_a-zA-Z0-9]*$",!1,!0,!1),null,null)},
 $isEH:true},
-Pw:{
-"^":"a;vc>,vH>,nl*,n5",
+iF:{
+"^":"a;vc>,vH>,nl*,ep",
 Xn:function(a){var z
 if(a==null)return"eof"
-switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return H.LY([a])
+switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return H.eT([a])
 case 95:case 36:return"ident"
 case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}if(typeof a!=="number")return H.s(a)
 if(!(97<=a&&a<=122))z=65<=a&&a<=90
@@ -15596,13 +15596,13 @@
 if(z)return"ident"
 if(49<=a&&a<=57)return"number"
 return"else"},
-rX:function(){var z,y,x,w
+rXF:function(){var z,y,x,w
 z=this.nl
 if(z==null)return
-z=$.cD().B0(z)
+z=$.cx().B0(z)
 y=this.vc
 x=this.nl
-if(z)y.push($.vu().JE.T4.t(0,x))
+if(z)y.push($.vu().xV.T4.t(0,x))
 else{w=H.BU(x,10,new L.PD())
 y.push(w!=null?w:this.nl)}this.nl=null},
 mx:function(a,b){var z=this.nl
@@ -15613,142 +15613,142 @@
 if(z>=y)return!1;++z
 if(z<0||z>=y)return H.e(b,z)
 z=b[z]
-x=H.LY([z])
+x=H.eT([z])
 if(!(a==="inSingleQuote"&&x==="'"))z=a==="inDoubleQuote"&&x==="\""
 else z=!0
 if(z){++this.vH
 z=this.nl
 this.nl=z==null?x:H.d(z)+x
 return!0}return!1},
-pI:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=U.LQ(J.OX(a),0,null,65533)
-for(y=this.n5,x=z.length,w="beforePath";w!=null;){v=++this.vH
-if(v>=x)u=null
-else{if(v<0)return H.e(z,v)
-u=z[v]}if(u!=null)v=H.LY([u])==="\\"&&this.jN(w,z)
-else v=!1
-if(v)continue
-t=this.Xn(u)
-if(J.xC(w,"error"))return
-s=y.t(0,w)
-r=s.t(0,t)
-if(r==null)r=s.t(0,"else")
-if(r==null)return
-v=J.U6(r)
-w=v.t(r,0)
-q=v.gB(r)>1?v.t(r,1):null
-p=J.x(q)
-if(p.n(q,"push")&&this.nl!=null)this.rX()
-if(p.n(q,"append")){if(v.gB(r)>2){v.t(r,2)
-p=!0}else p=!1
-if(p)o=v.t(r,2)
-else o=H.LY([u])
-v=this.nl
-this.nl=v==null?o:H.d(v)+H.d(o)}if(w==="afterPath")return this.vc}return}},
+pI:function(a){var z,y,x,w,v,u,t,s,r,q,p
+z=U.LQ(J.GG(a),0,null,65533)
+for(y=z.length,x="beforePath";x!=null;){w=++this.vH
+if(w>=y)v=null
+else{if(w<0)return H.e(z,w)
+v=z[w]}if(v!=null)w=H.eT([v])==="\\"&&this.jN(x,z)
+else w=!1
+if(w)continue
+u=this.Xn(v)
+if(J.xC(x,"error"))return
+t=this.ep.t(0,x)
+s=t.t(0,u)
+if(s==null)s=t.t(0,"else")
+if(s==null)return
+w=J.U6(s)
+x=w.t(s,0)
+r=w.gB(s)>1?w.t(s,1):null
+q=J.x(r)
+if(q.n(r,"push")&&this.nl!=null)this.rXF()
+if(q.n(r,"append")){if(w.gB(s)>2){w.t(s,2)
+q=!0}else q=!1
+if(q)p=w.t(s,2)
+else p=H.eT([v])
+w=this.nl
+this.nl=w==null?p:H.d(w)+H.d(p)}if(x==="afterPath")return this.vc}return}},
 PD:{
 "^":"TpZ:12;",
 $1:function(a){return},
 $isEH:true},
 nQ:{
-"^":"ARh;IE,ds,vl,wN,dR,z7,KZ",
+"^":"ARh;IE,pu,vl,zo,dR,z7,KZ",
 gDJ:function(){return 3},
 TR:function(a,b){return L.ARh.prototype.TR.call(this,this,b)},
 Ej:function(a){var z,y,x,w
 for(z=this.vl,y=z.length,x=0;x<y;x+=2){w=z[x]
-if(w!==C.aZ){z=$.rf
+if(w!==C.zr){z=$.rf
 if(z!=null){y=z.Ou
 y=y==null?w!=null:y!==w}else y=!0
-if(y){z=w==null?null:P.fM(null,null,null,null)
-z=new L.Og(w,z,[],null)
+if(y){z=w==null?null:P.Ls(null,null,null,null)
+z=new L.Js(w,z,[],null)
 $.rf=z}if(z.Ou==null){z.Ou=w
-z.cE=P.fM(null,null,null,null)}z.JD.push(this)
+z.pe=P.Ls(null,null,null,null)}z.JD.push(this)
 this.VC(z.gUu(z))
 this.IE=null
-break}}this.CG(!this.ds)},
+break}}this.CG(!this.pu)},
 U9:function(){var z,y,x,w
-for(z=0;y=this.vl,x=y.length,z<x;z+=2)if(y[z]===C.aZ){w=z+1
+for(z=0;y=this.vl,x=y.length,z<x;z+=2)if(y[z]===C.zr){w=z+1
 if(w>=x)return H.e(y,w)
 J.yd(y[w])}this.vl=null
 this.z7=null},
 WX:function(a,b){var z=this.KZ
-if(z===$.ng||z===$.H2)throw H.b(P.w("Cannot add paths once started."))
+if(z===$.ljh||z===$.ls)throw H.b(P.w("Cannot add paths once started."))
 b=L.hk(b)
 z=this.vl
 z.push(a)
 z.push(b)
-if(!this.ds)return
-J.dH(this.z7,b.WK(a))},
+if(!this.pu)return
+J.bi(this.z7,b.WK(a))},
 ti:function(a){return this.WX(a,null)},
 YU:function(a){var z=this.KZ
-if(z===$.ng||z===$.H2)throw H.b(P.w("Cannot add observers once started."))
+if(z===$.ljh||z===$.ls)throw H.b(P.w("Cannot add observers once started."))
 z=this.vl
-z.push(C.aZ)
+z.push(C.zr)
 z.push(a)
-if(!this.ds)return
-J.dH(this.z7,J.mu(a,new L.bjd(this)))},
+if(!this.pu)return
+J.bi(this.z7,J.mu(a,new L.Zu(this)))},
 VC:function(a){var z,y,x,w,v
 for(z=0;y=this.vl,x=y.length,z<x;z+=2){w=y[z]
-if(w!==C.aZ){v=z+1
+if(w!==C.zr){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isTv").I5(w,a)}}},
+H.Go(y[v],"$isZl").I5(w,a)}}},
 CG:function(a){var z,y,x,w,v,u,t,s,r
-J.Vw(this.z7,C.jn.BU(this.vl.length,2))
+J.wg(this.z7,C.jn.BU(this.vl.length,2))
 for(z=!1,y=null,x=0;w=this.vl,v=w.length,x<v;x+=2){u=w[x]
 t=x+1
 if(t>=v)return H.e(w,t)
 s=w[t]
-if(u===C.aZ){H.Go(s,"$isAp")
-r=this.KZ===$.jq1?s.TR(0,new L.cmp(this)):s.gP(s)}else r=H.Go(s,"$isTv").WK(u)
-if(a){J.qQ(this.z7,C.jn.BU(x,2),r)
+if(u===C.zr){H.Go(s,"$isAp")
+r=this.KZ===$.jq1?s.TR(0,new L.vI(this)):s.gP(s)}else r=H.Go(s,"$isZl").WK(u)
+if(a){J.kW(this.z7,C.jn.BU(x,2),r)
 continue}w=this.z7
 v=C.jn.BU(x,2)
 if(J.xC(r,J.UQ(w,v)))continue
 w=this.dR
 if(typeof w!=="number")return w.F()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.z7,v))}J.qQ(this.z7,v,r)
+y.u(0,v,J.UQ(this.z7,v))}J.kW(this.z7,v,r)
 z=!0}if(!z)return!1
 this.dC(this.z7,y,w)
 return!0},
 mX:function(){return this.CG(!1)},
 $isAp:true},
-bjd:{
+Zu:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.KZ===$.ng)z.fl()
+if(z.KZ===$.ljh)z.fl()
 return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-cmp:{
+vI:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.KZ===$.ng)z.fl()
+if(z.KZ===$.ljh)z.fl()
 return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 iNc:{
 "^":"a;"},
 ARh:{
 "^":"Ap;",
-Yd:function(){return this.wN.$0()},
-d1:function(a){return this.wN.$1(a)},
-qk:function(a,b){return this.wN.$2(a,b)},
-p0:function(a,b,c){return this.wN.$3(a,b,c)},
-gB9:function(){return this.KZ===$.ng},
+Yd:function(){return this.zo.$0()},
+d1:function(a){return this.zo.$1(a)},
+qk:function(a,b){return this.zo.$2(a,b)},
+Tu:function(a,b,c){return this.zo.$3(a,b,c)},
+gB9:function(){return this.KZ===$.ljh},
 TR:function(a,b){var z=this.KZ
-if(z===$.ng||z===$.H2)throw H.b(P.w("Observer has already been opened."))
-if(X.OS(b)>this.gDJ())throw H.b(P.u("callback should take "+this.gDJ()+" or fewer arguments"))
-this.wN=b
-this.dR=P.J(this.gDJ(),X.RI(b))
+if(z===$.ljh||z===$.ls)throw H.b(P.w("Observer has already been opened."))
+if(X.na(b)>this.gDJ())throw H.b(P.u("callback should take "+this.gDJ()+" or fewer arguments"))
+this.zo=b
+this.dR=P.J(this.gDJ(),X.Zpg(b))
 this.Ej(0)
-this.KZ=$.ng
+this.KZ=$.ljh
 return this.z7},
 gP:function(a){this.CG(!0)
 return this.z7},
-xO:function(a){if(this.KZ!==$.ng)return
+xO:function(a){if(this.KZ!==$.ljh)return
 this.U9()
 this.z7=null
-this.wN=null
-this.KZ=$.H2},
-fR:function(){if(this.KZ===$.ng)this.fl()},
+this.zo=null
+this.KZ=$.ls},
+fR:function(){if(this.KZ===$.ljh)this.fl()},
 fl:function(){var z=0
 while(!0){if(!(z<1000&&this.mX()))break;++z}return z>0},
 dC:function(a,b,c){var z,y,x,w
@@ -15758,15 +15758,15 @@
 break
 case 2:this.qk(a,b)
 break
-case 3:this.p0(a,b,c)
+case 3:this.Tu(a,b,c)
 break}}catch(x){w=H.Ru(x)
 z=w
 y=new H.oP(x,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}}},
-Og:{
-"^":"a;Ou,cE,JD,YR",
+Js:{
+"^":"a;Ou,pe,JD,YR",
 zJ:[function(a,b,c){var z=this.Ou
-if(b==null?z==null:b===z)this.cE.h(0,c)
+if(b==null?z==null:b===z)this.pe.h(0,c)
 z=J.x(b)
 if(!!z.$iswn)this.hr(b.gXF())
 if(!!z.$isd3)this.hr(z.gqh(b))},"$2","gUu",4,0,181,96,182],
@@ -15776,22 +15776,22 @@
 b2:function(a){var z,y,x,w
 for(z=J.mY(a);z.G();){y=z.gl()
 x=J.x(y)
-if(!!x.$isqI){if(y.WA!==this.Ou||this.cE.tg(0,y.oc))return!1}else if(!!x.$isZq){x=y.WA
+if(!!x.$isqI){if(y.WA!==this.Ou||this.pe.tg(0,y.oc))return!1}else if(!!x.$isZq){x=y.WA
 w=this.Ou
-if((x==null?w!=null:x!==w)||this.cE.tg(0,y.Ft))return!1}else return!1}return!0},
+if((x==null?w!=null:x!==w)||this.pe.tg(0,y.Ft))return!1}else return!1}return!0},
 F5:[function(a){var z,y,x
 if(this.b2(a))return
-for(z=this.JD,y=C.Nm.tt(z,!1),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
-if(x.gB9())x.VC(this.gUu(this))}for(z=C.Nm.tt(z,!1),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=z.lo
+for(z=this.JD,y=C.Nm.tt(z,!1),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.Ff
+if(x.gB9())x.VC(this.gUu(this))}for(z=C.Nm.tt(z,!1),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){x=z.Ff
 if(x.gB9())x.mX()}},"$1","gCP",2,0,19,183],
-static:{"^":"rf",SE:function(a,b){var z,y
+static:{"^":"rf",KJ:function(a,b){var z,y
 z=$.rf
 if(z!=null){y=z.Ou
 y=y==null?b!=null:y!==b}else y=!0
-if(y){z=b==null?null:P.fM(null,null,null,null)
-z=new L.Og(b,z,[],null)
+if(y){z=b==null?null:P.Ls(null,null,null,null)
+z=new L.Js(b,z,[],null)
 $.rf=z}if(z.Ou==null){z.Ou=b
-z.cE=P.fM(null,null,null,null)}z.JD.push(a)
+z.pe=P.Ls(null,null,null,null)}z.JD.push(a)
 a.VC(z.gUu(z))}}}}],["","",,R,{
 "^":"",
 tB:[function(a){var z,y,x
@@ -15808,26 +15808,26 @@
 $2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,141,66,"call"],
 $isEH:true}}],["","",,A,{
 "^":"",
-YG:function(a,b,c){var z=$.lx()
-if(z==null||$.oo()!==!0)return
+ec:function(a,b,c){var z=$.lx()
+if(z==null||$.Ep()!==!0)return
 z.V7("shimStyling",[a,b,c])},
-Hl:function(a){var z,y,x,w,v
+q3:function(a){var z,y,x,w,v
 if(a==null)return""
 if($.UG)return""
 w=J.RE(a)
-z=w.gLU(a)
+z=w.gmH(a)
 if(J.xC(z,""))z=w.gQg(a).dA.getAttribute("href")
 try{w=new XMLHttpRequest()
 C.W3.i3(w,"GET",z,!1)
 w.send()
 w=w.responseText
 return w}catch(v){w=H.Ru(v)
-if(!!J.x(w).$isNh){y=w
+if(!!J.x(w).$isBK){y=w
 x=new H.oP(v,null)
-$.eU().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+$.Is().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
 return""}else throw v}},
 M8:[function(a){var z,y
-z=$.vu().JE.fJ.t(0,a)
+z=$.vu().xV.af.t(0,a)
 if(z==null)return!1
 y=J.Qe(z)
 return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,64,65],
@@ -15836,62 +15836,62 @@
 ZI:function(a,b){var z,y,x,w
 if(a==null)return
 document
-if($.oo()===!0)b=document.head
+if($.Ep()===!0)b=document.head
 z=document.createElement("style",null)
 J.t3(z,J.dY(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
 x=b.firstChild
 if(b===document.head){w=W.vD(document.head.querySelectorAll("style[element]"),null)
-if(w.gor(w))x=J.cC(C.z0.grZ(w.mk))}b.insertBefore(z,x)},
-Ok:function(){A.c4()
+if(w.gor(w))x=J.rk(C.t5.grZ(w.jt))}b.insertBefore(z,x)},
+Zw:function(){A.c4()
 if($.UG){A.X1($.M6,!0)
 return $.X3}var z=$.X3.iT(O.Ht())
 z.Gr(new A.mS())
 return z},
 X1:function(a,b){var z,y
-if($.DG)throw H.b("Initialization was already done.")
-$.DG=!0
+if($.HE)throw H.b("Initialization was already done.")
+$.HE=!0
 A.JP()
 $.ok=b
 if(a==null)throw H.b("Missing initialization of polymer elements. Please check that the list of entry points in your pubspec.yaml is correct. If you are using pub-serve, you may need to restart it.")
-A.Ad("auto-binding-dart",C.kA)
+A.Ad("auto-binding-dart",C.nj)
 z=document.createElement("polymer-element",null)
 z.setAttribute("name","auto-binding-dart")
 z.setAttribute("extends","template")
-J.UQ($.XX(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,93,0,null),[H.u3(a,0)]);y.G();)y.lo.$0()},
+J.UQ($.Dw(),"init").qP([],z)
+for(y=H.VM(new H.a7(a,93,0,null),[H.u3(a,0)]);y.G();)y.Ff.$0()},
 JP:function(){var z,y,x
 z=J.UQ($.Xw(),"Polymer")
 if(z==null)throw H.b(P.w("polymer.js must be loaded before polymer.dart, please add <link rel=\"import\" href=\"packages/polymer/polymer.html\"> to your <head> before any Dart scripts. Alternatively you can get a different version of polymer.js by following the instructions at http://www.polymer-project.org."))
 y=$.X3
 z.V7("whenPolymerReady",[y.ce(new A.XR())])
-x=J.UQ($.XX(),"register")
+x=J.UQ($.Dw(),"register")
 if(x==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
-J.qQ($.XX(),"register",P.mt(new A.k2(y,x)))},
+J.kW($.Dw(),"register",P.mt(new A.k2(y,x)))},
 c4:function(){var z,y,x,w
 z={}
 $.RL=!0
 y=J.UQ($.Xw(),"logFlags")
 z.a=y
 if(y==null)z.a=P.Fl(null,null)
-x=[$.a3(),$.xW(),$.UW(),$.aQ(),$.Is(),$.Fs()]
+x=[$.dn(),$.vo(),$.iX(),$.Lu(),$.REM(),$.lg()]
 w=N.QM("polymer")
-if(!H.Ck(x,new A.j0(z))){w.sOR(C.oO)
-return}H.VM(new H.U5(x,new A.j0N(z)),[H.u3(H.VM(new H.TNQ(),[H.u3(x,0)]),0)]).aN(0,new A.MZ6())
+if(!H.Ck(x,new A.j0(z))){w.sOR(C.oOA)
+return}H.VM(new H.U5(x,new A.j0N(z)),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]).aN(0,new A.MZ6())
 w.gSZ().yI(new A.mqr())},
-XP:{
-"^":"a;FL>,t5>,P1<,oc>,Q7<,DB<,eJ>,Gl<,CY<,ix<,y0,G9,wX>,mR<,yz,aU",
+So:{
+"^":"a;FL>,t5>,Jh<,oc>,Q7<,Md<,eJ>,Gl<,PH<,ix<,y0,G9,wX>,mR<,WV,vT",
 gZf:function(){var z,y
-z=J.Eh(this.FL,"template")
-if(z!=null)y=J.ti(!!J.x(z).$ishs?z:M.uH(z))
+z=J.yR(this.FL,"template")
+if(z!=null)y=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
 else y=null
 return y},
 Ba:function(a){var z,y,x
 for(z=null,y=this;y!=null;){z=J.Vs(J.y3(y)).dA.getAttribute("extends")
-y=y.gP1()}x=document
-W.wi(window,x,a,this.t5,z)},
-RH:function(a){var z=$.uj()
+y=y.gJh()}x=document
+W.Ct(window,x,a,this.t5,z)},
+Cw:function(a){var z=$.uj()
 if(z==null)return
 J.UQ(z,"urlResolver").V7("resolveDom",[a])},
 Zw:function(a){var z,y,x,w,v,u,t,s,r,q
@@ -15899,125 +15899,118 @@
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
 this.Q7=y}if(a.gix()!=null){z=a.gix()
-y=P.fM(null,null,null,null)
+y=P.Ls(null,null,null,null)
 y.FV(0,z)
 this.ix=y}}z=this.t5
 this.en(z)
 x=J.Vs(this.FL).dA.getAttribute("attributes")
-if(x!=null)for(y=C.yo.Fr(x,$.FF()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.iY(y.lo)
+if(x!=null)for(y=C.yo.Fr(x,$.FF()),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.oc;y.G();){v=J.rr(y.Ff)
 if(v==="")continue
-u=$.vu().JE.T4.t(0,v)
+u=$.vu().xV.T4.t(0,v)
 t=u!=null
 if(t){s=L.hk([u])
 r=this.Q7
 if(r!=null&&r.NZ(0,s))continue
-q=$.II().CV(z,u)}else{q=null
-s=null}if(!t||q==null||q.gUA()||J.Z6(q)===!0){window
+q=$.mX().CV(z,u)}else{q=null
+s=null}if(!t||q==null||q.gUA()||J.EM(q)===!0){window
 t="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
 if(typeof console!="undefined")console.warn(t)
 continue}t=this.Q7
 if(t==null){t=P.Fl(null,null)
 this.Q7=t}t.u(0,s,q)}},
 en:function(a){var z,y,x,w,v
-for(z=$.II().Me(0,a,C.V4),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+for(z=$.mX().Me(0,a,C.V4),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 x=J.RE(y)
 if(x.gV5(y)===!0)continue
 w=this.Q7
 if(w==null){w=P.Fl(null,null)
 this.Q7=w}w.u(0,L.hk([x.goc(y)]),y)
 w=y.gDv()
-v=new H.TNQ()
+v=new H.wb()
 v.$builtinTypeInfo=[H.u3(w,0)]
 w=new H.U5(w,new A.Zd())
 w.$builtinTypeInfo=[H.u3(v,0)]
 if(w.Vr(0,new A.Da())){w=this.ix
-if(w==null){w=P.fM(null,null,null,null)
+if(w==null){w=P.Ls(null,null,null,null)
 this.ix=w}x=x.goc(y)
-w.h(0,$.vu().JE.fJ.t(0,x))}}},
+w.h(0,$.vu().xV.af.t(0,x))}}},
 Vk:function(){var z,y
 z=P.L5(null,null,null,P.qU,P.a)
-this.CY=z
-y=this.P1
-if(y!=null)z.FV(0,y.gCY())
+this.PH=z
+y=this.Jh
+if(y!=null)z.FV(0,y.gPH())
 J.Vs(this.FL).aN(0,new A.EB(this))},
-W3:function(a){J.Vs(this.FL).aN(0,new A.Pf(a))},
-fk:function(){var z=this.Bg("link[rel=stylesheet]")
+W3:function(a){J.Vs(this.FL).aN(0,new A.Y1(a))},
+ka:function(){var z=this.Bg("link[rel=stylesheet]")
 this.y0=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Rv(z.lo)},
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.Ff)},
 f6:function(){var z=this.Bg("style[polymer-scope]")
 this.G9=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Rv(z.lo)},
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.Mp(z.Ff)},
 yq:function(){var z,y,x,w,v,u,t,s
 z=this.y0
 z.toString
-y=H.VM(new H.U5(z,new A.IJ()),[H.u3(H.VM(new H.TNQ(),[H.u3(z,0)]),0)])
+y=H.VM(new H.U5(z,new A.IJ()),[H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0)])
 x=this.gZf()
 if(x!=null){w=P.p9("")
-for(z=H.VM(new H.Mo(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),v=z.CL;z.G();){u=A.Hl(v.gl())
+for(z=H.VM(new H.vG(J.mY(y.Hb),y.Oh),[H.u3(y,0)]),v=z.CL;z.G();){u=A.q3(v.gl())
 t=w.IN+=typeof u==="string"?u:H.d(u)
-w.IN=t+"\n"}if(w.IN.length>0){s=J.Do(this.FL).createElement("style",null)
+w.IN=t+"\n"}if(w.IN.length>0){s=J.lu(this.FL).createElement("style",null)
 J.t3(s,H.d(w))
 z=J.RE(x)
-z.mK(x,s,z.gNL(x))}}},
+z.FO(x,s,z.gNL(x))}}},
 Wz:function(a,b){var z,y,x
-z=J.Vj(this.FL,a)
+z=J.We(this.FL,a)
 y=z.br(z)
 x=this.gZf()
-if(x!=null)C.Nm.FV(y,J.Vj(x,a))
+if(x!=null)C.Nm.FV(y,J.We(x,a))
 return y},
 Bg:function(a){return this.Wz(a,null)},
-l7:function(a){var z,y,x,w,v,u
+ds:function(a){var z,y,x,w,v,u
 z=P.p9("")
-y=new A.Vi("[polymer-scope="+a+"]")
-for(x=this.y0,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.TNQ(),[H.u3(x,0)]),0)]),x=H.VM(new H.Mo(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),w=x.CL;x.G();){v=A.Hl(w.gl())
+y=new A.ui("[polymer-scope="+a+"]")
+for(x=this.y0,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]),x=H.VM(new H.vG(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),w=x.CL;x.G();){v=A.q3(w.gl())
 u=z.IN+=typeof v==="string"?v:H.d(v)
-z.IN=u+"\n\n"}for(x=this.G9,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.TNQ(),[H.u3(x,0)]),0)]),x=H.VM(new H.Mo(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),y=x.CL;x.G();){v=J.dY(y.gl())
+z.IN=u+"\n\n"}for(x=this.G9,x.toString,x=H.VM(new H.U5(x,y),[H.u3(H.VM(new H.wb(),[H.u3(x,0)]),0)]),x=H.VM(new H.vG(J.mY(x.Hb),x.Oh),[H.u3(x,0)]),y=x.CL;x.G();){v=J.dY(y.gl())
 w=z.IN+=typeof v==="string"?v:H.d(v)
-z.IN=w+"\n\n"}y=z.IN
-return y.charCodeAt(0)==0?y:y},
+z.IN=w+"\n\n"}return z.IN},
 J3:function(a,b){var z
-if(J.xC(a,""))return
+if(a==="")return
 z=document.createElement("style",null)
 J.t3(z,a)
 z.setAttribute("element",H.d(this.oc)+"-"+b)
 return z},
 rH:function(){var z,y,x,w,v
-for(z=$.or(),z=$.II().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
+for(z=$.HN(),z=$.mX().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
 if(this.eJ==null)this.eJ=P.YM(null,null,null,null,null)
 x=J.RE(y)
 w=x.goc(y)
-v=$.vu().JE.fJ.t(0,w)
+v=$.vu().xV.af.t(0,w)
 w=J.U6(v)
 v=w.Nj(v,0,J.bI(w.gB(v),7))
 this.eJ.u(0,L.hk(v),[x.goc(y)])}},
-I7:function(){var z,y,x,w,v,u,t
-for(z=$.II().Me(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
-x=y.gDv()
-w=new H.a7(x,x.length,0,null)
-w.$builtinTypeInfo=[H.u3(x,0)]
-x=J.RE(y)
-for(;w.G();){v=w.lo
-if(!J.x(v).$iswA)continue
-if(this.eJ==null)this.eJ=P.YM(null,null,null,null,null)
-for(u=v.gfJ(),u=u.gA(u);u.G(),!1;){t=u.gl()
-J.dH(this.eJ.to(0,L.hk(t),new A.XU()),x.goc(y))}}}},
+I7:function(){var z,y,x
+for(z=$.mX().Me(0,this.t5,C.Tb),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff.gDv()
+x=new H.a7(y,y.length,0,null)
+x.$builtinTypeInfo=[H.u3(y,0)]
+for(;x.G();)continue}},
 jq:function(a){var z=P.L5(null,null,null,P.qU,null)
-a.aN(0,new A.fh(z))
+a.aN(0,new A.Tj(z))
 return z},
-hW:function(){var z,y,x,w,v,u,t,s,r
+ut:function(){var z,y,x,w,v,u,t,s,r
 z=P.Fl(null,null)
-for(y=$.II().Me(0,this.t5,C.jJ),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.Gl;y.G();){w=y.lo
-v=H.Sz(w.gDv(),new A.HH(),null)
+for(y=$.mX().Me(0,this.t5,C.m8),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.Gl;y.G();){w=y.Ff
+v=H.FU(w.gDv(),new A.HH(),null)
 u=J.RE(w)
 t=u.goc(w)
 s=z.t(0,t)
 if(s!=null){u=u.gt5(w)
 r=J.zH(s)
-r=$.II().xs(u,r)
+r=$.mX().xs(u,r)
 u=r}else u=!0
-if(u){x.u(0,t,v.gEV())
+if(u){x.u(0,t,v.gXt())
 z.u(0,t,w)}}},
-$isXP:true,
+$isSo:true,
 static:{"^":"Kb"}},
 Zd:{
 "^":"TpZ:12;",
@@ -16029,52 +16022,52 @@
 $isEH:true},
 EB:{
 "^":"TpZ:81;a",
-$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.a.CY.u(0,a,b)},
+$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.a.PH.u(0,a,b)},
 $isEH:true},
-Pf:{
+Y1:{
 "^":"TpZ:81;a",
 $2:function(a,b){var z,y,x
 z=J.Qe(a)
 if(z.nC(a,"on-")){y=J.U6(b).OY(b,"{{")
 x=C.yo.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.yo.DY(C.yo.Nj(b,y+2,x)))}},
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.yo.bS(C.yo.Nj(b,y+2,x)))}},
 $isEH:true},
 IJ:{
 "^":"TpZ:12;",
 $1:function(a){return J.Vs(a).dA.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
-Vi:{
+ui:{
 "^":"TpZ:12;a",
-$1:function(a){return J.YN(a,this.a)},
+$1:function(a){return J.wK(a,this.a)},
 $isEH:true},
-XU:{
+eM:{
 "^":"TpZ:76;",
 $0:function(){return[]},
 $isEH:true},
-fh:{
+Tj:{
 "^":"TpZ:184;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 HH:{
 "^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$isYj},
+$1:function(a){return!1},
 $isEH:true},
 Li:{
-"^":"BG9;xI,oe",
-op:function(a,b,c){if(J.co(b,"on-"))return this.Io(a,b,c)
-return this.xI.op(a,b,c)},
-static:{"^":"rd0,Uv"}},
+"^":"BG9;Mn,oe",
+op:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
+return this.Mn.op(a,b,c)},
+static:{"^":"rd0,QPA"}},
 BG9:{
-"^":"VE+d23;"},
+"^":"vE+d23;"},
 d23:{
 "^":"a;",
-h5:function(a){var z
+XB:function(a){var z
 for(;z=J.RE(a),z.gAd(a)!=null;){if(!!z.$iszs&&J.UQ(a.n7,"eventController")!=null)return J.UQ(z.gCp(a),"eventController")
 a=z.gAd(a)}return!!z.$isI0?a.host:null},
 Z8:function(a,b,c){var z={}
 z.a=a
-return new A.AC(z,this,b,c)},
-Io:function(a,b,c){var z,y,x,w
+return new A.l5(z,this,b,c)},
+CZ:function(a,b,c){var z,y,x,w
 z={}
 y=J.Qe(b)
 if(!y.nC(b,"on-"))return
@@ -16083,17 +16076,17 @@
 w=C.yt.t(0,x)
 z.a=w!=null?w:z.a
 return new A.liz(z,this,a)}},
-AC:{
+l5:{
 "^":"TpZ:12;a,b,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.h5(this.c)
+if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
 z.a=x
 y=x}if(!!J.x(y).$iszs){y=J.x(a)
-if(!!y.$isRb){w=C.lG.gey(a)
-if(w==null)w=J.UQ(P.kW(a),"detail")}else w=null
-y=y.gXQ(a)
+if(!!y.$isDG4){w=y.gey(a)
+if(w==null)w=J.UQ(P.XY(a),"detail")}else w=null
+y=y.gF0(a)
 z=z.a
 J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
@@ -16101,50 +16094,50 @@
 "^":"TpZ:188;a,b,c",
 $3:[function(a,b,c){var z,y,x
 z=this.c
-y=P.mt(new A.Bc($.X3.mS(this.b.Z8(null,b,z))))
+y=P.mt(new A.kD($.X3.mS(this.b.Z8(null,b,z))))
 x=this.a
-$.Op().V7("addEventListener",[b,x.a,y])
+$.tNi().V7("addEventListener",[b,x.a,y])
 if(c===!0)return
-return new A.d6(z,b,x.a,y)},"$3",null,6,0,null,185,186,187,"call"],
+return new A.zIs(z,b,x.a,y)},"$3",null,6,0,null,185,186,187,"call"],
 $isEH:true},
-Bc:{
+kD:{
 "^":"TpZ:81;d",
 $2:[function(a,b){return this.d.$1(b)},"$2",null,4,0,null,13,2,"call"],
 $isEH:true},
-d6:{
-"^":"Ap;ED,v3,dF,Xj",
+zIs:{
+"^":"Ap;ED,d9,dF,Xj",
 gP:function(a){return"{{ "+this.ED+" }}"},
 TR:function(a,b){return"{{ "+this.ED+" }}"},
-xO:function(a){$.Op().V7("removeEventListener",[this.v3,this.dF,this.Xj])}},
+xO:function(a){$.tNi().V7("removeEventListener",[this.d9,this.dF,this.Xj])}},
 xn:{
 "^":"iv;vn<",
 $isxn:true},
 xc:{
-"^":"TR0;Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"TR0;Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 XI:function(a){this.kR(a)},
-static:{yk:function(a){var z,y,x,w
+static:{oaJ:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Vk.LX(a)
-C.Vk.XI(a)
+C.GBL.LX(a)
+C.GBL.XI(a)
 return a}}},
 jpR:{
 "^":"Bo+zs;Cp:n7=",
 $iszs:true,
-$ishs:true,
+$isvy:true,
 $isd3:true,
 $ish4:true,
-$isFU:true,
+$isPZ:true,
 $isKV:true},
 TR0:{
 "^":"jpR+Pi;",
@@ -16159,137 +16152,138 @@
 y=this.gQg(a).dA.getAttribute("is")
 return y==null||y===""?this.gqn(a):y},
 kR:function(a){var z,y
-z=this.gCn(a)
+z=this.gmb(a)
 if(z!=null&&z.k8!=null){window
 y="Attributes on "+H.d(this.gRT(a))+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."
 if(typeof console!="undefined")console.warn(y)}this.Ec(a)
-y=this.gM0(a)
-if(!J.xC($.Tg().t(0,y),!0))this.rf(a)},
+y=this.gJ8(a)
+if(!J.xC($.Ks().t(0,y),!0))this.rf(a)},
 Ec:function(a){var z,y
 if(a.IX!=null){window
 z="Element already prepared: "+H.d(this.gRT(a))
 if(typeof console!="undefined")console.warn(z)
-return}a.n7=P.kW(a)
+return}a.n7=P.XY(a)
 z=this.gRT(a)
-a.IX=$.RA().t(0,z)
-this.nt(a)
+a.IX=$.w3G().t(0,z)
+this.jM(a)
 z=a.MJ
 if(z!=null){y=this.gnu(a)
 z.toString
 L.ARh.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gLj(a))
 this.oR(a)
-this.xX(a)
+this.xL(a)
 this.Uc(a)},
 rf:function(a){if(a.OD)return
 a.OD=!0
 this.bT(a)
 this.Qs(a,a.IX)
 this.gQg(a).Rz(0,"unresolved")
-$.Fs().To(new A.pN(a))
+$.lg().To(new A.pN(a))
 this.I9(a)},
 I9:function(a){},
 Es:function(a){if(a.IX==null)throw H.b(P.w("polymerCreated was not called for custom element "+H.d(this.gRT(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
 this.oW(a)
 if(!a.kK){a.kK=!0
 this.rW(a,new A.hp(a))}},
-dQ:function(a){this.x3(a)},
-Qs:function(a,b){if(b!=null){this.Qs(a,b.gP1())
+Lx:function(a){this.x3(a)},
+Qs:function(a,b){if(b!=null){this.Qs(a,b.gJh())
 this.aI(a,J.y3(b))}},
 aI:function(a,b){var z,y,x,w
 z=J.RE(b)
-y=z.Wk(b,"template")
+y=z.XT(b,"template")
 if(y!=null){x=this.Tp(a,y)
 w=z.gQg(b).dA.getAttribute("name")
 if(w==null)return
 a.ZM.u(0,w,x)}},
 Tp:function(a,b){var z,y,x,w,v,u
-z=this.er(a)
-M.uH(b).rp(null)
+if(b==null)return
+z=this.TL(a)
+M.Xi(b).cl(null)
 y=this.gwX(a)
-x=!!J.x(b).$ishs?b:M.uH(b)
-w=J.ju(x,a,y==null&&J.Ee(x)==null?J.RH0(a.IX):y)
-v=a.Iy
-u=$.Uo().t(0,w)
+x=!!J.x(b).$isvy?b:M.Xi(b)
+w=J.dv(x,a,y==null&&J.qy(x)==null?J.v7(a.IX):y)
+v=a.f4
+u=$.nR().t(0,w)
 C.Nm.FV(v,u!=null?u.gdn():u)
 z.appendChild(w)
 this.lj(a,z)
 return z},
 lj:function(a,b){var z,y,x
 if(b==null)return
-for(z=J.Vj(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
+for(z=J.We(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.Ff
 y.u(0,J.eS(x),x)}},
-aC:function(a,b,c,d){var z=J.x(b)
+wN:function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
-oR:function(a){a.IX.gCY().aN(0,new A.va(a))},
-xX:function(a){if(a.IX.gDB()==null)return
+oR:function(a){a.IX.gPH().aN(0,new A.Sv(a))},
+xL:function(a){if(a.IX.gMd()==null)return
 this.gQg(a).aN(0,this.gCg(a))},
 D3:[function(a,b,c){var z,y,x,w,v,u
 z=this.B2(a,b)
 if(z==null)return
-if(c==null||J.kE(c,$.iB())===!0)return
+if(c==null||J.kE(c,$.VCp())===!0)return
 y=J.RE(z)
 x=y.goc(z)
-w=$.cp().jD(a,x)
+w=$.cp().Gp(a,x)
 v=y.gt5(z)
 x=J.x(v)
-u=Z.LB(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.bB(w):v)
+u=Z.fd(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.bB(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Q1(a,y,u)}},"$2","gCg",4,0,189],
-B2:function(a,b){var z=a.IX.gDB()
+$.cp().Cq(a,y,u)}},"$2","gCg",4,0,189],
+B2:function(a,b){var z=a.IX.gMd()
 if(z==null)return
 return z.t(0,b)},
-JL:function(a,b){if(b==null)return
+TW:function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number")return H.d(b)
 return},
 QH:function(a,b){var z,y
 z=L.hk(b).WK(a)
-y=this.JL(a,z)
+y=this.TW(a,z)
 if(y!=null)this.gQg(a).dA.setAttribute(b,y)
 else if(typeof z==="boolean")this.gQg(a).Rz(0,b)},
 nR:function(a,b,c,d){var z,y,x,w,v,u
 z=this.B2(a,b)
-if(z==null)return J.FS1(M.uH(a),b,c,d)
+if(z==null)return J.IB(M.Xi(a),b,c,d)
 else{y=J.RE(z)
 x=this.Fy(a,y.goc(z),c,d)
-if(J.xC(J.UQ(J.UQ($.Xw(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.QE(M.uH(a))==null){w=P.Fl(null,null)
-J.nC(M.uH(a),w)}J.qQ(J.QE(M.uH(a)),b,x)}v=a.IX.gix()
+if(J.xC(J.UQ(J.UQ($.Xw(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.QE(M.Xi(a))==null){w=P.Fl(null,null)
+J.CS(M.Xi(a),w)}J.kW(J.QE(M.Xi(a)),b,x)}v=a.IX.gix()
 y=y.goc(z)
-u=$.vu().JE.fJ.t(0,y)
+u=$.vu().xV.af.t(0,y)
 if(v!=null&&v.tg(0,u))this.QH(a,u)
 return x}},
 lL:function(a){return this.rf(a)},
-gCd:function(a){return J.QE(M.uH(a))},
-sCd:function(a,b){J.nC(M.uH(a),b)},
-gCn:function(a){return J.OC(M.uH(a))},
+gCd:function(a){return J.QE(M.Xi(a))},
+sCd:function(a,b){J.CS(M.Xi(a),b)},
+gmb:function(a){return J.re(M.Xi(a))},
 x3:function(a){var z,y
 if(a.bb===!0)return
-$.UW().Ny(new A.rs(a))
+$.iX().J4(new A.N3(a))
 z=a.TT
-y=this.gf2(a)
+y=this.gyz(a)
 if(z==null)z=new A.FT(null,null,null)
-z.ui(0,y,null)
+z.t6(0,y,null)
 a.TT=z},
-GB:[function(a){if(a.bb===!0)return
+GBV:[function(a){if(a.bb===!0)return
 this.mc(a)
 this.Uq(a)
-a.bb=!0},"$0","gf2",0,0,17],
+a.bb=!0},"$0","gyz",0,0,17],
 oW:function(a){var z
-if(a.bb===!0){$.UW().j2(new A.TV(a))
-return}$.UW().Ny(new A.Z7(a))
+if(a.bb===!0){$.iX().j2(new A.ti(a))
+return}$.iX().J4(new A.Rb(a))
 z=a.TT
-if(z!=null){z.TP(0)
+if(z!=null){z.nY(0)
 a.TT=null}},
-nt:function(a){var z,y,x,w,v
+jM:function(a){var z,y,x,w,v
 z=J.q1(a.IX)
 if(z!=null){y=new L.nQ(null,!1,[],null,null,null,$.jq1)
 y.z7=[]
 a.MJ=y
-a.Iy.push(y)
+a.f4.push(y)
 for(x=H.VM(new P.fG(z),[H.u3(z,0)]),w=x.ZD,x=H.VM(new P.EQ(w,w.Nm(),0,null),[H.u3(x,0)]);x.G();){v=x.fD
 y.WX(a,v)
 this.j6(a,v,v.WK(a),null)}}},
-FQx:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.q1(a.IX),P.l1(null,null,null,null)))},"$3","gnu",6,0,190],
+FQx:[function(a,b,c,d){J.Me(c,new A.OaD(a,b,c,d,J.q1(a.IX),P.l1(null,null,null,null)))},"$3","gnu",6,0,190],
 p7:[function(a,b){var z,y,x,w
 for(z=J.mY(b),y=a.qJ;z.G();){x=z.gl()
 if(!J.x(x).$isqI)continue
@@ -16297,8 +16291,8 @@
 if(y.t(0,w)!=null)continue
 this.Dt(a,w,x.zZ,x.jL)}},"$1","gLj",2,0,191,183],
 Dt:function(a,b,c,d){var z,y
-$.Is().To(new A.qW(a,b,c,d))
-z=$.vu().JE.fJ.t(0,b)
+$.REM().To(new A.qW(a,b,c,d))
+z=$.vu().xV.af.t(0,b)
 y=a.IX.gix()
 if(y!=null&&y.tg(0,z))this.QH(a,z)},
 j6:function(a,b,c,d){var z,y,x,w,v
@@ -16306,18 +16300,18 @@
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-if(!!J.x(d).$iswn){$.a3().Ny(new A.xf(a,b))
-this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){$.a3().Ny(new A.Y0(a,b))
-x=c.gXF().k0(new A.fS(a,y),null,null,!1)
+if(!!J.x(d).$iswn){$.dn().J4(new A.xf(a,b))
+this.Mx(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){$.dn().J4(new A.Y0(a,b))
+x=c.gXF().k0(new A.kMK(a,y),null,null,!1)
 w=H.d(b)+"__array"
-v=a.vG
+v=a.Bd
 if(v==null){v=P.L5(null,null,null,P.qU,P.yX)
-a.vG=v}v.u(0,w,x)}},
-Oq:function(a,b,c,d){if(d==null?c==null:d===c)return
+a.Bd=v}v.u(0,w,x)}},
+hq:function(a,b,c,d){if(d==null?c==null:d===c)return
 this.Dt(a,b,c,d)},
-rh:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
-z=$.cp().JE.E4.t(0,b)
-if(z==null)H.vh(O.lA("getter \""+H.d(b)+"\" in "+this.bu(a)))
+hO:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
+z=$.cp().xV.II.t(0,b)
+if(z==null)H.vh(O.Fm("getter \""+H.d(b)+"\" in "+this.bu(a)))
 y=z.$1(a)
 x=a.qJ.t(0,b)
 if(x==null){w=J.RE(c)
@@ -16326,10 +16320,10 @@
 v.Sx=this.gqh(a).k0(v.gou(),null,null,!1)
 w=J.mu(c,v.gew())
 v.RP=w
-u=$.cp().JE.F8.t(0,b)
-if(u==null)H.vh(O.lA("setter \""+H.d(b)+"\" in "+this.bu(a)))
+u=$.cp().xV.F8.t(0,b)
+if(u==null)H.vh(O.Fm("setter \""+H.d(b)+"\" in "+this.bu(a)))
 u.$2(a,w)
-a.Iy.push(v)
+a.f4.push(v)
 return v}x.mn=c
 w=J.RE(c)
 t=w.TR(c,x.gUe())
@@ -16340,71 +16334,71 @@
 r=x.RT
 q=J.RE(w)
 x.VB=q.ct(w,r,y,t)
-q.Oq(w,r,t,y)
+q.hq(w,r,t,y)
 v=new A.p0(x)
-a.Iy.push(v)
+a.f4.push(v)
 return v},
-wc:function(a,b,c){return this.rh(a,b,c,!1)},
+hH:function(a,b,c){return this.hO(a,b,c,!1)},
 yO:function(a,b){var z=a.IX.gGl().t(0,b)
 if(z==null)return
-return T.aC().$3$globals(T.Ms().$1(z),a,J.RH0(a.IX).xI.nF)},
+return T.yM().$3$globals(T.u5().$1(z),a,J.v7(a.IX).Mn.nF)},
 bT:function(a){var z,y,x,w,v,u,t,s
 z=a.IX.gGl()
-for(v=J.mY(J.iYM(z)),u=a.qJ;v.G();){y=v.gl()
+for(v=J.mY(J.iY(z)),u=a.qJ;v.G();){y=v.gl()
 try{x=this.yO(a,y)
-if(u.t(0,y)==null){t=new A.Zw(y,J.Vm(x),a,null)
+if(u.t(0,y)==null){t=new A.js(y,J.Vm(x),a,null)
 t.$builtinTypeInfo=[null]
-u.u(0,y,t)}this.wc(a,y,x)}catch(s){t=H.Ru(s)
+u.u(0,y,t)}this.hH(a,y,x)}catch(s){t=H.Ru(s)
 w=t
 window
 t="Failed to create computed property "+H.d(y)+" ("+H.d(J.UQ(z,y))+"): "+H.d(w)
 if(typeof console!="undefined")console.error(t)}}},
 mc:function(a){var z,y
-for(z=a.Iy,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.lo
-if(y!=null)J.yd(y)}a.Iy=[]},
-iQ:function(a,b){var z=a.vG.Rz(0,b)
+for(z=a.f4,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=z.Ff
+if(y!=null)J.yd(y)}a.f4=[]},
+Mx:function(a,b){var z=a.Bd.Rz(0,b)
 if(z==null)return!1
 z.Gv()
 return!0},
 Uq:function(a){var z,y
-z=a.vG
+z=a.Bd
 if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.Hb),z.Oh),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.lo
-if(y!=null)y.Gv()}a.vG.V1(0)
-a.vG=null},
-Fy:function(a,b,c,d){var z=$.aQ()
-z.Ny(new A.aM(a,b,c))
+for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.Hb),z.Oh),[H.u3(z,0),H.u3(z,1)]);z.G();){y=z.Ff
+if(y!=null)y.Gv()}a.Bd.V1(0)
+a.Bd=null},
+Fy:function(a,b,c,d){var z=$.Lu()
+z.J4(new A.aM(a,b,c))
 if(d){if(!!J.x(c).$isAp)z.j2(new A.aMY(a,b,c))
-$.cp().Q1(a,b,c)
-return}return this.rh(a,b,c,!0)},
+$.cp().Cq(a,b,c)
+return}return this.hO(a,b,c,!0)},
 Uc:function(a){var z=a.IX.gmR()
 if(z.gl0(z))return
-$.xW().Ny(new A.SX(a,z))
+$.vo().J4(new A.SX(a,z))
 z.aN(0,new A.Jys(a))},
 ea:function(a,b,c,d){var z,y,x
-z=$.xW()
+z=$.vo()
 z.To(new A.od(a,c))
-if(!!J.x(c).$isEH){y=X.RI(c)
+if(!!J.x(c).$isEH){y=X.Zpg(c)
 if(y===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
 C.Nm.sB(d,y)
-H.eC(c,d,P.Te(null))}else if(typeof c==="string"){x=$.vu().JE.T4.t(0,c)
+H.eC(c,d,P.Te(null))}else if(typeof c==="string"){x=$.vu().xV.T4.t(0,c)
 $.cp().Ck(b,x,d,!0,null)}else z.j2("invalid callback")
-z.Ny(new A.cB(a,c))},
+z.J4(new A.cB(a,c))},
 rW:function(a,b){var z
 P.rb(F.Jy())
 $.Kc().nQ("flush")
 z=window
-C.ol.Wq(z)
-return C.ol.ne(z,W.Yt(b))},
+C.ole.Wq(z)
+return C.ole.rK(z,W.Yt(b))},
 TZ:function(a,b,c,d,e,f){var z=W.Q8(b,!0,!0,e)
-this.jR(a,z)
+this.Ph(a,z)
 return z},
 ZB:function(a,b){return this.TZ(a,b,null,null,null,null)},
 $iszs:true,
-$ishs:true,
+$isvy:true,
 $isd3:true,
 $ish4:true,
-$isFU:true,
+$isPZ:true,
 $isKV:true},
 pN:{
 "^":"TpZ:76;a",
@@ -16414,7 +16408,7 @@
 "^":"TpZ:12;a",
 $1:[function(a){return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-va:{
+Sv:{
 "^":"TpZ:81;a",
 $2:function(a,b){var z=J.Vs(this.a)
 if(z.NZ(0,a)!==!0)z.u(0,a,new A.Te4(b).$0())
@@ -16424,19 +16418,19 @@
 "^":"TpZ:76;b",
 $0:function(){return this.b},
 $isEH:true},
-rs:{
+N3:{
 "^":"TpZ:76;a",
-$0:[function(){return"["+H.d(J.VB(this.a))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.RI(this.a))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"],
 $isEH:true},
-TV:{
+ti:{
 "^":"TpZ:76;a",
-$0:[function(){return"["+H.d(J.VB(this.a))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.RI(this.a))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"],
 $isEH:true},
-Z7:{
+Rb:{
 "^":"TpZ:76;b",
-$0:[function(){return"["+H.d(J.VB(this.b))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.RI(this.b))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"],
 $isEH:true},
-N4:{
+OaD:{
 "^":"TpZ:81;a,b,c,d,e,f",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=this.b
@@ -16459,13 +16453,13 @@
 $isEH:true},
 xf:{
 "^":"TpZ:76;a,b",
-$0:[function(){return"["+H.d(J.VB(this.a))+"] observeArrayValue: unregister "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.RI(this.a))+"] observeArrayValue: unregister "+H.d(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Y0:{
 "^":"TpZ:76;c,d",
-$0:[function(){return"["+H.d(J.VB(this.c))+"] observeArrayValue: register "+H.d(this.d)},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.RI(this.c))+"] observeArrayValue: register "+H.d(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
-fS:{
+kMK:{
 "^":"TpZ:12;e,f",
 $1:[function(a){var z,y,x
 for(z=J.mY(this.f),y=this.e;z.G();){x=z.gl()
@@ -16473,38 +16467,38 @@
 $isEH:true},
 aM:{
 "^":"TpZ:76;a,b,c",
-$0:[function(){return"bindProperty: ["+H.d(this.c)+"] to ["+H.d(J.VB(this.a))+"].["+H.d(this.b)+"]"},"$0",null,0,0,null,"call"],
+$0:[function(){return"bindProperty: ["+H.d(this.c)+"] to ["+H.d(J.RI(this.a))+"].["+H.d(this.b)+"]"},"$0",null,0,0,null,"call"],
 $isEH:true},
 aMY:{
 "^":"TpZ:76;d,e,f",
-$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.VB(this.d))+"].["+H.d(this.e)+"], but found "+H.a5(this.f)+"."},"$0",null,0,0,null,"call"],
+$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.RI(this.d))+"].["+H.d(this.e)+"], but found "+H.a5(this.f)+"."},"$0",null,0,0,null,"call"],
 $isEH:true},
 SX:{
 "^":"TpZ:76;a,b",
-$0:[function(){return"["+H.d(J.VB(this.a))+"] addHostListeners: "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$0:[function(){return"["+H.d(J.RI(this.a))+"] addHostListeners: "+this.b.bu(0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Jys:{
 "^":"TpZ:81;c",
 $2:function(a,b){var z=this.c
-$.Op().V7("addEventListener",[z,a,$.X3.mS(J.RH0(z.IX).Z8(z,z,b))])},
+$.tNi().V7("addEventListener",[z,a,$.X3.mS(J.v7(z.IX).Z8(z,z,b))])},
 $isEH:true},
 od:{
 "^":"TpZ:76;a,b",
-$0:[function(){return">>> ["+H.d(J.VB(this.a))+"]: dispatch "+H.d(this.b)},"$0",null,0,0,null,"call"],
+$0:[function(){return">>> ["+H.d(J.RI(this.a))+"]: dispatch "+H.d(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cB:{
 "^":"TpZ:76;c,d",
-$0:[function(){return"<<< ["+H.d(J.VB(this.c))+"]: dispatch "+H.d(this.d)},"$0",null,0,0,null,"call"],
+$0:[function(){return"<<< ["+H.d(J.RI(this.c))+"]: dispatch "+H.d(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lK:{
 "^":"Ap;I6,ko,q0,Sx,RP",
 z9N:[function(a){this.RP=a
-$.cp().Q1(this.I6,this.ko,a)},"$1","gew",2,0,19,60],
+$.cp().Cq(this.I6,this.ko,a)},"$1","gew",2,0,19,60],
 XH:[function(a){var z,y,x,w,v
 for(z=J.mY(a),y=this.ko;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
-w=$.cp().JE.E4.t(0,y)
-if(w==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+J.AG(z)))
+w=$.cp().xV.II.t(0,y)
+if(w==null)H.vh(O.Fm("getter \""+H.d(y)+"\" in "+J.AG(z)))
 v=w.$1(z)
 z=this.RP
 if(z==null?v!=null:z!==v)J.Fc(this.q0,v)
@@ -16529,26 +16523,26 @@
 J.yd(y)
 z.mn=null}},
 FT:{
-"^":"a;Hi,Ar,TU",
-Dj:function(){return this.Hi.$0()},
-ui:function(a,b,c){var z
-this.TP(0)
-this.Hi=b
+"^":"a;ek,Ar,lS",
+Dj:function(){return this.ek.$0()},
+t6:function(a,b,c){var z
+this.nY(0)
+this.ek=b
 z=window
-C.ol.Wq(z)
-this.TU=C.ol.ne(z,W.Yt(new A.K3(this)))},
-TP:function(a){var z,y
-z=this.TU
+C.ole.Wq(z)
+this.lS=C.ole.rK(z,W.Yt(new A.K3(this)))},
+nY:function(a){var z,y
+z=this.lS
 if(z!=null){y=window
-C.ol.Wq(y)
+C.ole.Wq(y)
 y.cancelAnimationFrame(z)
-this.TU=null}z=this.Ar
+this.lS=null}z=this.Ar
 if(z!=null){z.Gv()
 this.Ar=null}}},
 K3:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(z.Ar!=null||z.TU!=null){z.TP(0)
+if(z.Ar!=null||z.lS!=null){z.nY(0)
 z.Dj()}return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 mS:{
@@ -16565,10 +16559,10 @@
 k2:{
 "^":"TpZ:195;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
-if(z!=null)return this.a.Gr(new A.v4(a,b,z,$.RA().t(0,c)))
+if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.w3G().t(0,c)))
 return this.b.qP([b,c],a)},"$3",null,6,0,null,193,58,194,"call"],
 $isEH:true},
-v4:{
+zR:{
 "^":"TpZ:76;c,d,e,f",
 $0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=this.c
@@ -16576,64 +16570,63 @@
 x=this.e
 w=this.f
 v=P.Fl(null,null)
-u=$.Cl()
+u=$.Ak()
 t=P.Fl(null,null)
-v=new A.XP(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
-$.RA().u(0,y,v)
+v=new A.So(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
+$.w3G().u(0,y,v)
 v.Zw(w)
 s=v.Q7
-if(s!=null)v.DB=v.jq(s)
+if(s!=null)v.Md=v.jq(s)
 v.rH()
 v.I7()
-v.hW()
+v.ut()
 s=J.RE(z)
-r=s.Wk(z,"template")
-if(r!=null)J.NA(!!J.x(r).$ishs?r:M.uH(r),u)
-v.fk()
+r=s.XT(z,"template")
+if(r!=null)J.D4(!!J.x(r).$isvy?r:M.Xi(r),u)
+v.ka()
 v.f6()
 v.yq()
-A.ZI(v.J3(v.l7("global"),"global"),document.head)
-v.RH(z)
+A.ZI(v.J3(v.ds("global"),"global"),document.head)
+v.Cw(z)
 v.Vk()
 v.W3(t)
 q=s.gQg(z).dA.getAttribute("assetpath")
 if(q==null)q=""
-p=P.hK(s.gM0(z).baseURI)
+p=P.hK(s.gJ8(z).baseURI)
 z=P.hK(q)
 o=z.Fi
 if(o.length!==0){if(z.Kk!=null){n=z.ku
 m=z.gJf(z)
-l=z.Ni!=null?z.gtp(z):null}else{n=""
+l=z.QB!=null?z.gtp(z):null}else{n=""
 m=null
-l=null}k=p.mE(z.Ee)
+l=null}k=p.jn(z.Ee)
 j=z.xu
 if(j!=null);else j=null}else{o=p.Fi
 if(z.Kk!=null){n=z.ku
 m=z.gJf(z)
-l=P.Ec(z.Ni!=null?z.gtp(z):null,o)
-k=p.mE(z.Ee)
+l=P.JF(z.QB!=null?z.gtp(z):null,o)
+k=p.jn(z.Ee)
 j=z.xu
 if(j!=null);else j=null}else{u=z.Ee
-t=J.x(u)
-if(t.n(u,"")){k=p.Ee
+if(u===""){k=p.Ee
 j=z.xu
-if(j!=null);else j=p.xu}else{k=t.nC(u,"/")?p.mE(u):p.mE(p.Bs(p.Ee,u))
+if(j!=null);else j=p.xu}else{k=C.yo.nC(u,"/")?p.jn(u):p.jn(p.pi(p.Ee,u))
 j=z.xu
 if(j!=null);else j=null}n=p.ku
 m=p.Kk
-l=p.Ni}}i=z.ys
+l=p.QB}}i=z.ys
 if(i!=null);else i=null
-v.aU=new P.q5(m,l,k,o,n,j,i,null,null)
+v.vT=new P.q5(m,l,k,o,n,j,i,null,null)
 z=v.gZf()
-A.YG(z,y,w!=null?J.DA(w):null)
-if($.II().n6(x,C.L9))$.cp().Ck(x,C.L9,[v],!1,null)
+A.ec(z,y,w!=null?J.DA(w):null)
+if($.mX().n6(x,C.SE))$.cp().Ck(x,C.SE,[v],!1,null)
 v.Ba(y)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 Md:{
 "^":"TpZ:76;",
-$0:function(){var z=J.UQ(P.kW(document.createElement("polymer-element",null)),"__proto__")
-return!!J.x(z).$isKV?P.kW(z):z},
+$0:function(){var z=J.UQ(P.XY(document.createElement("polymer-element",null)),"__proto__")
+return!!J.x(z).$isKV?P.XY(z):z},
 $isEH:true},
 j0:{
 "^":"TpZ:12;a",
@@ -16645,56 +16638,56 @@
 $isEH:true},
 MZ6:{
 "^":"TpZ:12;",
-$1:function(a){a.sOR(C.oO)},
+$1:function(a){a.sOR(C.oOA)},
 $isEH:true},
 mqr:{
 "^":"TpZ:12;",
 $1:[function(a){P.FL(a)},"$1",null,2,0,null,169,"call"],
 $isEH:true},
-Zw:{
+js:{
 "^":"a;RT,VB,I6,mn",
-VV:[function(a){var z,y,x,w
+xz:[function(a){var z,y,x,w
 z=this.VB
 y=this.I6
 x=this.RT
 w=J.RE(y)
 this.VB=w.ct(y,x,z,a)
-w.Oq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"Zw")},60],
+w.hq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"js")},60],
 gP:function(a){var z=this.mn
 if(z!=null)z.fR()
 return this.VB},
 sP:function(a,b){var z=this.mn
 if(z!=null)J.Fc(z,b)
-else this.VV(b)},
+else this.xz(b)},
 bu:[function(a){var z,y
-z=$.vu().JE.fJ.t(0,this.RT)
+z=$.vu().xV.af.t(0,this.RT)
 y=this.mn==null?"(no-binding)":"(with-binding)"
 return"["+H.d(new H.cu(H.wO(this),null))+": "+J.AG(this.I6)+"."+H.d(z)+": "+H.d(this.VB)+" "+y+"]"},"$0","gCR",0,0,76]}}],["","",,Y,{
 "^":"",
-G0:{
-"^":"k5d;Hf,ro,XY,iS,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+hg:{
+"^":"k5d;Hf,ro,XY,cU,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gk8:function(a){return J.ZH(a.Hf)},
-gG5:function(a){return J.Ee(a.Hf)},
-sG5:function(a,b){J.NA(a.Hf,b)},
-V1:function(a){return J.U2(a.Hf)},
-gwX:function(a){return J.Ee(a.Hf)},
-eX:function(a,b,c){return J.ju(a.Hf,b,c)},
+gA0:function(a){return J.qy(a.Hf)},
+sA0:function(a,b){J.D4(a.Hf,b)},
+V1:function(a){return J.Z8(a.Hf)},
+gwX:function(a){return J.qy(a.Hf)},
+v3:function(a,b,c){return J.dv(a.Hf,b,c)},
 ea:function(a,b,c,d){return A.zs.prototype.ea.call(this,a,b===a?J.ZH(a.Hf):b,c,d)},
 dX:function(a){var z
 this.kR(a)
-a.Hf=M.uH(a)
-z=T.GF(null,C.qY)
-J.NA(a.Hf,new Y.oM(a,z,null))
+a.Hf=M.Xi(a)
+z=T.Mo(null,C.qY)
+J.D4(a.Hf,new Y.oM(a,z,null))
 $.j6().MM.ml(new Y.lkK(a))},
 $isDT:true,
-$ishs:true,
-static:{zE:function(a){var z,y,x,w
+$isvy:true,
+static:{Ifw:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -16705,21 +16698,21 @@
 C.Gkp.dX(a)
 return a}}},
 GLL:{
-"^":"yY+zs;Cp:n7=",
+"^":"OH+zs;Cp:n7=",
 $iszs:true,
-$ishs:true,
+$isvy:true,
 $isd3:true,
 $ish4:true,
-$isFU:true,
+$isPZ:true,
 $isKV:true},
 k5d:{
-"^":"GLL+d3;R9:ro%,rJ:XY%,me:iS%",
+"^":"GLL+d3;R9:ro%,rJ:XY%,xt:cU%",
 $isd3:true},
 lkK:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 z.setAttribute("bind","")
-J.mI(z,new Y.Mrx(z))},"$1",null,2,0,null,13,"call"],
+J.J1(z,new Y.Mrx(z))},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Mrx:{
 "^":"TpZ:12;b",
@@ -16730,35 +16723,35 @@
 y.ZB(z,"template-bound")},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 oM:{
-"^":"Li;dq,xI,oe",
-h5:function(a){return this.dq}}}],["","",,Z,{
+"^":"Li;dq,Mn,oe",
+XB:function(a){return this.dq}}}],["","",,Z,{
 "^":"",
-LB:function(a,b,c){var z,y,x
-z=$.RO().t(0,c)
+fd:function(a,b,c){var z,y,x
+z=$.h2().t(0,c)
 if(z!=null)return z.$2(a,b)
-try{y=C.xr.kV(J.JA(a,"'","\""))
+try{y=C.xr.iQ(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
 return a}},
-DO:{
-"^":"TpZ:81;",
-$2:function(a,b){return a},
-$isEH:true},
 lP:{
 "^":"TpZ:81;",
 $2:function(a,b){return a},
 $isEH:true},
-Uf:{
+wJY:{
+"^":"TpZ:81;",
+$2:function(a,b){return a},
+$isEH:true},
+zOQ:{
 "^":"TpZ:81;",
 $2:function(a,b){var z,y
-try{z=P.Gl(a)
+try{z=P.zu(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
-Ra:{
+W6o:{
 "^":"TpZ:81;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
-wJY:{
+MdQ:{
 "^":"TpZ:81;",
 $2:function(a,b){return H.BU(a,null,new Z.pp(b))},
 $isEH:true},
@@ -16766,7 +16759,7 @@
 "^":"TpZ:12;a",
 $1:function(a){return this.a},
 $isEH:true},
-zOQ:{
+YJG:{
 "^":"TpZ:81;",
 $2:function(a,b){return H.RR(a,new Z.fT(b))},
 $isEH:true},
@@ -16779,10 +16772,10 @@
 if(!!z.$isT8)z=J.zg(z.gvc(a),new T.IK(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
 return z},"$1","PG6",2,0,52,66],
-SC:[function(a){var z=J.x(a)
+qN:[function(a){var z=J.x(a)
 if(!!z.$isT8)z=J.ZG(J.kl(z.gvc(a),new T.k9(a)),";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Oq",2,0,52,66],
+return z},"$1","Bn",2,0,52,66],
 IK:{
 "^":"TpZ:12;a",
 $1:[function(a){return J.xC(J.UQ(this.a,a),!0)},"$1",null,2,0,null,141,"call"],
@@ -16792,10 +16785,10 @@
 $1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,141,"call"],
 $isEH:true},
 QB:{
-"^":"VE;OH,nF,R3,CZ,oe",
+"^":"vE;OH,nF,R3,SY,oe",
 op:function(a,b,c){var z,y,x
 z={}
-y=T.eHj(a,null).oK()
+y=T.OD(a,null).oK()
 if(M.CF(c)){x=J.x(b)
 x=x.n(b,"bind")||x.n(b,"repeat")}else x=!1
 if(x){z=J.x(y)
@@ -16803,22 +16796,22 @@
 else return new T.Xyb(this,y)}z.a=null
 x=!!J.x(c).$ish4
 if(x&&J.xC(b,"class"))z.a=T.PG6()
-else if(x&&J.xC(b,"style"))z.a=T.Oq()
+else if(x&&J.xC(b,"style"))z.a=T.Bn()
 return new T.Ddj(z,this,y)},
-CE:function(a){var z=this.CZ.t(0,a)
+CE:function(a){var z=this.SY.t(0,a)
 if(z==null)return new T.uK(this,a)
-return new T.rc(this,a,z)},
-LR:function(a){var z,y,x,w,v
+return new T.uKo(this,a,z)},
+jX:function(a){var z,y,x,w,v
 z=J.RE(a)
 y=z.gAd(a)
 if(y==null)return
-if(M.CF(a)){x=!!z.$ishs?a:M.uH(a)
+if(M.CF(a)){x=!!z.$isvy?a:M.Xi(a)
 z=J.RE(x)
-w=z.gCn(x)
+w=z.gmb(x)
 v=w==null?z.gk8(x):w.k8
 if(!!J.x(v).$isPF)return v
-else return this.R3.t(0,a)}return this.LR(y)},
-mH:function(a,b){var z,y
+else return this.R3.t(0,a)}return this.jX(y)},
+fi:function(a,b){var z,y
 if(a==null)return K.wm(b,this.nF)
 z=J.x(a)
 if(!!z.$ish4);if(!!J.x(b).$isPF)return b
@@ -16828,24 +16821,26 @@
 else{if(!M.CF(a))throw H.b("expected a template instead of "+H.d(a))
 return this.W5(a,b)}},
 W5:function(a,b){var z,y,x
-if(M.CF(a)){z=!!J.x(a).$ishs?a:M.uH(a)
+if(M.CF(a)){z=!!J.x(a).$isvy?a:M.Xi(a)
 y=J.RE(z)
-if(y.gCn(z)==null)y.gk8(z)
+if(y.gmb(z)==null)y.gk8(z)
 return this.R3.t(0,a)}else{y=J.RE(a)
 if(y.geT(a)==null){x=this.R3.t(0,a)
 return x!=null?x:K.wm(b,this.nF)}else return this.W5(y.gAd(a),b)}},
-static:{"^":"rp3",GF:function(a,b){var z,y,x
+static:{"^":"rp3",Mo:function(a,b){var z,y,x
 z=H.VM(new P.qo(null),[K.PF])
 y=H.VM(new P.qo(null),[P.qU])
 x=P.L5(null,null,null,P.qU,P.a)
-x.FV(0,C.c7)
-return new T.QB(b,x,z,y,null)},aV:[function(a){return T.eHj(a,null).oK()},"$1","Ms",2,0,67],QP:[function(a,b,c,d){var z=K.wm(b,c)
-return d?T.rD(a,z,null):new T.tI(z,null,a,null,null,null,null)},function(a,b){return T.QP(a,b,null,!1)},null,function(a,b,c){return T.QP(a,b,null,c)},null,function(a,b,c){return T.QP(a,b,c,!1)},null,"$4$globals$oneTime","$2","$3$oneTime","$3$globals","aC",4,5,68,22,69]}},
+x.FV(0,C.mB)
+return new T.QB(b,x,z,y,null)},ct:[function(a){return T.OD(a,null).oK()},"$1","u5",2,0,67],mD:[function(a,b,c,d){var z
+if(c==null){c=P.L5(null,null,null,null,null)
+c.FV(0,C.mB)}z=K.wm(b,c)
+return d?T.rD(a,z,null):new T.tI(z,null,a,null,null,null,null)},function(a,b){return T.mD(a,b,null,!1)},null,function(a,b,c){return T.mD(a,b,null,c)},null,function(a,b,c){return T.mD(a,b,c,!1)},null,"$4$globals$oneTime","$2","$3$oneTime","$3$globals","yM",4,5,68,22,69]}},
 qb:{
 "^":"TpZ:196;b,c,d",
 $3:[function(a,b,c){var z,y
 z=this.b
-z.CZ.u(0,b,this.c)
+z.SY.u(0,b,this.c)
 y=!!J.x(a).$isPF?a:K.wm(a,z.nF)
 z.R3.u(0,b,y)
 return new T.tI(y,null,this.d,null,null,null,null)},"$3",null,6,0,null,185,186,187,"call"],
@@ -16861,7 +16856,7 @@
 $isEH:true},
 Ddj:{
 "^":"TpZ:196;a,UI,bK",
-$3:[function(a,b,c){var z=this.UI.mH(b,a)
+$3:[function(a,b,c){var z=this.UI.fi(b,a)
 if(c===!0)return T.rD(this.bK,z,this.a.a)
 return new T.tI(z,this.a.a,this.bK,null,null,null,null)},"$3",null,6,0,null,185,186,187,"call"],
 $isEH:true},
@@ -16872,9 +16867,9 @@
 y=this.b
 x=z.R3.t(0,y)
 if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.wm(a,z.nF)}else return z.mH(y,a)},"$1",null,2,0,null,185,"call"],
+return K.wm(a,z.nF)}else return z.fi(y,a)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
-rc:{
+uKo:{
 "^":"TpZ:12;c,d,e",
 $1:[function(a){var z,y,x,w
 z=this.c
@@ -16882,10 +16877,10 @@
 x=z.R3.t(0,y)
 w=this.e
 if(x!=null)return x.t1(w,a)
-else return z.LR(y).t1(w,a)},"$1",null,2,0,null,185,"call"],
+else return z.jX(y).t1(w,a)},"$1",null,2,0,null,185,"call"],
 $isEH:true},
 tI:{
-"^":"Ap;Hk,mo,te,qc,F0,kg,Ke",
+"^":"Ap;Hk,mo,te,qc,RQ,uZ,Ke",
 Ko:function(a){return this.mo.$1(a)},
 AO:function(a){return this.qc.$1(a)},
 Mr:[function(a,b){var z,y
@@ -16904,39 +16899,41 @@
 TR:function(a,b){var z,y
 if(this.qc!=null)throw H.b(P.w("already open"))
 this.qc=b
-z=J.okV(this.te,new K.Oy(P.NZ2(null,null)))
-this.kg=z
-y=z.gqM().yI(this.gGX())
-y.fm(0,new T.yF(this))
-this.F0=y
+z=H.VM(new P.nd(null,0,0,0),[null])
+z.Eo(null,null)
+y=J.okV(this.te,new K.Oy(z))
+this.uZ=y
+z=y.gju().yI(this.gGX())
+z.fm(0,new T.yF(this))
+this.RQ=z
 this.kf(!0)
 return this.Ke},
 kf:function(a){var z,y,x,w,v
-try{x=this.kg
-J.okV(x,new K.pf(this.Hk,a))
+try{x=this.uZ
+J.okV(x,new K.Edh(this.Hk,a))
 x.gBI()
-x=this.Mr(this.kg.gBI(),a)
+x=this.Mr(this.uZ.gBI(),a)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.oP(w,null)
 x=new P.Gc(0,$.X3,null,null,null,null,null,null)
 x.$builtinTypeInfo=[null]
 new P.Zf(x).$builtinTypeInfo=[null]
-v="Error evaluating expression '"+H.d(this.kg)+"': "+H.d(z)
+v="Error evaluating expression '"+H.d(this.uZ)+"': "+H.d(z)
 if(x.YM!==0)H.vh(P.w("Future already completed"))
 x.Nk(v,y)
 return!1}},
 Yg:function(){return this.kf(!1)},
 xO:function(a){var z,y
 if(this.qc==null)return
-this.F0.Gv()
-this.F0=null
+this.RQ.Gv()
+this.RQ=null
 this.qc=null
 z=$.Pk()
-y=this.kg
+y=this.uZ
 z.toString
 J.okV(y,z)
-this.kg=null},
+this.uZ=null},
 fR:function(){if(this.qc!=null)this.Cm()},
 Cm:function(){var z=0
 while(!0){if(!(z<1000&&this.Yg()===!0))break;++z}return z>0},
@@ -16949,16 +16946,16 @@
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
 yF:{
 "^":"TpZ:81;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.kg)+"': "+H.d(a),b)},"$2",null,4,0,null,2,165,"call"],
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.uZ)+"': "+H.d(a),b)},"$2",null,4,0,null,2,165,"call"],
 $isEH:true},
 WM:{
 "^":"a;"}}],["","",,B,{
 "^":"",
-De:{
-"^":"xhq;vq>,Xq,Vg,ij",
+LL:{
+"^":"xhq;vq>,Xq,Vg,fn",
 vb:function(a,b){this.vq.yI(new B.iH6(b,this))},
 $asxhq:function(a){return[null]},
-static:{zR:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
+static:{Ha:function(a,b){var z=H.VM(new B.LL(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 iH6:{
@@ -16966,132 +16963,130 @@
 $1:[function(a){var z=this.b
 z.Xq=F.Wi(z,C.zd,z.Xq,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"Lf1",args:[a]}},this.b,"De")}}}],["","",,K,{
+$signature:function(){return H.oZ(function(a){return{func:"WM",args:[a]}},this.b,"LL")}}}],["","",,K,{
 "^":"",
-jXm:function(a,b,c,d){var z,y,x,w,v,u,t,s
-z=H.VM([],[U.hw])
+jXm:function(a,b,c,d){var z,y,x,w,v,u,t
+z=H.VM([],[U.rx])
 for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gxS(a),"|"))break
 z.push(y.gT8(a))
 a=y.gBb(a)}if(!!y.$isfp){x=y.gP(a)
-w=C.OL
+w=C.x4
 v=!1}else if(!!y.$isvn){w=a.gZs()
 x=a.gmU()
 v=!0}else{if(!!y.$isx9){w=a.gZs()
-x=y.goc(a)}else{if(d)throw H.b(K.du("Expression is not assignable: "+H.d(a)))
-return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.lo
-t=J.okV(u,new K.GQ(c))
-if(!J.x(t).$isKq)if(d)throw H.b(K.du("filter must implement Transformer to be assignable: "+H.d(u)))
-else return
-b=t.Kh(b)}s=J.okV(w,new K.GQ(c))
-if(s==null)return
-if(v)J.qQ(s,J.okV(x,new K.GQ(c)),b)
-else{y=$.vu().JE.T4.t(0,x)
-$.cp().Q1(s,y,b)}return b},
-wm:function(a,b){var z,y
-z=P.L5(null,null,null,P.qU,P.a)
-z.FV(0,b)
-y=new K.Ph(new K.nk(a),z)
-if(z.NZ(0,"this"))H.vh(K.du("'this' cannot be used as a variable name."))
-z=y
-return z},
-w5:{
+x=y.goc(a)}else{if(d)throw H.b(K.zq("Expression is not assignable: "+H.d(a)))
+return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){u=y.Ff
+J.okV(u,new K.GQ(c))
+if(d)throw H.b(K.zq("filter must implement Transformer to be assignable: "+H.d(u)))
+else return}t=J.okV(w,new K.GQ(c))
+if(t==null)return
+if(v)J.kW(t,J.okV(x,new K.GQ(c)),b)
+else{y=$.vu().xV.T4.t(0,x)
+$.cp().Cq(t,y,b)}return b},
+wm:function(a,b){var z,y,x
+z=new K.ug(a)
+if(b==null)y=z
+else{y=P.L5(null,null,null,P.qU,P.a)
+y.FV(0,b)
+x=new K.Ph(z,y)
+if(y.NZ(0,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
+y=x}return y},
+w12:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.WB(a,b)},
 $isEH:true},
-w10:{
+w13:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.bI(a,b)},
 $isEH:true},
-w11:{
+w14:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
-w12:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.X9(a,b)},
-$isEH:true},
-w13:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.jOZ(a,b)},
-$isEH:true},
-w14:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.xC(a,b)},
-$isEH:true},
 w15:{
 "^":"TpZ:81;",
-$2:function(a,b){return!J.xC(a,b)},
+$2:function(a,b){return J.L9(a,b)},
 $isEH:true},
 w16:{
 "^":"TpZ:81;",
-$2:function(a,b){return a==null?b==null:a===b},
+$2:function(a,b){return J.jOZ(a,b)},
 $isEH:true},
 w17:{
 "^":"TpZ:81;",
-$2:function(a,b){return a==null?b!=null:a!==b},
+$2:function(a,b){return J.xC(a,b)},
 $isEH:true},
 w18:{
 "^":"TpZ:81;",
-$2:function(a,b){return J.xZ(a,b)},
+$2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
 w19:{
 "^":"TpZ:81;",
-$2:function(a,b){return J.J5(a,b)},
+$2:function(a,b){return a==null?b==null:a===b},
 $isEH:true},
 w20:{
 "^":"TpZ:81;",
-$2:function(a,b){return J.u6(a,b)},
+$2:function(a,b){return a==null?b!=null:a!==b},
 $isEH:true},
 w21:{
 "^":"TpZ:81;",
-$2:function(a,b){return J.Bl(a,b)},
+$2:function(a,b){return J.xZ(a,b)},
 $isEH:true},
 w22:{
 "^":"TpZ:81;",
-$2:function(a,b){return a===!0||b===!0},
+$2:function(a,b){return J.J5(a,b)},
 $isEH:true},
 w23:{
 "^":"TpZ:81;",
-$2:function(a,b){return a===!0&&b===!0},
+$2:function(a,b){return J.u6(a,b)},
 $isEH:true},
 w24:{
 "^":"TpZ:81;",
-$2:function(a,b){var z=J.x(b)
-if(!!z.$isKq)return z.At(b,a)
-z=H.Ogz(P.a)
+$2:function(a,b){return J.Bl(a,b)},
+$isEH:true},
+w25:{
+"^":"TpZ:81;",
+$2:function(a,b){return a===!0||b===!0},
+$isEH:true},
+w26:{
+"^":"TpZ:81;",
+$2:function(a,b){return a===!0&&b===!0},
+$isEH:true},
+w27:{
+"^":"TpZ:81;",
+$2:function(a,b){var z=H.Ogz(P.a)
 z=H.KT(z,[z]).Zg(b)
 if(z)return b.$1(a)
-throw H.b(K.du("Filters must be a one-argument function."))},
+throw H.b(K.zq("Filters must be a one-argument function."))},
 $isEH:true},
-lPa:{
+w5:{
 "^":"TpZ:12;",
 $1:function(a){return a},
 $isEH:true},
-Ufa:{
+w10:{
 "^":"TpZ:12;",
-$1:function(a){return J.jzo(a)},
+$1:function(a){return J.Lh(a)},
 $isEH:true},
-Raa:{
+w11:{
 "^":"TpZ:12;",
 $1:function(a){return a!==!0},
 $isEH:true},
 PF:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
-t1:function(a,b){if(J.xC(a,"this"))H.vh(K.du("'this' cannot be used as a variable name."))
+t1:function(a,b){if(J.xC(a,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
 return new K.Rf(this,a,b)},
 $isPF:true,
 $isueT:true,
 $asueT:function(){return[P.qU,P.a]}},
-nk:{
+ug:{
 "^":"PF;k8>",
 t:function(a,b){var z,y
 if(J.xC(b,"this"))return this.k8
-z=$.vu().JE.T4.t(0,b)
+z=$.vu().xV.T4.t(0,b)
 y=this.k8
-if(y==null||z==null)throw H.b(K.du("variable '"+H.d(b)+"' not found"))
-y=$.cp().jD(y,z)
-return!!J.x(y).$iscb?B.zR(y,null):y},
+if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
+y=$.cp().Gp(y,z)
+return!!J.x(y).$iswS?B.Ha(y,null):y},
 tc:function(a){return!J.xC(a,"this")},
 bu:[function(a){return"[model: "+H.d(this.k8)+"]"},"$0","gCR",0,0,73]},
 Rf:{
@@ -17101,7 +17096,7 @@
 return z},
 t:function(a,b){var z
 if(J.xC(this.hI,b)){z=this.P
-return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
+return!!J.x(z).$iswS?B.Ha(z,null):z}return this.eT.t(0,b)},
 tc:function(a){if(J.xC(this.hI,a))return!1
 return this.eT.tc(a)},
 bu:[function(a){return this.eT.bu(0)+" > [local: "+H.d(this.hI)+"]"},"$0","gCR",0,0,73]},
@@ -17110,40 +17105,40 @@
 gk8:function(a){return this.eT.k8},
 t:function(a,b){var z=this.Z3
 if(z.NZ(0,b)){z=z.t(0,b)
-return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
+return!!J.x(z).$iswS?B.Ha(z,null):z}return this.eT.t(0,b)},
 tc:function(a){if(this.Z3.NZ(0,a))return!1
 return!J.xC(a,"this")},
 bu:[function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+H.d(H.VM(new P.i5(z),[H.u3(z,0)]))+"]"},"$0","gCR",0,0,73]},
+return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.B4(H.VM(new P.i5(z),[H.u3(z,0)]),"(",")")+"]"},"$0","gCR",0,0,73]},
 Ay0:{
-"^":"a;VO?,vt<",
-gqM:function(){var z=this.vO
-return H.VM(new P.rk(z),[H.u3(z,0)])},
-gEV:function(){return this.KL},
-gBI:function(){return this.vt},
-ux:function(a){},
-BZ:function(a){var z
+"^":"a;VO?,Xl<",
+gju:function(){var z=this.vO
+return H.VM(new P.Ik(z),[H.u3(z,0)])},
+gXt:function(){return this.KL},
+gBI:function(){return this.Xl},
+MN:function(a){},
+Yo:function(a){var z
 this.jK(0,a,!1)
 z=this.VO
-if(z!=null)z.BZ(a)},
+if(z!=null)z.Yo(a)},
 fs:function(){var z=this.tj
 if(z!=null){z.Gv()
 this.tj=null}},
 jK:function(a,b,c){var z,y,x
 this.fs()
-z=this.vt
-this.ux(b)
-if(!c){y=this.vt
+z=this.Xl
+this.MN(b)
+if(!c){y=this.Xl
 y=y==null?z!=null:y!==z}else y=!1
 if(y){y=this.vO
-x=this.vt
+x=this.Xl
 if(y.YM>=4)H.vh(y.Pq())
 y.MW(x)}},
 bu:[function(a){return this.KL.bu(0)},"$0","gCR",0,0,73],
-$ishw:true},
-pf:{
-"^":"cfS;ms,xZ",
-xn:function(a){a.jK(0,this.ms,this.xZ)}},
+$isrx:true},
+Edh:{
+"^":"cfS;ms,OQ",
+xn:function(a){a.jK(0,this.ms,this.OQ)}},
 me:{
 "^":"cfS;",
 xn:function(a){a.fs()},
@@ -17151,13 +17146,13 @@
 GQ:{
 "^":"P55;ms",
 W9:function(a){return J.ZH(this.ms)},
-Hs:function(a){return a.ep.RR(0,this)},
+Hs:function(a){return a.o2.RR(0,this)},
 Ci:function(a){var z,y,x
 z=J.okV(a.gZs(),this)
 if(z==null)return
 y=a.goc(a)
-x=$.vu().JE.T4.t(0,y)
-return $.cp().jD(z,x)},
+x=$.vu().xV.T4.t(0,y)
+return $.cp().Gp(z,x)},
 CU:function(a){var z=J.okV(a.gZs(),this)
 if(z==null)return
 return J.UQ(z,J.okV(a.gmU(),this))},
@@ -17170,13 +17165,13 @@
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gnK(a)==null)return H.eC(z,y,P.Te(null))
 x=a.gnK(a)
-v=$.vu().JE.T4.t(0,x)
+v=$.vu().xV.T4.t(0,x)
 return $.cp().Ck(z,v,y,!1,null)},
-la:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.glm(),this.gnG()),[null,null]).br(0)},
+I6W:function(a){return a.gP(a)},
+Zh:function(a){return H.VM(new H.A8(a.gBx(),this.gnG()),[null,null]).br(0)},
 o0:function(a){var z,y,x
 z=P.Fl(null,null)
-for(y=a.gJq(a),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.lo
+for(y=a.gJq(a),y=H.VM(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.G();){x=y.Ff
 z.u(0,J.okV(J.AW(x),this),J.okV(x.gv4(),this))}return z},
 YV:function(a){return H.vh(P.f("should never be called"))},
 qv:function(a){return J.UQ(this.ms,a.gP(a))},
@@ -17190,27 +17185,27 @@
 return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
 else if(y==null||x==null)return
 return w.$2(y,x)},
-zPR:function(a){var z,y
-z=J.okV(a.gep(),this)
-y=$.EU().t(0,a.gxS(a))
+kb:function(a){var z,y
+z=J.okV(a.go2(),this)
+y=$.fs().t(0,a.gxS(a))
 if(J.xC(a.gxS(a),"!"))return y.$1(z==null?!1:z)
 return z==null?null:y.$1(z)},
-RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gav(),this):J.okV(a.gHy(),this)},
-kz:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
-pg:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
+RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gav(),this):J.okV(a.geE(),this)},
+ky:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
+eS:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
 Oy:{
 "^":"P55;ZG",
-W9:function(a){return new K.WhS(a,null,null,null,P.bK(null,null,!1,null))},
-Hs:function(a){return a.ep.RR(0,this)},
+W9:function(a){return new K.Il(a,null,null,null,P.bK(null,null,!1,null))},
+Hs:function(a){return a.o2.RR(0,this)},
 Ci:function(a){var z,y
 z=J.okV(a.gZs(),this)
-y=new K.vlk(z,a,null,null,null,P.bK(null,null,!1,null))
+y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(y)
 return y},
 CU:function(a){var z,y,x
 z=J.okV(a.gZs(),this)
 y=J.okV(a.gmU(),this)
-x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.iTN(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(x)
 y.sVO(x)
 return x},
@@ -17222,17 +17217,17 @@
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.faZ(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(v)
-if(y!=null)H.bQ(y,new K.o4(v))
+if(y!=null)H.bQ(y,new K.zD(v))
 return v},
-la:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
+I6W:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
-z=H.VM(new H.A8(a.glm(),this.gnG()),[null,null]).tt(0,!1)
+z=H.VM(new H.A8(a.gBx(),this.gnG()),[null,null]).tt(0,!1)
 y=new K.UF(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.wr(y))
+H.bQ(z,new K.XV(y))
 return y},
 o0:function(a){var z,y
 z=H.VM(new H.A8(a.gJq(a),this.gnG()),[null,null]).tt(0,!1)
-y=new K.ED(z,a,null,null,null,P.bK(null,null,!1,null))
+y=new K.ev2(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.Xs(y))
 return y},
 YV:function(a){var z,y,x
@@ -17246,33 +17241,33 @@
 ex:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
-x=new K.ky(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.ED(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(x)
 y.sVO(x)
 return x},
-zPR:function(a){var z,y
-z=J.okV(a.gep(),this)
+kb:function(a){var z,y
+z=J.okV(a.go2(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(y)
 return y},
 RD:function(a){var z,y,x,w
 z=J.okV(a.gdc(),this)
 y=J.okV(a.gav(),this)
-x=J.okV(a.gHy(),this)
-w=new K.an(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
+x=J.okV(a.geE(),this)
+w=new K.WW(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sVO(w)
 y.sVO(w)
 x.sVO(w)
 return w},
-kz:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
-pg:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
-o4:{
+ky:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
+eS:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
+zD:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sVO(z)
 return z},
 $isEH:true},
-wr:{
+XV:{
 "^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sVO(z)
@@ -17284,217 +17279,217 @@
 a.sVO(z)
 return z},
 $isEH:true},
-WhS:{
-"^":"Ay0;KL,VO,tj,vt,vO",
-ux:function(a){this.vt=J.ZH(a)},
+Il:{
+"^":"Ay0;KL,VO,tj,Xl,vO",
+MN:function(a){this.Xl=J.ZH(a)},
 RR:function(a,b){return b.W9(this)},
-$asAy0:function(){return[U.EO]},
-$isEO:true,
-$ishw:true},
+$asAy0:function(){return[U.WH]},
+$isWH:true,
+$isrx:true},
 x5:{
-"^":"Ay0;KL,VO,tj,vt,vO",
+"^":"Ay0;KL,VO,tj,Xl,vO",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-ux:function(a){var z=this.KL
-this.vt=z.gP(z)},
-RR:function(a,b){return b.la(this)},
-$asAy0:function(){return[U.Dv]},
-$asDv:function(){return[null]},
-$isDv:true,
-$ishw:true},
+MN:function(a){var z=this.KL
+this.Xl=z.gP(z)},
+RR:function(a,b){return b.I6W(this)},
+$asAy0:function(){return[U.noG]},
+$asnoG:function(){return[null]},
+$isnoG:true,
+$isrx:true},
 UF:{
-"^":"Ay0;lm<,KL,VO,tj,vt,vO",
-ux:function(a){this.vt=H.VM(new H.A8(this.lm,new K.Hv()),[null,null]).br(0)},
+"^":"Ay0;Bx<,KL,VO,tj,Xl,vO",
+MN:function(a){this.Xl=H.VM(new H.A8(this.Bx,new K.Hv()),[null,null]).br(0)},
 RR:function(a,b){return b.Zh(this)},
-$asAy0:function(){return[U.c09]},
-$isc09:true,
-$ishw:true},
+$asAy0:function(){return[U.c0]},
+$isc0:true,
+$isrx:true},
 Hv:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gvt()},"$1",null,2,0,null,97,"call"],
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-ED:{
-"^":"Ay0;Jq>,KL,VO,tj,vt,vO",
-ux:function(a){this.vt=H.n3(this.Jq,P.L5(null,null,null,null,null),new K.Ku())},
+ev2:{
+"^":"Ay0;Jq>,KL,VO,tj,Xl,vO",
+MN:function(a){this.Xl=H.n3(this.Jq,P.L5(null,null,null,null,null),new K.Ku())},
 RR:function(a,b){return b.o0(this)},
 $asAy0:function(){return[U.Mm]},
 $isMm:true,
-$ishw:true},
+$isrx:true},
 Ku:{
 "^":"TpZ:81;",
-$2:function(a,b){J.qQ(a,J.AW(b).gvt(),b.gv4().gvt())
+$2:function(a,b){J.kW(a,J.AW(b).gXl(),b.gv4().gXl())
 return a},
 $isEH:true},
 EL:{
-"^":"Ay0;nl>,v4<,KL,VO,tj,vt,vO",
+"^":"Ay0;nl>,v4<,KL,VO,tj,Xl,vO",
 RR:function(a,b){return b.YV(this)},
 $asAy0:function(){return[U.nu]},
 $isnu:true,
-$ishw:true},
+$isrx:true},
 ek:{
-"^":"Ay0;KL,VO,tj,vt,vO",
+"^":"Ay0;KL,VO,tj,Xl,vO",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-ux:function(a){var z,y,x,w
+MN:function(a){var z,y,x,w
 z=this.KL
 y=J.U6(a)
-this.vt=y.t(a,z.gP(z))
+this.Xl=y.t(a,z.gP(z))
 if(!a.tc(z.gP(z)))return
 x=y.gk8(a)
 y=J.x(x)
 if(!y.$isd3)return
 z=z.gP(z)
-w=$.vu().JE.T4.t(0,z)
-this.tj=y.gqh(x).yI(new K.j9(this,a,w))},
+w=$.vu().xV.T4.t(0,z)
+this.tj=y.gqh(x).yI(new K.OC(this,a,w))},
 RR:function(a,b){return b.qv(this)},
 $asAy0:function(){return[U.fp]},
 $isfp:true,
-$ishw:true},
-j9:{
+$isrx:true},
+OC:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 GC:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
 mv:{
-"^":"Ay0;ep<,KL,VO,tj,vt,vO",
+"^":"Ay0;o2<,KL,VO,tj,Xl,vO",
 gxS:function(a){var z=this.KL
 return z.gxS(z)},
-ux:function(a){var z,y
+MN:function(a){var z,y
 z=this.KL
-y=$.EU().t(0,z.gxS(z))
-if(J.xC(z.gxS(z),"!")){z=this.ep.gvt()
-this.vt=y.$1(z==null?!1:z)}else{z=this.ep
-this.vt=z.gvt()==null?null:y.$1(z.gvt())}},
-RR:function(a,b){return b.zPR(this)},
+y=$.fs().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"!")){z=this.o2.gXl()
+this.Xl=y.$1(z==null?!1:z)}else{z=this.o2
+this.Xl=z.gXl()==null?null:y.$1(z.gXl())}},
+RR:function(a,b){return b.kb(this)},
 $asAy0:function(){return[U.FH]},
 $isFH:true,
-$ishw:true},
-ky:{
-"^":"Ay0;Bb>,T8>,KL,VO,tj,vt,vO",
+$isrx:true},
+ED:{
+"^":"Ay0;Bb>,T8>,KL,VO,tj,Xl,vO",
 gxS:function(a){var z=this.KL
 return z.gxS(z)},
-ux:function(a){var z,y,x
+MN:function(a){var z,y,x
 z=this.KL
 y=$.YP().t(0,z.gxS(z))
-if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gvt()
+if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gXl()
 if(z==null)z=!1
-x=this.T8.gvt()
-this.vt=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.vt=y.$2(this.Bb.gvt(),this.T8.gvt())
+x=this.T8.gXl()
+this.Xl=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.Xl=y.$2(this.Bb.gXl(),this.T8.gXl())
 else{x=this.Bb
-if(x.gvt()==null||this.T8.gvt()==null)this.vt=null
-else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gvt()).$iswn)this.tj=H.Go(x.gvt(),"$iswn").gXF().yI(new K.nV(this,a))
-this.vt=y.$2(x.gvt(),this.T8.gvt())}}},
+if(x.gXl()==null||this.T8.gXl()==null)this.Xl=null
+else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gXl()).$iswn)this.tj=H.Go(x.gXl(),"$iswn").gXF().yI(new K.P8(this,a))
+this.Xl=y.$2(x.gXl(),this.T8.gXl())}}},
 RR:function(a,b){return b.ex(this)},
 $asAy0:function(){return[U.uku]},
 $isuku:true,
-$ishw:true},
-nV:{
+$isrx:true},
+P8:{
 "^":"TpZ:12;a,b",
-$1:[function(a){return this.a.BZ(this.b)},"$1",null,2,0,null,13,"call"],
+$1:[function(a){return this.a.Yo(this.b)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-an:{
-"^":"Ay0;dc<,av<,Hy<,KL,VO,tj,vt,vO",
-ux:function(a){var z=this.dc.gvt()
-this.vt=(z==null?!1:z)===!0?this.av.gvt():this.Hy.gvt()},
+WW:{
+"^":"Ay0;dc<,av<,eE<,KL,VO,tj,Xl,vO",
+MN:function(a){var z=this.dc.gXl()
+this.Xl=(z==null?!1:z)===!0?this.av.gXl():this.eE.gXl()},
 RR:function(a,b){return b.RD(this)},
 $asAy0:function(){return[U.x06]},
 $isx06:true,
-$ishw:true},
-vlk:{
-"^":"Ay0;Zs<,KL,VO,tj,vt,vO",
+$isrx:true},
+vl:{
+"^":"Ay0;Zs<,KL,VO,tj,Xl,vO",
 goc:function(a){var z=this.KL
 return z.goc(z)},
-ux:function(a){var z,y,x
-z=this.Zs.gvt()
-if(z==null){this.vt=null
+MN:function(a){var z,y,x
+z=this.Zs.gXl()
+if(z==null){this.Xl=null
 return}y=this.KL
 y=y.goc(y)
-x=$.vu().JE.T4.t(0,y)
-this.vt=$.cp().jD(z,x)
+x=$.vu().xV.T4.t(0,y)
+this.Xl=$.cp().Gp(z,x)
 y=J.x(z)
-if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.e9n(this,a,x))},
+if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.Vw(this,a,x))},
 RR:function(a,b){return b.Ci(this)},
 $asAy0:function(){return[U.x9]},
 $isx9:true,
-$ishw:true},
-e9n:{
+$isrx:true},
+Vw:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 WKb:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-iT:{
-"^":"Ay0;Zs<,mU<,KL,VO,tj,vt,vO",
-ux:function(a){var z,y,x
-z=this.Zs.gvt()
-if(z==null){this.vt=null
-return}y=this.mU.gvt()
+iTN:{
+"^":"Ay0;Zs<,mU<,KL,VO,tj,Xl,vO",
+MN:function(a){var z,y,x
+z=this.Zs.gXl()
+if(z==null){this.Xl=null
+return}y=this.mU.gXl()
 x=J.U6(z)
-this.vt=x.t(z,y)
-if(!!x.$iswn)this.tj=z.gXF().yI(new K.jai(this,a,y))
-else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.FAT(this,a,y))},
+this.Xl=x.t(z,y)
+if(!!x.$iswn)this.tj=z.gXF().yI(new K.tE(this,a,y))
+else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.jai(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asAy0:function(){return[U.vn]},
 $isvn:true,
-$ishw:true},
-jai:{
+$isrx:true},
+tE:{
 "^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.zw(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.GST(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
-zw:{
+GST:{
 "^":"TpZ:12;d",
 $1:[function(a){return a.vP(this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-FAT:{
+jai:{
 "^":"TpZ:12;e,f,UI",
-$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.BZ(this.f)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.ey(this.UI))===!0)this.e.Yo(this.f)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
 ey:{
 "^":"TpZ:12;bK",
 $1:[function(a){return!!J.x(a).$isya&&J.xC(a.nl,this.bK)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
 faZ:{
-"^":"Ay0;Zs<,re<,KL,VO,tj,vt,vO",
+"^":"Ay0;Zs<,re<,KL,VO,tj,Xl,vO",
 gnK:function(a){var z=this.KL
 return z.gnK(z)},
-ux:function(a){var z,y,x,w
+MN:function(a){var z,y,x,w
 z=this.re
 z.toString
-y=H.VM(new H.A8(z,new K.BGc()),[null,null]).br(0)
-x=this.Zs.gvt()
-if(x==null){this.vt=null
+y=H.VM(new H.A8(z,new K.vQ()),[null,null]).br(0)
+x=this.Zs.gXl()
+if(x==null){this.Xl=null
 return}z=this.KL
 if(z.gnK(z)==null){z=H.eC(x,y,P.Te(null))
-this.vt=!!J.x(z).$iscb?B.zR(z,null):z}else{z=z.gnK(z)
-w=$.vu().JE.T4.t(0,z)
-this.vt=$.cp().Ck(x,w,y,!1,null)
+this.Xl=!!J.x(z).$iswS?B.Ha(z,null):z}else{z=z.gnK(z)
+w=$.vu().xV.T4.t(0,z)
+this.Xl=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.WWJ(this,a,w))}},
+if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.BGc(this,a,w))}},
 RR:function(a,b){return b.Y7(this)},
 $asAy0:function(){return[U.RWc]},
 $isRWc:true,
-$ishw:true},
-BGc:{
+$isrx:true},
+vQ:{
 "^":"TpZ:12;",
-$1:[function(a){return a.gvt()},"$1",null,2,0,null,49,"call"],
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,49,"call"],
 $isEH:true},
-WWJ:{
+BGc:{
 "^":"TpZ:199;a,b,c",
-$1:[function(a){if(J.VA(a,new K.Kr(this.c))===!0)this.a.BZ(this.b)},"$1",null,2,0,null,192,"call"],
+$1:[function(a){if(J.VA(a,new K.ho(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,192,"call"],
 $isEH:true},
-Kr:{
+ho:{
 "^":"TpZ:12;d",
 $1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,85,"call"],
 $isEH:true},
-nD:{
+XX:{
 "^":"a;G1>",
 bu:[function(a){return"EvalException: "+this.G1},"$0","gCR",0,0,73],
-static:{du:function(a){return new K.nD(a)}}}}],["","",,U,{
+static:{zq:function(a){return new K.XX(a)}}}}],["","",,U,{
 "^":"",
 Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
@@ -17503,58 +17498,58 @@
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
 if(!J.xC(y,b[z]))return!1}return!0},
-pz:function(a){a.toString
-return U.OT(H.n3(a,0,new U.lc()))},
+N4:function(a){a.toString
+return U.Le(H.n3(a,0,new U.lc()))},
 C0C: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},
-OT:function(a){if(typeof a!=="number")return H.s(a)
+Le: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)},
-tu:{
+Fs:{
 "^":"a;",
 Bf:[function(a,b,c){return new U.vn(b,c)},"$2","gvH",4,0,200,2,49]},
-hw:{
+rx:{
 "^":"a;",
-$ishw:true},
-EO:{
-"^":"hw;",
+$isrx:true},
+WH:{
+"^":"rx;",
 RR:function(a,b){return b.W9(this)},
-$isEO:true},
-Dv:{
-"^":"hw;P>",
-RR:function(a,b){return b.la(this)},
+$isWH:true},
+noG:{
+"^":"rx;P>",
+RR:function(a,b){return b.I6W(this)},
 bu:[function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
-z=H.RB(b,"$isDv",[H.u3(this,0)],"$asDv")
+z=H.RB(b,"$isnoG",[H.u3(this,0)],"$asnoG")
 return z&&J.xC(J.Vm(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$isDv:true},
-c09:{
-"^":"hw;lm<",
+$isnoG:true},
+c0:{
+"^":"rx;Bx<",
 RR:function(a,b){return b.Zh(this)},
-bu:[function(a){return H.d(this.lm)},"$0","gCR",0,0,73],
+bu:[function(a){return H.d(this.Bx)},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isc09&&U.Pu(b.glm(),this.lm)},
-giO:function(a){return U.pz(this.lm)},
-$isc09:true},
+return!!J.x(b).$isc0&&U.Pu(b.gBx(),this.Bx)},
+giO:function(a){return U.N4(this.Bx)},
+$isc0:true},
 Mm:{
-"^":"hw;Jq>",
+"^":"rx;Jq>",
 RR:function(a,b){return b.o0(this)},
 bu:[function(a){return"{"+H.d(this.Jq)+"}"},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
 return!!z.$isMm&&U.Pu(z.gJq(b),this.Jq)},
-giO:function(a){return U.pz(this.Jq)},
+giO:function(a){return U.N4(this.Jq)},
 $isMm:true},
 nu:{
-"^":"hw;nl>,v4<",
+"^":"rx;nl>,v4<",
 RR:function(a,b){return b.YV(this)},
 bu:[function(a){return this.nl.bu(0)+": "+H.d(this.v4)},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17564,18 +17559,18 @@
 giO:function(a){var z,y
 z=J.v1(this.nl.P)
 y=J.v1(this.v4)
-return U.OT(U.C0C(U.C0C(0,z),y))},
+return U.Le(U.C0C(U.C0C(0,z),y))},
 $isnu:true},
 XC:{
-"^":"hw;ep",
+"^":"rx;o2",
 RR:function(a,b){return b.Hs(this)},
-bu:[function(a){return"("+H.d(this.ep)+")"},"$0","gCR",0,0,73],
+bu:[function(a){return"("+H.d(this.o2)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isXC&&J.xC(b.ep,this.ep)},
-giO:function(a){return J.v1(this.ep)},
+return!!J.x(b).$isXC&&J.xC(b.o2,this.o2)},
+giO:function(a){return J.v1(this.o2)},
 $isXC:true},
 fp:{
-"^":"hw;P>",
+"^":"rx;P>",
 RR:function(a,b){return b.qv(this)},
 bu:[function(a){return this.P},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17585,20 +17580,20 @@
 giO:function(a){return J.v1(this.P)},
 $isfp:true},
 FH:{
-"^":"hw;xS>,ep<",
-RR:function(a,b){return b.zPR(this)},
-bu:[function(a){return H.d(this.xS)+" "+H.d(this.ep)},"$0","gCR",0,0,73],
+"^":"rx;xS>,o2<",
+RR:function(a,b){return b.kb(this)},
+bu:[function(a){return H.d(this.xS)+" "+H.d(this.o2)},"$0","gCR",0,0,73],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isFH&&J.xC(z.gxS(b),this.xS)&&J.xC(b.gep(),this.ep)},
+return!!z.$isFH&&J.xC(z.gxS(b),this.xS)&&J.xC(b.go2(),this.o2)},
 giO:function(a){var z,y
 z=J.v1(this.xS)
-y=J.v1(this.ep)
-return U.OT(U.C0C(U.C0C(0,z),y))},
+y=J.v1(this.o2)
+return U.Le(U.C0C(U.C0C(0,z),y))},
 $isFH:true},
 uku:{
-"^":"hw;xS>,Bb>,T8>",
+"^":"rx;xS>,Bb>,T8>",
 RR:function(a,b){return b.ex(this)},
 bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.xS)+" "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17609,23 +17604,23 @@
 z=J.v1(this.xS)
 y=J.v1(this.Bb)
 x=J.v1(this.T8)
-return U.OT(U.C0C(U.C0C(U.C0C(0,z),y),x))},
+return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isuku:true},
 x06:{
-"^":"hw;dc<,av<,Hy<",
+"^":"rx;dc<,av<,eE<",
 RR:function(a,b){return b.RD(this)},
-bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.av)+" : "+H.d(this.Hy)+")"},"$0","gCR",0,0,73],
+bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.av)+" : "+H.d(this.eE)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isx06&&J.xC(b.gdc(),this.dc)&&J.xC(b.gav(),this.av)&&J.xC(b.gHy(),this.Hy)},
+return!!J.x(b).$isx06&&J.xC(b.gdc(),this.dc)&&J.xC(b.gav(),this.av)&&J.xC(b.geE(),this.eE)},
 giO:function(a){var z,y,x
 z=J.v1(this.dc)
 y=J.v1(this.av)
-x=J.v1(this.Hy)
-return U.OT(U.C0C(U.C0C(U.C0C(0,z),y),x))},
+x=J.v1(this.eE)
+return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isx06:true},
 X7S:{
-"^":"hw;Bb>,T8>",
-RR:function(a,b){return b.kz(this)},
+"^":"rx;Bb>,T8>",
+RR:function(a,b){return b.ky(this)},
 gxG:function(){var z=this.Bb
 return z.gP(z)},
 gkZ:function(a){return this.T8},
@@ -17636,27 +17631,27 @@
 z=this.Bb
 z=z.giO(z)
 y=J.v1(this.T8)
-return U.OT(U.C0C(U.C0C(0,z),y))},
+return U.Le(U.C0C(U.C0C(0,z),y))},
 $isX7S:true,
 $isDI:true},
-NM:{
-"^":"hw;Bb>,T8>",
-RR:function(a,b){return b.pg(this)},
+va:{
+"^":"rx;Bb>,T8>",
+RR:function(a,b){return b.eS(this)},
 gxG:function(){var z=this.T8
 return z.gP(z)},
 gkZ:function(a){return this.Bb},
 bu:[function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isNM&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
+return!!J.x(b).$isva&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
 giO:function(a){var z,y
 z=J.v1(this.Bb)
 y=this.T8
 y=y.giO(y)
-return U.OT(U.C0C(U.C0C(0,z),y))},
-$isNM:true,
+return U.Le(U.C0C(U.C0C(0,z),y))},
+$isva:true,
 $isDI:true},
 vn:{
-"^":"hw;Zs<,mU<",
+"^":"rx;Zs<,mU<",
 RR:function(a,b){return b.CU(this)},
 bu:[function(a){return H.d(this.Zs)+"["+H.d(this.mU)+"]"},"$0","gCR",0,0,73],
 n:function(a,b){if(b==null)return!1
@@ -17664,10 +17659,10 @@
 giO:function(a){var z,y
 z=J.v1(this.Zs)
 y=J.v1(this.mU)
-return U.OT(U.C0C(U.C0C(0,z),y))},
+return U.Le(U.C0C(U.C0C(0,z),y))},
 $isvn:true},
 x9:{
-"^":"hw;Zs<,oc>",
+"^":"rx;Zs<,oc>",
 RR:function(a,b){return b.Ci(this)},
 bu:[function(a){return H.d(this.Zs)+"."+H.d(this.oc)},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17677,10 +17672,10 @@
 giO:function(a){var z,y
 z=J.v1(this.Zs)
 y=J.v1(this.oc)
-return U.OT(U.C0C(U.C0C(0,z),y))},
+return U.Le(U.C0C(U.C0C(0,z),y))},
 $isx9:true},
 RWc:{
-"^":"hw;Zs<,nK>,re<",
+"^":"rx;Zs<,nK>,re<",
 RR:function(a,b){return b.Y7(this)},
 bu:[function(a){return H.d(this.Zs)+"."+H.d(this.nK)+"("+H.d(this.re)+")"},"$0","gCR",0,0,73],
 n:function(a,b){var z
@@ -17690,8 +17685,8 @@
 giO:function(a){var z,y,x
 z=J.v1(this.Zs)
 y=J.v1(this.nK)
-x=U.pz(this.re)
-return U.OT(U.C0C(U.C0C(U.C0C(0,z),y),x))},
+x=U.N4(this.re)
+return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isRWc:true},
 lc:{
 "^":"TpZ:81;",
@@ -17700,57 +17695,68 @@
 "^":"",
 FX:{
 "^":"a;Wi,f7,JR,V6",
-gVd:function(){return this.V6.lo},
+gVd:function(){return this.V6.Ff},
 oK:function(){var z=this.f7.zl()
 this.JR=z
 this.V6=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])
 this.jz()
 return this.VK()},
 Jn:function(a,b){var z
-if(a!=null){z=this.V6.lo
+if(a!=null){z=this.V6.Ff
 z=z==null||!J.xC(J.Iz(z),a)}else z=!1
-if(!z)if(b!=null){z=this.V6.lo
+if(!z)if(b!=null){z=this.V6.Ff
 z=z==null||!J.xC(J.Vm(z),b)}else z=!1
 else z=!0
 if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gVd())))
 this.V6.G()},
 jz:function(){return this.Jn(null,null)},
 IH:function(a){return this.Jn(a,null)},
-VK:function(){if(this.V6.lo==null)return C.OL
-var z=this.ZR()
-return z==null?null:this.lM(z,0)},
-lM:function(a,b){var z,y,x
-for(;z=this.V6.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.V6.lo),"("))a=new U.RWc(a,null,this.Hr())
-else if(J.xC(J.Vm(this.V6.lo),"["))a=new U.vn(a,this.FD())
-else break
-else if(J.xC(J.Iz(this.V6.lo),3)){this.jz()
-a=this.JuP(a,this.ZR())}else if(J.xC(J.Iz(this.V6.lo),10))if(J.xC(J.Vm(this.V6.lo),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
+VK:function(){if(this.V6.Ff==null){this.Wi.toString
+return C.x4}var z=this.ZR()
+return z==null?null:this.Ay(z,0)},
+Ay:function(a,b){var z,y,x,w,v,u
+for(;z=this.V6.Ff,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.V6.Ff),"(")){y=this.Hr()
+this.Wi.toString
+a=new U.RWc(a,null,y)}else if(J.xC(J.Vm(this.V6.Ff),"[")){x=this.le()
+this.Wi.toString
+a=new U.vn(a,x)}else break
+else if(J.xC(J.Iz(this.V6.Ff),3)){this.jz()
+a=this.JuP(a,this.ZR())}else if(J.xC(J.Iz(this.V6.Ff),10))if(J.xC(J.Vm(this.V6.Ff),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
 this.jz()
-a=new U.X7S(a,this.VK())}else if(J.xC(J.Vm(this.V6.lo),"as")){this.jz()
-y=this.VK()
-if(!J.x(y).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
-a=new U.NM(a,y)}else break
-else{if(J.xC(J.Iz(this.V6.lo),8)){z=this.V6.lo.gG8()
+w=this.VK()
+this.Wi.toString
+a=new U.X7S(a,w)}else if(J.xC(J.Vm(this.V6.Ff),"as")){this.jz()
+w=this.VK()
+if(!J.x(w).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
+this.Wi.toString
+a=new U.va(a,w)}else break
+else{if(J.xC(J.Iz(this.V6.Ff),8)){z=this.V6.Ff.gG8()
 if(typeof z!=="number")return z.F()
 if(typeof b!=="number")return H.s(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.V6.lo),"?")){this.Jn(8,"?")
-x=this.VK()
+if(z)if(J.xC(J.Vm(this.V6.Ff),"?")){this.Jn(8,"?")
+v=this.VK()
 this.IH(5)
-a=new U.x06(a,x,this.VK())}else a=this.Ax(a)
+u=this.VK()
+this.Wi.toString
+a=new U.x06(a,v,u)}else a=this.Ax(a)
 else break}return a},
-JuP:function(a,b){var z=J.x(b)
-if(!!z.$isfp)return new U.x9(a,z.gP(b))
-else if(!!z.$isRWc&&!!J.x(b.gZs()).$isfp)return new U.RWc(a,J.Vm(b.gZs()),b.gre())
-else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
+JuP:function(a,b){var z,y
+z=J.x(b)
+if(!!z.$isfp){z=z.gP(b)
+this.Wi.toString
+return new U.x9(a,z)}else if(!!z.$isRWc&&!!J.x(b.gZs()).$isfp){z=J.Vm(b.gZs())
+y=b.gre()
+this.Wi.toString
+return new U.RWc(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
 Ax:function(a){var z,y,x,w,v
-z=this.V6.lo
+z=this.V6.Ff
 y=J.RE(z)
 if(!C.Nm.tg(C.fW,y.gP(z)))throw H.b(Y.RV("unknown operator: "+H.d(y.gP(z))))
 this.jz()
 x=this.ZR()
-while(!0){w=this.V6.lo
-if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.V6.lo),3)||J.xC(J.Iz(this.V6.lo),9)){w=this.V6.lo.gG8()
+while(!0){w=this.V6.Ff
+if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.V6.Ff),3)||J.xC(J.Iz(this.V6.Ff),9)){w=this.V6.Ff.gG8()
 v=z.gG8()
 if(typeof w!=="number")return w.D()
 if(typeof v!=="number")return H.s(v)
@@ -17758,145 +17764,173 @@
 w=v}else w=!1
 else w=!1
 if(!w)break
-x=this.lM(x,this.V6.lo.gG8())}return new U.uku(y.gP(z),a,x)},
-ZR:function(){var z,y
-if(J.xC(J.Iz(this.V6.lo),8)){z=J.Vm(this.V6.lo)
+x=this.Ay(x,this.V6.Ff.gG8())}y=y.gP(z)
+this.Wi.toString
+return new U.uku(y,a,x)},
+ZR:function(){var z,y,x,w
+if(J.xC(J.Iz(this.V6.Ff),8)){z=J.Vm(this.V6.Ff)
 y=J.x(z)
 if(y.n(z,"+")||y.n(z,"-")){this.jz()
-if(J.xC(J.Iz(this.V6.lo),6)){z=new U.Dv(H.BU(H.d(z)+H.d(J.Vm(this.V6.lo)),null,null))
+if(J.xC(J.Iz(this.V6.Ff),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.V6.Ff)),null,null)
+this.Wi.toString
+z=new U.noG(y)
 z.$builtinTypeInfo=[null]
 this.jz()
-return z}else if(J.xC(J.Iz(this.V6.lo),7)){z=new U.Dv(H.RR(H.d(z)+H.d(J.Vm(this.V6.lo)),null))
+return z}else{y=this.Wi
+if(J.xC(J.Iz(this.V6.Ff),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.V6.Ff)),null)
+y.toString
+z=new U.noG(x)
 z.$builtinTypeInfo=[null]
 this.jz()
-return z}else return new U.FH(z,this.lM(this.LE(),11))}else if(y.n(z,"!")){this.jz()
-return new U.FH(z,this.lM(this.LE(),11))}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LE()},
+return z}else{w=this.Ay(this.LE(),11)
+y.toString
+return new U.FH(z,w)}}}else if(y.n(z,"!")){this.jz()
+w=this.Ay(this.LE(),11)
+this.Wi.toString
+return new U.FH(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LE()},
 LE:function(){var z,y
-switch(J.Iz(this.V6.lo)){case 10:z=J.Vm(this.V6.lo)
+switch(J.Iz(this.V6.Ff)){case 10:z=J.Vm(this.V6.Ff)
 if(J.xC(z,"this")){this.jz()
+this.Wi.toString
 return new U.fp("this")}else if(C.Nm.tg(C.jY,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
 throw H.b(Y.RV("unrecognized keyword: "+H.d(z)))
 case 2:return this.Yj()
 case 1:return this.Dy()
 case 6:return this.c9()
 case 7:return this.eD()
-case 9:if(J.xC(J.Vm(this.V6.lo),"(")){this.jz()
+case 9:if(J.xC(J.Vm(this.V6.Ff),"(")){this.jz()
 y=this.VK()
 this.Jn(9,")")
-return new U.XC(y)}else if(J.xC(J.Vm(this.V6.lo),"{"))return this.I1()
-else if(J.xC(J.Vm(this.V6.lo),"["))return this.U3()
+this.Wi.toString
+return new U.XC(y)}else if(J.xC(J.Vm(this.V6.Ff),"{"))return this.hR()
+else if(J.xC(J.Vm(this.V6.Ff),"["))return this.U3()
 return
 case 5:throw H.b(Y.RV("unexpected token \":\""))
 default:return}},
 U3:function(){var z,y
 z=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.lo),9)&&J.xC(J.Vm(this.V6.lo),"]"))break
+if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"]"))break
 z.push(this.VK())
-y=this.V6.lo}while(y!=null&&J.xC(J.Vm(y),","))
+y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
 this.Jn(9,"]")
-return new U.c09(z)},
-I1:function(){var z,y,x
+return new U.c0(z)},
+hR:function(){var z,y,x
 z=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.lo),9)&&J.xC(J.Vm(this.V6.lo),"}"))break
-y=new U.Dv(J.Vm(this.V6.lo))
-y.$builtinTypeInfo=[null]
+if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"}"))break
+y=J.Vm(this.V6.Ff)
+this.Wi.toString
+x=new U.noG(y)
+x.$builtinTypeInfo=[null]
 this.jz()
 this.Jn(5,":")
-z.push(new U.nu(y,this.VK()))
-x=this.V6.lo}while(x!=null&&J.xC(J.Vm(x),","))
+z.push(new U.nu(x,this.VK()))
+y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
 this.Jn(9,"}")
 return new U.Mm(z)},
 Yj:function(){var z,y,x
-if(J.xC(J.Vm(this.V6.lo),"true")){this.jz()
-return H.VM(new U.Dv(!0),[null])}if(J.xC(J.Vm(this.V6.lo),"false")){this.jz()
-return H.VM(new U.Dv(!1),[null])}if(J.xC(J.Vm(this.V6.lo),"null")){this.jz()
-return H.VM(new U.Dv(null),[null])}if(!J.xC(J.Iz(this.V6.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gVd())+".value"))
-z=J.Vm(this.V6.lo)
+if(J.xC(J.Vm(this.V6.Ff),"true")){this.jz()
+this.Wi.toString
+return H.VM(new U.noG(!0),[null])}if(J.xC(J.Vm(this.V6.Ff),"false")){this.jz()
+this.Wi.toString
+return H.VM(new U.noG(!1),[null])}if(J.xC(J.Vm(this.V6.Ff),"null")){this.jz()
+this.Wi.toString
+return H.VM(new U.noG(null),[null])}if(!J.xC(J.Iz(this.V6.Ff),2))H.vh(Y.RV("expected identifier: "+H.d(this.gVd())+".value"))
+z=J.Vm(this.V6.Ff)
 this.jz()
+this.Wi.toString
 y=new U.fp(z)
 x=this.Hr()
 if(x==null)return y
 else return new U.RWc(y,null,x)},
 Hr:function(){var z,y
-z=this.V6.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.lo),"(")){y=[]
+z=this.V6.Ff
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"(")){y=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.lo),9)&&J.xC(J.Vm(this.V6.lo),")"))break
+if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),")"))break
 y.push(this.VK())
-z=this.V6.lo}while(z!=null&&J.xC(J.Vm(z),","))
+z=this.V6.Ff}while(z!=null&&J.xC(J.Vm(z),","))
 this.Jn(9,")")
 return y}return},
-FD:function(){var z,y
-z=this.V6.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.lo),"[")){this.jz()
+le:function(){var z,y
+z=this.V6.Ff
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"[")){this.jz()
 y=this.VK()
 this.Jn(9,"]")
 return y}return},
-Dy:function(){var z=H.VM(new U.Dv(J.Vm(this.V6.lo)),[null])
+Dy:function(){var z,y
+z=J.Vm(this.V6.Ff)
+this.Wi.toString
+y=H.VM(new U.noG(z),[null])
 this.jz()
-return z},
-Rb:function(a){var z=H.VM(new U.Dv(H.BU(H.d(a)+H.d(J.Vm(this.V6.lo)),null,null)),[null])
+return y},
+Rb:function(a){var z,y
+z=H.BU(H.d(a)+H.d(J.Vm(this.V6.Ff)),null,null)
+this.Wi.toString
+y=H.VM(new U.noG(z),[null])
 this.jz()
-return z},
+return y},
 c9:function(){return this.Rb("")},
-XO:function(a){var z=H.VM(new U.Dv(H.RR(H.d(a)+H.d(J.Vm(this.V6.lo)),null)),[null])
+XO:function(a){var z,y
+z=H.RR(H.d(a)+H.d(J.Vm(this.V6.Ff)),null)
+this.Wi.toString
+y=H.VM(new U.noG(z),[null])
 this.jz()
-return z},
+return y},
 eD:function(){return this.XO("")},
-static:{eHj:function(a,b){var z,y,x
-z=H.VM([],[Y.PnY])
+static:{OD:function(a,b){var z,y,x
+z=H.VM([],[Y.qS])
 y=P.p9("")
-x=new U.tu()
-return new T.FX(x,new Y.hc6(z,y,new P.Kg(a,0,0,null),null),null,null)}}}}],["","",,K,{
+x=new U.Fs()
+return new T.FX(x,new Y.dd(z,y,new P.hM(a,0,0,null),null),null,null)}}}}],["","",,K,{
 "^":"",
-Dce:[function(a){return H.VM(new K.Bt(a),[null])},"$1","HZg",2,0,70,71],
-O1:{
+Dce:[function(a){return H.VM(new K.Bt(a),[null])},"$1","oJ",2,0,70,71],
+Aep:{
 "^":"a;vH>,P>",
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isO1&&J.xC(b.vH,this.vH)&&J.xC(b.P,this.P)},
+return!!J.x(b).$isAep&&J.xC(b.vH,this.vH)&&J.xC(b.P,this.P)},
 giO:function(a){return J.v1(this.P)},
 bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gCR",0,0,73],
-$isO1:true},
+$isAep:true},
 Bt:{
-"^":"mW;ty",
-gA:function(a){var z=new K.kd(J.mY(this.ty),0,null)
+"^":"mW;FD",
+gA:function(a){var z=new K.vR(J.mY(this.FD),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.ty)},
-gl0:function(a){return J.FN(this.ty)},
-gtH:function(a){var z=new K.O1(0,J.Es(this.ty))
+gB:function(a){return J.q8(this.FD)},
+gl0:function(a){return J.FN(this.FD)},
+gqG:function(a){var z=new K.Aep(0,J.bT(this.FD))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 grZ:function(a){var z,y
-z=this.ty
+z=this.FD
 y=J.U6(z)
-z=new K.O1(J.bI(y.gB(z),1),y.grZ(z))
+z=new K.Aep(J.bI(y.gB(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-$asmW:function(a){return[[K.O1,a]]},
-$asQV:function(a){return[[K.O1,a]]}},
-kd:{
+$asmW:function(a){return[[K.Aep,a]]},
+$asQV:function(a){return[[K.Aep,a]]}},
+vR:{
 "^":"Anv;FU,vk,Uh",
 gl:function(){return this.Uh},
 G:function(){var z=this.FU
-if(z.G()){this.Uh=H.VM(new K.O1(this.vk++,z.gl()),[null])
+if(z.G()){this.Uh=H.VM(new K.Aep(this.vk++,z.gl()),[null])
 return!0}this.Uh=null
 return!1},
-$asAnv:function(a){return[[K.O1,a]]}}}],["","",,Y,{
+$asAnv:function(a){return[[K.Aep,a]]}}}],["","",,Y,{
 "^":"",
-Ox: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}},
-PnY:{
+qS:{
 "^":"a;fY>,P>,G8<",
-bu:[function(a){return"("+this.fY+", '"+H.d(this.P)+"')"},"$0","gCR",0,0,73],
-$isPnY:true},
-hc6:{
+bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gCR",0,0,73],
+$isqS:true},
+dd:{
 "^":"a;Bv,Lz,LP,pV",
 zl:function(){var z,y,x,w,v,u,t,s
 z=this.LP
@@ -17912,21 +17946,21 @@
 this.pV=x
 if(typeof x!=="number")return H.s(x)
 if(48<=x&&x<=57)this.e1()
-else y.push(new Y.PnY(3,".",11))}else if(x===44){this.pV=z.G()?z.ft:null
-y.push(new Y.PnY(4,",",0))}else if(x===58){this.pV=z.G()?z.ft:null
-y.push(new Y.PnY(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.pV
+else y.push(new Y.qS(3,".",11))}else if(x===44){this.pV=z.G()?z.ft:null
+y.push(new Y.qS(4,",",0))}else if(x===58){this.pV=z.G()?z.ft:null
+y.push(new Y.qS(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.pV
 x=z.G()?z.ft:null
 this.pV=x
 if(C.Nm.tg(C.bg,x)){x=this.pV
-u=H.LY([v,x])
+u=H.eT([v,x])
 if(C.Nm.tg(C.ip,u)){x=z.G()?z.ft:null
 this.pV=x
 if(x===61)x=v===33||v===61
 else x=!1
 if(x){t=u+"="
 this.pV=z.G()?z.ft:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
-y.push(new Y.PnY(8,t,C.w0.t(0,t)))}else if(C.Nm.tg(C.ML,this.pV)){s=H.mx(this.pV)
-y.push(new Y.PnY(9,s,C.w0.t(0,s)))
+y.push(new Y.qS(8,t,C.w0.t(0,t)))}else if(C.Nm.tg(C.iq,this.pV)){s=H.mx(this.pV)
+y.push(new Y.qS(9,s,C.w0.t(0,s)))
 this.pV=z.G()?z.ft:null}else this.pV=z.G()?z.ft:null}return y},
 DS:function(){var z,y,x,w
 z=this.pV
@@ -17937,11 +17971,10 @@
 if(x===92){x=y.G()?y.ft:null
 this.pV=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
-x=H.mx(Y.Ox(x))
+x=H.mx(Y.wX(x))
 w.IN+=x}else{x=H.mx(x)
 w.IN+=x}x=y.G()?y.ft:null
-this.pV=x}x=w.IN
-this.Bv.push(new Y.PnY(1,x.charCodeAt(0)==0?x:x,0))
+this.pV=x}this.Bv.push(new Y.qS(1,w.IN,0))
 w.IN=""
 this.pV=y.G()?y.ft:null},
 y3:function(){var z,y,x,w,v
@@ -17955,11 +17988,10 @@
 if(!w)break
 x=H.mx(x)
 y.IN+=x
-this.pV=z.G()?z.ft:null}z=y.IN
-v=z.charCodeAt(0)==0?z:z
+this.pV=z.G()?z.ft:null}v=y.IN
 z=this.Bv
-if(C.Nm.tg(C.jY,v))z.push(new Y.PnY(10,v,0))
-else z.push(new Y.PnY(2,v,0))
+if(C.Nm.tg(C.jY,v))z.push(new Y.qS(10,v,0))
+else z.push(new Y.qS(2,v,0))
 y.IN=""},
 jj:function(){var z,y,x,w
 z=this.LP
@@ -17974,8 +18006,7 @@
 this.pV=z
 if(typeof z!=="number")return H.s(z)
 if(48<=z&&z<=57)this.e1()
-else this.Bv.push(new Y.PnY(3,".",11))}else{z=y.IN
-this.Bv.push(new Y.PnY(6,z.charCodeAt(0)==0?z:z,0))
+else this.Bv.push(new Y.qS(3,".",11))}else{this.Bv.push(new Y.qS(6,y.IN,0))
 y.IN=""}},
 e1:function(){var z,y,x,w
 z=this.Lz
@@ -17987,13 +18018,12 @@
 if(!w)break
 x=H.mx(x)
 z.IN+=x
-this.pV=y.G()?y.ft:null}y=z.IN
-this.Bv.push(new Y.PnY(7,y.charCodeAt(0)==0?y:y,0))
+this.pV=y.G()?y.ft:null}this.Bv.push(new Y.qS(7,z.IN,0))
 z.IN=""}},
-Em:{
+hAN:{
 "^":"a;G1>",
 bu:[function(a){return"ParseException: "+this.G1},"$0","gCR",0,0,73],
-static:{RV:function(a){return new Y.Em(a)}}}}],["","",,S,{
+static:{RV:function(a){return new Y.hAN(a)}}}}],["","",,S,{
 "^":"",
 P55:{
 "^":"a;",
@@ -18002,7 +18032,7 @@
 "^":"P55;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
-Hs:function(a){a.ep.RR(0,this)
+Hs:function(a){a.o2.RR(0,this)
 this.xn(a)},
 Ci:function(a){J.okV(a.gZs(),this)
 this.xn(a)},
@@ -18011,14 +18041,14 @@
 this.xn(a)},
 Y7:function(a){var z
 J.okV(a.gZs(),this)
-if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
 this.xn(a)},
-la:function(a){this.xn(a)},
+I6W:function(a){this.xn(a)},
 Zh:function(a){var z
-for(z=a.glm(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
+for(z=a.gBx(),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
 this.xn(a)},
 o0:function(a){var z
-for(z=a.gJq(a),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.lo,this)
+for(z=a.gJq(a),z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();)J.okV(z.Ff,this)
 this.xn(a)},
 YV:function(a){J.okV(a.gnl(a),this)
 J.okV(a.gv4(),this)
@@ -18027,31 +18057,31 @@
 ex:function(a){J.okV(a.gBb(a),this)
 J.okV(a.gT8(a),this)
 this.xn(a)},
-zPR:function(a){J.okV(a.gep(),this)
+kb:function(a){J.okV(a.go2(),this)
 this.xn(a)},
 RD:function(a){J.okV(a.gdc(),this)
 J.okV(a.gav(),this)
-J.okV(a.gHy(),this)
+J.okV(a.geE(),this)
 this.xn(a)},
-kz:function(a){a.Bb.RR(0,this)
+ky:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)},
-pg:function(a){a.Bb.RR(0,this)
+eS:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)}}}],["","",,T,{
 "^":"",
 ov:{
-"^":"V54;oX,t7,fI,Fd,hX,He,xo,ZJ,PZ,Kf,Nf,D6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gtu:function(a){return a.oX},
-stu:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
+"^":"V54;Ny,t7,fI,Fd,cI,He,xo,ZJ,PZ,Kf,Nf,D6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gtu:function(a){return a.Ny},
+stu:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
 gfg:function(a){return a.t7},
 sfg:function(a,b){a.t7=this.ct(a,C.A7,a.t7,b)},
-gX7:function(a){return a.fI},
-sX7:function(a,b){a.fI=this.ct(a,C.vY,a.fI,b)},
+gGV:function(a){return a.fI},
+sGV:function(a,b){a.fI=this.ct(a,C.vY,a.fI,b)},
 gLf:function(a){return a.Fd},
 sLf:function(a,b){a.Fd=this.ct(a,C.IT,a.Fd,b)},
-gJb:function(a){return a.hX},
-sJb:function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},
+gMl:function(a){return a.cI},
+sMl:function(a,b){a.cI=this.ct(a,C.Gr,a.cI,b)},
 gML:function(a){return a.He},
 sML:function(a,b){a.He=this.ct(a,C.kI,a.He,b)},
 gxT:function(a){return a.xo},
@@ -18062,45 +18092,45 @@
 sTj:function(a,b){a.PZ=this.ct(a,C.uG,a.PZ,b)},
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-qV:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
-vr:function(a){var z,y
+Nn:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
+W7:function(a){var z,y
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#line-"+H.d(a.He))
 if(z!=null){y=!!z.scrollIntoViewIfNeeded
 if(y)z.scrollIntoViewIfNeeded()
 else z.scrollIntoView()}},
-pLm:[function(a,b,c){this.vr(a)},"$2","gcL",4,0,202,203,204],
+qA:[function(a,b,c){this.W7(a)},"$2","giH",4,0,202,203,204],
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector(".sourceTable")
-if(z!=null){y=W.Ws(this.gcL(a))
+if(z!=null){y=W.Ws(this.giH(a))
 a.Nf=y
 C.S2.OT(y,z,!0)}},
-dQ:function(a){var z=a.Nf
+Lx:function(a){var z=a.Nf
 if(z!=null){z.disconnect()
-a.Nf=null}Z.uL.prototype.dQ.call(this,a)},
+a.Nf=null}Z.uL.prototype.Lx.call(this,a)},
 mN:[function(a,b){this.Um(a)
-this.vr(a)},"$1","goL",2,0,19,59],
-Yo:[function(a,b){this.Um(a)},"$1","gLe",2,0,19,59],
-Ti:[function(a,b){this.Um(a)},"$1","gRq",2,0,19,59],
+this.W7(a)},"$1","goL",2,0,19,59],
+KC:[function(a,b){this.Um(a)},"$1","giB",2,0,19,59],
+Ti:[function(a,b){this.Um(a)},"$1","gP3",2,0,19,59],
 Vj:[function(a,b){this.Um(a)},"$1","gcY",2,0,19,59],
 Um:function(a){var z,y,x
 a.PZ=this.ct(a,C.uG,a.PZ,!1)
 if(a.D6!=null)return
-z=a.oX
+z=a.Ny
 if(z==null)return
-if(J.iS(z)!==!0){a.D6=J.SK(a.oX).ml(new T.oEe(a))
+if(J.iS(z)!==!0){a.D6=J.SK(a.Ny).ml(new T.Es(a))
 return}z=a.Fd
-z=z!=null?a.oX.q6(z):1
+z=z!=null?a.Ny.q6(z):1
 a.xo=this.ct(a,C.nt,a.xo,z)
 z=a.fI
-z=z!=null?a.oX.q6(z):null
+z=z!=null?a.Ny.q6(z):null
 a.He=this.ct(a,C.kI,a.He,z)
-z=a.hX
-y=a.oX
+z=a.cI
+y=a.Ny
 z=z!=null?y.q6(z):J.q8(J.de(y))
 a.ZJ=this.ct(a,C.vs,a.ZJ,z)
-J.U2(a.Kf)
-for(x=J.bI(a.xo,1);z=J.Wx(x),z.E(x,J.bI(a.ZJ,1));x=z.g(x,1))J.dH(a.Kf,J.UQ(J.de(a.oX),x))
+J.Z8(a.Kf)
+for(x=J.bI(a.xo,1);z=J.Wx(x),z.E(x,J.bI(a.ZJ,1));x=z.g(x,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),x))
 a.PZ=this.ct(a,C.uG,a.PZ,!0)},
 static:{Zz:function(a){var z,y,x,w,v
 z=R.tB([])
@@ -18112,27 +18142,27 @@
 a.t7=null
 a.PZ=!1
 a.Kf=z
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
 a.ZQ=x
 a.qJ=w
 a.wy=v
-C.vy.LX(a)
-C.vy.XI(a)
+C.za.LX(a)
+C.za.XI(a)
 return a}}},
 V54:{
 "^":"uL+Pi;",
 $isd3:true},
-oEe:{
+Es:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0){z.D6=null
-J.TR(z)}},"$1",null,2,0,null,13,"call"],
+if(J.iS(z.Ny)===!0){z.D6=null
+J.XP(z)}},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 vr:{
-"^":"V55;X9,pL,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V55;X9,pL,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gRd:function(a){return a.X9},
 sRd:function(a,b){a.X9=this.ct(a,C.VI,a.X9,b)},
 gO9:function(a){return a.pL},
@@ -18143,8 +18173,8 @@
 a.pL=this.ct(a,C.S4,z,!0)
 z=a.X9.gqr()
 y=a.X9
-if(z==null)J.wg(J.fx(y)).PI(J.fx(a.X9),J.f2(a.X9)).ml(new T.eE(a))
-else J.wg(J.fx(y)).Xu(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,49,50,85],
+if(z==null)J.aT(J.zE(y)).G5(J.zE(a.X9),J.f2(a.X9)).ml(new T.eE(a))
+else J.aT(J.zE(y)).Xu(a.X9.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,49,50,85],
 static:{aed:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -18152,7 +18182,7 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.pL=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -18168,22 +18198,22 @@
 eE:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-z.pL=J.Q5(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
+z.pL=J.NB(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 b3:{
 "^":"TpZ:12;b",
 $1:[function(a){var z=this.b
-z.pL=J.Q5(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
+z.pL=J.NB(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true}}],["","",,A,{
 "^":"",
 kn:{
-"^":"oEY;jJ,Vg,ij,tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"oEY;jJ,Vg,fn,tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gBV:function(a){return a.jJ},
 sBV:function(a,b){a.jJ=this.ct(a,C.tW,a.jJ,b)},
 gJp:function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gJp.call(this,a)
-return z.gzz()},
-J4:[function(a,b){this.at(a,null)},"$1","gUv",2,0,19,59],
+return z.gTE()},
+fX:[function(a,b){this.at(a,null)},"$1","glD",2,0,19,59],
 at:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
 this.ct(a,C.Fh,0,1)}},"$1","gRy",2,0,19,13],
@@ -18204,23 +18234,23 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.jJ=-1
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Mh.LX(a)
-C.Mh.XI(a)
+C.Wa.LX(a)
+C.Wa.XI(a)
 return a}}},
 oEY:{
 "^":"xI+Pi;",
 $isd3:true}}],["","",,U,{
 "^":"",
 fI:{
-"^":"V56;Uz,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V56;Uz,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gtu:function(a){return a.Uz},
 stu:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
 Es:function(a){var z
@@ -18229,14 +18259,14 @@
 if(z==null)return
 J.SK(z)},
 pA:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,19,102],
-Da:[function(a,b){J.y9(a.Uz).wM(b)},"$1","gDX",2,0,19,102],
-static:{Ln:function(a){var z,y,x,w
+m4:[function(a,b){J.y9(a.Uz).wM(b)},"$1","gDX",2,0,19,102],
+static:{TXt:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -18250,8 +18280,8 @@
 "^":"uL+Pi;",
 $isd3:true}}],["","",,D,{
 "^":"",
-Xm:[function(a,b){return J.FW(J.DA(a),J.DA(b))},"$2","Br",4,0,72],
-Ep:function(a){switch(a){case"BoundedType":case"Instance":case"List":case"String":case"Type":case"TypeParameter":case"TypeRef":case"bool":case"double":case"int":case"null":return!0
+Xm:[function(a,b){return J.FW(J.DA(a),J.DA(b))},"$2","E0",4,0,72],
+dV:function(a){switch(a){case"BoundedType":case"Instance":case"List":case"String":case"Type":case"TypeParameter":case"TypeRef":case"bool":case"double":case"int":case"null":return!0
 default:return!1}},
 rO:function(a){switch(a){case"BoundedType":case"Type":case"TypeParameter":case"TypeRef":return!0
 default:return!1}},
@@ -18259,7 +18289,7 @@
 if(b==null)return
 z=J.U6(b)
 z=z.t(b,"id")!=null&&z.t(b,"type")!=null
-if(!z)N.QM("").YX("Malformed service object: "+H.d(b))
+if(!z)N.QM("").hh("Malformed service object: "+H.d(b))
 z=J.U6(b)
 y=z.t(b,"type")
 x=J.Qe(y)
@@ -18287,7 +18317,7 @@
 t.$builtinTypeInfo=[z]
 t=new Q.wn(null,null,t,null,null)
 t.$builtinTypeInfo=[z]
-s=new D.dy(null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.qp(0,0,null,null),new D.qp(0,0,null,null)),new D.Iy(new D.qp(0,0,null,null),new D.qp(0,0,null,null)),new D.qp(0,0,null,null),x,v,null,u,t,null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.dy(null,null,null,null,null,null,null,null,null,null,new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.Iy(new D.mT(0,0,null,null),new D.mT(0,0,null,null)),new D.mT(0,0,null,null),x,v,null,u,t,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 case"Code":z=[]
 z.$builtinTypeInfo=[D.ta]
@@ -18344,7 +18374,7 @@
 p.$builtinTypeInfo=[r]
 p=new Q.wn(null,null,p,null,null)
 p.$builtinTypeInfo=[r]
-r=P.L5(null,null,null,P.qU,P.CP)
+r=P.L5(null,null,null,P.qU,P.Vf)
 r=R.tB(r)
 o=P.qU
 n=D.YX
@@ -18383,12 +18413,12 @@
 r.$builtinTypeInfo=[z]
 s=new D.U4(null,x,v,u,t,r,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"Object":switch(w){case"PcDescriptors":z=D.xb
+case"Object":switch(w){case"PcDescriptors":z=D.Z9
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-s=new D.hn(null,null,x,null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.Hx(null,null,x,null,null,a,null,null,null,!1,null,null,null,null,null)
 z=$.oK
 if(z==null)H.qw("created PcDescriptors.")
 else z.$1("created PcDescriptors.")
@@ -18400,7 +18430,7 @@
 x.$builtinTypeInfo=[z]
 s=new D.Mi(null,null,x,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-case"TokenStream":s=new D.Ik(null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"TokenStream":s=new D.RA(null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 default:s=null}break
 case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
@@ -18418,14 +18448,14 @@
 break
 case"Socket":s=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
-default:s=D.Ep(y)||J.xC(y,"Sentinel")?new D.uq(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null):null
+default:s=D.dV(y)||J.xC(y,"Sentinel")?new D.uq(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null):null
 break}if(s==null){z=new V.qC(P.YM(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
 s=new D.vO(z,a,null,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
-vQ:function(a){if(a.gHh())return
+UW:function(a){if(a.gHh())return
 return a},
-D5:function(a){var z
+bF: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},
@@ -18435,7 +18465,7 @@
 else if(!!z.$iswn)D.f3(a,b)},
 Gf:function(a,b){a.aN(0,new D.Qf(a,b))},
 f3:function(a,b){var z,y,x,w,v,u
-for(z=a.xN,y=0;y<z.length;++y){x=z[y]
+for(z=a.XG,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
 v=!!w.$isqC
 if(v)u=w.t(x,"id")!=null&&w.t(x,"type")!=null
@@ -18445,39 +18475,39 @@
 else if(v)D.Gf(x,b)}},
 af:{
 "^":"Pi;bN@,GR@",
-gXP:function(){return this.V0},
-gwv:function(a){return J.wp(this.V0)},
-god:function(a){return J.wg(this.V0)},
-gjO:function(a){return this.r0},
+gXP:function(){return this.x8},
+gwv:function(a){return J.wp(this.x8)},
+god:function(a){return J.aT(this.x8)},
+gjO:function(a){return this.TU},
 gt5:function(a){return this.oU},
 gdr:function(){return this.JK},
 glO:function(){return D.rO(this.oU)},
 gFY:function(){return J.xC(this.oU,"bool")},
 gzx:function(){return J.xC(this.oU,"double")},
 gt3:function(){return J.xC(this.oU,"Error")},
-gNs:function(){return D.Ep(this.oU)},
+gNs:function(){return D.dV(this.oU)},
 gSO:function(){return J.xC(this.oU,"int")},
 gK4:function(a){return J.xC(this.oU,"List")},
 gHh:function(){return J.xC(this.oU,"null")},
 gl5:function(){return J.xC(this.oU,"Sentinel")},
 gu7:function(){return J.xC(this.oU,"String")},
-gOC:function(){return J.xC(this.JK,"MirrorReference")},
+gJE:function(){return J.xC(this.JK,"MirrorReference")},
 gl2:function(){return J.xC(this.JK,"WeakProperty")},
 gBF:function(){return!1},
 gXM:function(){return J.xC(this.oU,"Instance")&&!J.xC(this.JK,"MirrorReference")&&!J.xC(this.JK,"WeakProperty")&&!this.gBF()},
-gPj:function(a){return this.V0.YC(this.r0)},
-gox:function(a){return this.ks},
+gPj:function(a){return this.x8.YC(this.TU)},
+gox:function(a){return this.qu},
 gjm:function(){return!1},
 gM8:function(){return!1},
 goc:function(a){return this.gbN()},
 soc:function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},
-gzz:function(){return this.gGR()},
-szz:function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},
-xW:function(a){if(this.ks)return P.Ab(this,null)
+gTE:function(){return this.gGR()},
+sTE:function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},
+xW:function(a){if(this.qu)return P.Ab(this,null)
 return this.VD(0)},
 VD:function(a){var z
-if(J.xC(this.r0,""))return P.Ab(this,null)
-if(this.ks&&this.gM8())return P.Ab(this,null)
+if(J.xC(this.TU,""))return P.Ab(this,null)
+if(this.qu&&this.gM8())return P.Ab(this,null)
 z=this.mQ
 if(z==null){z=this.gwv(this).jU(this.gPj(this)).ml(new D.n1(this)).wM(new D.jI(this))
 this.mQ=z}return z},
@@ -18487,13 +18517,13 @@
 x=z.t(a,"type")
 w=J.Qe(x)
 if(w.nC(x,"@"))x=w.yn(x,1)
-w=this.r0
-if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
+w=this.TU
+if(w!=null&&!J.xC(w,z.t(a,"id")));this.TU=z.t(a,"id")
 this.oU=x
 if(z.NZ(a,"_vmType")===!0){z=z.t(a,"_vmType")
 w=J.Qe(z)
 this.JK=w.nC(z,"@")?w.yn(z,1):z}else this.JK=this.oU
-this.bF(0,a,y)},
+this.R5(0,a,y)},
 YC:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,172,205],
 $isaf:true},
 n1:{
@@ -18513,17 +18543,17 @@
 $isEH:true},
 boh:{
 "^":"a;",
-qe:function(a){J.Me(a,new D.u9(this))},
-lh:[function(a){return this.gwv(this).jU(this.YC("coverage")).ml(new D.TCE(this))},"$0","gDX",0,0,208]},
-u9:{
+O5:function(a){J.Me(a,new D.P5(this))},
+lh:[function(a){return this.gwv(this).jU(this.YC("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,208]},
+P5:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
 z.t(a,"script").lV(z.t(a,"hits"))},"$1",null,2,0,null,209,"call"],
 $isEH:true},
-TCE:{
+Rv:{
 "^":"TpZ:207;a",
 $1:[function(a){var z=this.a
-z.qe(D.Nl(J.xC(z.gt5(z),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,206,"call"],
+z.O5(D.Nl(J.xC(z.gt5(z),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,206,"call"],
 $isEH:true},
 xm:{
 "^":"af;"},
@@ -18533,27 +18563,27 @@
 god:function(a){return},
 gi2:function(){var z=this.Qi
 return z.gUQ(z)},
-gPj:function(a){return H.d(this.r0)},
+gPj:function(a){return H.d(this.TU)},
 YC:[function(a){return H.d(a)},"$1","gua",2,0,172,205],
 gYe:function(a){return this.Ox},
 gI2:function(){return this.RW},
 gA3:function(){return this.Ts},
 gdW:function(){return this.Va},
-gU6:function(){return this.h7},
-gJW:function(){return this.jA},
+gU6:function(){return this.kU},
+gJW:function(){return this.l7},
 hQ:function(a,b){var z,y,x,w
 z={}
 z.a=null
 try{y=this.hb(a)
 z.a=y
-if(b!=null)J.qQ(y,"_data",b)}catch(x){H.Ru(x)
-N.QM("").YX("Ignoring malformed event message: "+H.d(a))
-return}if(!J.xC(J.UQ(z.a,"type"),"ServiceEvent")){N.QM("").YX("Expected 'ServiceEvent' but found '"+H.d(J.UQ(z.a,"type"))+"'")
+if(b!=null)J.kW(y,"_data",b)}catch(x){H.Ru(x)
+N.QM("").hh("Ignoring malformed event message: "+H.d(a))
+return}if(!J.xC(J.UQ(z.a,"type"),"ServiceEvent")){N.QM("").hh("Expected 'ServiceEvent' but found '"+H.d(J.UQ(z.a,"type"))+"'")
 return}w=J.UQ(J.UQ(z.a,"isolate"),"id")
-this.wD(w).ml(new D.mT(z,this,w))},
+this.wD(w).ml(new D.jy(z,this,w))},
 EM:function(a){return this.hQ(a,null)},
 BC:function(a){var z,y,x,w
-z=$.r0().R4(0,a)
+z=$.rc().R4(0,a)
 if(z==null)return
 y=z.pX
 x=y.input
@@ -18563,7 +18593,7 @@
 if(typeof y!=="number")return H.s(y)
 return C.yo.yn(x,w+y)},
 ZS:function(a){var z,y,x
-z=$.jN().R4(0,a)
+z=$.fA().R4(0,a)
 if(z==null)return""
 y=z.pX
 x=y.index
@@ -18576,42 +18606,42 @@
 if(J.xC(a,""))return P.Ab(null,null)
 z=this.Qi.t(0,a)
 if(z!=null)return P.Ab(z,null)
-return this.VD(0).ml(new D.wU(this,a))},
+return this.VD(0).ml(new D.MZ(this,a))},
 cv:function(a){var z,y,x
 if(J.co(a,"isolates/")){z=this.ZS(a)
 y=this.BC(a)
-return this.wD(z).ml(new D.kk(this,y))}x=this.uj.t(0,a)
+return this.wD(z).ml(new D.aEE(this,y))}x=this.uj.t(0,a)
 if(x!=null)return J.LE(x)
-return this.jU(a).ml(new D.it(this,a))},
-nJ:[function(a,b){return b},"$2","gS6",4,0,81],
+return this.jU(a).ml(new D.oew(this,a))},
+B5:[function(a,b){return b},"$2","gJ2",4,0,81],
 hb:function(a){var z,y,x
 z=null
-try{y=new P.Mx(this.gS6())
-z=P.jc(a,y.gJ2())}catch(x){H.Ru(x)
+try{y=new P.c5(this.gJ2())
+z=P.jc(a,y.gFs())}catch(x){H.Ru(x)
 return}return R.tB(z)},
 OJ:function(a){var z
-if(!D.D5(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
-return P.t5(D.Nl(this,R.tB(z)),null,null)}z=J.U6(a)
-if(J.xC(z.t(a,"type"),"ServiceError"))return P.t5(D.Nl(this,a),null,null)
-else if(J.xC(z.t(a,"type"),"ServiceException"))return P.t5(D.Nl(this,a),null,null)
+if(!D.bF(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
+return P.pz(D.Nl(this,R.tB(z)),null,null)}z=J.U6(a)
+if(J.xC(z.t(a,"type"),"ServiceError"))return P.pz(D.Nl(this,a),null,null)
+else if(J.xC(z.t(a,"type"),"ServiceException"))return P.pz(D.Nl(this,a),null,null)
 return P.Ab(a,null)},
 jU:function(a){return this.z6(0,a).ml(new D.zA(this,a)).pU(new D.tm(this),new D.mR()).pU(new D.hc(this),new D.pa())},
-bF:function(a,b,c){var z,y
+R5:function(a,b,c){var z,y
 if(c)return
-this.ks=!0
+this.qu=!0
 z=J.U6(b)
 y=z.t(b,"version")
 this.Ox=F.Wi(this,C.zn,this.Ox,y)
 y=z.t(b,"architecture")
-this.GY=F.Wi(this,C.ke,this.GY,y)
+this.GY=F.Wi(this,C.US,this.GY,y)
 y=z.t(b,"uptime")
 this.RW=F.Wi(this,C.mh,this.RW,y)
 y=P.Wu(H.BU(z.t(b,"date"),null,null),!1)
-this.jA=F.Wi(this,C.GI,this.jA,y)
+this.l7=F.Wi(this,C.GI,this.l7,y)
 y=z.t(b,"assertsEnabled")
 this.Ts=F.Wi(this,C.ET,this.Ts,y)
 y=z.t(b,"pid")
-this.h7=F.Wi(this,C.uI,this.h7,y)
+this.kU=F.Wi(this,C.uI,this.kU,y)
 y=z.t(b,"typeChecksEnabled")
 this.Va=F.Wi(this,C.J2,this.Va,y)
 this.y8(z.t(b,"isolates"))},
@@ -18624,7 +18654,7 @@
 if(u!=null)y.u(0,v,u)
 else{u=D.Nl(this,w)
 y.u(0,v,u)
-N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.Yu())
+N.QM("").To("New isolate '"+H.d(u.TU)+"'")}}y.aN(0,new D.Yu())
 this.Qi=y},
 Lw:function(){this.bN=this.ct(this,C.YS,this.bN,"vm")
 this.GR=this.ct(this,C.KS,this.GR,"vm")
@@ -18635,21 +18665,21 @@
 O1w:{
 "^":"xm+Pi;",
 $isd3:true},
-mT:{
+jy:{
 "^":"TpZ:12;a,b,c",
 $1:[function(a){var z,y
-if(a==null)N.QM("").YX("Ignoring event with unknown isolate id: "+H.d(this.c))
+if(a==null)N.QM("").hh("Ignoring event with unknown isolate id: "+H.d(this.c))
 else{z=D.Nl(a,this.a.a)
 y=this.b.Rk
 if(y.YM>=4)H.vh(y.Pq())
 y.MW(z)}},"$1",null,2,0,null,210,"call"],
 $isEH:true},
-wU:{
+MZ:{
 "^":"TpZ:12;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
 return this.a.Qi.t(0,this.b)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-kk:{
+aEE:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z
 if(a==null)return this.a
@@ -18657,7 +18687,7 @@
 if(z==null)return J.LE(a)
 else return a.cv(z)},"$1",null,2,0,null,6,"call"],
 $isEH:true},
-it:{
+oew:{
 "^":"TpZ:207;c,d",
 $1:[function(a){var z,y
 z=this.c
@@ -18674,8 +18704,8 @@
 $1:[function(a){var z,y,x
 z=this.a
 y=z.hb(a)
-x=$.hm
-if(x!=null)x.AS(0,"Received response for "+H.d(this.b),y)
+x=$.ax
+if(x!=null)x.ab(0,"Received response for "+H.d(this.b),y)
 return z.OJ(y)},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 tm:{
@@ -18683,7 +18713,7 @@
 $1:[function(a){var z=this.c.G2
 if(z.YM>=4)H.vh(z.Pq())
 z.MW(a)
-return P.t5(a,null,null)},"$1",null,2,0,null,23,"call"],
+return P.pz(a,null,null)},"$1",null,2,0,null,23,"call"],
 $isEH:true},
 mR:{
 "^":"TpZ:12;",
@@ -18694,7 +18724,7 @@
 $1:[function(a){var z=this.d.Li
 if(z.YM>=4)H.vh(z.Pq())
 z.MW(a)
-return P.t5(a,null,null)},"$1",null,2,0,null,90,"call"],
+return P.pz(a,null,null)},"$1",null,2,0,null,90,"call"],
 $isEH:true},
 pa:{
 "^":"TpZ:12;",
@@ -18713,7 +18743,7 @@
 v=z[x]
 if(typeof v!=="number")return H.s(v)
 this.jf=w+v}},
-dS:function(a,b){var z,y,x,w,v,u,t
+pg:function(a,b){var z,y,x,w,v,u,t
 for(z=this.XE,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
 if(v>=w)return H.e(b,v)
 u=J.bI(u,b[v])
@@ -18721,7 +18751,7 @@
 t=this.jf
 if(typeof u!=="number")return H.s(u)
 this.jf=t+u}},
-q9:[function(a,b){var z,y,x,w,v,u
+k5:[function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
 y=this.XE
 x=y.length
@@ -18736,13 +18766,13 @@
 for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
 tL:{
-"^":"a;fJ<,Fw<,u1,Ob,Eq,kL",
+"^":"a;af<,Fw<,u1,Ob,Eq,kL",
 gvh:function(){return this.u1},
 Qv:function(a,b){var z,y,x,w,v,u
 this.u1=a
 z=J.U6(b)
 y=z.t(b,"counters")
-x=this.fJ
+x=this.af
 if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
 this.kL=J.q8(z.t(b,"counters"))
 for(z=this.Eq,x=this.Fw,w=0;w<z;++w){v=this.kL
@@ -18764,23 +18794,23 @@
 z=Array(z)
 z.fixed$length=init
 u=new D.ER(a,H.VM(z,[P.KN]),0)
-u.dS(y,this.Ob.XE)
-this.Ob.q9(0,y)
+u.pg(y,this.Ob.XE)
+this.Ob.k5(0,y)
 z=this.Fw
 z.push(u)
 if(z.length>this.Eq)C.Nm.W4(z,0)}},
 eK:{
-"^":"Pi;Ev,ob,j8,yp,Og,hu,Vg,ij",
-gSU:function(){return this.Ev},
-gbZ:function(){return this.ob},
+"^":"Pi;zd,ob,j8,yp,Og,hu,Vg,fn",
+gSU:function(){return this.zd},
+gkV:function(){return this.ob},
 gMX:function(){return this.j8},
 gYk:function(){return this.yp},
 gpy:function(){return this.Og},
-gUH:function(){return this.hu},
+gqZ:function(){return this.hu},
 eC:function(a){var z,y
 z=J.U6(a)
 y=z.t(a,"used")
-this.Ev=F.Wi(this,C.LP,this.Ev,y)
+this.zd=F.Wi(this,C.LP,this.zd,y)
 y=z.t(a,"capacity")
 this.ob=F.Wi(this,C.bV,this.ob,y)
 y=z.t(a,"external")
@@ -18792,28 +18822,28 @@
 z=z.t(a,"avgCollectionPeriodMillis")
 this.hu=F.Wi(this,C.BE,this.hu,z)}},
 bv:{
-"^":"bvc;V3,Jr,EY,eU,yP,XV,uj,KJ,h0,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,SF,Y8,UY<,xQ<,Q2H,yv,qo<,yA,Ac,iD<,hz,pG<,Sn<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
-gwv:function(a){return this.V0},
+"^":"bvc;V3,Jr,EY,eU,yP,XV,uj,KJ,Wm,AI,v9,tW,zb,bN:KT@,GR:f5@,i9,cL,Y8,UY<,xQ<,Q2H,yv,qo<,n5,l9,iD<,hz,pG<,Sn<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+gwv:function(a){return this.x8},
 god:function(a){return this},
 gXE:function(a){return this.V3},
 sXE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
-gPj:function(a){return"/"+H.d(this.r0)},
+gPj:function(a){return"/"+H.d(this.TU)},
 gBP:function(a){return this.Jr},
-gLd:function(){return this.EY},
+gGL:function(){return this.EY},
 gaj:function(){return this.eU},
 gn0:function(){return this.yP},
-YC:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gua",2,0,172,205],
-f9:function(a){var z,y,x,w
+YC:[function(a){return"/"+H.d(this.TU)+"/"+H.d(a)},"$1","gua",2,0,172,205],
+N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
 for(x=J.mY(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
-this.Id()
-this.qx(a,z)
+this.I1()
+this.nN(a,z)
 w=y.t(a,"exclusive_trie")
 if(w!=null)this.qo=this.Jm(w,z)},
-Id:function(){var z=this.uj
-z.gUQ(z).aN(0,new D.S0())},
-qx:function(a,b){var z,y,x,w
+I1:function(){var z=this.uj
+z.gUQ(z).aN(0,new D.TV())},
+nN:function(a,b){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"codes")
 x=z.t(a,"samples")
@@ -18824,17 +18854,17 @@
 z=[]
 for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
 w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.hz(z,!1)},"$1","gLG",2,0,213,214],
+if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","gLG",2,0,213,214],
 lKe:[function(a){var z,y,x,w
 z=this.AI
 z.V1(z)
-this.h0=F.Wi(this,C.as,this.h0,null)
+this.Wm=F.Wi(this,C.jo,this.Wm,null)
 for(y=J.mY(a);y.G();){x=y.gl()
 if(x.gAY()==null)z.h(0,x)
-if(J.xC(x.gzz(),"Object")&&J.xC(x.geh(),!1)){w=this.h0
-if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.as,w,x)
+if(J.xC(x.gTE(),"Object")&&J.xC(x.geh(),!1)){w=this.Wm
+if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.jo,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.h0=x}}return P.Ab(this.h0,null)},"$1","gHB",2,0,215,216],
+this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gHB",2,0,215,216],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -18846,25 +18876,25 @@
 return x},
 cv:function(a){var z=this.uj.t(0,a)
 if(z!=null)return J.LE(z)
-return this.V0.jU("/"+H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gDZ:function(){return this.h0},
+return this.x8.jU("/"+H.d(this.TU)+"/"+H.d(a)).ml(new D.KQ(this,a))},
+gDZ:function(){return this.Wm},
 gVc:function(){return this.v9},
 sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
-gpd:function(){return this.tW},
+gvU:function(){return this.tW},
 gkw:function(){return this.zb},
 goc:function(a){return this.KT},
 soc:function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},
-gzz:function(){return this.f5},
-szz:function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},
+gTE:function(){return this.f5},
+sTE:function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},
 gIT:function(){return this.i9},
-gw2:function(){return this.SF},
-sw2:function(a){this.SF=F.Wi(this,C.tP,this.SF,a)},
+gw2:function(){return this.cL},
+sw2:function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},
 gkc:function(a){return this.yv},
 skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
-WU:function(a){var z=J.U6(a)
+Bs:function(a){var z=J.U6(a)
 this.UY.eC(z.t(a,"new"))
 this.xQ.eC(z.t(a,"old"))},
-bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+R5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z=J.U6(b)
 y=z.t(b,"mainPort")
 this.i9=F.Wi(this,C.wT,this.i9,y)
@@ -18873,15 +18903,15 @@
 y=z.t(b,"name")
 this.f5=F.Wi(this,C.KS,this.f5,y)
 if(c)return
-this.ks=!0
+this.qu=!0
 this.yP=F.Wi(this,C.DY,this.yP,!1)
 this.Xb()
 D.kT(b,this)
-if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heaps")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
+if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heaps")==null){N.QM("").hh("Malformed 'Isolate' response: "+H.d(b))
 return}y=z.t(b,"rootLib")
 this.v9=F.Wi(this,C.eN,this.v9,y)
 if(z.t(b,"entry")!=null){y=z.t(b,"entry")
-this.SF=F.Wi(this,C.tP,this.SF,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
+this.cL=F.Wi(this,C.tP,this.cL,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
 this.zb=F.Wi(this,C.bc,this.zb,y)}else this.zb=F.Wi(this,C.bc,this.zb,null)
 x=z.t(b,"tagCounters")
 if(x!=null){y=J.U6(x)
@@ -18903,13 +18933,13 @@
 while(!0){s=y.gB(w)
 if(typeof s!=="number")return H.s(s)
 if(!(t<s))break
-J.qQ(this.V3,y.t(w,t),"0.0%");++t}}else{s=J.U6(w)
+J.kW(this.V3,y.t(w,t),"0.0%");++t}}else{s=J.U6(w)
 t=0
 while(!0){r=s.gB(w)
 if(typeof r!=="number")return H.s(r)
 if(!(t<r))break
-J.qQ(this.V3,s.t(w,t),C.CD.Sy(J.X9(y.t(v,t),u)*100,2)+"%");++t}}}q=P.Fl(null,null)
-J.Me(z.t(b,"timers"),new D.dn(q))
+J.kW(this.V3,s.t(w,t),C.CD.Sy(J.L9(y.t(v,t),u)*100,2)+"%");++t}}}q=P.Fl(null,null)
+J.Me(z.t(b,"timers"),new D.Qq(q))
 y=this.Y8
 s=J.w1(y)
 s.u(y,"total",q.t(0,"time_total_runtime"))
@@ -18917,7 +18947,7 @@
 s.u(y,"gc",0)
 s.u(y,"init",J.WB(J.WB(J.WB(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
 s.u(y,"dart",q.t(0,"time_dart_execution"))
-this.WU(z.t(b,"heaps"))
+this.Bs(z.t(b,"heaps"))
 p=z.t(b,"features")
 if(p!=null)for(y=J.mY(p);y.G();)if(J.xC(y.gl(),"io")){s=this.XV
 if(this.gnz(this)&&!J.xC(s,!0)){s=new T.qI(this,C.iA,s,!0)
@@ -18934,37 +18964,37 @@
 y=this.tW
 y.V1(y)
 y.FV(0,z.t(b,"libraries"))
-y.GT(y,D.Br())},
-m7:function(){return this.V0.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.O5(this))},
-Jm:function(a,b){this.yA=0
-this.Ac=a
+y.GT(y,D.E0())},
+xB:function(){return this.x8.jU("/"+H.d(this.TU)+"/profile/tag").ml(new D.O5(this))},
+Jm:function(a,b){this.n5=0
+this.l9=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.LB(b)},
-LB:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.Ac
-y=this.yA
+return this.ci(b)},
+ci:function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.l9
+y=this.n5
 if(typeof y!=="number")return y.g()
-this.yA=y+1
+this.n5=y+1
 x=J.UQ(z,y)
 if(x>>>0!==x||x>=a.length)return H.e(a,x)
 w=a[x]
-y=this.Ac
-z=this.yA
+y=this.l9
+z=this.n5
 if(typeof z!=="number")return z.g()
-this.yA=z+1
+this.n5=z+1
 v=J.UQ(y,z)
 z=[]
-z.$builtinTypeInfo=[D.TH]
-u=new D.TH(w,v,z,0)
-y=this.Ac
-t=this.yA
+z.$builtinTypeInfo=[D.D5]
+u=new D.D5(w,v,z,0)
+y=this.l9
+t=this.n5
 if(typeof t!=="number")return t.g()
-this.yA=t+1
+this.n5=t+1
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
-for(;r<s;++r){q=this.LB(a)
+for(;r<s;++r){q=this.ci(a)
 z.push(q)
 y=u.Jv
 t=q.Av
@@ -18995,16 +19025,16 @@
 Xb:function(){var z=this.hz
 if(z==null){z=this.cv("debug/breakpoints").ml(new D.y4(this)).wM(new D.Cm(this))
 this.hz=z}return z},
-PI:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.JL(this,a,b))},
+G5:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.ad(this,a,b))},
 Xu:function(a){return this.cv(H.d(J.eS(a))+"/clear").ml(new D.fw(this,a))},
-zd:[function(a){return this.cv("debug/pause").ml(new D.G4(this))},"$0","gX0",0,0,208],
+WJ:[function(a){return this.cv("debug/pause").ml(new D.G4(this))},"$0","gX0",0,0,208],
 QE:[function(a){return this.cv("debug/resume").ml(new D.LO(this))},"$0","gDQ",0,0,208],
-Lg:[function(a){return this.cv("debug/resume?step=into").ml(new D.wX(this))},"$0","gLc",0,0,208],
-PJ:[function(a){return this.cv("debug/resume?step=over").ml(new D.Vd(this))},"$0","gqF",0,0,208],
-h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.pW(this))},"$0","gZp",0,0,208],
-yB:function(a,b){return this.cv(a).ml(new D.oq(b))},
-VT:function(){return this.yB("metrics",this.pG).ml(new D.y1(this))},
-bu:[function(a){return"Isolate("+H.d(this.r0)+")"},"$0","gCR",0,0,73],
+Lg:[function(a){return this.cv("debug/resume?step=into").ml(new D.qD(this))},"$0","gLc",0,0,208],
+Fc:[function(a){return this.cv("debug/resume?step=over").ml(new D.A6(this))},"$0","gqF",0,0,208],
+h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.xK(this))},"$0","gZp",0,0,208],
+WO:function(a,b){return this.cv(a).ml(new D.oq(b))},
+VT:function(){return this.WO("metrics",this.pG).ml(new D.y1(this))},
+bu:[function(a){return"Isolate("+H.d(this.TU)+")"},"$0","gCR",0,0,73],
 $isbv:true,
 static:{"^":"ZGx"}},
 PKX:{
@@ -19012,11 +19042,11 @@
 bvc:{
 "^":"PKX+Pi;",
 $isd3:true},
-S0:{
+TV:{
 "^":"TpZ:12;",
-$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
+$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.kr,a.xM,0)
 a.Du=0
-a.pn=0
+a.fF=0
 a.mM=F.Wi(a,C.eF,a.mM,"")
 a.rF=F.Wi(a,C.uU,a.rF,"")
 C.Nm.sB(a.VS,0)
@@ -19035,7 +19065,7 @@
 "^":"TpZ:76;c",
 $0:function(){return this.c},
 $isEH:true},
-dn:{
+Qq:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
 this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,217,"call"],
@@ -19061,7 +19091,7 @@
 "^":"TpZ:76;b",
 $0:[function(){this.b.hz=null},"$0",null,0,0,null,"call"],
 $isEH:true},
-JL:{
+ad:{
 "^":"TpZ:12;a,b,c",
 $1:[function(a){if(!!J.x(a).$iscn)J.UQ(J.de(this.b),J.bI(this.c,1)).sj9(!1)
 return this.a.Xb()},"$1",null,2,0,null,121,"call"],
@@ -19069,42 +19099,42 @@
 fw:{
 "^":"TpZ:12;a,b",
 $1:[function(a){var z,y
-if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
+if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
 z=this.a
 y=z.Jr
-if(y!=null&&y.gYZ()!=null&&J.xC(J.UQ(z.Jr.gYZ(),"id"),J.UQ(this.b,"id")))return z.VD(0)
+if(y!=null&&y.gQ1()!=null&&J.xC(J.UQ(z.Jr.gQ1(),"id"),J.UQ(this.b,"id")))return z.VD(0)
 else return z.Xb()},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 G4:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 LO:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-wX:{
+qD:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-Vd:{
+A6:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
-pW:{
+xK:{
 "^":"TpZ:12;a",
-$1:[function(a){if(!!J.x(a).$iscn)N.QM("").YX(a.LD)
+$1:[function(a){if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
 return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 oq:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y,x
 z=J.x(a)
-if(!!z.$iscn){N.QM("").YX(a.LD)
+if(!!z.$iscn){N.QM("").hh(a.LD)
 return}y=this.a
 y.V1(0)
 for(z=J.mY(z.t(a,"members"));z.G();){x=z.gl()
@@ -19113,47 +19143,47 @@
 y1:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-return z.yB("metrics/vm",z.Sn)},"$1",null,2,0,null,13,"call"],
+return z.WO("metrics/vm",z.Sn)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 vO:{
-"^":"af;RF,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
-gjm:function(){return(J.xC(this.oU,"Class")||J.xC(this.oU,"Function")||J.xC(this.oU,"Field"))&&!J.co(this.r0,$.RQ)},
+"^":"af;RF,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+gjm:function(){return(J.xC(this.oU,"Class")||J.xC(this.oU,"Function")||J.xC(this.oU,"Field"))&&!J.co(this.TU,$.RQ)},
 gM8:function(){return!1},
-bF:function(a,b,c){var z,y,x
-this.ks=!c
+R5:function(a,b,c){var z,y,x
+this.qu=!c
 z=this.RF
 z.V1(0)
 z.FV(0,b)
-y=z.tf
+y=z.LL
 x=y.t(0,"name")
 this.bN=this.ct(0,C.YS,this.bN,x)
 y=y.NZ(0,"vmName")?y.t(0,"vmName"):this.bN
 this.GR=this.ct(0,C.KS,this.GR,y)
-D.kT(z,this.V0)},
+D.kT(z,this.x8)},
 FV:function(a,b){return this.RF.FV(0,b)},
 V1:function(a){return this.RF.V1(0)},
-NZ:function(a,b){return this.RF.tf.NZ(0,b)},
-aN:function(a,b){return this.RF.tf.aN(0,b)},
+NZ:function(a,b){return this.RF.LL.NZ(0,b)},
+aN:function(a,b){return this.RF.LL.aN(0,b)},
 Rz:function(a,b){return this.RF.Rz(0,b)},
-t:function(a,b){return this.RF.tf.t(0,b)},
+t:function(a,b){return this.RF.LL.t(0,b)},
 u:function(a,b,c){this.RF.u(0,b,c)
 return c},
-gl0:function(a){var z=this.RF.tf
+gl0:function(a){var z=this.RF.LL
 return z.gB(z)===0},
-gor:function(a){var z=this.RF.tf
+gor:function(a){var z=this.RF.LL
 return z.gB(z)!==0},
-gvc:function(a){var z=this.RF.tf
+gvc:function(a){var z=this.RF.LL
 return z.gvc(z)},
-gUQ:function(a){var z=this.RF.tf
+gUQ:function(a){var z=this.RF.LL
 return z.gUQ(z)},
-gB:function(a){var z=this.RF.tf
+gB:function(a){var z=this.RF.LL
 return z.gB(z)},
 HC:[function(a){var z=this.RF
 return z.HC(z)},"$0","gDx",0,0,131],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-Tr:[function(a){return},"$0","gcm",0,0,17],
+w37:[function(a){return},"$0","gcm",0,0,17],
 dt:[function(a){this.RF.Vg=null
 return},"$0","gym",0,0,17],
 gqh:function(a){var z=this.RF
@@ -19163,7 +19193,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-bu:[function(a){return"ServiceMap("+H.d(this.RF)+")"},"$0","gCR",0,0,73],
+bu:[function(a){return"ServiceMap("+P.vW(this.RF)+")"},"$0","gCR",0,0,73],
 $isvO:true,
 $isqC:true,
 $asqC:function(){return[null,null]},
@@ -19172,18 +19202,18 @@
 $isd3:true,
 static:{"^":"RQ"}},
 cn:{
-"^":"wVq;I0,LD,jo,Ne,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"wVq;I0,LD,jo,Ne,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
-bF:function(a,b,c){var z,y,x
+R5:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"message")
 this.LD=F.Wi(this,C.pX,this.LD,y)
-y=this.V0
+y=this.x8
 x=D.Nl(y,z.t(b,"exception"))
 this.jo=F.Wi(this,C.ne,this.jo,x)
 z=D.Nl(y,z.t(b,"stacktrace"))
@@ -19198,11 +19228,11 @@
 "^":"af+Pi;",
 $isd3:true},
 N7:{
-"^":"dZL;I0,LD,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"dZL;I0,LD,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
-bF:function(a,b,c){var z,y
-this.ks=!0
+R5:function(a,b,c){var z,y
+this.qu=!0
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -19218,11 +19248,11 @@
 "^":"af+Pi;",
 $isd3:true},
 Ix:{
-"^":"w8F;I0,LD,IV,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"w8F;I0,LD,IV,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gG1:function(a){return this.LD},
 gn9:function(a){return this.IV},
-bF:function(a,b,c){var z,y
+R5:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -19240,15 +19270,15 @@
 "^":"af+Pi;",
 $isd3:true},
 Mk:{
-"^":"V4b;eq,NH,jo,ZK,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"V4b;eq,HQ,jo,ZK,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gfG:function(a){return this.eq},
-gYZ:function(){return this.NH},
+gQ1:function(){return this.HQ},
 gja:function(a){return this.jo},
 sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
 gRn:function(a){return this.ZK},
-bF:function(a,b,c){var z,y
-this.ks=!0
-D.kT(b,this.V0)
+R5:function(a,b,c){var z,y
+this.qu=!0
+D.kT(b,this.x8)
 z=J.U6(b)
 y=z.t(b,"eventType")
 y=F.Wi(this,C.qR,this.eq,y)
@@ -19258,7 +19288,7 @@
 this.bN=y
 this.GR=this.ct(this,C.KS,this.GR,y)
 if(z.t(b,"breakpoint")!=null){y=z.t(b,"breakpoint")
-this.NH=F.Wi(this,C.hR,this.NH,y)}if(z.t(b,"exception")!=null){y=z.t(b,"exception")
+this.HQ=F.Wi(this,C.hR,this.HQ,y)}if(z.t(b,"exception")!=null){y=z.t(b,"exception")
 this.jo=F.Wi(this,C.ne,this.jo,y)}if(z.t(b,"_data")!=null){z=z.t(b,"_data")
 this.ZK=F.Wi(this,C.ee,this.ZK,z)}},
 bu:[function(a){var z,y
@@ -19270,48 +19300,50 @@
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gO3:function(a){return this.dj},
 gjm:function(){return!0},
 gM8:function(){return!1},
-bF:function(a,b,c){var z,y,x,w
+R5:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=z.t(b,"url")
 x=F.Wi(this,C.Fh,this.dj,y)
 this.dj=x
 if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
 w=J.U6(y)
-x=w.yn(y,w.cn(y,"/")+1)}y=z.t(b,"name")
+v=w.cn(y,"/")
+if(typeof v!=="number")return v.g()
+x=w.yn(y,v+1)}y=z.t(b,"name")
 y=this.ct(this,C.YS,this.bN,y)
 this.bN=y
 if(J.FN(y)===!0)this.bN=this.ct(this,C.YS,this.bN,x)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.KS,this.GR,y)
 if(c)return
-this.ks=!0
-D.kT(b,J.wg(this.V0))
+this.qu=!0
+D.kT(b,J.aT(this.x8))
 y=this.Bm
 y.V1(y)
-w=J.Ij(z.t(b,"imports")).br(0)
-H.ig(w,D.Br())
+w=J.dF(z.t(b,"imports")).br(0)
+H.ig(w,D.E0())
 y.FV(0,w)
 y=this.XR
 y.V1(y)
-w=J.Ij(z.t(b,"scripts")).br(0)
-H.ig(w,D.Br())
+w=J.dF(z.t(b,"scripts")).br(0)
+H.ig(w,D.E0())
 y.FV(0,w)
 y=this.DD
 y.V1(y)
 y.FV(0,z.t(b,"classes"))
-y.GT(y,D.Br())
+y.GT(y,D.E0())
 y=this.Z3
 y.V1(y)
 y.FV(0,z.t(b,"variables"))
-y.GT(y,D.Br())
+y.GT(y,D.E0())
 y=this.mu
 y.V1(y)
 y.FV(0,z.t(b,"functions"))
-y.GT(y,D.Br())},
+y.GT(y,D.E0())},
 bu:[function(a){return"Library("+H.d(this.dj)+")"},"$0","gCR",0,0,73],
 $isU4:true},
 T5W:{
@@ -19319,11 +19351,11 @@
 rG9:{
 "^":"T5W+Pi;",
 $isd3:true},
-qp:{
-"^":"Pi;wf,wY,Vg,ij",
+mT:{
+"^":"Pi;wf,wY,Vg,fn",
 gWt:function(a){return this.wf},
 sWt:function(a,b){this.wf=F.Wi(this,C.yB,this.wf,b)},
-gET:function(){return this.wY}},
+gfj:function(){return this.wY}},
 Iy:{
 "^":"a;EJ<,l<",
 eC:function(a){var z,y,x
@@ -19340,16 +19372,16 @@
 x.wY=F.Wi(x,C.hN,x.wY,y)},
 static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,Whu"}},
 dy:{
-"^":"cOr;Gz,ar,Lh,GQ,GU,J1,E8,qG,dN,yv,UY<,xQ<,vU,tJ<,mu<,k9,p2<,up<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"cOr;Gz,ar,Lh,GQ,GU,J1,E8,eH,dN,yv,UY<,xQ<,dQ,tJ<,mu<,k9,p2<,LT<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gHt:function(a){return this.Gz},
 sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
 gVM:function(){return this.Lh},
-gRh:function(){return this.GQ},
+gRs:function(){return this.GQ},
 geh:function(){return this.J1},
-gVF:function(){return this.qG},
-sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
+gVF:function(){return this.eH},
+sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
 gej:function(){return this.dN},
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
 gkc:function(a){return this.yv},
@@ -19368,15 +19400,15 @@
 sAY:function(a){this.k9=F.Wi(this,C.FZ,this.k9,a)},
 gjm:function(){return!0},
 gM8:function(){return!1},
-bF:function(a,b,c){var z,y,x,w
+R5:function(a,b,c){var z,y,x,w
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.KS,this.GR,y)
 if(c)return
-this.ks=!0
-D.kT(b,J.wg(this.V0))
+this.qu=!0
+D.kT(b,J.aT(this.x8))
 if(!!J.x(z.t(b,"library")).$isU4){y=z.t(b,"library")
 this.Gz=F.Wi(this,C.EV,this.Gz,y)}else this.Gz=F.Wi(this,C.EV,this.Gz,null)
 y=z.t(b,"script")
@@ -19392,21 +19424,21 @@
 y=z.t(b,"implemented")
 this.E8=F.Wi(this,C.Ih,this.E8,y)
 y=z.t(b,"tokenPos")
-this.qG=F.Wi(this,C.dA,this.qG,y)
+this.eH=F.Wi(this,C.dA,this.eH,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
-y=this.up
+y=this.LT
 y.V1(y)
 y.FV(0,z.t(b,"subclasses"))
-y.GT(y,D.Br())
+y.GT(y,D.E0())
 y=this.tJ
 y.V1(y)
 y.FV(0,z.t(b,"fields"))
-y.GT(y,D.Br())
+y.GT(y,D.E0())
 y=this.mu
 y.V1(y)
 y.FV(0,z.t(b,"functions"))
-y.GT(y,D.Br())
+y.GT(y,D.E0())
 y=z.t(b,"super")
 y=F.Wi(this,C.FZ,this.k9,y)
 this.k9=y
@@ -19417,16 +19449,16 @@
 if(x!=null){z=J.U6(x)
 this.UY.eC(z.t(x,"new"))
 this.xQ.eC(z.t(x,"old"))
-y=this.vU
+y=this.dQ
 w=z.t(x,"promotedInstances")
 y.wf=F.Wi(y,C.yB,y.wf,w)
 z=z.t(x,"promotedBytes")
 y.wY=F.Wi(y,C.hN,y.wY,z)}},
-u2:function(a){var z=this.up
+u2:function(a){var z=this.LT
 if(z.tg(z,a))return
 z.h(0,a)
-z.GT(z,D.Br())},
-cv:function(a){return J.wg(this.V0).cv(J.WB(this.r0,"/"+H.d(a)))},
+z.GT(z,D.E0())},
+cv:function(a){return J.aT(this.x8).cv(J.WB(this.TU,"/"+H.d(a)))},
 bu:[function(a){return"Class("+H.d(this.GR)+")"},"$0","gCR",0,0,73],
 $isdy:true},
 ZzQ:{
@@ -19435,25 +19467,25 @@
 "^":"ZzQ+Pi;",
 $isd3:true},
 uq:{
-"^":"Zqa;df,MD,lA,fQ,ni,Xl,bN:di@,cM,F6,oI,dG,Rf,z0,TG,tk,FA,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"Zqa;df,MD,lA,fQ,ni,Iv,bN:di@,cM,F6,oI,dG,Rf,z0,TG,tk,FA,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gky:function(a){return this.MD},
+gyT:function(a){return this.MD},
 gPE:function(){return this.lA},
 gSS:function(){return this.fQ},
 gwz:function(){return this.ni},
 swz:function(a){this.ni=F.Wi(this,C.aw,this.ni,a)},
-gu5:function(){return this.Xl},
-su5:function(a){this.Xl=F.Wi(this,C.mM,this.Xl,a)},
+gu5:function(){return this.Iv},
+su5:function(a){this.Iv=F.Wi(this,C.mM,this.Iv,a)},
 goc:function(a){return this.di},
 soc:function(a,b){this.di=F.Wi(this,C.YS,this.di,b)},
 gB:function(a){return this.cM},
 sB:function(a,b){this.cM=F.Wi(this,C.Wn,this.cM,b)},
-gQR:function(){return this.F6},
-sQR:function(a){this.F6=F.Wi(this,C.hx,this.F6,a)},
+gCY:function(){return this.F6},
+sCY:function(a){this.F6=F.Wi(this,C.hx,this.F6,a)},
 gtJ:function(){return this.oI},
 stJ:function(a){this.oI=F.Wi(this,C.fV,this.oI,a)},
-gDm:function(){return this.dG},
+gbA:function(){return this.dG},
 gP9:function(a){return this.Rf},
 sP9:function(a,b){this.Rf=F.Wi(this,C.mw,this.Rf,b)},
 gCM:function(){return this.TG},
@@ -19463,8 +19495,8 @@
 gP:function(a){return this.FA},
 sP:function(a,b){this.FA=F.Wi(this,C.zd,this.FA,b)},
 gBF:function(){return this.ni!=null},
-bF:function(a,b,c){var z,y
-D.kT(b,J.wg(this.V0))
+R5:function(a,b,c){var z,y
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"class")
 this.df=F.Wi(this,C.Wt,this.df,y)
@@ -19477,7 +19509,7 @@
 y=z.t(b,"closureFunc")
 this.ni=F.Wi(this,C.aw,this.ni,y)
 y=z.t(b,"closureCtxt")
-this.Xl=F.Wi(this,C.mM,this.Xl,y)
+this.Iv=F.Wi(this,C.mM,this.Iv,y)
 y=z.t(b,"name")
 this.di=F.Wi(this,C.YS,this.di,y)
 y=z.t(b,"length")
@@ -19492,32 +19524,32 @@
 y=z.t(b,"type_class")
 this.F6=F.Wi(this,C.hx,this.F6,y)
 y=z.t(b,"user_name")
-this.z0=F.Wi(this,C.ct,this.z0,y)
+this.z0=F.Wi(this,C.Gy,this.z0,y)
 y=z.t(b,"referent")
 this.TG=F.Wi(this,C.Tc,this.TG,y)
 y=z.t(b,"key")
 this.tk=F.Wi(this,C.z6,this.tk,y)
 z=z.t(b,"value")
 this.FA=F.Wi(this,C.zd,this.FA,z)
-this.ks=!0},
+this.qu=!0},
 bu:[function(a){var z=this.lA
 return"Instance("+H.d(z!=null?z:"a "+H.d(J.DA(this.df)))+")"},"$0","gCR",0,0,73]},
 Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 lI:{
-"^":"D3i;df,MD,Jx,cM,A6,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"D3i;df,MD,Jx,cM,A6,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gky:function(a){return this.MD},
+gyT:function(a){return this.MD},
 gqH:function(){return this.Jx},
 sqH:function(a){this.Jx=F.Wi(this,C.BV,this.Jx,a)},
 gB:function(a){return this.cM},
 sB:function(a,b){this.cM=F.Wi(this,C.Wn,this.cM,b)},
 gZ3:function(){return this.A6},
 sZ3:function(a){this.A6=F.Wi(this,C.xw,this.A6,a)},
-bF:function(a,b,c){var z,y
-D.kT(b,J.wg(this.V0))
+R5:function(a,b,c){var z,y
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"size")
 this.MD=F.Wi(this,C.da,this.MD,y)
@@ -19530,44 +19562,44 @@
 this.df=F.Wi(this,C.Wt,this.df,y)
 z=z.t(b,"variables")
 this.A6=F.Wi(this,C.xw,this.A6,z)
-this.ks=!0},
+this.qu=!0},
 bu:[function(a){return"Context("+H.d(this.cM)+")"},"$0","gCR",0,0,73]},
 D3i:{
 "^":"af+Pi;",
 $isd3:true},
-yz:{
+ma:{
 "^":"a;Sf",
 bu:[function(a){return this.Sf},"$0","gCR",0,0,76],
-Q2:function(){return C.Nm.tg([$.Dh(),$.Nk(),$.zx(),$.OA()],this)},
-static:{"^":"et,jX,PZ,Bs,G8,xs,ab,Sp,Et,Ll,fJ,bt,dQ,z3,tT,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.xK()
-case"kClosureFunction":return $.HU()
-case"kGetterFunction":return $.rQ()
-case"kSetterFunction":return $.en()
+Q2:function(){return C.Nm.tg([$.b1(),$.YK(),$.zx(),$.dh()],this)},
+static:{"^":"Ij,jX,F0,Bs,G8,xs,ab,Sp,Et,Ll,HU,bt,dQ,z3,Gh,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.qu()
+case"kClosureFunction":return $.xq()
+case"kGetterFunction":return $.xW()
+case"kSetterFunction":return $.Kw()
 case"kConstructor":return $.kj()
 case"kImplicitGetter":return $.d9()
 case"kImplicitSetter":return $.AH()
 case"kStaticInitializer":return $.y5()
 case"kMethodExtractor":return $.Ot()
 case"kNoSuchMethodDispatcher":return $.E7()
-case"kInvokeFieldDispatcher":return $.bh()
-case"Collected":return $.Dh()
-case"Native":return $.Nk()
+case"kInvokeFieldDispatcher":return $.f6()
+case"Collected":return $.b1()
+case"Native":return $.YK()
 case"Tag":return $.zx()
-case"Reused":return $.OA()}return $.lC()}}},
+case"Reused":return $.dh()}return $.lC()}}},
 Kp:{
-"^":"S6L;Pp,EG,bV,GQ,fd,ar,qG,dN,v5,NM,vf,H7,I0,XN,Ph,kE,TA,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
-gP2:function(){return this.Pp},
-sP2:function(a){this.Pp=F.Wi(this,C.YV,this.Pp,a)},
+"^":"S6L;Pp,EG,bV,GQ,fd,ar,eH,dN,v5,NM,vf,H7,I0,XN,Ni,kE,Z4,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+gEl:function(){return this.Pp},
+sEl:function(a){this.Pp=F.Wi(this,C.YV,this.Pp,a)},
 gxH:function(){return this.EG},
 sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
 gFo:function(){return this.bV},
-gRh:function(){return this.GQ},
+gRs:function(){return this.GQ},
 geT:function(a){return this.fd},
 seT:function(a,b){this.fd=F.Wi(this,C.nX,this.fd,b)},
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gVF:function(){return this.qG},
-sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
+gVF:function(){return this.eH},
+sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
 gej:function(){return this.dN},
 sej:function(a){this.dN=F.Wi(this,C.Fe,this.dN,a)},
 gtT:function(a){return this.v5},
@@ -19575,19 +19607,19 @@
 gjW:function(){return this.NM},
 sjW:function(a){this.NM=F.Wi(this,C.OU,this.NM,a)},
 gW1:function(){return this.vf},
-gxL:function(){return this.H7},
+gho:function(){return this.H7},
 gfY:function(a){return this.I0},
-gOs:function(){return this.XN},
-gUx:function(){return this.Ph},
+guh:function(){return this.XN},
+gUx:function(){return this.Ni},
 gSu:function(){return this.kE},
-gMA:function(){return this.TA},
-bF:function(a,b,c){var z,y
+gMA:function(){return this.Z4},
+R5:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
 this.GR=this.ct(this,C.KS,this.GR,y)
-D.kT(b,J.wg(this.V0))
+D.kT(b,J.aT(this.x8))
 y=z.NZ(b,"owningClass")===!0?z.t(b,"owningClass"):null
 this.Pp=F.Wi(this,C.YV,this.Pp,y)
 y=z.NZ(b,"owningLibrary")===!0?z.t(b,"owningLibrary"):null
@@ -19596,7 +19628,7 @@
 y=F.Wi(this,C.Lc,this.I0,y)
 this.I0=y
 y=y.Q2()
-this.TA=F.Wi(this,C.a0,this.TA,!y)
+this.Z4=F.Wi(this,C.a0,this.Z4,!y)
 if(c)return
 y=z.t(b,"static")
 this.bV=F.Wi(this,C.AT,this.bV,y)
@@ -19607,12 +19639,12 @@
 y=z.t(b,"script")
 this.ar=F.Wi(this,C.PX,this.ar,y)
 y=z.t(b,"tokenPos")
-this.qG=F.Wi(this,C.dA,this.qG,y)
+this.eH=F.Wi(this,C.dA,this.eH,y)
 y=z.t(b,"endTokenPos")
 this.dN=F.Wi(this,C.Fe,this.dN,y)
-y=D.vQ(z.t(b,"code"))
+y=D.UW(z.t(b,"code"))
 this.v5=F.Wi(this,C.i4,this.v5,y)
-y=D.vQ(z.t(b,"unoptimizedCode"))
+y=D.UW(z.t(b,"unoptimizedCode"))
 this.NM=F.Wi(this,C.OU,this.NM,y)
 y=z.t(b,"optimizable")
 this.vf=F.Wi(this,C.Vl,this.vf,y)
@@ -19625,8 +19657,8 @@
 z=this.fd
 if(z==null){z=this.Pp
 z=z!=null?H.d(J.DA(z))+"."+H.d(this.bN):this.bN
-this.Ph=F.Wi(this,C.AO,this.Ph,z)}else{z=H.d(z.gUx())+"."+H.d(this.bN)
-this.Ph=F.Wi(this,C.AO,this.Ph,z)}},
+this.Ni=F.Wi(this,C.AO,this.Ni,z)}else{z=H.d(z.gUx())+"."+H.d(this.bN)
+this.Ni=F.Wi(this,C.AO,this.Ni,z)}},
 $isKp:true},
 wvY:{
 "^":"af+boh;"},
@@ -19634,36 +19666,36 @@
 "^":"wvY+Pi;",
 $isd3:true},
 xB:{
-"^":"Pqb;kU,Br,bV,f3,GQ,FA,bN:T6@,GR:vS@,ND,lw,jB,ar,qG,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
-gXP:function(){return this.kU},
-sXP:function(a){this.kU=F.Wi(this,C.Yp,this.kU,a)},
+"^":"Pqb;qy,Br,bV,f3,GQ,FA,bN:T6@,GR:vS@,ND,lw,ne,ar,eH,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+gXP:function(){return this.qy},
+sXP:function(a){this.qy=F.Wi(this,C.Yp,this.qy,a)},
 gOF:function(){return this.Br},
 sOF:function(a){this.Br=F.Wi(this,C.yC,this.Br,a)},
 gFo:function(){return this.bV},
 gV5:function(a){return this.f3},
-gRh:function(){return this.GQ},
+gRs:function(){return this.GQ},
 gP:function(a){return this.FA},
 sP:function(a,b){this.FA=F.Wi(this,C.zd,this.FA,b)},
 goc:function(a){return this.T6},
 soc:function(a,b){this.T6=F.Wi(this,C.YS,this.T6,b)},
-gzz:function(){return this.vS},
-szz:function(a){this.vS=F.Wi(this,C.KS,this.vS,a)},
+gTE:function(){return this.vS},
+sTE:function(a){this.vS=F.Wi(this,C.KS,this.vS,a)},
 gRl:function(){return this.ND},
 gSE:function(){return this.lw},
 sSE:function(a){this.lw=F.Wi(this,C.ft,this.lw,a)},
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gVF:function(){return this.qG},
-sVF:function(a){this.qG=F.Wi(this,C.dA,this.qG,a)},
-bF:function(a,b,c){var z,y
-D.kT(b,J.wg(this.V0))
+gVF:function(){return this.eH},
+sVF:function(a){this.eH=F.Wi(this,C.dA,this.eH,a)},
+R5:function(a,b,c){var z,y
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"name")
 this.T6=F.Wi(this,C.YS,this.T6,y)
 y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.T6
 this.vS=F.Wi(this,C.KS,this.vS,y)
 y=z.t(b,"owner")
-this.kU=F.Wi(this,C.Yp,this.kU,y)
+this.qy=F.Wi(this,C.Yp,this.qy,y)
 y=z.t(b,"declaredType")
 this.Br=F.Wi(this,C.yC,this.Br,y)
 y=z.t(b,"static")
@@ -19680,19 +19712,19 @@
 y=z.t(b,"guardClass")
 this.lw=F.Wi(this,C.ft,this.lw,y)
 y=z.t(b,"guardLength")
-this.jB=F.Wi(this,C.fX,this.jB,y)
+this.ne=F.Wi(this,C.fX,this.ne,y)
 y=z.t(b,"script")
 this.ar=F.Wi(this,C.PX,this.ar,y)
 z=z.t(b,"tokenPos")
-this.qG=F.Wi(this,C.dA,this.qG,z)
-this.ks=!0},
-bu:[function(a){return"Field("+H.d(J.DA(this.kU))+"."+H.d(this.T6)+")"},"$0","gCR",0,0,73],
+this.eH=F.Wi(this,C.dA,this.eH,z)
+this.qu=!0},
+bu:[function(a){return"Field("+H.d(J.DA(this.qy))+"."+H.d(this.T6)+")"},"$0","gCR",0,0,73],
 $isxB:true},
 Pqb:{
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":"Pi;tu>,Rd>,a4>,x9,Yp,am,Vg,ij",
+"^":"Pi;tu>,Rd>,a4>,x9,Yp,am,Vg,fn",
 gc1:function(){return this.x9},
 sc1:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
 gqr:function(){return this.Yp},
@@ -19705,7 +19737,7 @@
 jY:function(a,b,c){var z,y,x,w,v,u,t
 z=D.y8(this.a4)
 this.am=F.Wi(this,C.Jf,this.am,!z)
-for(z=this.tu,y=J.mY(J.UQ(J.wg(z.V0).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
+for(z=this.tu,y=J.mY(J.UQ(J.aT(z.x8).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
 v=J.U6(w)
 u=J.UQ(v.t(w,"location"),"script")
 t=J.UQ(v.t(w,"location"),"tokenPos")
@@ -19720,41 +19752,43 @@
 z=z.Fr(a,"")
 y=new H.a7(z,z.length,0,null)
 y.$builtinTypeInfo=[H.u3(z,0)]
-for(;y.G();)switch(y.lo){case"{":case"}":case"(":case")":case";":break
+for(;y.G();)switch(y.Ff){case"{":case"}":case"(":case")":case";":break
 default:return!1}return!0},y8:function(a){var z,y,x,w
-z=J.BQ(a,new H.VR("(\\s)+",H.Vq("(\\s)+",!1,!0,!1),null,null))
-for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.BQ(y.lo,new H.VR("(\\b)",H.Vq("(\\b)",!1,!0,!1),null,null))
+z=J.BQ(a,new H.VR("(\\s)+",H.v4("(\\s)+",!1,!0,!1),null,null))
+for(y=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.G();){x=J.BQ(y.Ff,new H.VR("(\\b)",H.v4("(\\b)",!1,!0,!1),null,null))
 w=new H.a7(x,x.length,0,null)
 w.$builtinTypeInfo=[H.u3(x,0)]
-for(;w.G();)if(!D.Fu(w.lo))return!1}return!0},Yo:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
+for(;w.G();)if(!D.Fu(w.Ff))return!1}return!0},NQ:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
 z.jY(a,b,c)
 return z}}},
 vx:{
-"^":"vix;Gd>,p3,I0,l9,nE,EG,yc,zD,MO,aQ,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"vix;Gd>,p3,I0,E4,nE,EG,yc,zD,MO,aQ,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 gxH:function(){return this.EG},
 sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
 gjm:function(){return!0},
 gM8:function(){return!0},
-rK:function(a){var z,y
+Vw:function(a){var z,y
 z=J.bI(a,1)
-y=this.Gd.xN
+y=this.Gd.XG
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 return y[z]},
 q6:function(a){return this.MO.t(0,a)},
-bF:function(a,b,c){var z,y,x
-D.kT(b,J.wg(this.V0))
+R5:function(a,b,c){var z,y,x,w
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 y=z.t(b,"name")
 this.zD=y
 x=J.U6(y)
-y=x.yn(y,x.cn(y,"/")+1)
-this.yc=y
-this.bN=this.ct(this,C.YS,this.bN,y)
-y=this.zD
-this.GR=this.ct(this,C.KS,this.GR,y)
+w=x.cn(y,"/")
+if(typeof w!=="number")return w.g()
+w=x.yn(y,w+1)
+this.yc=w
+this.bN=this.ct(this,C.YS,this.bN,w)
+w=this.zD
+this.GR=this.ct(this,C.KS,this.GR,w)
 if(c)return
 this.Aj(z.t(b,"source"))
 this.YG(z.t(b,"tokenPosTable"))
@@ -19766,9 +19800,9 @@
 z.V1(0)
 y=this.aQ
 y.V1(0)
-this.l9=F.Wi(this,C.Gd,this.l9,null)
-this.nE=F.Wi(this,C.qa,this.nE,null)
-x=P.fM(null,null,null,null)
+this.E4=F.Wi(this,C.Gd,this.E4,null)
+this.nE=F.Wi(this,C.kA,this.nE,null)
+x=P.Ls(null,null,null,null)
 for(w=J.mY(a);w.G();){v=w.gl()
 u=J.U6(v)
 t=u.t(v,0)
@@ -19779,25 +19813,25 @@
 if(!(s<r))break
 q=u.t(v,s)
 p=u.t(v,s+1)
-r=this.l9
+r=this.E4
 if(r==null){if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.Gd,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.l9=q
+this.nq(this,r)}this.E4=q
 r=this.nE
-if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.qa,r,q)
+if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.kA,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.l9:q
-o=this.l9
+this.nq(this,r)}this.nE=q}else{r=J.Bl(r,q)?this.E4:q
+o=this.E4
 if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.Gd,o,r)
 o.$builtinTypeInfo=[null]
-this.nq(this,o)}this.l9=r
+this.nq(this,o)}this.E4=r
 r=J.J5(this.nE,q)?this.nE:q
 o=this.nE
-if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.qa,o,r)
+if(this.gnz(this)&&!J.xC(o,r)){o=new T.qI(this,C.kA,o,r)
 o.$builtinTypeInfo=[null]
 this.nq(this,o)}this.nE=r}z.u(0,q,t)
 y.u(0,q,p)
-s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.lo
+s+=2}}for(z=this.Gd,z=z.gA(z);z.G();){v=z.Ff
 if(!x.tg(0,J.f2(v)))v.sj9(!1)}},
 lV:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
@@ -19810,20 +19844,20 @@
 u=z.t(a,x+1)
 t=y.t(0,v)
 y.u(0,v,t!=null?J.WB(u,t):u)
-x+=2}this.xz()},
+x+=2}this.f2()},
 Aj:function(a){var z,y,x,w
-this.ks=!1
+this.qu=!1
 if(a==null)return
 z=J.BQ(a,"\n")
 if(z.length===0)return
-this.ks=!0
+this.qu=!0
 y=this.Gd
 y.V1(y)
 N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.zD))
 for(x=0;x<z.length;x=w){w=x+1
-y.h(0,D.Yo(this,w,z[x]))}this.xz()},
-xz:function(){var z,y,x
-for(z=this.Gd,z=z.gA(z),y=this.p3;z.G();){x=z.lo
+y.h(0,D.NQ(this,w,z[x]))}this.f2()},
+f2:function(){var z,y,x
+for(z=this.Gd,z=z.gA(z),y=this.p3;z.G();){x=z.Ff
 x.sc1(y.t(0,J.f2(x)))}},
 $isvx:true},
 Vlh:{
@@ -19832,18 +19866,18 @@
 "^":"Vlh+Pi;",
 $isd3:true},
 uA:{
-"^":"a;Yu<,Du<,pn<",
+"^":"a;Yu<,Du<,fF<",
 $isuA:true},
-xb:{
-"^":"Pi;Yu<,p4,VF<,Yn,fY>,ar,GL,Vg,ij",
+Z9:{
+"^":"Pi;Yu<,p4,VF<,Yn,fY>,ar,up,Vg,fn",
 gtu:function(a){return this.ar},
 stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gP3:function(){return this.GL},
+gmE:function(){return this.up},
 JM:[function(){var z,y
 z=this.p4
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gqE",0,0,73],
+return y.bu(z)},"$0","gkA",0,0,73],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -19851,19 +19885,19 @@
 y=a.q6(z)
 if(y==null)return
 this.ar=F.Wi(this,C.PX,this.ar,a)
-z=J.dY(a.rK(y))
-this.GL=F.Wi(this,C.oI,this.GL,z)},
-$isxb:true},
-hn:{
-"^":"nla;df,MD,uH<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+z=J.dY(a.Vw(y))
+this.up=F.Wi(this,C.oI,this.up,z)},
+$isZ9:true},
+Hx:{
+"^":"nla;df,MD,uH<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gky:function(a){return this.MD},
+gyT:function(a){return this.MD},
 gjm:function(){return!1},
 gM8:function(){return!0},
-bF:function(a,b,c){var z,y,x,w
+R5:function(a,b,c){var z,y,x,w
 if(c)return
-D.kT(b,J.wg(this.V0))
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"class")
 this.df=F.Wi(this,C.Wt,this.df,y)
@@ -19873,23 +19907,23 @@
 y.V1(y)
 for(z=J.mY(z.t(b,"members"));z.G();){x=z.gl()
 w=J.U6(x)
-y.h(0,new D.xb(H.BU(w.t(x,"pc"),16,null),w.t(x,"deoptId"),w.t(x,"tokenPos"),w.t(x,"tryIndex"),J.iY(w.t(x,"kind")),null,null,null,null))}}},
+y.h(0,new D.Z9(H.BU(w.t(x,"pc"),16,null),w.t(x,"deoptId"),w.t(x,"tokenPos"),w.t(x,"tryIndex"),J.rr(w.t(x,"kind")),null,null,null,null))}}},
 nla:{
 "^":"af+Pi;",
 $isd3:true},
 br:{
-"^":"Pi;oc>,vH>,eb,Jb>,ePv,fY>,Vg,ij",
+"^":"Pi;oc>,vH>,eb,Ml>,ePv,fY>,Vg,fn",
 $isbr:true},
 Mi:{
-"^":"Fba;df,MD,uH<,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"Fba;df,MD,uH<,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gky:function(a){return this.MD},
+gyT:function(a){return this.MD},
 gjm:function(){return!1},
 gM8:function(){return!0},
-bF:function(a,b,c){var z,y,x,w
+R5:function(a,b,c){var z,y,x,w
 if(c)return
-D.kT(b,J.wg(this.V0))
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"class")
 this.df=F.Wi(this,C.Wt,this.df,y)
@@ -19899,20 +19933,20 @@
 y.V1(y)
 for(z=J.mY(z.t(b,"members"));z.G();){x=z.gl()
 w=J.U6(x)
-y.h(0,new D.br(w.t(x,"name"),w.t(x,"index"),w.t(x,"beginPos"),w.t(x,"endPos"),w.t(x,"scopeId"),J.iY(w.t(x,"kind")),null,null))}}},
+y.h(0,new D.br(w.t(x,"name"),w.t(x,"index"),w.t(x,"beginPos"),w.t(x,"endPos"),w.t(x,"scopeId"),J.rr(w.t(x,"kind")),null,null))}}},
 Fba:{
 "^":"af+Pi;",
 $isd3:true},
-Ik:{
-"^":"laa;df,MD,C9,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+RA:{
+"^":"laa;df,MD,C9,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gUP:function(){return this.df},
 sUP:function(a){this.df=F.Wi(this,C.Wt,this.df,a)},
-gky:function(a){return this.MD},
+gyT:function(a){return this.MD},
 gjm:function(){return!1},
 gM8:function(){return!0},
-bF:function(a,b,c){var z,y
+R5:function(a,b,c){var z,y
 if(c)return
-D.kT(b,J.wg(this.V0))
+D.kT(b,J.aT(this.x8))
 z=J.U6(b)
 y=z.t(b,"class")
 this.df=F.Wi(this,C.Wt,this.df,y)
@@ -19924,26 +19958,26 @@
 "^":"af+Pi;",
 $isd3:true},
 Q4:{
-"^":"Pi;Yu<,m7E,u0<,dh,uH<,Vg,ij",
-gnp:function(){return this.dh},
+"^":"Pi;Yu<,m7E,u0<,dh,uH<,Vg,fn",
+gEB:function(){return this.dh},
 gUB:function(){return J.xC(this.Yu,0)},
-ghR:function(){return this.uH.xN.length>0},
-dV:[function(){var z,y
+gX1:function(){return this.uH.XG.length>0},
+xtx:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
 return"0x"+y.WZ(z,16)},"$0","gZd",0,0,73],
 tU:[function(a){var z
 if(a==null)return""
-z=a.gn3().tf.t(0,this.Yu)
+z=a.gn3().LL.t(0,this.Yu)
 if(z==null)return""
-if(J.xC(z.gpn(),z.gDu()))return""
-return D.Tn(z.gpn(),a.glt())+" ("+H.d(z.gpn())+")"},"$1","gcQ",2,0,219,78],
+if(J.xC(z.gfF(),z.gDu()))return""
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,219,78],
 P7:[function(a){var z
 if(a==null)return""
-z=a.gn3().tf.t(0,this.Yu)
+z=a.gn3().LL.t(0,this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gAX",2,0,219,78],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,219,78],
 lF:function(){var z,y,x,w
 y=J.BQ(this.u0," ")
 x=y.length
@@ -19959,15 +19993,15 @@
 if(!J.co(z,"j"))return
 y=this.lF()
 x=J.x(y)
-if(x.n(y,0)){N.QM("").YX("Could not determine jump address for "+H.d(z))
-return}for(z=a.xN,w=0;w<z.length;++w){v=z[w]
+if(x.n(y,0)){N.QM("").hh("Could not determine jump address for "+H.d(z))
+return}for(z=a.XG,w=0;w<z.length;++w){v=z[w]
 if(J.xC(v.gYu(),y)){z=this.dh
 if(this.gnz(this)&&!J.xC(z,v)){z=new T.qI(this,C.b5,z,v)
 z.$builtinTypeInfo=[null]
 this.nq(this,z)}this.dh=v
-return}}N.QM("").YX("Could not find instruction at "+x.WZ(y,16))},
+return}}N.QM("").hh("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
-static:{Tn:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
+static:{Tn:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
 bu:[function(a){return this.uX},"$0","gCR",0,0,73],
@@ -19975,18 +20009,18 @@
 if(z.n(a,"Native"))return C.Oc
 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.AA
-else if(z.n(a,"Tag"))return C.oA
+else if(z.n(a,"Reused"))return C.yP
+else if(z.n(a,"Tag"))return C.Z7
 N.QM("").j2("Unknown code kind "+H.d(a))
 throw H.b(P.a9())}}},
 ta:{
 "^":"a;tT>,Av<",
 $ista:true},
-TH:{
-"^":"a;tT>,Av<,qu>,Jv",
-$isTH:true},
+D5:{
+"^":"a;tT>,Av<,ks>,Jv",
+$isD5:true},
 kx:{
-"^":"w25;I0,xM,Du<,pn<,vg,QA,VS,hw,va<,n3<,mM,rF,fo,uG,ar,MH,Mk,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"w28;I0,xM,Du<,fF<,vg,uE,VS,hw,va<,n3<,mM,rF,fo,uG,ar,MH,Mk,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gfY:function(a){return this.I0},
 glt:function(){return this.xM},
 gS7:function(){return this.mM},
@@ -20002,16 +20036,16 @@
 gM8:function(){return!0},
 P8:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gH8",2,0,220,221],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.Ff.guH(),y=y.gA(y);y.G();)y.Ff.bR(a)},"$1","gH8",2,0,220,221],
 QW:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
 var z=this.uG
 if(z==null)return
-if(J.fx(z)==null){J.SK(this.uG).ml(new D.fA(this))
-return}J.SK(J.fx(this.uG)).ml(this.gH8())},
+if(J.zE(z)==null){J.SK(this.uG).ml(new D.Em(this))
+return}J.SK(J.zE(this.uG)).ml(this.gH8())},
 VD:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.VD.call(this,this)
 return P.Ab(this,null)},
-GK:function(a,b,c){var z,y,x,w,v
+ui:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=0
 while(!0){x=z.gB(b)
@@ -20021,21 +20055,21 @@
 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 D.ta(c[w],v))
-y+=2}H.ig(a,new D.jm())},
+y+=2}H.ig(a,new D.fx())},
 Il:function(a,b,c){var z,y
-this.xM=F.Wi(this,C.Kj,this.xM,c)
+this.xM=F.Wi(this,C.kr,this.xM,c)
 z=J.U6(a)
-this.pn=H.BU(z.t(a,"inclusive_ticks"),null,null)
+this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
 this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
-this.GK(this.VS,z.t(a,"callers"),b)
-this.GK(this.hw,z.t(a,"callees"),b)
+this.ui(this.VS,z.t(a,"callers"),b)
+this.ui(this.hw,z.t(a,"callees"),b)
 y=z.t(a,"ticks")
 if(y!=null)this.Zk(y)
-z=D.Rd(this.pn,this.xM)+" ("+H.d(this.pn)+")"
+z=D.Rd(this.fF,this.xM)+" ("+H.d(this.fF)+")"
 this.mM=F.Wi(this,C.eF,this.mM,z)
 z=D.Rd(this.Du,this.xM)+" ("+H.d(this.Du)+")"
 this.rF=F.Wi(this,C.uU,this.rF,z)},
-bF:function(a,b,c){var z,y,x,w,v,u
+R5:function(a,b,c){var z,y,x,w,v,u
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
@@ -20046,8 +20080,8 @@
 y=D.CQ(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 this.vg=H.BU(z.t(b,"start"),16,null)
-this.QA=H.BU(z.t(b,"end"),16,null)
-y=this.V0
+this.uE=H.BU(z.t(b,"end"),16,null)
+y=this.x8
 x=J.RE(y)
 w=x.god(y).Qn(z.t(b,"function"))
 this.uG=F.Wi(this,C.nf,this.uG,w)
@@ -20057,8 +20091,8 @@
 if(v!=null)this.cr(v)
 u=z.t(b,"descriptors")
 if(u!=null)this.Xd(J.UQ(u,"members"))
-z=this.va.xN
-this.ks=z.length!==0||!J.xC(this.I0,C.l8)
+z=this.va.XG
+this.qu=z.length!==0||!J.xC(this.I0,C.l8)
 z=z.length!==0&&J.xC(this.I0,C.l8)
 this.Mk=F.Wi(this,C.zS,this.Mk,z)},
 gUa:function(){return this.Mk},
@@ -20073,22 +20107,22 @@
 v=y.t(a,x+1)
 u=y.t(a,x+2)
 t=!J.xC(y.t(a,x),"")?H.BU(y.t(a,x),null,null):0
-w=D.xb
+w=D.Z9
 s=[]
 s.$builtinTypeInfo=[w]
 s=new Q.wn(null,null,s,null,null)
 s.$builtinTypeInfo=[w]
 z.h(0,new D.Q4(t,v,u,null,s,null,null))
-x+=3}for(y=z.gA(z);y.G();)y.lo.pj(z)},
+x+=3}for(y=z.gA(z);y.G();)y.Ff.pj(z)},
 MY:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=H.BU(z.t(a,"pc"),16,null)
 x=z.t(a,"deoptId")
 w=z.t(a,"tokenPos")
 v=z.t(a,"tryIndex")
-u=J.iY(z.t(a,"kind"))
-for(z=this.va,z=z.gA(z);z.G();){t=z.lo
-if(J.xC(t.gYu(),y)){t.guH().h(0,new D.xb(y,x,w,v,u,null,null,null,null))
+u=J.rr(z.t(a,"kind"))
+for(z=this.va,z=z.gA(z);z.G();){t=z.Ff
+if(J.xC(t.gYu(),y)){t.guH().h(0,new D.Z9(y,x,w,v,u,null,null,null,null))
 return}}N.QM("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
 Xd:function(a){var z
 for(z=J.mY(a);z.G();)this.MY(z.gl())},
@@ -20103,29 +20137,29 @@
 y.u(0,v,new D.uA(v,H.BU(z.t(a,x+1),null,null),H.BU(z.t(a,x+2),null,null)))
 x+=3}},
 tg:function(a,b){var z=J.Wx(b)
-return z.F(b,this.vg)&&z.C(b,this.QA)},
-gqy:function(){return J.xC(this.I0,C.l8)},
+return z.F(b,this.vg)&&z.C(b,this.uE)},
+gcE:function(){return J.xC(this.I0,C.l8)},
 $iskx:true,
-static:{Rd:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
-w25:{
+static:{Rd:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
+w28:{
 "^":"af+Pi;",
 $isd3:true},
-fA:{
+Em:{
 "^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=this.a
-y=J.fx(z.uG)
+y=J.zE(z.uG)
 if(y==null)return
 J.SK(y).ml(z.gH8())},"$1",null,2,0,null,222,"call"],
 $isEH:true},
-jm:{
+fx:{
 "^":"TpZ:81;",
 $2:function(a,b){return J.bI(b.gAv(),a.gAv())},
 $isEH:true},
 M9x:{
 "^":"a;uX",
 bu:[function(a){return this.uX},"$0","gCR",0,0,73],
-static:{"^":"Cnk,lTU,FJy,wjk",AR:function(a){var z=J.x(a)
+static:{"^":"Cnk,qp,FJy,wr",AR:function(a){var z=J.x(a)
 if(z.n(a,"Listening"))return C.Cn
 else if(z.n(a,"Normal"))return C.lT
 else if(z.n(a,"Pipe"))return C.FJ
@@ -20133,21 +20167,21 @@
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"w26;V8@,jel,IHj,I0,vu,e5,ho,SI,L7,zw,tO,HO,u8,Wm,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"w29;ip@,jel,IHj,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gjm:function(){return!0},
 gHY:function(){return J.xC(this.I0,C.FJ)},
 gfY:function(a){return this.I0},
-gA8:function(a){return this.vu},
-gm8:function(){return this.e5},
-gSY:function(){return this.ho},
-gmy:function(){return this.SI},
+gaB:function(a){return this.vu},
+gm8:function(){return this.DB},
+gaU:function(){return this.XK},
+gaP:function(){return this.FH},
 gzM:function(){return this.L7},
-gq2:function(){return this.zw},
+gki:function(){return this.zw},
 giP:function(){return this.tO},
-gbB:function(){return this.HO},
+gfJ:function(){return this.HO},
 gNS:function(){return this.u8},
-gzK:function(){return this.Wm},
-bF:function(a,b,c){var z,y
+gzK:function(){return this.EC},
+R5:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
@@ -20156,14 +20190,14 @@
 y=D.AR(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 if(c)return
-this.ks=!0
-D.kT(b,J.wg(this.V0))
+this.qu=!0
+D.kT(b,J.aT(this.x8))
 y=z.t(b,"readClosed")
-this.e5=F.Wi(this,C.I7,this.e5,y)
+this.DB=F.Wi(this,C.I7,this.DB,y)
 y=z.t(b,"writeClosed")
-this.ho=F.Wi(this,C.Uy,this.ho,y)
+this.XK=F.Wi(this,C.Uy,this.XK,y)
 y=z.t(b,"closing")
-this.SI=F.Wi(this,C.To,this.SI,y)
+this.FH=F.Wi(this,C.To,this.FH,y)
 y=z.t(b,"listening")
 this.L7=F.Wi(this,C.cc,this.L7,y)
 y=z.t(b,"protocol")
@@ -20175,37 +20209,37 @@
 y=z.t(b,"remoteAddress")
 this.u8=F.Wi(this,C.dx,this.u8,y)
 y=z.t(b,"remotePort")
-this.Wm=F.Wi(this,C.ni,this.Wm,y)
+this.EC=F.Wi(this,C.ni,this.EC,y)
 y=z.t(b,"fd")
 this.zw=F.Wi(this,C.R3,this.zw,y)
-this.V8=z.t(b,"owner")}},
-w26:{
+this.ip=z.t(b,"owner")}},
+w29:{
 "^":"af+Pi;",
 $isd3:true},
 G9:{
 "^":"a;P>,Fl<",
 $isG9:true},
 YX:{
-"^":"w27;L5,mw@,Jk<,kB,Qd,FA,zn,ay,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"w30;L5,mw@,Jk<,wE,Qd,FA,zn,LV,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 gjm:function(){return!0},
 gM8:function(){return!1},
-ghM:function(){return this.kB},
-shM:function(a){this.kB=a
-this.nW()},
+ghM:function(){return this.wE},
+shM:function(a){this.wE=a
+this.Hi()},
 NT:function(a){this.Jk.h(0,a)
-this.nW()},
-nW:function(){var z,y,x
+this.Hi()},
+Hi:function(){var z,y,x
 z=this.Jk
-y=z.xN.length
-x=this.kB
+y=z.XG.length
+x=this.wE
 if(typeof x!=="number")return H.s(x)
 if(y>x)z.oq(0,0,y-x)},
-gQZ:function(){return this.Qd},
+gGB:function(){return this.Qd},
 gP:function(a){return this.FA},
 sP:function(a,b){this.FA=F.Wi(this,C.zd,this.FA,b)},
 gBp:function(a){return this.zn},
-gA5:function(a){return this.ay},
-bF:function(a,b,c){var z,y
+gA5:function(a){return this.LV},
+R5:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
 this.bN=this.ct(this,C.YS,this.bN,y)
@@ -20218,19 +20252,19 @@
 y=z.t(b,"min")
 this.zn=F.Wi(this,C.a2,this.zn,y)
 z=z.t(b,"max")
-this.ay=F.Wi(this,C.qi,this.ay,z)},
-bu:[function(a){return"ServiceMetric("+H.d(this.r0)+")"},"$0","gCR",0,0,73],
+this.LV=F.Wi(this,C.qi,this.LV,z)},
+bu:[function(a){return"ServiceMetric("+H.d(this.TU)+")"},"$0","gCR",0,0,73],
 $isYX:true},
-w27:{
+w30:{
 "^":"af+Pi;",
 $isd3:true},
 W1:{
-"^":"a;fj<,MT>,Cb",
+"^":"a;Jb<,MT>,Cb",
 Gv:function(){var z=this.Cb
 if(z!=null)z.Gv()
 this.Cb=null},
-Lyg:[function(a,b){var z,y,x,w
-for(z=this.fj,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=J.LE(z.lo)
+Y0:[function(a,b){var z,y,x,w
+for(z=this.Jb,z=H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.G();){y=J.LE(z.Ff)
 y.toString
 x=$.X3
 w=new P.Gc(0,x,null,null,x.cR(new D.r6()),null,P.VH(null,$.X3),null)
@@ -20250,17 +20284,17 @@
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
-if(y&&D.D5(b))this.a.u(0,a,this.b.Qn(b))
+if(y&&D.bF(b))this.a.u(0,a,this.b.Qn(b))
 else if(!!z.$iswn)D.f3(b,this.b)
 else if(y)D.Gf(b,this.b)},
 $isEH:true}}],["","",,L,{
 "^":"",
 Z5:{
-"^":"a;FH@,A9<,oc*,w8<",
+"^":"a;eX@,A9<,oc*,w8<",
 gp8:function(){return this.A9!==!0},
-Lt:function(){return P.EF(["lastConnectionTime",this.FH,"chrome",this.A9,"name",this.oc,"networkAddress",this.w8],null,null)},
+Lt:function(){return P.EF(["lastConnectionTime",this.eX,"chrome",this.A9,"name",this.oc,"networkAddress",this.w8],null,null)},
 UT:function(a){var z=J.U6(a)
-this.FH=z.t(a,"lastConnectionTime")
+this.eX=z.t(a,"lastConnectionTime")
 this.A9=z.t(a,"chrome")
 this.oc=z.t(a,"name")
 z=z.t(a,"networkAddress")
@@ -20270,47 +20304,49 @@
 static:{K9:function(a){var z=new L.Z5(0,!1,null,null)
 z.UT(a)
 return z}}},
-Z8:{
-"^":"a;jO>,mh<",
-$isZ8:true},
+U2:{
+"^":"a;jO>,qT<",
+$isU2:true},
 Uon:{
 "^":"wv;N>",
 gEH:function(){return this.Tn.MM},
-FZ:function(){var z=this.Fq.MM
+FZ:function(){if(!this.ib)return
+var z=this.Fq.MM
 if(z.YM===0){N.QM("").To("WebSocketVM connection error: "+H.d(this.N.gw8()))
 if(z.YM!==0)H.vh(P.w("Future already completed"))
 z.Xf(this)}},
 giG:function(a){return this.Fq.MM},
 je:function(a){if(this.Sl)this.Ra.bs.close()
-this.C8()
+this.M0()
 this.FZ()},
 z6:function(a,b){var z,y,x
 if(!this.Sl){this.Sl=!0
 this.Ra.Tc(this.N.gw8(),this.gkQ(),this.gM3(),this.gCW(),this.gNu())}z=C.jn.bu(this.x7++)
 y=P.qU
 y=H.VM(new P.Zf(P.Dt(y)),[y])
-x=new L.Z8(b,y)
+x=new L.U2(b,y)
 if(this.Ra.bs.readyState===1)this.Mf(z,x)
 else this.WE.u(0,z,x)
 return y.MM},
-abp:[function(){this.C8()
+abp:[function(){this.M0()
 this.FZ()},"$0","gNu",0,0,17],
-Xs:[function(){this.C8()
+Xs:[function(){this.M0()
 this.FZ()},"$0","gCW",0,0,17],
-LN:[function(){var z,y
+LNZ:[function(){var z,y
 z=this.N
 y=Date.now()
 new P.iP(y,!1).EK()
-z.sFH(y)
+z.seX(y)
 this.e2()
+this.ib=!0
 y=this.Tn.MM
 if(y.YM===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
 if(y.YM!==0)H.vh(P.w("Future already completed"))
 y.Xf(this)}},"$0","gkQ",0,0,17],
 PW:[function(a){var z,y,x,w,v
 if(typeof a!=="string"){this.Ra.OI(a).ml(new L.jF(this))
-return}z=C.xr.kV(a)
-if(z==null){N.QM("").YX("WebSocketVM got empty message")
+return}z=C.xr.iQ(a)
+if(z==null){N.QM("").hh("WebSocketVM got empty message")
 return}if(this.N.gA9()===!0){y=J.U6(z)
 if(!J.xC(y.t(z,"method"),"Dart.observatoryData"))return
 x=J.AG(J.UQ(y.t(z,"params"),"id"))
@@ -20318,13 +20354,13 @@
 x=y.t(z,"seq")
 w=y.t(z,"response")}if(x==null){this.EM(w)
 return}v=this.Td.Rz(0,x)
-if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
-return}y=v.gmh().MM
+if(v==null){N.QM("").hh("Received unexpected message: "+H.d(z))
+return}y=v.gqT().MM
 if(y.YM!==0)H.vh(P.w("Future already completed"))
 y.Xf(w)},"$1","gM3",2,0,19],
-ck:function(a){a.aN(0,new L.dV(this))
+ck:function(a){a.aN(0,new L.aZ(this))
 a.V1(0)},
-C8:function(){var z=this.Td
+M0:function(){var z=this.Td
 if(z.X5>0){N.QM("").To("Cancelling all pending requests.")
 this.ck(z)}z=this.WE
 if(z.X5>0){N.QM("").To("Cancelling all delayed requests.")
@@ -20344,13 +20380,13 @@
 "^":"TpZ:224;a",
 $1:[function(a){var z,y,x,w,v,u,t
 z=J.RE(a)
-y=z.mt(a,0,C.eL)
+y=z.mt(a,0,C.it)
 x=this.a
 w=z.gbg(a)
 v=z.gVl(a)
 if(typeof v!=="number")return v.g()
 w.toString
-u=x.Ur.WJ(H.GG(w,v+8,y))
+u=x.Ur.Sw(H.z4(w,v+8,y))
 t=C.jn.g(8,y)
 v=z.gbg(a)
 w=z.gVl(a)
@@ -20359,10 +20395,10 @@
 if(typeof z!=="number")return z.W()
 x.hQ(u,J.cm(v,w+t,z-t))},"$1",null,2,0,null,15,"call"],
 $isEH:true},
-dV:{
+aZ:{
 "^":"TpZ:225;a",
 $2:function(a,b){var z,y
-z=b.gmh()
+z=b.gqT()
 y=C.xr.KP(P.EF(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null))
 z=z.MM
 if(z.YM!==0)H.vh(P.w("Future already completed"))
@@ -20370,16 +20406,16 @@
 $isEH:true}}],["","",,R,{
 "^":"",
 zM:{
-"^":"V57;S4,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V57;S4,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gkc:function(a){return a.S4},
 skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
-static:{ZmK:function(a){var z,y,x,w
+static:{qa:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20394,24 +20430,24 @@
 $isd3:true}}],["","",,D,{
 "^":"",
 Rk:{
-"^":"V58;D1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gja:function(a){return a.D1},
-sja:function(a,b){a.D1=this.ct(a,C.ne,a.D1,b)},
+"^":"V58;Xc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gja:function(a){return a.Xc},
+sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
 static:{bZp:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.kgQ.LX(a)
-C.kgQ.XI(a)
+C.Vd.LX(a)
+C.Vd.XI(a)
 return a}}},
 V58:{
 "^":"uL+Pi;",
@@ -20419,29 +20455,29 @@
 "^":"",
 hA:{
 "^":"a;bs",
-Tc:function(a,b,c,d,e){var z=W.D7(a,null)
+Tc:function(a,b,c,d,e){var z=W.P0(a,null)
 this.bs=z
-z=H.VM(new W.vG(z,"close",!1),[null])
+z=H.VM(new W.RO(z,C.d6.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.lo(e)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.vG(z,"error",!1),[null])
+z=H.VM(new W.RO(z,C.MD.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.j3(d)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.vG(z,"open",!1),[null])
+z=H.VM(new W.RO(z,C.JL.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.Fz(b)),z.el),[H.u3(z,0)]).DN()
 z=this.bs
 z.toString
-z=H.VM(new W.vG(z,"message",!1),[null])
+z=H.VM(new W.RO(z,C.ph.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(new U.oy(c)),z.el),[H.u3(z,0)]).DN()},
 wR:function(a,b){this.bs.send(b)},
 xO:function(a){this.bs.close()},
 OI:function(a){var z,y
 z=new FileReader()
 z.readAsArrayBuffer(a)
-y=H.VM(new W.vG(z,"loadend",!1),[null])
-return y.gtH(y).ml(new U.OW(z))}},
+y=H.VM(new W.RO(z,C.G5.fA,!1),[null])
+return y.gqG(y).ml(new U.OW(z))}},
 lo:{
 "^":"TpZ:12;a",
 $1:[function(a){return this.a.$0()},"$1",null,2,0,null,226,"call"],
@@ -20463,13 +20499,13 @@
 $1:[function(a){return J.cm(C.kL.gyG(this.a),0,null)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 KM:{
-"^":"Uon;Tn,Fq,N,WE,Td,x7,Sl,Ur,Ra,Ox,GY,RW,Ts,Va,h7,jA,Li,G2,Rk,uj,Qi,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"Uon;Tn,Fq,N,WE,Td,x7,Sl,ib,Ur,Ra,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 $isKM:true},
 dS:{
-"^":"wv;eG,iW,S3,yb,Ox,GY,RW,Ts,Va,h7,jA,Li,G2,Rk,uj,Qi,Vg,ij,V0,r0,oU,JK,ks,bN,GR,mQ,Vg,ij",
+"^":"wv;eG,rp,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,x8,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
 je:function(a){},
 gEH:function(){return this.eG.MM},
-giG:function(a){return this.iW.MM},
+giG:function(a){return this.rp.MM},
 j03:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -20488,16 +20524,16 @@
 y.u(0,"query",H.d(b));++this.yb
 x=H.VM(new P.Zf(P.Dt(null)),[null])
 this.S3.u(0,z,x)
-J.bb(W.Pv(window.parent),C.xr.KP(y),"*")
+J.tT(W.Pv(window.parent),C.xr.KP(y),"*")
 return x.MM},
-ZH:function(){var z=H.VM(new W.vG(window,"message",!1),[null])
+ZH:function(){var z=H.VM(new W.RO(window,C.ph.fA,!1),[null])
 H.VM(new W.Ov(0,z.bi,z.fA,W.Yt(this.gDi()),z.el),[H.u3(z,0)]).DN()
 z=this.eG.MM
 if(z.YM!==0)H.vh(P.w("Future already completed"))
 z.Xf(this)}}}],["","",,U,{
 "^":"",
 Ti:{
-"^":"V59;Ll,Sa,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V59;Ll,Sa,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gWA:function(a){return a.Ll},
 sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
 gl6:function(a){return a.Sa},
@@ -20507,7 +20543,7 @@
 J.CJ(z,a.Ll)
 return z
 case"BreakpointList":z=W.r3("breakpoint-list",null)
-J.oJ(z,a.Ll)
+J.o3(z,a.Ll)
 return z
 case"Class":z=W.r3("class-view",null)
 J.NZ(z,a.Ll)
@@ -20558,7 +20594,7 @@
 J.A4(z,a.Ll)
 return z
 case"WebSocket":z=W.r3("io-web-socket-view",null)
-J.w7(z,a.Ll)
+J.tH(z,a.Ll)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
 J.Rp(z,a.Ll)
@@ -20617,21 +20653,21 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Ns.LX(a)
-C.Ns.XI(a)
+C.Uv.LX(a)
+C.Uv.XI(a)
 return a}}},
 V59:{
 "^":"uL+Pi;",
 $isd3:true},
 Um:{
-"^":"V60;dL,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V60;dL,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gBN:function(a){return a.dL},
 sBN:function(a,b){a.dL=this.ct(a,C.nE,a.dL,b)},
 static:{T21:function(a){var z,y,x,w
@@ -20640,7 +20676,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20654,13 +20690,13 @@
 "^":"uL+Pi;",
 $isd3:true},
 VZ:{
-"^":"V61;GW,C7,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V61;GW,C7,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gIr:function(a){return a.GW},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.GW=this.ct(a,C.SR,a.GW,b)},
 git:function(a){return a.C7},
 sit:function(a,b){a.C7=this.ct(a,C.B0,a.C7,b)},
-ITt:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
+hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
 Cpp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,166],
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
@@ -20672,61 +20708,61 @@
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.C7=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.vmJ.LX(a)
-C.vmJ.XI(a)
+C.OX.LX(a)
+C.OX.XI(a)
 return a}}},
 V61:{
 "^":"uL+Pi;",
 $isd3:true},
 WG:{
-"^":"V62;Jg,C7,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V62;Jg,C7,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gjx:function(a){return a.Jg},
 sjx:function(a,b){a.Jg=this.ct(a,C.vp,a.Jg,b)},
 git:function(a){return a.C7},
 sit:function(a,b){a.C7=this.ct(a,C.B0,a.C7,b)},
-ITt:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
+hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,166],
 Cpp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,166],
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
 vQ:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
 c.$0()},"$2","gus",4,0,230,231,102],
-static:{KTC:function(a){var z,y,x,w
+static:{z0:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
 a.C7=!1
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.dl.LX(a)
-C.dl.XI(a)
+C.DX.LX(a)
+C.DX.XI(a)
 return a}}},
 V62:{
 "^":"uL+Pi;",
 $isd3:true}}],["","",,Q,{
 "^":"",
 xI:{
-"^":"Dsd;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"Dsd;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gnv:function(a){return a.tY},
 snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
-gjT:function(a){return a.R1},
-sjT:function(a,b){a.R1=this.ct(a,C.uu,a.R1,b)},
+gjT:function(a){return a.Pe},
+sjT:function(a,b){a.Pe=this.ct(a,C.uu,a.Pe,b)},
 Qj:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
 this.ct(a,C.pu,0,1)
-this.ct(a,C.k6,"",this.gJp(a))},"$1","gBj",2,0,19,59],
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,19,59],
 gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 z=J.Ds(z)
@@ -20734,7 +20770,7 @@
 return"#"+H.d(z)},
 gJp:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},
+return z.gTE()},
 goc:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 return J.DA(z)},
@@ -20745,8 +20781,8 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20760,7 +20796,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 f7:{
-"^":"V63;tY,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V63;tY,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gnv:function(a){return a.tY},
 snv:function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},
 pY:function(a){var z
@@ -20804,14 +20840,14 @@
 x=this.pY(a)
 if(x==null){N.QM("").To("Unable to find a ref element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gBj",2,0,12,59],
-static:{wzV:function(a){var z,y,x,w
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gLe",2,0,12,59],
+static:{nk:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20825,15 +20861,15 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ce:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{FMr:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -20845,14 +20881,14 @@
 return a}}}}],["","",,Q,{
 "^":"",
 CY:{
-"^":"ImK;kF,IK,bP,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"ImK;kF,IK,bP,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gd4:function(a){return a.kF},
 sd4:function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},
 gEu:function(a){return a.IK},
 sEu:function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
-oew:[function(a,b,c,d){var z=J.rp((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+oew:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
 a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,116,2,232,107],
 static:{AlS:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -20860,23 +20896,23 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.zb.LX(a)
-C.zb.XI(a)
+C.Yo.LX(a)
+C.Yo.XI(a)
 return a}}},
 ImK:{
 "^":"xc+Pi;",
 $isd3:true}}],["","",,A,{
 "^":"",
 rv:{
-"^":"a;kl,IW,Mg,nN,ER,Ja,BY,rM",
-WO:function(a,b){return this.rM.$1(b)},
+"^":"a;kl,IW,Mg,Yx,ER,Ja,BY,rM",
+xZ:function(a,b){return this.rM.$1(b)},
 bu:[function(a){var z=P.p9("")
 z.KF("(options:")
 z.KF(this.kl?"fields ":"")
@@ -20887,12 +20923,11 @@
 z.KF("annotations: "+H.d(this.BY))
 z.KF(this.rM!=null?"with matcher":"")
 z.KF(")")
-z=z.IN
-return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,73]},
+return z.IN},"$0","gCR",0,0,73]},
 ES:{
 "^":"a;oc>,fY>,V5>,t5>,Fo<,Dv<",
 gZI:function(){return this.fY===C.nU},
-gUd:function(){return this.fY===C.BM},
+gRS:function(){return this.fY===C.BM},
 gUA:function(){return this.fY===C.hU},
 giO:function(a){var z=this.oc
 return z.giO(z)},
@@ -20906,8 +20941,7 @@
 z.KF(this.Fo?"static ":"")
 z.KF(this.Dv)
 z.KF(")")
-z=z.IN
-return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,73],
+return z.IN},"$0","gCR",0,0,73],
 $isES:true},
 iYn:{
 "^":"a;fY>"}}],["","",,X,{
@@ -20924,17 +20958,17 @@
 ZO:function(a,b){var z,y,x,w,v,u
 z=new H.a7(a,a.length,0,null)
 z.$builtinTypeInfo=[H.u3(a,0)]
-for(;z.G();){y=z.lo
+for(;z.G();){y=z.Ff
 b.length
 x=new H.a7(b,1,0,null)
 x.$builtinTypeInfo=[H.u3(b,0)]
 w=J.x(y)
-for(;x.G();){v=x.lo
+for(;x.G();){v=x.Ff
 if(w.n(y,v))return!0
 if(!!J.x(v).$isLz){u=w.gbx(y)
-u=$.II().xs(u,v)}else u=!1
+u=$.mX().xs(u,v)}else u=!1
 if(u)return!0}}return!1},
-OS:function(a){var z,y
+na:function(a){var z,y
 z=H.G3()
 y=H.KT(z).Zg(a)
 if(y)return 0
@@ -20945,7 +20979,7 @@
 z=H.KT(z,[z,z,z]).Zg(a)
 if(z)return 3
 return 4},
-RI:function(a){var z,y
+Zpg:function(a){var z,y
 z=H.G3()
 y=H.KT(z,[z,z,z]).Zg(a)
 if(y)return 3
@@ -20961,9 +20995,9 @@
 y=b.length
 if(z!==y)return!1
 if(c){x=P.Fl(null,null)
-for(z=H.VM(new H.a7(b,y,0,null),[H.u3(b,0)]);z.G();){w=z.lo
+for(z=H.VM(new H.a7(b,y,0,null),[H.u3(b,0)]);z.G();){w=z.Ff
 v=x.t(0,w)
-x.u(0,w,J.WB(v==null?0:v,1))}for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){w=z.lo
+x.u(0,w,J.WB(v==null?0:v,1))}for(z=H.VM(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.G();){w=z.Ff
 v=x.t(0,w)
 if(v==null)return!1
 if(v===1)x.Rz(0,w)
@@ -20974,15 +21008,15 @@
 kP:function(){throw H.b(P.eG("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["","",,O,{
 "^":"",
 Oj:{
-"^":"a;E4,F8,ZG,YK,t6,fJ<,T4,NI",
-FV:function(a,b){this.E4.FV(0,b.gE4())
+"^":"a;II,F8,ZG,of,F3,af<,T4,nX",
+FV:function(a,b){this.II.FV(0,b.gII())
 this.F8.FV(0,b.gF8())
 this.ZG.FV(0,b.gZG())
-O.PV(this.YK,b.gYK())
-O.PV(this.t6,b.gt6())
-this.fJ.FV(0,b.gfJ())
-b.gfJ().aN(0,new O.W2(this))},
-IZ:function(a,b,c,d,e,f,g){this.fJ.aN(0,new O.PO(this))},
+O.PV(this.of,b.gof())
+O.PV(this.F3,b.gF3())
+this.af.FV(0,b.gaf())
+b.gaf().aN(0,new O.T6(this))},
+IZ:function(a,b,c,d,e,f,g){this.af.aN(0,new O.PO(this))},
 static:{rH:function(a,b,c,d,e,f,g){var z,y
 z=P.Fl(null,null)
 y=P.Fl(null,null)
@@ -20990,98 +21024,98 @@
 z.IZ(a,b,c,d,e,f,g)
 return z},PV:function(a,b){var z,y
 for(z=b.gvc(b),z=z.gA(z);z.G(),!1;){y=z.gl()
-a.to(0,y,new O.D8())
+a.to(0,y,new O.oQ())
 J.bj(a.t(0,y),b.t(0,y))}}}},
 PO:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.T4.u(0,b,a)},
 $isEH:true},
-W2:{
+T6:{
 "^":"TpZ:81;a",
 $2:function(a,b){this.a.T4.u(0,b,a)},
 $isEH:true},
-D8:{
+oQ:{
 "^":"TpZ:76;",
 $0:function(){return P.Fl(null,null)},
 $isEH:true},
 fH:{
-"^":"a;JE",
-jD:function(a,b){var z=this.JE.E4.t(0,b)
-if(z==null)throw H.b(O.lA("getter \""+H.d(b)+"\" in "+H.d(a)))
+"^":"a;xV",
+Gp:function(a,b){var z=this.xV.II.t(0,b)
+if(z==null)throw H.b(O.Fm("getter \""+H.d(b)+"\" in "+H.d(a)))
 return z.$1(a)},
-Q1:function(a,b,c){var z=this.JE.F8.t(0,b)
-if(z==null)throw H.b(O.lA("setter \""+H.d(b)+"\" in "+H.d(a)))
+Cq:function(a,b,c){var z=this.xV.F8.t(0,b)
+if(z==null)throw H.b(O.Fm("setter \""+H.d(b)+"\" in "+H.d(a)))
 z.$2(a,c)},
 Ck:function(a,b,c,d,e){var z,y,x,w,v,u,t,s
 z=null
-x=this.JE
-if(!!J.x(a).$isLz){w=x.t6.t(0,a)
-z=w==null?null:J.UQ(w,b)}else{v=x.E4.t(0,b)
-z=v==null?null:v.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
+x=this.xV
+if(!!J.x(a).$isLz){w=x.F3.t(0,a)
+z=w==null?null:J.UQ(w,b)}else{v=x.II.t(0,b)
+z=v==null?null:v.$1(a)}if(z==null)throw H.b(O.Fm("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){u=X.OS(z)
+if(d){u=X.na(z)
 if(u>3){y="we tried to adjust the arguments for calling \""+H.d(b)+"\", but we couldn't determine the exact number of arguments it expects (it is more than 3)."
-c=X.Na(c,u,P.y(u,J.q8(c)))}else{t=X.RI(z)
+c=X.Na(c,u,P.y(u,J.q8(c)))}else{t=X.Zpg(z)
 x=t>=0?t:J.q8(c)
 c=X.Na(c,u,x)}}try{x=H.eC(z,c,P.Te(null))
 return x}catch(s){if(!!J.x(H.Ru(s)).$isJS){if(y!=null)P.FL(y)
 throw s}else throw s}}},
 bY:{
-"^":"a;JE",
+"^":"a;xV",
 xs:function(a,b){var z,y,x
 if(J.xC(a,b)||J.xC(b,C.AP))return!0
-for(z=this.JE,y=z.ZG;!J.xC(a,C.AP);a=x){x=y.t(0,a)
+for(z=this.xV,y=z.ZG;!J.xC(a,C.AP);a=x){x=y.t(0,a)
 if(J.xC(x,b))return!0
-if(x==null){if(!z.NI)return!1
-throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+H.d(x)+")"))}}return!1},
+if(x==null){if(!z.nX)return!1
+throw H.b(O.Fm("superclass of \""+H.d(a)+"\" ("+H.d(x)+")"))}}return!1},
 UK:function(a,b){var z=this.NW(a,b)
 return z!=null&&z.gUA()&&z.gFo()!==!0},
 n6:function(a,b){var z,y,x
-z=this.JE
-y=z.YK.t(0,a)
-if(y==null){if(!z.NI)return!1
-throw H.b(O.lA("declarations for "+H.d(a)))}x=J.UQ(y,b)
+z=this.xV
+y=z.of.t(0,a)
+if(y==null){if(!z.nX)return!1
+throw H.b(O.Fm("declarations for "+H.d(a)))}x=J.UQ(y,b)
 return x!=null&&x.gUA()&&x.gFo()===!0},
 CV:function(a,b){var z=this.NW(a,b)
-if(z==null){if(!this.JE.NI)return
-throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
+if(z==null){if(!this.xV.nX)return
+throw H.b(O.Fm("declaration for "+H.d(a)+"."+H.d(b)))}return z},
 Me:function(a,b,c){var z,y,x,w,v,u
 z=[]
-if(c.Mg){y=this.JE
+if(c.Mg){y=this.xV
 x=y.ZG.t(0,b)
-if(x==null){if(y.NI)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!J.xC(x,c.nN))z=this.Me(0,x,c)}y=this.JE
-w=y.YK.t(0,b)
-if(w==null){if(!y.NI)return z
-throw H.b(O.lA("declarations for "+H.d(b)))}for(y=J.mY(J.hI(w));y.G();){v=y.gl()
+if(x==null){if(y.nX)throw H.b(O.Fm("superclass of \""+H.d(b)+"\""))}else if(!J.xC(x,c.Yx))z=this.Me(0,x,c)}y=this.xV
+w=y.of.t(0,b)
+if(w==null){if(!y.nX)return z
+throw H.b(O.Fm("declarations for "+H.d(b)))}for(y=J.mY(J.hI(w));y.G();){v=y.gl()
 if(!c.kl&&v.gZI())continue
-if(!c.IW&&v.gUd())continue
-if(c.ER&&J.Z6(v)===!0)continue
+if(!c.IW&&v.gRS())continue
+if(c.ER&&J.EM(v)===!0)continue
 if(!c.Ja&&v.gUA())continue
-if(c.rM!=null&&c.WO(0,J.DA(v))!==!0)continue
+if(c.rM!=null&&c.xZ(0,J.DA(v))!==!0)continue
 u=c.BY
 if(u!=null&&!X.ZO(v.gDv(),u))continue
 z.push(v)}return z},
 NW:function(a,b){var z,y,x,w,v,u
-for(z=this.JE,y=z.ZG,x=z.YK;!J.xC(a,C.AP);a=u){w=x.t(0,a)
+for(z=this.xV,y=z.ZG,x=z.of;!J.xC(a,C.AP);a=u){w=x.t(0,a)
 if(w!=null){v=J.UQ(w,b)
 if(v!=null)return v}u=y.t(0,a)
-if(u==null){if(!z.NI)return
-throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
+if(u==null){if(!z.nX)return
+throw H.b(O.Fm("superclass of \""+H.d(a)+"\""))}}return}},
 ut:{
-"^":"a;JE"},
+"^":"a;xV"},
 tk:{
-"^":"a;QZ<",
-bu:[function(a){return"Missing "+this.QZ+". Code generation for the smoke package seems incomplete."},"$0","gCR",0,0,73],
-static:{lA:function(a){return new O.tk(a)}}}}],["","",,K,{
+"^":"a;GB<",
+bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gCR",0,0,73],
+static:{Fm:function(a){return new O.tk(a)}}}}],["","",,K,{
 "^":"",
 nm:{
-"^":"V64;xP,yl,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V64;xP,rs,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gM6:function(a){return a.xP},
 sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
-git:function(a){return a.yl},
-sit:function(a,b){a.yl=this.ct(a,C.B0,a.yl,b)},
+git:function(a){return a.rs},
+sit:function(a,b){a.rs=this.ct(a,C.B0,a.rs,b)},
 Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-vQ:[function(a,b,c){a.yl=this.ct(a,C.B0,a.yl,b)
+vQ:[function(a,b,c){a.rs=this.ct(a,C.B0,a.rs,b)
 c.$0()},"$2","gus",4,0,230,231,102],
 static:{ant:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -21089,8 +21123,8 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.yl=!1
-a.Iy=[]
+a.rs=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -21105,17 +21139,17 @@
 $isd3:true}}],["","",,X,{
 "^":"",
 Vu:{
-"^":"V65;ju,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-gtN:function(a){return a.ju},
-stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-pA:[function(a,b){J.LE(a.ju).wM(b)},"$1","gvC",2,0,19,102],
+"^":"V65;Jl,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+gtN:function(a){return a.Jl},
+stN:function(a,b){a.Jl=this.ct(a,C.kw,a.Jl,b)},
+pA:[function(a,b){J.LE(a.Jl).wM(b)},"$1","gvC",2,0,19,102],
 static:{lt2:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -21129,58 +21163,59 @@
 "^":"uL+Pi;",
 $isd3:true}}],["","",,M,{
 "^":"",
-iX:function(a,b){var z,y,x,w,v,u
+dg:function(a,b){var z,y,x,w,v,u
 z=M.pNz(a,b)
 if(z==null)z=new M.XI([],null,null)
-for(y=J.RE(a),x=y.gNL(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.iX(x,b)
-if(w==null){w=Array(y.gdH(a).uR.childNodes.length)
+for(y=J.RE(a),x=y.gNL(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.dg(x,b)
+if(u==null)continue
+if(w==null){w=Array(y.gUN(a).uR.childNodes.length)
 w.fixed$length=init}if(v>=w.length)return H.e(w,v)
-w[v]=u}z.qu=w
+w[v]=u}z.ks=w
 return z},
-Ch:function(a,b,c,d,e,f,g,h){var z,y,x,w
-z=b.appendChild(J.Ct(c,a,!1))
-for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.Ch(y,z,c,x?d.f8(w):null,e,f,g,null)
-if(d.ghK()){M.uH(z).rp(a)
-if(f!=null)J.NA(M.uH(z),f)}M.mV(z,d,e,g)
+S0:function(a,b,c,d,e,f,g,h){var z,y,x,w
+z=b.appendChild(J.pL(c,a,!1))
+for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.S0(y,z,c,x?d.f8(w):null,e,f,g,null)
+if(d.ghK()){M.Xi(z).cl(a)
+if(f!=null)J.D4(M.Xi(z),f)}M.mV(z,d,e,g)
 return z},
-b1:function(a,b){return!!J.x(a).$iskJ&&J.xC(b,"text")?"textContent":b},
+aR:function(a,b){return!!J.x(a).$isUn&&J.xC(b,"text")?"textContent":b},
 xa:function(a){var z
 if(a==null)return
 z=J.UQ(a,"__dartBindable")
-return!!J.x(z).$isAp?z:new M.dP(a)},
+return!!J.x(z).$isAp?z:new M.VB(a)},
 fg:function(a){var z,y,x
-if(!!J.x(a).$isdP)return a.qf
+if(!!J.x(a).$isVB)return a.qf
 z=$.X3
-y=new M.Vf(z)
+y=new M.Ra(z)
 x=new M.aY(z)
-return P.jT(P.EF(["open",x.$1(new M.SL(a)),"close",y.$1(new M.no(a)),"discardChanges",y.$1(new M.uD(a)),"setValue",x.$1(new M.eT(a)),"deliver",y.$1(new M.Wb(a)),"__dartBindable",a],null,null))},
+return P.jT(P.EF(["open",x.$1(new M.SL(a)),"close",y.$1(new M.no(a)),"discardChanges",y.$1(new M.uD(a)),"setValue",x.$1(new M.Wb(a)),"deliver",y.$1(new M.SLX(a)),"__dartBindable",a],null,null))},
 tA:function(a){var z
-for(;z=J.cP(a),z!=null;a=z);return a},
-l5:function(a,b){var z,y,x,w,v,u
+for(;z=J.ra5(a),z!=null;a=z);return a},
+cS:function(a,b){var z,y,x,w,v,u
 if(b==null||b==="")return
 z="#"+H.d(b)
 for(;!0;){a=M.tA(a)
-y=$.Uo()
+y=$.nR()
 y.toString
-x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.V2())
+x=H.vA(a,"expando$values")
+w=x==null?null:H.vA(x,y.V2())
 y=w==null
-if(!y&&w.gNK()!=null)v=J.Eh(w.gNK(),z)
+if(!y&&w.gcA()!=null)v=J.yR(w.gcA(),z)
 else{u=J.x(a)
-v=!!u.$isSy||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
+v=!!u.$isYN||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
 if(y)return
-a=w.gLx()
+a=w.gXD()
 if(a==null)return}},
 ah:function(a,b,c){if(c==null)return
-return new M.hg(a,b,c)},
+return new M.iT(a,b,c)},
 pNz:function(a,b){var z,y
 z=J.x(a)
 if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$iskJ){y=S.iw(a.textContent,M.ah("text",a,b))
+if(!!z.$isUn){y=S.j9(a.textContent,M.ah("text",a,b))
 if(y!=null)return new M.XI(["text",y],null,null)}return},
 rJ:function(a,b,c){var z=a.getAttribute(b)
 if(z==="")z="{{}}"
-return S.iw(z,M.ah(b,a,c))},
+return S.j9(z,M.ah(b,a,c))},
 F5:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=null
@@ -21190,18 +21225,18 @@
 if(x==null){w=[]
 z.a=w
 z=w}else z=x
-v=new M.qfK(null,null,null,z,null,null)
+v=new M.qf(null,null,null,z,null,null)
 z=M.rJ(a,"if",b)
 v.Z0=z
 x=M.rJ(a,"bind",b)
 v.lC=x
 u=M.rJ(a,"repeat",b)
 v.vJ=u
-if(z!=null&&x==null&&u==null)v.lC=S.iw("{{}}",M.ah("bind",a,b))
+if(z!=null&&x==null&&u==null)v.lC=S.j9("{{}}",M.ah("bind",a,b))
 return v}z=z.a
 return z==null?null:new M.XI(z,null,null)},
 i8:function(a,b,c,d){var z,y,x,w,v,u,t
-if(b.gqz()){z=b.Bd(0)
+if(b.gqz()){z=b.cf(0)
 y=z!=null?z.$3(d,c,!0):b.Pn(0).WK(d)
 return b.gaW()?y:b.qm(y)}x=J.U6(b)
 w=x.gB(b)
@@ -21213,13 +21248,13 @@
 while(!0){t=x.gB(b)
 if(typeof t!=="number")return H.s(t)
 if(!(u<t))break
-z=b.Bd(u)
+z=b.cf(u)
 t=z!=null?z.$3(d,c,!1):b.Pn(u).WK(d)
 if(u>=w)return H.e(v,u)
 v[u]=t;++u}return b.qm(v)},
-G5:function(a,b,c,d){var z,y,x,w,v,u,t,s
+jb:function(a,b,c,d){var z,y,x,w,v,u,t,s
 if(b.gau())return M.i8(a,b,c,d)
-if(b.gqz()){z=b.Bd(0)
+if(b.gqz()){z=b.cf(0)
 y=z!=null?z.$3(d,c,!1):new L.WR(L.hk(b.Pn(0)),d,null,null,null,null,$.jq1)
 return b.gaW()?y:new Y.cU(y,b.gPf(),null,null,null)}y=new L.nQ(null,!1,[],null,null,null,$.jq1)
 y.z7=[]
@@ -21228,8 +21263,8 @@
 while(!0){v=x.gB(b)
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
-c$0:{u=b.U0(w)
-z=b.Bd(w)
+c$0:{u=b.AX(w)
+z=b.cf(w)
 if(z!=null){t=z.$3(d,c,u)
 if(u===!0)y.ti(t)
 else y.YU(t)
@@ -21239,7 +21274,7 @@
 mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o
 z=J.RE(b)
 y=z.gCd(b)
-x=!!J.x(a).$ishs?a:M.uH(a)
+x=!!J.x(a).$isvy?a:M.Xi(a)
 w=J.U6(y)
 v=J.RE(x)
 u=0
@@ -21248,78 +21283,78 @@
 if(!(u<t))break
 s=w.t(y,u)
 r=w.t(y,u+1)
-q=v.nR(x,s,M.G5(s,r,a,c),r.gau())
+q=v.nR(x,s,M.jb(s,r,a,c),r.gau())
 if(q!=null&&!0)d.push(q)
 u+=2}v.lL(x)
-if(!z.$isqfK)return
-p=M.uH(a)
+if(!z.$isqf)return
+p=M.Xi(a)
 p.sQk(c)
 o=p.KI(b)
 if(o!=null&&!0)d.push(o)},
-uH:function(a){var z,y,x,w
-z=$.rw()
+Xi:function(a){var z,y,x,w
+z=$.as()
 z.toString
-y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.V2())
+y=H.vA(a,"expando$values")
+x=y==null?null:H.vA(y,z.V2())
 if(x!=null)return x
 w=J.x(a)
-if(!!w.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).dA.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!w.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).dA.hasAttribute("template")===!0&&C.bq.NZ(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!0
 else w=!0
 else w=!1
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,P.kW(a),null):new M.hs(a,P.kW(a),null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,P.XY(a),null):new M.vy(a,P.XY(a),null)
 z.u(0,a,x)
 return x},
 CF:function(a){var z=J.x(a)
-if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).dA.hasAttribute("template")===!0&&C.lY.NZ(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).dA.hasAttribute("template")===!0&&C.bq.NZ(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
 else z=!0
 else z=!0
 else z=!1
 return z},
-VE:{
+vE:{
 "^":"a;oe",
 op:function(a,b,c){return},
 static:{"^":"ac"}},
 XI:{
-"^":"a;Cd>,qu>,rz>",
+"^":"a;Cd>,ks>,rz>",
 ghK:function(){return!1},
-f8:function(a){var z=this.qu
+f8:function(a){var z=this.ks
 if(z==null||a>=z.length)return
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
-qfK:{
-"^":"XI;Z0,lC,vJ,Cd,qu,rz",
+qf:{
+"^":"XI;Z0,lC,vJ,Cd,ks,rz",
 ghK:function(){return!0},
-$isqfK:true},
-hs:{
+$isqf:true},
+vy:{
 "^":"a;KB<,qf,qL?",
 gCd:function(a){var z=J.UQ(this.qf,"bindings_")
 if(z==null)return
 return new M.lb(this.gKB(),z)},
 sCd:function(a,b){var z=this.gCd(this)
-if(z==null){J.qQ(this.qf,"bindings_",P.jT(P.Fl(null,null)))
+if(z==null){J.kW(this.qf,"bindings_",P.jT(P.Fl(null,null)))
 z=this.gCd(this)}z.FV(0,b)},
-nR:function(a,b,c,d){b=M.b1(this.gKB(),b)
+nR:function(a,b,c,d){b=M.aR(this.gKB(),b)
 if(!d&&!!J.x(c).$isAp)c=M.fg(c)
 return M.xa(this.qf.V7("bind",[b,c,d]))},
 lL:function(a){return this.qf.nQ("bindFinished")},
-gCn:function(a){var z=this.qL
+gmb:function(a){var z=this.qL
 if(z!=null);else if(J.Lp(this.gKB())!=null){z=J.Lp(this.gKB())
-z=J.OC(!!J.x(z).$ishs?z:M.uH(z))}else z=null
+z=J.re(!!J.x(z).$isvy?z:M.Xi(z))}else z=null
 return z},
-$ishs:true},
+$isvy:true},
 lb:{
 "^":"ilb;KB<,dn<",
 gvc:function(a){return J.kl(J.UQ($.Xw(),"Object").V7("keys",[this.dn]),new M.Tl(this))},
-t:function(a,b){if(!!J.x(this.KB).$iskJ&&J.xC(b,"text"))b="textContent"
+t:function(a,b){if(!!J.x(this.KB).$isUn&&J.xC(b,"text"))b="textContent"
 return M.xa(J.UQ(this.dn,b))},
-u:function(a,b,c){if(!!J.x(this.KB).$iskJ&&J.xC(b,"text"))b="textContent"
-J.qQ(this.dn,b,M.fg(c))},
+u:function(a,b,c){if(!!J.x(this.KB).$isUn&&J.xC(b,"text"))b="textContent"
+J.kW(this.dn,b,M.fg(c))},
 Rz:[function(a,b){var z,y,x
 z=this.KB
-b=M.b1(z,b)
+b=M.aR(z,b)
 y=this.dn
-x=M.xa(J.UQ(y,M.b1(z,b)))
+x=M.xa(J.UQ(y,M.aR(z,b)))
 y.Ji(b)
 return x},"$1","gUS",2,0,233,58],
 V1:function(a){J.Me(this.gvc(this),this.gUS(this))},
@@ -21327,17 +21362,17 @@
 $asT8:function(){return[P.qU,A.Ap]}},
 Tl:{
 "^":"TpZ:12;a",
-$1:[function(a){return!!J.x(this.a.KB).$iskJ&&J.xC(a,"textContent")?"text":a},"$1",null,2,0,null,58,"call"],
+$1:[function(a){return!!J.x(this.a.KB).$isUn&&J.xC(a,"textContent")?"text":a},"$1",null,2,0,null,58,"call"],
 $isEH:true},
-dP:{
+VB:{
 "^":"Ap;qf",
 TR:function(a,b){return this.qf.V7("open",[$.X3.mS(b)])},
 xO:function(a){return this.qf.nQ("close")},
 gP:function(a){return this.qf.nQ("discardChanges")},
 sP:function(a,b){this.qf.V7("setValue",[b])},
 fR:function(){return this.qf.nQ("deliver")},
-$isdP:true},
-Vf:{
+$isVB:true},
+Ra:{
 "^":"TpZ:12;a",
 $1:function(a){return this.a.xi(a,!1)},
 $isEH:true},
@@ -21361,80 +21396,80 @@
 "^":"TpZ:76;f",
 $0:[function(){return J.Vm(this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
-eT:{
+Wb:{
 "^":"TpZ:12;UI",
 $1:[function(a){J.Fc(this.UI,a)
 return a},"$1",null,2,0,null,180,"call"],
 $isEH:true},
-Wb:{
+SLX:{
 "^":"TpZ:76;bK",
 $0:[function(){return this.bK.fR()},"$0",null,0,0,null,"call"],
 $isEH:true},
 qU9:{
-"^":"a;k8>,tA,ip"},
+"^":"a;k8>,tA,MC"},
 DT:{
-"^":"hs;Qk?,Rc,kr<,mT,Gw?,Yz?,CS?,dK,Fe,XA,KB,qf,qL",
+"^":"vy;Qk?,Rc,kr<,mT,Gw?,Yz?,CS?,dK,Fe,XA,KB,qf,qL",
 gKB:function(){return this.KB},
 nR:function(a,b,c,d){var z,y
-if(!J.xC(b,"ref"))return M.hs.prototype.nR.call(this,this,b,c,d)
-z=d?c:J.mu(c,new M.Aj(this))
+if(!J.xC(b,"ref"))return M.vy.prototype.nR.call(this,this,b,c,d)
+z=d?c:J.mu(c,new M.De(this))
 J.Vs(this.KB).dA.setAttribute("ref",z)
 this.NB()
 if(d)return
 if(this.gCd(this)==null)this.sCd(0,P.Fl(null,null))
 y=this.gCd(this)
-J.qQ(y.dn,M.b1(y.KB,"ref"),M.fg(c))
+J.kW(y.dn,M.aR(y.KB,"ref"),M.fg(c))
 return c},
 KI:function(a){var z=this.kr
-if(z!=null)z.qT()
+if(z!=null)z.la()
 if(a.Z0==null&&a.lC==null&&a.vJ==null){z=this.kr
 if(z!=null){z.xO(0)
 this.kr=null}return}z=this.kr
 if(z==null){z=new M.TGm(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
 this.kr=z}z.FE(a,this.Qk)
-J.ZW($.TQ(),this.KB,["ref"],!0)
+J.ZW($.ik(),this.KB,["ref"],!0)
 return this.kr},
-eX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+v3:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(c==null)c=this.Rc
 z=this.XA
-if(z==null){z=this.gws()
-z=J.ti(!!J.x(z).$ishs?z:M.uH(z))
+if(z==null){z=this.gPI()
+z=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
 this.XA=z}y=J.RE(z)
 if(y.gNL(z)==null)return $.zl()
 x=c==null?$.Bu():c
 w=x.oe
 if(w==null){w=H.VM(new P.qo(null),[null])
 x.oe=w}v=w.t(0,z)
-if(v==null){v=M.iX(z,x)
+if(v==null){v=M.dg(z,x)
 x.oe.u(0,z,v)}w=this.dK
-if(w==null){u=J.Do(this.KB)
-w=$.MO()
+if(w==null){u=J.lu(this.KB)
+w=$.Ou()
 t=w.t(0,u)
 if(t==null){t=u.implementation.createHTMLDocument("")
-$.Tg().u(0,t,!0)
+$.Ks().u(0,t,!0)
 M.AL(t)
 w.u(0,u,t)}this.dK=t
-w=t}s=J.bs(w)
+w=t}s=J.O2(w)
 w=[]
-r=new M.qdK(w,null,null,null)
-q=$.Uo()
-r.Lx=this.KB
-r.NK=z
+r=new M.Fi(w,null,null,null)
+q=$.nR()
+r.XD=this.KB
+r.cA=z
 q.u(0,s,r)
 p=new M.qU9(b,null,null)
-M.uH(s).sqL(p)
+M.Xi(s).sqL(p)
 for(o=y.gNL(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
 l=z?v.f8(n):null
-k=M.Ch(o,s,this.dK,l,b,c,w,null)
-M.uH(k).sqL(p)
+k=M.S0(o,s,this.dK,l,b,c,w,null)
+M.Xi(k).sqL(p)
 if(m)r.yi=k}p.tA=s.firstChild
-p.ip=s.lastChild
-r.NK=null
-r.Lx=null
+p.MC=s.lastChild
+r.cA=null
+r.XD=null
 return s},
 gk8:function(a){return this.Qk},
-gG5:function(a){return this.Rc},
-sG5:function(a,b){var z
+gA0:function(a){return this.Rc},
+sA0:function(a,b){var z
 if(this.Rc!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
 this.Rc=b
 this.Fe=null
@@ -21444,15 +21479,15 @@
 z.Mv=null}},
 NB:function(){var z,y
 if(this.kr!=null){z=this.XA
-y=this.gws()
-y=J.ti(!!J.x(y).$ishs?y:M.uH(y))
+y=this.gPI()
+y=J.f5(!!J.x(y).$isvy?y:M.Xi(y))
 y=z==null?y==null:z===y
 z=y}else z=!0
 if(z)return
 this.XA=null
 this.kr.Oo(null)
 z=this.kr
-z.kY(z.Tf())},
+z.OP(z.Tf())},
 V1:function(a){var z,y
 this.Qk=null
 this.Rc=null
@@ -21463,62 +21498,62 @@
 y.Oo(null)
 this.kr.xO(0)
 this.kr=null},
-gws:function(){var z,y
+gPI:function(){var z,y
 this.xk()
-z=M.l5(this.KB,J.Vs(this.KB).dA.getAttribute("ref"))
+z=M.cS(this.KB,J.Vs(this.KB).dA.getAttribute("ref"))
 if(z==null){z=this.Gw
-if(z==null)return this.KB}y=M.uH(z).gws()
+if(z==null)return this.KB}y=M.Xi(z).gPI()
 return y!=null?y:z},
 grz:function(a){var z
 this.xk()
 z=this.Yz
-return z!=null?z:H.Go(this.KB,"$isyY").content},
-rp:function(a){var z,y,x,w,v,u,t
+return z!=null?z:H.Go(this.KB,"$isOH").content},
+cl:function(a){var z,y,x,w,v,u,t
 if(this.CS===!0)return!1
 M.oR()
-M.hb()
+M.Tr()
 this.CS=!0
-z=!!J.x(this.KB).$isyY
+z=!!J.x(this.KB).$isOH
 y=!z
 if(y){x=this.KB
 w=J.RE(x)
-if(w.gQg(x).dA.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
+if(w.gQg(x).dA.hasAttribute("template")===!0&&C.bq.NZ(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
 v=M.pZ(this.KB)
-v=!!J.x(v).$ishs?v:M.uH(v)
+v=!!J.x(v).$isvy?v:M.Xi(v)
 v.sCS(!0)
-z=!!J.x(v.gKB()).$isyY
+z=!!J.x(v.gKB()).$isOH
 u=!0}else{x=this.KB
 w=J.RE(x)
-if(w.gq5(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.KB
+if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.KB
 w=J.RE(x)
-t=w.gM0(x).createElement("template",null)
+t=w.gJ8(x).createElement("template",null)
 w.gAd(x).insertBefore(t,x)
 t.toString
 new W.E9(t).FV(0,w.gQg(x))
 w.gQg(x).V1(0)
 w.wg(x)
-v=!!J.x(t).$ishs?t:M.uH(t)
+v=!!J.x(t).$isvy?t:M.Xi(t)
 v.sCS(!0)
-z=!!J.x(v.gKB()).$isyY}else{v=this
+z=!!J.x(v.gKB()).$isOH}else{v=this
 z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sYz(J.bs(M.TA(v.gKB())))
+u=!1}if(!z)v.sYz(J.O2(M.TA(v.gKB())))
 if(a!=null)v.sGw(a)
-else if(y)M.KE(v,this.KB,u)
-else M.Af(J.ti(v))
+else if(y)M.O1(v,this.KB,u)
+else M.Af(J.f5(v))
 return!0},
-xk:function(){return this.rp(null)},
+xk:function(){return this.cl(null)},
 $isDT:true,
-static:{"^":"Ub,Xi,YO,vU,Hg,joK",TA:function(a){var z,y,x,w
-z=J.Do(a)
+static:{"^":"Ub,v2,YO,vU,Xa,joK",TA:function(a){var z,y,x,w
+z=J.lu(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.B8().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)}$.B8().u(0,z,y)}return y},pZ:function(a){var z,y,x,w,v,u
 z=J.RE(a)
-y=z.gM0(a).createElement("template",null)
+y=z.gJ8(a).createElement("template",null)
 z.gAd(a).insertBefore(y,a)
-for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.lo
+for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.G();){w=x.Ff
 switch(w){case"template":v=z.gQg(a).dA
 v.getAttribute(w)
 v.removeAttribute(w)
@@ -21528,27 +21563,27 @@
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-break}}return y},KE:function(a,b,c){var z,y,x,w
-z=J.ti(a)
+break}}return y},O1:function(a,b,c){var z,y,x,w
+z=J.f5(a)
 if(c){J.y2(z,b)
 return}for(y=J.RE(b),x=J.RE(z);w=y.gNL(b),w!=null;)x.mx(z,w)},Af:function(a){var z,y
 z=new M.CE()
-y=J.Vj(a,$.S1())
+y=J.We(a,$.S1())
 if(M.CF(a))z.$1(a)
 y.aN(y,z)},oR:function(){if($.vU===!0)return
 $.vU=!0
 var z=document.createElement("style",null)
 J.t3(z,H.d($.S1())+" { display: none; }")
-document.head.appendChild(z)},hb:function(){var z,y
-if($.Hg===!0)return
-$.Hg=!0
+document.head.appendChild(z)},Tr:function(){var z,y
+if($.Xa===!0)return
+$.Xa=!0
 z=document.createElement("template",null)
-if(!!J.x(z).$isyY){y=z.content.ownerDocument
+if(!!J.x(z).$isOH){y=z.content.ownerDocument
 if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
 if(J.lL(y).querySelector("base")==null)M.AL(y)}},AL:function(a){var z=a.createElement("base",null)
-J.PS(z,document.baseURI)
+J.dc(z,document.baseURI)
 J.lL(a).appendChild(z)}}},
-Aj:{
+De:{
 "^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 J.Vs(z.KB).dA.setAttribute("ref",a)
@@ -21556,26 +21591,26 @@
 $isEH:true},
 CE:{
 "^":"TpZ:19;",
-$1:function(a){if(!M.uH(a).rp(null))M.Af(J.ti(!!J.x(a).$ishs?a:M.uH(a)))},
+$1:function(a){if(!M.Xi(a).cl(null))M.Af(J.f5(!!J.x(a).$isvy?a:M.Xi(a)))},
 $isEH:true},
-W6o:{
+DOe:{
 "^":"TpZ:12;",
 $1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,141,"call"],
 $isEH:true},
-YJG:{
+Ufa:{
 "^":"TpZ:81;",
 $2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.uH(J.l2(z.gl())).NB()},"$2",null,4,0,null,183,13,"call"],
+for(z=J.mY(a);z.G();)M.Xi(J.l2(z.gl())).NB()},"$2",null,4,0,null,183,13,"call"],
 $isEH:true},
-DOe:{
+Raa:{
 "^":"TpZ:76;",
 $0:function(){var z=document.createDocumentFragment()
-$.Uo().u(0,z,new M.qdK([],null,null,null))
+$.nR().u(0,z,new M.Fi([],null,null,null))
 return z},
 $isEH:true},
-qdK:{
-"^":"a;dn<,yi<,Lx<,NK<"},
-hg:{
+Fi:{
+"^":"a;dn<,yi<,XD<,cA<"},
+iT:{
 "^":"TpZ:12;a,b,c",
 $1:function(a){return this.c.op(a,this.a,this.b)},
 $isEH:true},
@@ -21586,7 +21621,7 @@
 if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
 else z=!1
 if(z)return
-y=S.iw(b,M.ah(a,this.b,this.c))
+y=S.j9(b,M.ah(a,this.b,this.c))
 if(y!=null){z=this.a
 x=z.a
 if(x==null){w=[]
@@ -21596,11 +21631,11 @@
 z.push(y)}},
 $isEH:true},
 TGm:{
-"^":"Ap;kb,tM,nH,dO,TE,Up,h6,RS,Gi,vj,lH,AB,z1,iz,Mv",
+"^":"Ap;yQ,tM,nH,dO,vx,Up,h6,dz,Gi,vj,lH,AB,z1,iz,Mv",
 ln:function(a){return this.iz.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
 gP:function(a){return this.h6},
-qT:function(){var z,y
+la:function(){var z,y
 z=this.Up
 y=J.x(z)
 if(!!y.$isAp){y.xO(z)
@@ -21609,14 +21644,14 @@
 if(!!y.$isAp){y.xO(z)
 this.h6=null}},
 FE:function(a,b){var z,y,x,w,v
-this.qT()
-z=this.kb.KB
+this.la()
+z=this.yQ.KB
 y=a.Z0
 x=y!=null
-this.RS=x
+this.dz=x
 this.Gi=a.vJ!=null
 if(x){this.vj=y.au
-w=M.G5("if",y,z,b)
+w=M.jb("if",y,z,b)
 this.Up=w
 y=this.vj===!0
 if(y)x=!(null!=w&&!1!==w)
@@ -21625,11 +21660,11 @@
 return}if(!y)w=H.Go(w,"$isAp").TR(0,this.ge7())}else w=!0
 if(this.Gi===!0){y=a.vJ
 this.lH=y.au
-y=M.G5("repeat",y,z,b)
+y=M.jb("repeat",y,z,b)
 this.h6=y
 v=y}else{y=a.lC
 this.lH=y.au
-y=M.G5("bind",y,z,b)
+y=M.jb("bind",y,z,b)
 this.h6=y
 v=y}if(this.lH!==!0)v=J.mu(v,this.gVN())
 if(!(null!=w&&!1!==w)){this.Oo(null)
@@ -21640,8 +21675,8 @@
 return!(null!=y&&y)?J.Vm(z):z},
 YSS:[function(a){if(!(null!=a&&!1!==a)){this.Oo(null)
 return}this.Ca(this.Tf())},"$1","ge7",2,0,19,235],
-kY:[function(a){var z
-if(this.RS===!0){z=this.Up
+OP:[function(a){var z
+if(this.dz===!0){z=this.Up
 if(this.vj!==!0){H.Go(z,"$isAp")
 z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Oo([])
 return}}this.Ca(a)},"$1","gVN",2,0,19,20],
@@ -21658,85 +21693,85 @@
 y=y!=null?y:[]
 this.LA(G.jj(y,0,J.q8(y),z,0,z.length))},
 Dk:function(a){var z,y,x,w
-if(J.xC(a,-1))return this.kb.KB
-z=$.Uo()
+if(J.xC(a,-1))return this.yQ.KB
+z=$.nR()
 y=this.tM
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
 x=z.t(0,y[a]).gyi()
 if(x==null)return this.Dk(a-1)
-if(!M.CF(x)||x===this.kb.KB)return x
-w=M.uH(x).gkr()
+if(!M.CF(x)||x===this.yQ.KB)return x
+w=M.Xi(x).gkr()
 if(w==null)return x
 return w.Dk(w.tM.length-1)},
-eS:function(a){var z,y,x,w,v,u,t
+C8:function(a){var z,y,x,w,v,u,t
 z=this.Dk(J.bI(a,1))
 y=this.Dk(a)
-J.cP(this.kb.KB)
+J.ra5(this.yQ.KB)
 x=C.Nm.W4(this.tM,a)
 for(w=J.RE(x),v=J.RE(z);!J.xC(y,z);){u=v.guD(z)
 if(u==null?y==null:u===y)y=z
 t=u.parentNode
 if(t!=null)t.removeChild(u)
 w.mx(x,u)}return x},
-LA:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d
-if(this.TE||J.FN(a)===!0)return
-u=this.kb
+LA:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
+if(this.vx||J.FN(a)===!0)return
+u=this.yQ
 t=u.KB
-if(J.cP(t)==null){this.xO(0)
+if(J.ra5(t)==null){this.xO(0)
 return}s=this.nH
-Q.Y5p(s,this.dO,a)
+Q.Oi(s,this.dO,a)
 z=u.Rc
 if(!this.z1){this.z1=!0
-r=J.Ee(!!J.x(u.KB).$isDT?u.KB:u)
-if(r!=null){this.iz=r.xI.CE(t)
+r=J.qy(!!J.x(u.KB).$isDT?u.KB:u)
+if(r!=null){this.iz=r.Mn.CE(t)
 this.Mv=null}}q=P.YM(P.XK(),null,null,null,null)
 for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
-for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.lo
-i=this.eS(J.WB(k.gvH(m),n))
+for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.Ff
+i=this.C8(J.WB(k.gvH(m),n))
 if(!J.xC(i,$.zl()))q.u(0,j,i)}l=m.gNg()
 if(typeof l!=="number")return H.s(l)
-n-=l}for(p=p.gA(a),o=this.tM;p.G();){m=p.gl()
-for(l=J.RE(m),h=l.gvH(m);J.u6(h,J.WB(l.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
+n-=l}for(p=p.gA(a);p.G();){m=p.gl()
+for(o=J.RE(m),h=o.gvH(m);J.u6(h,J.WB(o.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
 y=s[h]
 x=q.Rz(0,y)
 if(x==null)try{if(this.iz!=null)y=this.ln(y)
 if(y==null)x=$.zl()
-else x=u.eX(0,y,z)}catch(g){k=H.Ru(g)
-w=k
+else x=u.v3(0,y,z)}catch(g){l=H.Ru(g)
+w=l
 v=new H.oP(g,null)
-k=new P.Gc(0,$.X3,null,null,null,null,null,null)
-k.$builtinTypeInfo=[null]
-new P.Zf(k).$builtinTypeInfo=[null]
-f=w
-if(f==null)H.vh(P.u("Error must not be null"))
-if(k.YM!==0)H.vh(P.w("Future already completed"))
-k.Nk(f,v)
-x=$.zl()}k=x
-e=this.Dk(h-1)
-d=J.cP(u.KB)
-C.Nm.aP(o,h,k)
-d.insertBefore(k,J.p7(e))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.Hb),u.Oh),[H.u3(u,0),H.u3(u,1)]);u.G();)this.vB(u.lo)},"$1","gSp",2,0,236,237],
+l=new P.Gc(0,$.X3,null,null,null,null,null,null)
+l.$builtinTypeInfo=[null]
+new P.Zf(l).$builtinTypeInfo=[null]
+k=w
+if(k==null)H.vh(P.u("Error must not be null"))
+if(l.YM!==0)H.vh(P.w("Future already completed"))
+l.Nk(k,v)
+x=$.zl()}l=x
+f=this.Dk(h-1)
+e=J.ra5(u.KB)
+C.Nm.xe(this.tM,h,l)
+e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.Hb),u.Oh),[H.u3(u,0),H.u3(u,1)]);u.G();)this.vB(u.Ff)},"$1","gSp",2,0,236,237],
 vB:[function(a){var z,y
-z=$.Uo()
+z=$.nR()
 z.toString
-y=H.of(a,"expando$values")
-for(z=J.mY((y==null?null:H.of(y,z.V2())).gdn());z.G();)J.yd(z.gl())},"$1","gJO",2,0,238],
+y=H.vA(a,"expando$values")
+for(z=J.mY((y==null?null:H.vA(y,z.V2())).gdn());z.G();)J.yd(z.gl())},"$1","gJO",2,0,238],
 ud:function(){var z=this.AB
 if(z==null)return
 z.Gv()
 this.AB=null},
 xO:function(a){var z
-if(this.TE)return
+if(this.vx)return
 this.ud()
 z=this.tM
 H.bQ(z,this.gJO())
 C.Nm.sB(z,0)
-this.qT()
-this.kb.kr=null
-this.TE=!0}}}],["","",,S,{
+this.la()
+this.yQ.kr=null
+this.vx=!0}}}],["","",,S,{
 "^":"",
 VH2:{
-"^":"a;qN,au<,PS",
+"^":"a;qN,au<,ll",
 gqz:function(){return this.qN.length===5},
 gaW:function(){var z,y
 z=this.qN
@@ -21745,10 +21780,10 @@
 if(J.xC(z[0],"")){if(4>=z.length)return H.e(z,4)
 z=J.xC(z[4],"")}else z=!1}else z=!1
 return z},
-gPf:function(){return this.PS},
+gPf:function(){return this.ll},
 qm:function(a){return this.gPf().$1(a)},
 gB:function(a){return C.jn.BU(this.qN.length,4)},
-U0:function(a){var z,y
+AX:function(a){var z,y
 z=this.qN
 y=a*4+1
 if(y>=z.length)return H.e(z,y)
@@ -21758,7 +21793,7 @@
 y=a*4+2
 if(y>=z.length)return H.e(z,y)
 return z[y]},
-Bd:function(a){var z,y
+cf:function(a){var z,y
 z=this.qN
 y=a*4+3
 if(y>=z.length)return H.e(z,y)
@@ -21782,10 +21817,9 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.IN+=typeof s==="string"?s:H.d(s)}z=y.IN
-return z.charCodeAt(0)==0?z:z},"$1","gYF",2,0,240,241],
-l3:function(a,b){this.PS=this.qN.length===5?this.gSG():this.gYF()},
-static:{"^":"rz5,xN8,t3a,epG,UO,Ftg",iw:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+y.IN+=typeof s==="string"?s:H.d(s)}return y.IN},"$1","gYF",2,0,240,241],
+l3:function(a,b){this.ll=this.qN.length===5?this.gSG():this.gYF()},
+static:{"^":"rz5,xN8,t3a,epG,UO,Ftg",j9:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
 z=a.length
 for(y=b==null,x=J.U6(a),w=null,v=0,u=!0;v<z;){t=x.XU(a,"{{",v)
@@ -21800,7 +21834,7 @@
 w.push(C.yo.yn(a,v))
 break}if(w==null)w=[]
 w.push(C.yo.Nj(a,v,t))
-n=C.yo.DY(C.yo.Nj(a,t+2,o))
+n=C.yo.bS(C.yo.Nj(a,t+2,o))
 w.push(q)
 u=u&&q
 m=y?null:b.$1(n)
@@ -21834,45 +21868,53 @@
 ez:function(a,b){return this.Ir.$1(b)},
 $islX:true},
 KZ:{
-"^":"d3;RV,NP,Rk*,ro,XY,iS",
+"^":"d3;RV,NP,Rk*,ro,XY,cU",
 Gv:function(){this.RV.Gv()},
-AS:[function(a,b,c){var z=new Z.lX(J.Ts(J.vX(this.NP.giU(),1000000),$.Ji),b,null)
+ab:[function(a,b,c){var z=new Z.lX(J.Cl(J.vX(this.NP.giU(),1000000),$.Ji),b,null)
 z.Ir=Z.d8(c)
-J.dH(this.Rk,z)
-return z},function(a,b){return this.AS(a,b,null)},"WL","$2$map","$1","gtN",2,3,242,22,243,206],
+J.bi(this.Rk,z)
+return z},function(a,b){return this.ab(a,b,null)},"ZF","$2$map","$1","gtN",2,3,242,22,243,206],
 l8:function(){var z=new P.VV(null,null)
-H.w4()
+H.Xe()
 $.Ji=$.xG
 this.NP=z
-z.wE(0)
-this.RV=N.QM("").gSZ().yI(new Z.QC(this))
+z.D5(0)
+this.RV=N.QM("").gSZ().yI(new Z.Ym(this))
 this.NP.CH(0)
-J.U2(this.Rk)},
-static:{"^":"hm",JQ:function(){var z=new Z.KZ(null,null,Q.pT(null,Z.lX),null,null,null)
+J.Z8(this.Rk)},
+static:{"^":"ax",JQ:function(){var z=new Z.KZ(null,null,Q.pT(null,Z.lX),null,null,null)
 z.l8()
 return z}}},
-QC:{
+Ym:{
 "^":"TpZ:170;a",
-$1:[function(a){this.a.WL(0,a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,169,"call"],
+$1:[function(a){this.a.ZF(0,a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,169,"call"],
 $isEH:true}}],["","",,G,{
 "^":"",
-YZ:{
-"^":"mW;N3,Mn,fO",
-gA:function(a){var z=this.Mn
-return new G.ay(this.N3,z-1,z+this.fO)},
+GMB:{
+"^":"mW;f9,D1,fO",
+gA:function(a){var z,y
+z=this.D1
+y=this.fO
+if(typeof y!=="number")return H.s(y)
+return new G.vZG(this.f9,z-1,z+y)},
 gB:function(a){return this.fO},
-a0:function(a,b,c){var z=this.Mn
-if(z>this.N3.Bx.length)throw H.b(P.N(z))
-if(this.fO<0)throw H.b(P.N(this.fO))
-z=this.fO+z
-if(z>this.N3.Bx.length)throw H.b(P.N(z))},
+a0:function(a,b,c){var z,y,x
+z=this.D1
+if(z>this.f9.vF.length)throw H.b(P.N(z))
+y=this.fO
+if(y!=null){if(typeof y!=="number")return y.C()
+x=y<0}else x=!1
+if(x)throw H.b(P.N(y))
+if(typeof y!=="number")return y.g()
+z=y+z
+if(z>this.f9.vF.length)throw H.b(P.N(z))},
 $asmW:function(){return[null]},
 $asQV:function(){return[null]}},
-ay:{
-"^":"a;N3,Mn,c0",
-gl:function(){return C.yo.j(this.N3.Bx,this.Mn)},
-G:function(){return++this.Mn<this.c0},
-eR:function(a,b){this.Mn+=b}}}],["","",,Z,{
+vZG:{
+"^":"a;f9,D1,c0",
+gl:function(){return C.yo.j(this.f9.vF,this.D1)},
+G:function(){return++this.D1<this.c0},
+eR:function(a,b){this.D1+=b}}}],["","",,Z,{
 "^":"",
 kb:{
 "^":"a;aH,Rr,O4",
@@ -21881,26 +21923,26 @@
 G:function(){var z,y,x,w,v,u
 this.O4=null
 z=this.aH
-y=++z.Mn
+y=++z.D1
 x=z.c0
 if(y>=x)return!1
-w=z.N3.Bx
+w=z.f9.vF
 v=C.yo.j(w,y)
 if(v>=55296)y=v>57343&&v<=65535
 else y=!0
 if(y)this.O4=v
-else if(v<56320&&++z.Mn<x){u=C.yo.j(w,z.Mn)
+else if(v<56320&&++z.D1<x){u=C.yo.j(w,z.D1)
 if(u>=56320&&u<=57343)this.O4=(v-55296<<10>>>0)+(65536+(u-56320))
-else{if(u>=55296&&u<56320)--z.Mn
+else{if(u>=55296&&u<56320)--z.D1
 this.O4=this.Rr}}else this.O4=this.Rr
 return!0}}}],["","",,U,{
 "^":"",
 LQ:function(a,b,c,d){var z,y,x,w,v,u,t
-z=a.Bx.length-b
-new G.YZ(a,b,z).a0(a,b,c)
+z=a.vF.length-b
+new G.GMB(a,b,z).a0(a,b,c)
 z=b+z
 y=b-1
-x=new Z.kb(new G.ay(a,y,z),d,null)
+x=new Z.kb(new G.vZG(a,y,z),d,null)
 w=H.VM(Array(z-y-1),[P.KN])
 for(z=w.length,v=0;x.G();v=u){u=v+1
 y=x.O4
@@ -21913,7 +21955,7 @@
 return t}}}],["","",,V,{
 "^":"",
 Pa:{
-"^":"V66;GG,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V66;GG,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gN:function(a){return a.GG},
 sN:function(a,b){a.GG=this.ct(a,C.pD,a.GG,b)},
 ghS:function(a){var z=a.GG
@@ -21922,16 +21964,16 @@
 gnI:function(a){var z=$.Kh.Nv
 if(z==null)return!1
 return J.xC(H.Go(z,"$isKM").N,a.GG)},
-f8D:[function(a,b,c,d){var z,y,x,w
+xX:[function(a,b,c,d){var z,y,x,w
 z=J.RE(b)
-y=z.gAy(b)
+y=z.gEV(b)
 if(typeof y!=="number")return y.D()
-if(y>0||z.gNl(b)===!0||z.gTu(b)===!0||z.gkA(b)===!0||z.gw4(b)===!0)return
-z.TI(b)
+if(y>0||z.gNl(b)===!0||z.gEX(b)===!0||z.gqx(b)===!0||z.gYK(b)===!0)return
+z.e6(b)
 x=$.Kh.Nv
 if(x==null||!J.xC(J.l2(x),a.GG)){z=$.Kh
 y=a.GG
-y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.Z8),P.L5(null,null,null,P.qU,L.Z8),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 y.Lw()
 z.swv(0,y)}w=J.Vs(d).dA.getAttribute("href")
 $.Kh.Z6.bo(0,w)},"$3","gkD",6,0,171,87,106,186],
@@ -21950,7 +21992,7 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -21964,31 +22006,31 @@
 "^":"uL+Pi;",
 $isd3:true},
 D2:{
-"^":"V67;ot,KW,E6,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V67;ot,YE,E6,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gvm:function(a){return a.ot},
 svm:function(a,b){a.ot=this.ct(a,C.uX,a.ot,b)},
-gHL:function(a){return a.KW},
-sHL:function(a,b){a.KW=this.ct(a,C.oE,a.KW,b)},
+gHL:function(a){return a.YE},
+sHL:function(a,b){a.YE=this.ct(a,C.oE,a.YE,b)},
 gFK:function(a){return a.E6},
 sFK:function(a,b){a.E6=this.ct(a,C.am,a.E6,b)},
-yY:function(a){this.Wd(a)},
+yY:function(a){this.iW(a)},
 VP:function(a,b){if(J.co(b,"ws://"))return b
 return"ws://"+H.d(b)+"/ws"},
 nyC:[function(a,b,c,d){var z,y,x
-J.jD(b)
+J.fD(b)
 z=this.VP(a,a.ot)
-d=$.Kh.m2.J8(z)
+d=$.Kh.m2.TP(z)
 y=$.Kh
-x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.Z8),P.L5(null,null,null,P.qU,L.Z8),0,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
+x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,L.U2),P.L5(null,null,null,P.qU,L.U2),0,!1,!1,new P.GY(!1),new U.hA(null),"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 x.Lw()
 y.swv(0,x)
-$.Kh.Z6.bo(0,"#/vm")},"$3","guZ",6,0,116,2,106,107],
-jLH:[function(a,b,c,d){J.jD(b)
-this.Wd(a)},"$3","gzG",6,0,116,2,106,107],
-Wd:function(a){G.QX(a.KW).ml(new V.Vn(a)).OA(new V.oU(a))},
+$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,116,2,106,107],
+jLH:[function(a,b,c,d){J.fD(b)
+this.iW(a)},"$3","gzG",6,0,116,2,106,107],
+iW:function(a){G.n8(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
 Kq:function(a){var z=P.ii(0,0,0,0,0,1)
 a.tB=this.ct(a,C.O9,a.tB,z)},
-static:{n5p:function(a){var z,y,x,w,v
+static:{Hr:function(a){var z,y,x,w,v
 z=Q.pT(null,L.Z5)
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -21996,9 +22038,9 @@
 w=P.Fl(null,null)
 v=P.Fl(null,null)
 a.ot=""
-a.KW="localhost:9222"
+a.YE="localhost:9222"
 a.E6=z
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=y
@@ -22016,7 +22058,7 @@
 "^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w
 z=this.a
-J.U2(z.E6)
+J.Z8(z.E6)
 if(a==null)return
 y=J.U6(a)
 x=0
@@ -22024,23 +22066,23 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.dH(z.E6,y.t(a,x))}++x}},"$1",null,2,0,null,244,"call"],
+J.bi(z.E6,y.t(a,x))}++x}},"$1",null,2,0,null,244,"call"],
 $isEH:true},
 oU:{
 "^":"TpZ:12;b",
-$1:[function(a){J.U2(this.b.E6)},"$1",null,2,0,null,2,"call"],
+$1:[function(a){J.Z8(this.b.E6)},"$1",null,2,0,null,2,"call"],
 $isEH:true}}],["","",,X,{
 "^":"",
 I5:{
-"^":"xI;tY,R1,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 static:{vC:function(a){var z,y,x,w
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.R1=!1
-a.Iy=[]
+a.Pe=!1
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
@@ -22052,7 +22094,7 @@
 return a}}}}],["","",,U,{
 "^":"",
 el:{
-"^":"V68;uB,lc,Vg,ij,tB,IO,Vg,ij,Vg,ij,IX,vG,Iy,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"V68;uB,lc,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
 gwv:function(a){return a.uB},
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
@@ -22064,15 +22106,15 @@
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
 x=P.Fl(null,null)
 w=P.Fl(null,null)
-a.Iy=[]
+a.f4=[]
 a.OD=!1
 a.kK=!1
 a.ZM=z
 a.ZQ=y
 a.qJ=x
 a.wy=w
-C.Tkx.LX(a)
-C.Tkx.XI(a)
+C.Hd.LX(a)
+C.Hd.XI(a)
 return a}}},
 V68:{
 "^":"uL+Pi;",
@@ -22082,15 +22124,15 @@
 ;(function(){var z=!0,y
 y=P.KN
 y.$isKN=z
-y.$isFK=z
+y.$islf=z
 y.$isfRn=z
-y.$asfRn=[P.FK]
+y.$asfRn=[P.lf]
 y.$isa=z
-y=P.CP
-y.$isCP=z
-y.$isFK=z
+y=P.Vf
+y.$isVf=z
+y.$islf=z
 y.$isfRn=z
-y.$asfRn=[P.FK]
+y.$asfRn=[P.lf]
 y.$isa=z
 y=W.KV
 y.$isKV=z
@@ -22101,11 +22143,11 @@
 y.$isfRn=z
 y.$asfRn=[P.qU]
 y.$isa=z
-W.M5K.$isa=z
-y=P.FK
-y.$isFK=z
+W.QI.$isa=z
+y=P.lf
+y.$islf=z
 y.$isfRn=z
-y.$asfRn=[P.FK]
+y.$asfRn=[P.lf]
 y.$isa=z
 y=N.Ng
 y.$isfRn=z
@@ -22116,61 +22158,61 @@
 y.$isfRn=z
 y.$asfRn=[P.a6]
 y.$isa=z
-P.a.$isa=z
-P.Od.$isa=z
-y=P.WO
-y.$isWO=z
-y.$isQV=z
-y.$isa=z
-y=A.Ap
-y.$isAp=z
-y.$isa=z
-P.oz.$isa=z
 y=W.h4
 y.$ish4=z
 y.$isKV=z
 y.$isa=z
-y=K.O1
-y.$isO1=z
+y=P.WO
+y.$isWO=z
+y.$isQV=z
+y.$isa=z
+P.Od.$isa=z
+P.oz.$isa=z
+P.a.$isa=z
+y=A.Ap
+y.$isAp=z
+y.$isa=z
+y=K.Aep
+y.$isAep=z
 y.$isa=z
 y=U.x06
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.FH
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.uku
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.fp
 y.$isfp=z
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.nu
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.Mm
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
-y=U.c09
-y.$ishw=z
+y=U.c0
+y.$isrx=z
 y.$isa=z
-y=U.Dv
-y.$ishw=z
+y=U.noG
+y.$isrx=z
 y.$isa=z
 y=U.RWc
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.vn
 y.$isvn=z
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
 y=U.x9
-y.$ishw=z
+y.$isrx=z
 y.$isa=z
-y=U.EO
-y.$isEO=z
-y.$ishw=z
+y=U.WH
+y.$isWH=z
+y.$isrx=z
 y.$isa=z
 y=P.IN
 y.$isIN=z
@@ -22182,19 +22224,12 @@
 y=T.yj
 y.$isyj=z
 y.$isa=z
-F.d3.$isa=z
-A.XP.$isa=z
-W.O7.$isa=z
-y=P.SQ
-y.$isSQ=z
+y=W.Iv
+y.$ish4=z
+y.$isKV=z
 y.$isa=z
-G.MQ.$isa=z
-y=D.Mk
-y.$isMk=z
-y.$isaf=z
-y.$isa=z
-y=L.Z8
-y.$isZ8=z
+y=L.U2
+y.$isU2=z
 y.$isa=z
 y=D.af
 y.$isaf=z
@@ -22202,10 +22237,6 @@
 y=D.bv
 y.$isaf=z
 y.$isa=z
-y=G.Zq
-y.$isZq=z
-y.$isyj=z
-y.$isa=z
 D.ta.$isa=z
 D.ER.$isa=z
 y=D.xB
@@ -22231,33 +22262,68 @@
 y.$isvx=z
 y.$isaf=z
 y.$isa=z
-D.xb.$isa=z
+D.Z9.$isa=z
 D.br.$isa=z
 D.c2.$isa=z
-y=P.z5
+y=G.Zq
+y.$isZq=z
+y.$isyj=z
+y.$isa=z
+y=W.BI
+y.$isea=z
+y.$isa=z
+y=W.ea
+y.$isea=z
+y.$isa=z
+y=W.cxu
+y.$iscxu=z
+y.$isea=z
+y.$isa=z
+y=P.Ol
 y.$isQV=z
 y.$isa=z
-y=Z.lX
-y.$islX=z
+y=P.SQ
+y.$isSQ=z
 y.$isa=z
-D.W1.$isa=z
-P.A5.$isa=z
+y=W.ew7
+y.$isea=z
+y.$isa=z
+W.fJ.$isa=z
 y=G.Y2
 y.$isY2=z
 y.$isa=z
-y=L.Tv
-y.$isTv=z
-y.$isa=z
-K.PF.$isa=z
-y=W.Iv
-y.$ish4=z
-y.$isKV=z
-y.$isa=z
 y=D.kx
 y.$iskx=z
 y.$isaf=z
 y.$isa=z
-D.TH.$isa=z
+D.D5.$isa=z
+F.d3.$isa=z
+A.So.$isa=z
+y=W.N2
+y.$isN2=z
+y.$isea=z
+y.$isa=z
+G.OS.$isa=z
+y=D.Mk
+y.$isMk=z
+y.$isaf=z
+y.$isa=z
+y=W.niR
+y.$isniR=z
+y.$isea=z
+y.$isa=z
+y=Z.lX
+y.$islX=z
+y.$isa=z
+D.W1.$isa=z
+P.A0.$isa=z
+y=W.PGY
+y.$isea=z
+y.$isa=z
+y=L.Zl
+y.$isZl=z
+y.$isa=z
+K.PF.$isa=z
 y=N.HV
 y.$isHV=z
 y.$isa=z
@@ -22268,9 +22334,9 @@
 y.$ishsw=z
 y.$isKV=z
 y.$isa=z
-Y.PnY.$isa=z
-y=U.hw
-y.$ishw=z
+Y.qS.$isa=z
+y=U.rx
+y.$isrx=z
 y.$isa=z
 y=P.yX
 y.$isyX=z
@@ -22278,34 +22344,24 @@
 y=L.Z5
 y.$isZ5=z
 y.$isa=z
-G.c0.$isa=z
-y=P.e4y
-y.$ise4y=z
-y.$isa=z
-y=P.JBS
-y.$isJBS=z
-y.$isa=z
-y=P.BpP
-y.$isBpP=z
-y.$isa=z
+G.Ni.$isa=z
 y=V.qC
 y.$isqC=z
 y.$isT8=z
 y.$isa=z
-y=W.cxu
-y.$iscxu=z
-y.$isea=z
+y=P.BpP
+y.$isBpP=z
 y.$isa=z
-y=P.Wy
-y.$isWy=z
+y=P.V2
+y.$isV2=z
 y.$isa=z
 y=P.KA
 y.$isKA=z
 y.$isNOT=z
 y.$isyX=z
 y.$isa=z
-y=P.JIw
-y.$isJIw=z
+y=P.LR
+y.$isLR=z
 y.$isKA=z
 y.$isNOT=z
 y.$isyX=z
@@ -22322,6 +22378,12 @@
 y.$isuq=z
 y.$isaf=z
 y.$isa=z
+y=P.e4y
+y.$ise4y=z
+y.$isa=z
+y=P.JBS
+y.$isJBS=z
+y.$isa=z
 y=P.fRn
 y.$isfRn=z
 y.$isa=z
@@ -22340,8 +22402,8 @@
 y=P.EH
 y.$isEH=z
 y.$isa=z
-y=P.cb
-y.$iscb=z
+y=P.wS
+y.$iswS=z
 y.$isa=z
 y=P.b8
 y.$isb8=z
@@ -22349,28 +22411,17 @@
 y=P.NOT
 y.$isNOT=z
 y.$isa=z
+y=P.fIm
+y.$isfIm=z
+y.$isa=z
 y=P.iP
 y.$isiP=z
 y.$isfRn=z
 y.$asfRn=[null]
 y.$isa=z
-y=P.fIm
-y.$isfIm=z
-y.$isa=z
-y=W.v3
-y.$isv3=z
-y.$isea=z
-y.$isa=z
-y=W.ea
-y.$isea=z
-y.$isa=z
 y=O.Hz
 y.$isHz=z
 y.$isa=z
-y=W.niR
-y.$isniR=z
-y.$isea=z
-y.$isa=z
 y=D.wv
 y.$iswv=z
 y.$isaf=z
@@ -22409,13 +22460,13 @@
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.MZ(a)}
+return J.aN(a)}
 J.U6=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.MZ(a)}
+return J.aN(a)}
 J.Wx=function(a){if(typeof a=="number")return J.P.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
@@ -22424,7 +22475,7 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.MZ(a)}
+return J.aN(a)}
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
 return J.VA7.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.CDU.prototype
@@ -22432,175 +22483,186 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.MZ(a)}
+return J.aN(a)}
 J.A1=function(a,b){return J.RE(a).seT(a,b)}
 J.A4=function(a,b){return J.RE(a).sjx(a,b)}
-J.A6=function(a,b){return J.RE(a).sdl(a,b)}
-J.AE=function(a,b){return J.RE(a).sJb(a,b)}
+J.A6L=function(a,b){return J.RE(a).sdl(a,b)}
+J.AC=function(a,b){return J.RE(a).Ky(a,b)}
 J.AF=function(a){return J.RE(a).gIi(a)}
 J.AG=function(a){return J.x(a).bu(a)}
 J.AI=function(a,b){return J.RE(a).su6(a,b)}
-J.AU=function(a){return J.RE(a).gpM(a)}
 J.AW=function(a){return J.RE(a).gnl(a)}
 J.Ac=function(a,b){return J.RE(a).siZ(a,b)}
 J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
-J.Ag=function(a){return J.RE(a).zd(a)}
-J.Ak=function(a){return J.RE(a).ghy(a)}
+J.As=function(a){return J.Wx(a).gVz(a)}
 J.At=function(a){return J.RE(a).gvC(a)}
 J.Aw=function(a){return J.RE(a).gb6(a)}
 J.B9=function(a,b){return J.RE(a).shN(a,b)}
-J.BB=function(a){return J.RE(a).gP9(a)}
 J.BC=function(a,b){return J.RE(a).sja(a,b)}
 J.BL=function(a,b){return J.RE(a).sRd(a,b)}
 J.BQ=function(a,b){return J.Qe(a).Fr(a,b)}
-J.BT=function(a){return J.RE(a).goN(a)}
+J.BT=function(a){return J.RE(a).gNG(a)}
 J.BZ=function(a){return J.RE(a).gnv(a)}
 J.Bj=function(a,b){return J.RE(a).snl(a,b)}
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.C3=function(a,b){return J.RE(a).sig(a,b)}
-J.CA=function(a){return J.RE(a).gil(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
-J.CNb=function(a){return J.RE(a).gd0(a)}
-J.Co=function(a,b){return J.RE(a).szH(a,b)}
-J.Cr=function(a){return J.RE(a).gEQ(a)}
-J.Cs=function(a){return J.RE(a).gWw(a)}
-J.Ct=function(a,b,c){return J.RE(a).ek(a,b,c)}
+J.CN=function(a){return J.RE(a).gd0(a)}
+J.CP=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
+J.CS=function(a,b){return J.RE(a).sCd(a,b)}
+J.Cl=function(a,b){return J.Wx(a).Z(a,b)}
+J.Cs=function(a){return J.RE(a).gyg(a)}
 J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
 J.Cz=function(a,b,c){return J.w1(a).oq(a,b,c)}
+J.D4=function(a,b){return J.RE(a).sA0(a,b)}
+J.D8=function(a){return J.RE(a).gl6(a)}
 J.DA=function(a){return J.RE(a).goc(a)}
+J.DF=function(a,b){return J.RE(a).soc(a,b)}
+J.DG=function(a,b){return J.RE(a).Tk(a,b)}
 J.DP=function(a,b,c){return J.U6(a).XU(a,b,c)}
-J.Dc=function(a){return J.RE(a).gEa(a)}
-J.Do=function(a){return J.RE(a).gM0(a)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
-J.E1=function(a){return J.RE(a).gi0(a)}
+J.Dv=function(a){return J.Wx(a).zQ(a)}
+J.E3=function(a){return J.RE(a).gRu(a)}
 J.EC=function(a,b){return J.RE(a).svm(a,b)}
 J.EE=function(a,b){return J.RE(a).sFF(a,b)}
 J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
+J.EM=function(a){return J.RE(a).gV5(a)}
+J.Ec=function(a){return J.RE(a).gMZ(a)}
 J.Ed=function(a,b){return J.RE(a).sFK(a,b)}
-J.Ee=function(a){return J.RE(a).gG5(a)}
-J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
+J.Eh=function(a,b){return J.Wx(a).O(a,b)}
 J.Ei=function(a,b){return J.w1(a).uk(a,b)}
 J.Eo=function(a,b){return J.RE(a).sDQ(a,b)}
 J.Er=function(a){return J.RE(a).gu6(a)}
-J.Es=function(a){return J.w1(a).gtH(a)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
 J.F9=function(a){return J.RE(a).gvm(a)}
 J.FI=function(a,b){return J.RE(a).sih(a,b)}
 J.FN=function(a){return J.U6(a).gl0(a)}
 J.FS=function(a){return J.RE(a).gwp(a)}
-J.FS1=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
 J.FW=function(a,b){return J.Qc(a).iM(a,b)}
 J.Fc=function(a,b){return J.RE(a).sP(a,b)}
 J.Fd=function(a,b,c){return J.w1(a).aM(a,b,c)}
-J.Ff=function(a){return J.RE(a).gLc(a)}
-J.Fi=function(a){return J.RE(a).gnZ(a)}
 J.Fv=function(a,b){return J.RE(a).sFR(a,b)}
 J.Fy=function(a){return J.RE(a).h9(a)}
 J.G7=function(a,b){return J.RE(a).seZ(a,b)}
+J.GF=function(a){return J.RE(a).gz2(a)}
+J.GG=function(a){return J.Qe(a).gNq(a)}
 J.GH=function(a){return J.RE(a).gyW(a)}
-J.GJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
+J.GL=function(a){return J.RE(a).gBp(a)}
+J.GW=function(a){return J.RE(a).gVY(a)}
 J.GZ=function(a,b){return J.RE(a).sph(a,b)}
-J.Gt=function(a){return J.RE(a).gRY(a)}
+J.Gl=function(a){return J.RE(a).ghy(a)}
 J.H1=function(a){return J.RE(a).gLe(a)}
-J.H3=function(a){return J.RE(a).gl6(a)}
+J.H2=function(a){return J.RE(a).gYi(a)}
+J.H3=function(a,b){return J.RE(a).sZA(a,b)}
 J.H4=function(a,b){return J.RE(a).wR(a,b)}
 J.HB=function(a){return J.RE(a).gxT(a)}
-J.HL=function(a){return J.RE(a).gvq(a)}
-J.HP=function(a){return J.RE(a).ghf(a)}
-J.HS=function(a){return J.RE(a).guS(a)}
+J.HP=function(a){return J.RE(a).gFK(a)}
 J.HT=function(a,b){return J.RE(a).sLc(a,b)}
-J.Hd=function(a){return J.RE(a).gLF(a)}
 J.Hf=function(a,b){return J.RE(a).seo(a,b)}
+J.Hg=function(a){return J.RE(a).gP9(a)}
 J.Hh=function(a,b){return J.RE(a).sO9(a,b)}
-J.Hm=function(a){return J.RE(a).gTK(a)}
-J.Hq=function(a){return J.RE(a).grV(a)}
+J.Hn=function(a,b){return J.RE(a).sxT(a,b)}
+J.Ho=function(a){return J.RE(a).WJ(a)}
 J.Hs=function(a){return J.RE(a).goL(a)}
 J.Hy=function(a){return J.RE(a).gZp(a)}
-J.I1=function(a){return J.RE(a).gCF(a)}
+J.IB=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
+J.II=function(a){return J.w1(a).Jd(a)}
 J.IL=function(a){return J.RE(a).goE(a)}
+J.IO=function(a){return J.RE(a).gRH(a)}
 J.IP=function(a){return J.RE(a).gSs(a)}
-J.IR=function(a){return J.RE(a).gYt(a)}
-J.IX=function(a,b){return J.RE(a).sTj(a,b)}
-J.Ij=function(a){return J.w1(a).Oe(a)}
-J.Ip=function(a,b){return J.RE(a).QS(a,b)}
+J.IR=function(a){return J.RE(a).gkZ(a)}
+J.IX=function(a,b){return J.RE(a).sEu(a,b)}
 J.Ir=function(a){return J.RE(a).gyK(a)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
-J.J1=function(a){return J.RE(a).PJ(a)}
-J.J2g=function(a){return J.RE(a).UV(a)}
+J.J0=function(a,b){return J.RE(a).sR1(a,b)}
+J.J1=function(a,b){return J.RE(a).rW(a,b)}
 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.Qe(a).h8(a,b,c)}
-J.JC=function(a){return J.RE(a).gCw(a)}
 J.JG=function(a,b){return J.RE(a).si0(a,b)}
-J.JU=function(a){return J.RE(a).gGc(a)}
 J.JX=function(a){return J.RE(a).gpE(a)}
 J.JZ=function(a,b){return J.RE(a).st0(a,b)}
-J.Jh=function(a){return J.RE(a).guh(a)}
+J.Jj=function(a){return J.RE(a).gWA(a)}
 J.Jl=function(a,b){return J.RE(a).sML(a,b)}
-J.Jp9=function(a){return J.RE(a).gjl(a)}
-J.Jq=function(a){return J.RE(a).gFF(a)}
-J.Jv=function(a){return J.RE(a).gfg(a)}
+J.Jp=function(a){return J.RE(a).gjl(a)}
+J.Jr=function(a){return J.RE(a).gGV(a)}
+J.Jv=function(a){return J.RE(a).gzG(a)}
+J.K0=function(a){return J.RE(a).gd4(a)}
+J.K2=function(a){return J.RE(a).gtN(a)}
 J.KD=function(a,b){return J.RE(a).j3(a,b)}
-J.Kf=function(a){return J.RE(a).gtN(a)}
+J.KG=function(a){return J.RE(a).guz(a)}
+J.Kd=function(a){return J.RE(a).gCF(a)}
+J.Kj=function(a){return J.RE(a).gYt(a)}
 J.Kl=function(a){return J.RE(a).gBP(a)}
-J.Ks=function(a){return J.RE(a).gPe(a)}
-J.Kv=function(a){return J.RE(a).gyZ(a)}
-J.Kw=function(a,b){return J.RE(a).sLF(a,b)}
-J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
-J.L6=function(a){return J.RE(a).gRu(a)}
+J.L1=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
+J.L6=function(a){return J.RE(a).glD(a)}
+J.L9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
+return J.Wx(a).V(a,b)}
 J.LE=function(a){return J.RE(a).VD(a)}
-J.LF=function(a){return J.RE(a).gpf(a)}
-J.LL=function(a){return J.RE(a).gFK(a)}
 J.LM=function(a){return J.RE(a).gn9(a)}
-J.LY4=function(a){return J.RE(a).gBp(a)}
+J.LW=function(a,b,c){return J.RE(a).AS(a,b,c)}
+J.LY=function(a){return J.RE(a).gi0(a)}
 J.La=function(a,b){return J.RE(a).sBN(a,b)}
 J.Ld=function(a,b){return J.w1(a).eR(a,b)}
+J.Lh=function(a){if(typeof a=="number")return-a
+return J.Wx(a).J(a)}
 J.Lp=function(a){return J.RE(a).geT(a)}
+J.M2=function(a){return J.RE(a).gFF(a)}
 J.ME=function(a,b){return J.RE(a).sUo(a,b)}
 J.MF=function(a,b){return J.RE(a).syK(a,b)}
-J.MI=function(a,b){return J.RE(a).PN(a,b)}
+J.MI=function(a,b){return J.RE(a).sQR(a,b)}
+J.MQ=function(a){return J.w1(a).grZ(a)}
 J.MT=function(a){return J.RE(a).guc(a)}
-J.MV=function(a){return J.RE(a).gRq(a)}
+J.MU=function(a){return J.RE(a).Fc(a)}
 J.MX=function(a,b){return J.RE(a).sPj(a,b)}
 J.Me=function(a,b){return J.w1(a).aN(a,b)}
+J.Mh=function(a,b){return J.RE(a).sTj(a,b)}
+J.Mp=function(a){return J.w1(a).wg(a)}
+J.Mx=function(a){return J.RE(a).gks(a)}
 J.N1=function(a){return J.RE(a).Es(a)}
-J.NA=function(a,b){return J.RE(a).sG5(a,b)}
-J.NC=function(a){return J.RE(a).gNG(a)}
+J.NB=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.NC=function(a){return J.RE(a).gHy(a)}
+J.NDJ=function(a){return J.RE(a).gWt(a)}
 J.NE=function(a,b){return J.RE(a).sHL(a,b)}
 J.NH=function(a,b){return J.RE(a).swv(a,b)}
 J.NO=function(a,b){return J.RE(a).soE(a,b)}
-J.NQ=function(a){return J.Wx(a).zQ(a)}
+J.NV=function(a){return J.RE(a).gYe(a)}
 J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
-J.Nb=function(a){return J.RE(a).gt0(a)}
+J.Nb=function(a){return J.RE(a).gdH(a)}
+J.Nd=function(a){return J.w1(a).br(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
+J.Nh=function(a,b){return J.RE(a).sz2(a,b)}
 J.Nj=function(a,b,c){return J.Qe(a).Nj(a,b,c)}
-J.Nx=function(a){return J.RE(a).gMN(a)}
+J.Nk=function(a){return J.RE(a).gtT(a)}
+J.Nq=function(a){return J.RE(a).gGc(a)}
+J.O2=function(a){return J.RE(a).JP(a)}
 J.O8=function(a){return J.RE(a).Sd(a)}
-J.OC=function(a){return J.RE(a).gCn(a)}
+J.OB=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
-J.OH=function(a){return J.w1(a).grZ(a)}
-J.OX=function(a){return J.Qe(a).gNq(a)}
+J.OT=function(a){return J.RE(a).gXE(a)}
 J.Oh=function(a){return J.RE(a).gG1(a)}
-J.Oi=function(a){return J.RE(a).gBo(a)}
-J.Okq=function(a){return J.RE(a).ghU(a)}
+J.Ok=function(a){return J.RE(a).ghU(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
-J.P5=function(a){return J.RE(a).gHo(a)}
 J.P6=function(a,b){return J.RE(a).sZ2(a,b)}
 J.PG=function(a){return J.RE(a).gEE(a)}
+J.PK=function(a){return J.RE(a).gQR(a)}
 J.PN=function(a,b){return J.RE(a).sCI(a,b)}
 J.PP=function(a,b){return J.RE(a).snv(a,b)}
-J.PQ=function(a){return J.RE(a).gVY(a)}
-J.PS=function(a,b){return J.RE(a).sLU(a,b)}
+J.PR=function(a){return J.RE(a).gA5(a)}
+J.PS=function(a){return J.x(a).gCR(a)}
 J.PW=function(a){return J.RE(a).gVb(a)}
+J.PY=function(a){return J.RE(a).goN(a)}
+J.Pc=function(a,b){return J.RE(a).yU(a,b)}
+J.Pf=function(a){return J.RE(a).gWw(a)}
 J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
 J.Pp=function(a,b){return J.Qe(a).j(a,b)}
 J.Pq=function(a){return J.RE(a).gqF(a)}
+J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
 J.Px=function(a,b){return J.RE(a).swp(a,b)}
-J.Q0=function(a){return J.RE(a).gwh(a)}
+J.Q0=function(a,b){return J.U6(a).OY(a,b)}
 J.Q2=function(a){return J.RE(a).gO3(a)}
-J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 J.Q9=function(a){return J.RE(a).gf0(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
 J.QT=function(a,b){return J.RE(a).vV(a,b)}
@@ -22612,79 +22674,85 @@
 J.Qy=function(a,b){return J.RE(a).shf(a,b)}
 J.R1=function(a){return J.RE(a).Fn(a)}
 J.R8=function(a,b){return J.RE(a).sMT(a,b)}
-J.RH0=function(a){return J.RE(a).gwX(a)}
+J.RC=function(a){return J.RE(a).gTA(a)}
+J.RI=function(a){return J.RE(a).gRT(a)}
 J.RX=function(a,b){return J.RE(a).sjl(a,b)}
 J.Rp=function(a,b){return J.RE(a).sod(a,b)}
-J.Rv=function(a){return J.w1(a).wg(a)}
-J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
+J.Rr=function(a){return J.RE(a).ga7(a)}
+J.Ry=function(a){return J.RE(a).gVE(a)}
 J.SF=function(a,b){return J.RE(a).sIi(a,b)}
 J.SG=function(a){return J.RE(a).gDI(a)}
 J.SK=function(a){return J.RE(a).xW(a)}
 J.SM=function(a){return J.RE(a).gbw(a)}
 J.SO=function(a,b){return J.RE(a).sCF(a,b)}
-J.SS=function(a){return J.RE(a).gQP(a)}
 J.Sf=function(a,b){return J.RE(a).sXE(a,b)}
 J.Sj=function(a,b){return J.RE(a).svC(a,b)}
 J.Sl=function(a){return J.RE(a).gxb(a)}
 J.Sm=function(a,b){return J.RE(a).skZ(a,b)}
+J.Sr=function(a){return J.RE(a).gvq(a)}
 J.T5=function(a,b){return J.RE(a).stT(a,b)}
 J.TG=function(a){return J.RE(a).gFb(a)}
 J.TM=function(a){return J.RE(a).gOd(a)}
-J.TP=function(a,b){return J.RE(a).sd0(a,b)}
-J.TR=function(a){return J.RE(a).Um(a)}
+J.TP=function(a,b){return J.RE(a).sGV(a,b)}
+J.TY=function(a){return J.RE(a).gvp(a)}
 J.TZ=function(a,b){return J.RE(a).sN(a,b)}
-J.Ts=function(a,b){return J.Wx(a).Z(a,b)}
+J.Tg=function(a){return J.RE(a).gCI(a)}
+J.Tm=function(a){return J.RE(a).grX(a)}
+J.Ts=function(a){return J.RE(a).gfG(a)}
 J.Tu=function(a,b){return J.RE(a).sl6(a,b)}
+J.Tv=function(a){return J.RE(a).gB1(a)}
 J.Tx=function(a,b){return J.RE(a).spf(a,b)}
-J.U2=function(a){return J.w1(a).V1(a)}
-J.U8=function(a,b){return J.RE(a).sX7(a,b)}
+J.U8=function(a){return J.RE(a).gEQ(a)}
+J.UA=function(a){return J.RE(a).gP2(a)}
 J.UE=function(a){return J.w1(a).git(a)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
 return J.Wx(a).w(a,b)}
+J.UP=function(a){return J.RE(a).gnZ(a)}
 J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.Gp(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
 return J.U6(a).t(a,b)}
-J.US=function(a){return J.RE(a).gWt(a)}
-J.UU=function(a,b){return J.RE(a).sng(a,b)}
-J.Ua=function(a){return J.RE(a).gkZ(a)}
-J.Ur=function(a){return J.RE(a).gyX(a)}
+J.UR=function(a){return J.RE(a).Lg(a)}
+J.UT=function(a){return J.RE(a).gDQ(a)}
+J.Ue=function(a){return J.RE(a).gV8(a)}
 J.Ux=function(a){return J.RE(a).geo(a)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
-J.V2=function(a,b,c){return J.w1(a).aP(a,b,c)}
 J.VA=function(a,b){return J.w1(a).Vr(a,b)}
-J.VB=function(a){return J.RE(a).gRT(a)}
-J.Vj=function(a,b){return J.RE(a).Md(a,b)}
+J.VU=function(a,b){return J.RE(a).PN(a,b)}
+J.Vk=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vr=function(a,b){return J.Qe(a).C1(a,b)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
-J.Vw=function(a,b){return J.U6(a).sB(a,b)}
-J.W2H=function(a){return J.RE(a).gCf(a)}
+J.W2=function(a){return J.RE(a).gCf(a)}
 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,b){return J.RE(a).soc(a,b)}
+J.WI=function(a,b){return J.RE(a).sLF(a,b)}
 J.WT=function(a){return J.RE(a).gFR(a)}
-J.WX7=function(a){return J.RE(a).gbJ(a)}
+J.WX=function(a){return J.RE(a).gbJ(a)}
+J.We=function(a,b){return J.RE(a).VG(a,b)}
 J.Wf=function(a){return J.RE(a).D4(a)}
+J.Wp=function(a){return J.RE(a).gQU(a)}
+J.Wy=function(a,b){return J.RE(a).sBk(a,b)}
+J.X6=function(a){return J.RE(a).gjD(a)}
 J.X7=function(a){return J.RE(a).gcH(a)}
-J.X9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
-return J.Wx(a).V(a,b)}
-J.XB=function(a){return J.RE(a).gQU(a)}
+J.X9=function(a){return J.RE(a).gTK(a)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
 J.XHl=function(a){return J.Wx(a).yu(a)}
-J.Xa=function(a){return J.RE(a).gXc(a)}
+J.XP=function(a){return J.RE(a).Um(a)}
 J.Xf=function(a){return J.RE(a).gbq(a)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
-J.Xp=function(a){return J.RE(a).gzH(a)}
+J.Xr=function(a){return J.RE(a).gEa(a)}
 J.Xu=function(a,b){return J.RE(a).sFL(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
-J.YH=function(a){return J.RE(a).gnS(a)}
-J.YN=function(a,b){return J.RE(a).WO(a,b)}
+J.Y7=function(a){return J.RE(a).gLU(a)}
+J.YG=function(a){return J.RE(a).gQP(a)}
+J.YH=function(a){return J.RE(a).gpM(a)}
 J.YQ=function(a){return J.RE(a).gPL(a)}
 J.YSV=function(a,b){return J.RE(a).sNJ(a,b)}
+J.Yd=function(a){return J.RE(a).gBV(a)}
 J.Yf=function(a){return J.w1(a).gIr(a)}
-J.Yq=function(a){return J.RE(a).gSR(a)}
+J.Yq=function(a){return J.RE(a).gph(a)}
 J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
-J.Z6=function(a){return J.RE(a).gV5(a)}
-J.ZC=function(a){return J.RE(a).gph(a)}
+J.Z6=function(a,b){return J.RE(a).sP9(a,b)}
+J.Z8=function(a){return J.w1(a).V1(a)}
 J.ZF=function(a){return J.RE(a).gAF(a)}
 J.ZG=function(a,b){return J.w1(a).zV(a,b)}
 J.ZH=function(a){return J.RE(a).gk8(a)}
@@ -22692,193 +22760,184 @@
 J.ZW=function(a,b,c,d){return J.RE(a).MS(a,b,c,d)}
 J.ZZ=function(a,b){return J.Qe(a).yn(a,b)}
 J.Zh=function(a){return J.RE(a).grJ(a)}
-J.Zl=function(a){return J.RE(a).gB1(a)}
 J.Zo=function(a){return J.RE(a).gK4(a)}
 J.Zs=function(a){return J.RE(a).gcY(a)}
-J.Zv=function(a){return J.RE(a).grs(a)}
+J.a3=function(a){return J.RE(a).gBk(a)}
+J.aA=function(a){return J.RE(a).gzY(a)}
+J.aB=function(a){return J.RE(a).gql(a)}
+J.aT=function(a){return J.RE(a).god(a)}
 J.aW=function(a){return J.RE(a).gJp(a)}
-J.ad=function(a){return J.RE(a).guZ(a)}
+J.an=function(a,b){return J.RE(a).Id(a,b)}
 J.au=function(a,b){return J.RE(a).sNG(a,b)}
+J.ay=function(a){return J.RE(a).giB(a)}
 J.b0=function(a,b){return J.RE(a).suc(a,b)}
 J.bB=function(a){return J.x(a).gbx(a)}
 J.bH=function(a,b,c,d){return J.RE(a).ea(a,b,c,d)}
 J.bI=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
-J.bL=function(a){return J.RE(a).gUt(a)}
-J.bb=function(a,b,c){return J.RE(a).X6(a,b,c)}
-J.be=function(a){return J.RE(a).gB3(a)}
+J.bL=function(a){return J.RE(a).ghS(a)}
+J.bS=function(a){return J.RE(a).gUo(a)}
+J.bT=function(a){return J.w1(a).gqG(a)}
+J.bh=function(a){return J.RE(a).geZ(a)}
+J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
-J.bs=function(a){return J.RE(a).JP(a)}
 J.bu=function(a){return J.RE(a).gyw(a)}
-J.cC=function(a){return J.RE(a).gke(a)}
+J.c7=function(a){return J.RE(a).guS(a)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cI=function(a,b){return J.Wx(a).Sy(a,b)}
 J.cO=function(a){return J.RE(a).gjx(a)}
-J.cP=function(a){return J.RE(a).gAd(a)}
-J.cS=function(a,b){return J.RE(a).sqF(a,b)}
 J.cV=function(a,b){return J.RE(a).sjT(a,b)}
 J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
 J.cj=function(a){return J.RE(a).gMT(a)}
 J.cl=function(a,b){return J.RE(a).sHt(a,b)}
 J.cm=function(a,b,c){return J.RE(a).kq(a,b,c)}
 J.co=function(a,b){return J.Qe(a).nC(a,b)}
-J.d5=function(a){return J.Wx(a).gKy(a)}
 J.dE=function(a){return J.RE(a).gGs(a)}
-J.dH=function(a,b){return J.w1(a).h(a,b)}
+J.dF=function(a){return J.w1(a).zH(a)}
+J.dK=function(a){return J.RE(a).gWk(a)}
 J.dY=function(a){return J.RE(a).ga4(a)}
-J.dd=function(a){return J.RE(a).gqu(a)}
+J.dZ=function(a){return J.RE(a).gDX(a)}
+J.dc=function(a,b){return J.RE(a).smH(a,b)}
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a){return J.RE(a).QE(a)}
-J.dv=function(a){return J.RE(a).gUL(a)}
+J.dj=function(a){return J.RE(a).gyZ(a)}
+J.dv=function(a,b,c){return J.RE(a).v3(a,b,c)}
+J.dw=function(a){return J.RE(a).gMt(a)}
 J.eS=function(a){return J.RE(a).gjO(a)}
+J.eU=function(a){return J.RE(a).gRh(a)}
 J.eY=function(a){return J.RE(a).gR(a)}
 J.eb=function(a){return J.RE(a).gIb(a)}
 J.ev=function(a){return J.RE(a).gkD(a)}
 J.f2=function(a){return J.RE(a).gRd(a)}
+J.f5=function(a){return J.RE(a).grz(a)}
+J.fD=function(a){return J.RE(a).e6(a)}
+J.fM=function(a){return J.RE(a).gLf(a)}
 J.fR=function(a,b){return J.RE(a).sMZ(a,b)}
-J.fY=function(a){return J.RE(a).gky(a)}
 J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
+J.fh=function(a){return J.RE(a).ghf(a)}
 J.fi=function(a){return J.RE(a).gX0(a)}
-J.fm=function(a,b){return J.RE(a).sxr(a,b)}
 J.fv=function(a){return J.RE(a).gZ9(a)}
-J.fx=function(a){return J.RE(a).gtu(a)}
 J.h6=function(a){return J.RE(a).gML(a)}
 J.h9=function(a,b){return J.RE(a).sWA(a,b)}
 J.hI=function(a){return J.RE(a).gUQ(a)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
-J.hW=function(a){return J.RE(a).gql(a)}
-J.ho=function(a){return J.RE(a).ghS(a)}
+J.hn=function(a){return J.RE(a).gEu(a)}
 J.ht=function(a){return J.RE(a).gZ2(a)}
 J.i0=function(a,b){return J.RE(a).sPB(a,b)}
 J.i2=function(a,b){return J.RE(a).sRk(a,b)}
-J.i2U=function(a){return J.RE(a).gCK(a)}
 J.i9=function(a,b){return J.w1(a).Zv(a,b)}
+J.iB=function(a){return J.RE(a).giC(a)}
 J.iL=function(a){return J.RE(a).gNb(a)}
 J.iS=function(a){return J.RE(a).gox(a)}
-J.iY=function(a){return J.Qe(a).DY(a)}
-J.iYM=function(a){return J.RE(a).gvc(a)}
-J.iiZ=function(a){return J.RE(a).gfG(a)}
-J.ik=function(a){return J.RE(a).gHt(a)}
+J.iY=function(a){return J.RE(a).gvc(a)}
+J.id=function(a){return J.RE(a).gR1(a)}
 J.io=function(a){return J.RE(a).gja(a)}
-J.iq=function(a){return J.RE(a).gRs(a)}
 J.is=function(a,b){return J.RE(a).snZ(a,b)}
-J.ix=function(a,b){return J.RE(a).sXc(a,b)}
-J.jD=function(a){return J.RE(a).TI(a)}
-J.jE=function(a){return J.RE(a).gA5(a)}
-J.jH=function(a){return J.RE(a).ghN(a)}
-J.jL=function(a){return J.RE(a).gBV(a)}
+J.ix=function(a){return J.RE(a).gnI(a)}
+J.j1=function(a){return J.RE(a).gZA(a)}
+J.jB=function(a){return J.RE(a).gpf(a)}
 J.jOZ=function(a,b){return J.Wx(a).Y(a,b)}
 J.jd=function(a){return J.RE(a).gZm(a)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
-J.jg=function(a){return J.RE(a).gEu(a)}
-J.jk=function(a,b,c){return J.RE(a).OP(a,b,c)}
-J.jo=function(a){return J.RE(a).gCI(a)}
+J.jl=function(a){return J.RE(a).gHt(a)}
 J.jq=function(a,b){return J.RE(a).sZp(a,b)}
-J.ju=function(a,b,c){return J.RE(a).eX(a,b,c)}
-J.jy=function(a,b){return J.RE(a).sPe(a,b)}
-J.jzo=function(a){if(typeof a=="number")return-a
-return J.Wx(a).J(a)}
 J.k0=function(a){return J.RE(a).giZ(a)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
+J.kW=function(a,b,c){if((a.constructor==Array||H.Gp(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
+return J.w1(a).u(a,b,c)}
 J.kX=function(a,b){return J.RE(a).sNb(a,b)}
+J.kZ=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.kv=function(a){return J.RE(a).glp(a)}
+J.kv=function(a){return J.RE(a).gDf(a)}
 J.l2=function(a){return J.RE(a).gN(a)}
-J.lF=function(a,b){return J.RE(a).snS(a,b)}
+J.lA=function(a){return J.RE(a).gLc(a)}
 J.lL=function(a){return J.RE(a).gQr(a)}
-J.lf=function(a,b){return J.Wx(a).O(a,b)}
-J.ls=function(a){return J.RE(a).gnI(a)}
+J.lN=function(a){return J.RE(a).gil(a)}
+J.le=function(a){return J.RE(a).gUt(a)}
+J.lu=function(a){return J.RE(a).gJ8(a)}
 J.m4=function(a){return J.RE(a).gig(a)}
-J.m8=function(a,b){return J.RE(a).sEu(a,b)}
-J.mB=function(a){return J.RE(a).Zi(a)}
 J.mF=function(a){return J.RE(a).gHn(a)}
-J.mI=function(a,b){return J.RE(a).rW(a,b)}
 J.mN=function(a){return J.RE(a).gRO(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.mU=function(a,b){return J.RE(a).skm(a,b)}
 J.mY=function(a){return J.w1(a).gA(a)}
-J.ma=function(a){return J.RE(a).gyG(a)}
-J.mk=function(a){return J.RE(a).gWA(a)}
 J.mu=function(a,b){return J.RE(a).TR(a,b)}
 J.my=function(a,b){return J.RE(a).sQl(a,b)}
 J.mz=function(a,b){return J.RE(a).scH(a,b)}
-J.n8=function(a){return J.RE(a).gUo(a)}
 J.n9=function(a){return J.RE(a).gQq(a)}
 J.nA=function(a,b){return J.RE(a).sPL(a,b)}
-J.nC=function(a,b){return J.RE(a).sCd(a,b)}
-J.nEe=function(a){return J.RE(a).gDf(a)}
 J.nG=function(a){return J.RE(a).gv8(a)}
-J.nb=function(a,b,c,d,e,f,g,h){return J.RE(a).kN(a,b,c,d,e,f,g,h)}
-J.nl=function(a){return J.RE(a).gDQ(a)}
+J.nN=function(a){return J.RE(a).gTt(a)}
+J.nb=function(a){return J.RE(a).gyX(a)}
 J.ns=function(a){return J.RE(a).gjT(a)}
 J.nv=function(a){return J.RE(a).gLW(a)}
+J.o3=function(a,b){return J.RE(a).sjD(a,b)}
+J.o6=function(a){return J.RE(a).Lx(a)}
+J.o8=function(a,b){return J.RE(a).sqF(a,b)}
 J.oD=function(a,b){return J.RE(a).hP(a,b)}
-J.oJ=function(a,b){return J.RE(a).srs(a,b)}
 J.oN=function(a){return J.RE(a).gj4(a)}
+J.oO=function(a){return J.RE(a).UV(a)}
+J.of=function(a){return J.RE(a).je(a)}
 J.okV=function(a,b){return J.RE(a).RR(a,b)}
+J.ol=function(a){return J.RE(a).glp(a)}
 J.op=function(a){return J.RE(a).gD7(a)}
-J.os=function(a){return J.RE(a).gqA(a)}
+J.p6=function(a){return J.RE(a).gBN(a)}
 J.p7=function(a){return J.RE(a).guD(a)}
 J.pA=function(a,b){return J.RE(a).sYt(a,b)}
 J.pB=function(a,b){return J.w1(a).sit(a,b)}
 J.pI=function(a){return J.RE(a).gH3(a)}
+J.pL=function(a,b,c){return J.RE(a).d2(a,b,c)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
-J.pU=function(a){return J.RE(a).gYe(a)}
-J.ph=function(a){return J.RE(a).gDX(a)}
-J.pq=function(a,b){return J.RE(a).yU(a,b)}
+J.pU=function(a){return J.RE(a).ghN(a)}
+J.pm=function(a){return J.RE(a).gt0(a)}
+J.pq=function(a,b){return J.RE(a).sV8(a,b)}
 J.q0=function(a,b){return J.RE(a).syG(a,b)}
 J.q1=function(a){return J.RE(a).geJ(a)}
 J.q8=function(a){return J.U6(a).gB(a)}
-J.qA=function(a){return J.w1(a).br(a)}
-J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
-J.qN=function(a){return J.RE(a).giC(a)}
-J.qQ=function(a,b,c){if((a.constructor==Array||H.Gp(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
-return J.w1(a).u(a,b,c)}
-J.qd=function(a,b,c,d){return J.RE(a).aC(a,b,c,d)}
-J.qf=function(a){return J.RE(a).gMl(a)}
-J.ql=function(a){return J.RE(a).gBN(a)}
-J.qq=function(a){return J.RE(a).dQ(a)}
+J.ql=function(a){return J.RE(a).gaB(a)}
 J.qx=function(a){return J.RE(a).gbe(a)}
+J.qy=function(a){return J.RE(a).gA0(a)}
+J.r0=function(a){return J.RE(a).gi6(a)}
+J.r5=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.rA=function(a,b){return J.RE(a).sbe(a,b)}
 J.rL=function(a,b){return J.RE(a).spE(a,b)}
-J.rN=function(a){return J.RE(a).gVE(a)}
-J.rS=function(a){return J.RE(a).gyr(a)}
+J.ra5=function(a){return J.RE(a).gAd(a)}
+J.re=function(a){return J.RE(a).gmb(a)}
+J.rk=function(a){return J.RE(a).gke(a)}
 J.ro=function(a){return J.RE(a).gOB(a)}
-J.rp=function(a){return J.RE(a).gd4(a)}
+J.rr=function(a){return J.Qe(a).bS(a)}
+J.rw=function(a){return J.RE(a).gMl(a)}
 J.ry=function(a,b){return J.RE(a).stu(a,b)}
 J.t0=function(a){return J.RE(a).gTj(a)}
 J.t3=function(a,b){return J.RE(a).sa4(a,b)}
 J.t8=function(a){return J.RE(a).gYQ(a)}
-J.tE=function(a,b){return J.RE(a).JX(a,b)}
-J.tX=function(a){return J.RE(a).gtT(a)}
-J.tdY=function(a){return J.RE(a).gng(a)}
-J.ti=function(a){return J.RE(a).grz(a)}
+J.tG=function(a){return J.RE(a).Zi(a)}
+J.tH=function(a,b){return J.RE(a).sHy(a,b)}
+J.tPf=function(a,b){return J.RE(a).X3(a,b)}
+J.tT=function(a,b,c){return J.RE(a).X6(a,b,c)}
 J.tv=function(a,b){return J.RE(a).sDX(a,b)}
-J.tw=function(a){return J.RE(a).je(a)}
+J.tw=function(a){return J.RE(a).gCK(a)}
 J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
-J.u5=function(a){return J.RE(a).gA8(a)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.uF=function(a,b){return J.w1(a).GT(a,b)}
-J.ufU=function(a){return J.RE(a).gxr(a)}
-J.ug=function(a){return J.x(a).gCR(a)}
+J.uH=function(a,b){return J.RE(a).sP2(a,b)}
+J.uN=function(a){return J.RE(a).gHo(a)}
+J.uW=function(a){return J.RE(a).gyG(a)}
+J.uf=function(a){return J.RE(a).gxr(a)}
 J.ul=function(a){return J.RE(a).gU4(a)}
 J.um=function(a){return J.RE(a).gRk(a)}
+J.un=function(a){return J.RE(a).gRY(a)}
 J.up=function(a){return J.RE(a).gIf(a)}
-J.us=function(a){return J.RE(a).gRN(a)}
 J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
-J.v7=function(a){return J.RE(a).Lg(a)}
-J.vE=function(a){return J.RE(a).gMZ(a)}
-J.vF=function(a,b){return J.RE(a).sP9(a,b)}
-J.vI=function(a,b){return J.RE(a).jn(a,b)}
+J.v7=function(a){return J.RE(a).gwX(a)}
 J.vJ=function(a,b){return J.RE(a).spM(a,b)}
 J.vP=function(a,b){return J.RE(a).sR(a,b)}
-J.vR=function(a,b){return J.RE(a).YP(a,b)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
 J.vc=function(a){return J.RE(a).gxD(a)}
@@ -22886,59 +22945,51 @@
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
 J.wJ=function(a,b){return J.RE(a).slp(a,b)}
-J.wS=function(a){return J.RE(a).geZ(a)}
+J.wK=function(a,b){return J.RE(a).xZ(a,b)}
 J.wd=function(a){return J.RE(a).gqw(a)}
-J.wg=function(a){return J.RE(a).god(a)}
+J.we=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
+J.wg=function(a,b){return J.U6(a).sB(a,b)}
 J.wl=function(a,b){return J.RE(a).Ch(a,b)}
 J.wp=function(a){return J.RE(a).gwv(a)}
+J.wt=function(a){return J.RE(a).gP3(a)}
 J.wu=function(a,b){return J.RE(a).sLf(a,b)}
 J.wx=function(a,b){return J.RE(a).Rg(a,b)}
 J.x0=function(a,b){return J.RE(a).sWt(a,b)}
-J.x3=function(a){return J.RE(a).gvp(a)}
 J.xC=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.xH=function(a,b){return J.RE(a).sxT(a,b)}
 J.xQ=function(a,b){return J.RE(a).sGd(a,b)}
 J.xZ=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
 return J.Wx(a).D(a,b)}
 J.xe=function(a){return J.RE(a).gPB(a)}
-J.xi=function(a){return J.RE(a).gBj(a)}
-J.xk=function(a){return J.RE(a).gXE(a)}
-J.xlH=function(a){return J.RE(a).gUv(a)}
+J.xo=function(a){return J.RE(a).gJN(a)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
 J.y3=function(a){return J.RE(a).gFL(a)}
 J.y9=function(a){return J.RE(a).lh(a)}
 J.yH=function(a){return J.Wx(a).Vy(a)}
-J.yI=function(a){return J.RE(a).gLf(a)}
+J.yI=function(a){return J.RE(a).gih(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yW=function(a){return J.RE(a).gX7(a)}
-J.yb=function(a){return J.RE(a).gWF(a)}
+J.yR=function(a,b){return J.RE(a).XT(a,b)}
 J.yd=function(a){return J.RE(a).xO(a)}
-J.yf=function(a){return J.RE(a).gzG(a)}
 J.yi=function(a,b){return J.RE(a).sMj(a,b)}
 J.yq=function(a){return J.RE(a).gQl(a)}
-J.yr=function(a){return J.RE(a).gJb(a)}
+J.yz=function(a){return J.RE(a).gLF(a)}
 J.z7Y=function(a,b,c,d,e){return J.RE(a).GM(a,b,c,d,e)}
-J.zC=function(a){return J.RE(a).gi6(a)}
-J.zD=function(a){return J.RE(a).gEl(a)}
-J.zF=function(a){return J.RE(a).gih(a)}
+J.zE=function(a){return J.RE(a).gtu(a)}
+J.zF=function(a){return J.RE(a).gHL(a)}
 J.zH=function(a){return J.RE(a).gt5(a)}
 J.zL=function(a){return J.RE(a).gO9(a)}
 J.zN=function(a){return J.RE(a).gM6(a)}
 J.zY=function(a){return J.RE(a).gdu(a)}
-J.za=function(a,b){return J.U6(a).OY(a,b)}
-J.ze=function(a){return J.RE(a).gHL(a)}
 J.zg=function(a,b){return J.w1(a).ad(a,b)}
 J.zj=function(a){return J.RE(a).gvH(a)}
-J.zq=function(a){return J.w1(a).Jd(a)}
 C.Gx=X.hV.prototype
 C.J9=Q.f7.prototype
-C.Gkp=Y.G0.prototype
+C.Gkp=Y.hg.prototype
 C.QD=B.G6.prototype
 C.FC=T.vr.prototype
 C.ic=A.wM.prototype
-C.YZz=Q.eW.prototype
+C.i3=Q.eW.prototype
 C.fe=O.eo.prototype
 C.ka=Z.ak.prototype
 C.tWO=O.VY.prototype
@@ -22946,42 +22997,41 @@
 C.vS=T.uV.prototype
 C.oS=U.NY.prototype
 C.O0=R.JI.prototype
-C.lG=W.Rb.prototype
-C.vo=G.Tk.prototype
+C.BB=G.Tk.prototype
 C.On=F.ZP.prototype
-C.GhT=L.nJ.prototype
-C.qL=R.Eg.prototype
+C.Jh=L.nJ.prototype
+C.lQ=R.Eg.prototype
 C.MC=D.i7.prototype
-C.D4=A.Gk.prototype
+C.LTI=A.Gk.prototype
 C.kL=W.H05.prototype
-C.Hb=X.MJ.prototype
-C.N3=X.J3.prototype
+C.ls6=X.MJ.prototype
+C.n0=X.J3.prototype
 C.Xo=U.DK.prototype
 C.PJ8=N.BS.prototype
 C.Al=O.Vb.prototype
 C.Vc=K.Ly.prototype
-C.W3=W.O7.prototype
-C.Ug=E.WS.prototype
+C.W3=W.fJ.prototype
+C.bP=E.WS.prototype
 C.GII=E.H8.prototype
 C.Ie=E.mO.prototype
 C.Ig=E.DE.prototype
-C.x4=E.U1.prototype
+C.VLs=E.U1.prototype
 C.ej=E.qM.prototype
-C.Wa=E.av.prototype
+C.OkI=E.av.prototype
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
 C.RVQ=E.wN.prototype
 C.wP=E.ds.prototype
-C.aj2=E.Mb.prototype
+C.Ag=E.Mb.prototype
 C.ozm=E.oF.prototype
-C.wK=E.qh.prototype
+C.IXz=E.qh.prototype
 C.rU=E.Q6.prototype
-C.j1=E.L4.prototype
+C.j1o=E.L4.prototype
 C.ag=E.Zn.prototype
-C.js=E.uE.prototype
+C.Fw=E.uE.prototype
 C.UZ=E.n5.prototype
 C.QFk=O.Im.prototype
-C.hM=B.pR.prototype
+C.uRw=B.pR.prototype
 C.yKx=Z.EZ.prototype
 C.aXP=D.Z4.prototype
 C.rCJ=D.Qh.prototype
@@ -22991,48 +23041,47 @@
 C.F2=D.IW.prototype
 C.mb=D.Oz.prototype
 C.OoF=D.St.prototype
-C.Xe=L.qk.prototype
+C.hys=L.qk.prototype
 C.Nm=J.Q.prototype
 C.YI=J.VA7.prototype
 C.jn=J.imn.prototype
-C.bP=J.CDU.prototype
+C.jN=J.CDU.prototype
 C.CD=J.P.prototype
 C.yo=J.O.prototype
 C.Du=Z.vj.prototype
 C.xA=A.UK.prototype
 C.Z3=R.LU.prototype
-C.MG=M.CX.prototype
-C.dl=U.WG.prototype
-C.vmJ=U.VZ.prototype
+C.fQ=M.CX.prototype
+C.DX=U.WG.prototype
+C.OX=U.VZ.prototype
 C.Ax=N.I2.prototype
-C.h1=N.FB.prototype
+C.Mw=N.FB.prototype
 C.po=N.qn.prototype
-C.S2=W.H9.prototype
+C.S2=W.x76.prototype
 C.yp=H.eEV.prototype
-C.Jm=H.V6a.prototype
-C.kD=A.md.prototype
+C.aV=A.md.prototype
 C.pl=A.ye.prototype
 C.IG=A.Bm.prototype
 C.nn=A.Ya.prototype
 C.BJj=A.NK.prototype
 C.L8=A.Zx.prototype
 C.J7=A.Ww.prototype
-C.z0=W.BH3.prototype
+C.t5=W.BH3.prototype
 C.aD=L.qV.prototype
 C.ji=Q.Ce.prototype
 C.LQi=L.NT.prototype
 C.YpE=V.F1.prototype
-C.Pfz=Z.uL.prototype
+C.mk=Z.uL.prototype
 C.Sx=J.iCW.prototype
-C.Vk=A.xc.prototype
-C.vy=T.ov.prototype
-C.Mh=A.kn.prototype
+C.GBL=A.xc.prototype
+C.za=T.ov.prototype
+C.Wa=A.kn.prototype
 C.cJ0=U.fI.prototype
 C.U0=R.zM.prototype
-C.kgQ=D.Rk.prototype
-C.Ns=U.Ti.prototype
+C.Vd=D.Rk.prototype
+C.Uv=U.Ti.prototype
 C.HRc=Q.xI.prototype
-C.zb=Q.CY.prototype
+C.Yo=Q.CY.prototype
 C.dX=K.nm.prototype
 C.bg3=X.Vu.prototype
 C.OKl=A.G1.prototype
@@ -23041,35 +23090,35 @@
 C.aXh=V.D2.prototype
 C.J57=V.Pa.prototype
 C.V8=X.I5.prototype
-C.Tkx=U.el.prototype
-C.ol=W.K5.prototype
+C.Hd=U.el.prototype
+C.ole=W.K5.prototype
 C.Kn=new H.i6()
-C.OL=new U.EO()
+C.x4=new U.WH()
 C.Ar=new H.MB()
 C.MS=new H.FuS()
 C.Eq=new P.k5C()
 C.qY=new T.WM()
 C.ZB=new P.yRf()
 C.Xh=new P.mgb()
-C.aZ=new L.iNc()
+C.zr=new L.iNc()
 C.NU=new P.R81()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
-C.AA=new D.WAE("Reused")
-C.oA=new D.WAE("Tag")
+C.yP=new D.WAE("Reused")
+C.Z7=new D.WAE("Tag")
 C.nU=new A.iYn(0)
 C.BM=new A.iYn(1)
 C.hU=new A.iYn(2)
 C.hf=new H.tx("label")
-C.Gh=H.Kxv('qU')
+C.lY=H.Kxv('qU')
 C.B10=new K.vly()
 C.vrd=new A.xn(!1)
 I.uLC=function(a){a.immutable$list=init
 a.fixed$length=init
 return a}
 C.ucP=I.uLC([C.B10,C.vrd])
-C.V0=new A.ES(C.hf,C.BM,!1,C.Gh,!1,C.ucP)
+C.V0=new A.ES(C.hf,C.BM,!1,C.lY,!1,C.ucP)
 C.EV=new H.tx("library")
 C.Jny=H.Kxv('U4')
 C.ZQ=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.ucP)
@@ -23104,7 +23153,7 @@
 C.esx=I.uLC([C.B10,C.J19])
 C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.esx)
 C.zU=new H.tx("uncheckedText")
-C.uT=new A.ES(C.zU,C.BM,!1,C.Gh,!1,C.ucP)
+C.uT=new A.ES(C.zU,C.BM,!1,C.lY,!1,C.ucP)
 C.mr=new H.tx("expanded")
 C.iz=new A.ES(C.mr,C.BM,!1,C.Ow,!1,C.esx)
 C.VI=new H.tx("line")
@@ -23114,7 +23163,7 @@
 C.yw=H.Kxv('KN')
 C.NL=new A.ES(C.IT,C.BM,!1,C.yw,!1,C.ucP)
 C.A7=new H.tx("height")
-C.SD=new A.ES(C.A7,C.BM,!1,C.Gh,!1,C.ucP)
+C.SD=new A.ES(C.A7,C.BM,!1,C.lY,!1,C.ucP)
 C.fn=new H.tx("instance")
 C.Q56=H.Kxv('uq')
 C.Kk=new A.ES(C.fn,C.BM,!1,C.Q56,!1,C.ucP)
@@ -23127,12 +23176,12 @@
 C.jFX=H.Kxv('dy')
 C.dq=new A.ES(C.XA,C.BM,!1,C.jFX,!1,C.ucP)
 C.aH=new H.tx("displayCutoff")
-C.w3=new A.ES(C.aH,C.BM,!1,C.Gh,!1,C.esx)
+C.w3=new A.ES(C.aH,C.BM,!1,C.lY,!1,C.esx)
 C.rB=new H.tx("isolate")
 C.a2p=H.Kxv('bv')
 C.xY=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.esx)
 C.mJ=new H.tx("color")
-C.Qu=new A.ES(C.mJ,C.BM,!1,C.Gh,!1,C.ucP)
+C.Qu=new A.ES(C.mJ,C.BM,!1,C.lY,!1,C.ucP)
 C.bz=new H.tx("isolateChanged")
 C.Bk=new A.ES(C.bz,C.hU,!1,C.yQP,!1,C.xD)
 C.CG=new H.tx("posChanged")
@@ -23141,7 +23190,7 @@
 C.oUD=H.Kxv('N7')
 C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
 C.Gs=new H.tx("sampleCount")
-C.iO=new A.ES(C.Gs,C.BM,!1,C.Gh,!1,C.esx)
+C.iO=new A.ES(C.Gs,C.BM,!1,C.lY,!1,C.esx)
 C.oj=new H.tx("httpServer")
 C.GT=new A.ES(C.oj,C.BM,!1,C.MR,!1,C.ucP)
 C.td=new H.tx("object")
@@ -23150,7 +23199,7 @@
 C.NBK=H.Kxv('Z5')
 C.Gz=new A.ES(C.pD,C.BM,!1,C.NBK,!1,C.ucP)
 C.TW=new H.tx("tagSelector")
-C.H0=new A.ES(C.TW,C.BM,!1,C.Gh,!1,C.esx)
+C.H0=new A.ES(C.TW,C.BM,!1,C.lY,!1,C.esx)
 C.vp=new H.tx("list")
 C.Rz=new A.ES(C.vp,C.BM,!1,C.hAX,!1,C.ucP)
 C.uO=new H.tx("inboundReferences")
@@ -23162,10 +23211,10 @@
 C.Rs=new H.tx("currentPosChanged")
 C.EW=new A.ES(C.Rs,C.hU,!1,C.yQP,!1,C.xD)
 C.zz=new H.tx("timeSpan")
-C.lS=new A.ES(C.zz,C.BM,!1,C.Gh,!1,C.esx)
+C.lS=new A.ES(C.zz,C.BM,!1,C.lY,!1,C.esx)
 C.EP=new H.tx("page")
-C.VW=H.Kxv('JM')
-C.db=new A.ES(C.EP,C.BM,!1,C.VW,!1,C.ucP)
+C.wIp=H.Kxv('JM')
+C.db=new A.ES(C.EP,C.BM,!1,C.wIp,!1,C.ucP)
 C.CZi=H.Kxv('cn')
 C.tO=new A.ES(C.yh,C.BM,!1,C.CZi,!1,C.ucP)
 C.kw=new H.tx("trace")
@@ -23193,7 +23242,7 @@
 C.Mda=H.Kxv('Ix')
 C.bp=new A.ES(C.ne,C.BM,!1,C.Mda,!1,C.ucP)
 C.kV=new H.tx("link")
-C.vz=new A.ES(C.kV,C.BM,!1,C.Gh,!1,C.ucP)
+C.vz=new A.ES(C.kV,C.BM,!1,C.lY,!1,C.ucP)
 C.Ve=new H.tx("socket")
 C.Xmq=H.Kxv('WP')
 C.X4=new A.ES(C.Ve,C.BM,!1,C.Xmq,!1,C.ucP)
@@ -23204,14 +23253,14 @@
 C.vY=new H.tx("currentPos")
 C.ZS=new A.ES(C.vY,C.BM,!1,C.yw,!1,C.ucP)
 C.p8=new H.tx("event")
-C.x8=H.Kxv('Mk')
-C.uc=new A.ES(C.p8,C.BM,!1,C.x8,!1,C.ucP)
+C.Kp2=H.Kxv('Mk')
+C.uc=new A.ES(C.p8,C.BM,!1,C.Kp2,!1,C.ucP)
 C.YD=new H.tx("sampleRate")
-C.fP=new A.ES(C.YD,C.BM,!1,C.Gh,!1,C.esx)
+C.fP=new A.ES(C.YD,C.BM,!1,C.lY,!1,C.esx)
 C.Aa=new H.tx("results")
 C.k5=new A.ES(C.Aa,C.BM,!1,C.Gsc,!1,C.esx)
 C.t6=new H.tx("mapAsString")
-C.b6=new A.ES(C.t6,C.BM,!1,C.Gh,!1,C.esx)
+C.b6=new A.ES(C.t6,C.BM,!1,C.lY,!1,C.esx)
 C.qs=new H.tx("io")
 C.MN=new A.ES(C.qs,C.BM,!1,C.MR,!1,C.ucP)
 C.QH=new H.tx("fragmentation")
@@ -23229,15 +23278,18 @@
 C.He=new H.tx("hideTagsChecked")
 C.fz=new A.ES(C.He,C.BM,!1,C.Ow,!1,C.esx)
 C.eh=new H.tx("lineMode")
-C.jO=new A.ES(C.eh,C.BM,!1,C.Gh,!1,C.esx)
+C.jO=new A.ES(C.eh,C.BM,!1,C.lY,!1,C.esx)
 C.PM=new H.tx("status")
-C.jv=new A.ES(C.PM,C.BM,!1,C.Gh,!1,C.esx)
+C.jv=new A.ES(C.PM,C.BM,!1,C.lY,!1,C.esx)
 C.Zi=new H.tx("lastAccumulatorReset")
-C.xx=new A.ES(C.Zi,C.BM,!1,C.Gh,!1,C.esx)
+C.xx=new A.ES(C.Zi,C.BM,!1,C.lY,!1,C.esx)
 C.lH=new H.tx("checkedText")
-C.dG=new A.ES(C.lH,C.BM,!1,C.Gh,!1,C.ucP)
+C.dG=new A.ES(C.lH,C.BM,!1,C.lY,!1,C.ucP)
 C.VK=new H.tx("devtools")
 C.lW=new A.ES(C.VK,C.BM,!1,C.Ow,!1,C.ucP)
+C.AV=new H.tx("callback")
+C.QiO=H.Kxv('Sa')
+C.fr=new A.ES(C.AV,C.BM,!1,C.QiO,!1,C.ucP)
 C.vs=new H.tx("endLine")
 C.MP=new A.ES(C.vs,C.BM,!1,C.yw,!1,C.esx)
 C.li=new H.tx("startPosChanged")
@@ -23246,11 +23298,11 @@
 C.Rh=new A.ES(C.ox,C.hU,!1,C.yQP,!1,C.xD)
 C.XM=new H.tx("path")
 C.Tt=new A.ES(C.XM,C.BM,!1,C.MR,!1,C.ucP)
-C.GO=new A.ES(C.EP,C.BM,!1,C.VW,!1,C.esx)
+C.GO=new A.ES(C.EP,C.BM,!1,C.wIp,!1,C.esx)
 C.bJ=new H.tx("counters")
 C.UI=new A.ES(C.bJ,C.BM,!1,C.SXK,!1,C.ucP)
 C.bE=new H.tx("sampleDepth")
-C.h3=new A.ES(C.bE,C.BM,!1,C.Gh,!1,C.esx)
+C.h3=new A.ES(C.bE,C.BM,!1,C.lY,!1,C.esx)
 C.N8=new H.tx("scriptChanged")
 C.qE=new A.ES(C.N8,C.hU,!1,C.yQP,!1,C.xD)
 C.YT=new H.tx("expr")
@@ -23268,23 +23320,23 @@
 C.YE=new H.tx("webSocket")
 C.Wl=new A.ES(C.YE,C.BM,!1,C.MR,!1,C.ucP)
 C.Dj=new H.tx("refreshTime")
-C.Ay=new A.ES(C.Dj,C.BM,!1,C.Gh,!1,C.esx)
+C.Ay=new A.ES(C.Dj,C.BM,!1,C.lY,!1,C.esx)
 C.Gr=new H.tx("endPos")
 C.VJ=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.ucP)
 C.RJ=new H.tx("vm")
 C.U0P=H.Kxv('wv')
 C.BP=new A.ES(C.RJ,C.BM,!1,C.U0P,!1,C.ucP)
 C.uX=new H.tx("standaloneVmAddress")
-C.Eb=new A.ES(C.uX,C.BM,!1,C.Gh,!1,C.ucP)
+C.Eb=new A.ES(C.uX,C.BM,!1,C.lY,!1,C.ucP)
 C.PX=new H.tx("script")
-C.iF=H.Kxv('vx')
-C.jz=new A.ES(C.PX,C.BM,!1,C.iF,!1,C.ucP)
+C.KB=H.Kxv('vx')
+C.jz=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.ucP)
 C.Gn=new H.tx("objectChanged")
 C.az=new A.ES(C.Gn,C.hU,!1,C.yQP,!1,C.xD)
 C.o0=new A.ES(C.vp,C.BM,!1,C.MR,!1,C.ucP)
 C.i4=new H.tx("code")
-C.pM=H.Kxv('kx')
-C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.ucP)
+C.nqy=H.Kxv('kx')
+C.aJ=new A.ES(C.i4,C.BM,!1,C.nqy,!1,C.ucP)
 C.nE=new H.tx("tracer")
 C.Tbd=H.Kxv('KZ')
 C.FM=new A.ES(C.nE,C.BM,!1,C.Tbd,!1,C.ucP)
@@ -23296,7 +23348,7 @@
 C.uk=new H.tx("last")
 C.rY=new A.ES(C.uk,C.BM,!1,C.Ow,!1,C.ucP)
 C.TN=new H.tx("lastServiceGC")
-C.Gj=new A.ES(C.TN,C.BM,!1,C.Gh,!1,C.esx)
+C.Gj=new A.ES(C.TN,C.BM,!1,C.lY,!1,C.esx)
 C.OO=new H.tx("flag")
 C.Cf=new A.ES(C.OO,C.BM,!1,C.SXK,!1,C.ucP)
 C.S4=new H.tx("busy")
@@ -23306,10 +23358,7 @@
 C.am=new H.tx("chromeTargets")
 C.JD=new A.ES(C.am,C.BM,!1,C.Gsc,!1,C.esx)
 C.oE=new H.tx("chromiumAddress")
-C.r2=new A.ES(C.oE,C.BM,!1,C.Gh,!1,C.ucP)
-C.AV=new H.tx("callback")
-C.Fyq=H.Kxv('Sa')
-C.k1=new A.ES(C.AV,C.BM,!1,C.Fyq,!1,C.ucP)
+C.r2=new A.ES(C.oE,C.BM,!1,C.lY,!1,C.ucP)
 C.r1=new H.tx("expandChanged")
 C.nP=new A.ES(C.r1,C.hU,!1,C.yQP,!1,C.xD)
 C.Mc=new H.tx("flagList")
@@ -23317,11 +23366,11 @@
 C.rE=new H.tx("frame")
 C.B7=new A.ES(C.rE,C.BM,!1,C.SXK,!1,C.ucP)
 C.cg=new H.tx("anchor")
-C.ll=new A.ES(C.cg,C.BM,!1,C.Gh,!1,C.ucP)
+C.ll=new A.ES(C.cg,C.BM,!1,C.lY,!1,C.ucP)
 C.ngm=I.uLC([C.J19])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.pM,!1,C.ngm)
+C.Qs=new A.ES(C.i4,C.BM,!0,C.nqy,!1,C.ngm)
 C.mi=new H.tx("text")
-C.yV=new A.ES(C.mi,C.BM,!1,C.Gh,!1,C.esx)
+C.yV=new A.ES(C.mi,C.BM,!1,C.lY,!1,C.esx)
 C.tW=new H.tx("pos")
 C.It=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.ucP)
 C.TO=new A.ES(C.kY,C.BM,!1,C.SmN,!1,C.ucP)
@@ -23334,7 +23383,18 @@
 C.Mq=new A.ES(C.vb,C.BM,!1,C.MR,!1,C.ucP)
 C.KK=new A.ES(C.uO,C.BM,!1,C.Gsc,!1,C.esx)
 C.ny=new P.a6(0)
-C.eL=new P.moY(!1)
+C.it=new P.moY(!1)
+C.d6=H.VM(new W.FkO("close"),[W.BI])
+C.iw=H.VM(new W.FkO("disconnect"),[W.PGY])
+C.JN=H.VM(new W.FkO("error"),[W.ew7])
+C.MD=H.VM(new W.FkO("error"),[W.ea])
+C.LF=H.VM(new W.FkO("load"),[W.ew7])
+C.G5=H.VM(new W.FkO("loadend"),[W.ew7])
+C.ph=H.VM(new W.FkO("message"),[W.cxu])
+C.Whw=H.VM(new W.FkO("mousedown"),[W.N2])
+C.Kq=H.VM(new W.FkO("mousemove"),[W.N2])
+C.JL=H.VM(new W.FkO("open"),[W.ea])
+C.yf=H.VM(new W.FkO("popstate"),[W.niR])
 C.mp=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -23467,16 +23527,16 @@
   hooks.prototypeForTag = prototypeForTagFixed;
 }
 C.xr=new P.byg(null,null)
-C.A3=new P.Mx(null)
-C.Sr=new P.ojF(null,null)
+C.A3=new P.c5(null)
+C.cb=new P.ojF(null,null)
 C.EkO=new N.Ng("FINER",400)
-C.R5=new N.Ng("FINE",500)
+C.t4=new N.Ng("FINE",500)
 C.IF=new N.Ng("INFO",800)
-C.oO=new N.Ng("OFF",2000)
+C.oOA=new N.Ng("OFF",2000)
 C.cd=new N.Ng("SEVERE",1000)
 C.nT=new N.Ng("WARNING",900)
 C.Gb=H.VM(I.uLC([127,2047,65535,1114111]),[P.KN])
-C.jb=I.uLC([1,6])
+C.Q5=I.uLC([1,6])
 C.rz=I.uLC([0,0,32776,33792,1,10240,0,0])
 C.SY=new H.tx("keys")
 C.l4=new H.tx("values")
@@ -23486,22 +23546,22 @@
 C.WK=I.uLC([C.SY,C.l4,C.Wn,C.ai,C.nZ])
 C.o5=I.uLC([0,0,65490,45055,65535,34815,65534,18431])
 C.fW=H.VM(I.uLC(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
-C.mKy=I.uLC([0,0,26624,1023,65534,2047,65534,2047])
-C.yD=I.uLC([0,0,26498,1023,65534,34815,65534,18431])
+C.qq=I.uLC([0,0,26624,1023,65534,2047,65534,2047])
+C.Fa=I.uLC([0,0,26498,1023,65534,34815,65534,18431])
 C.fJ3=H.Kxv('iv')
-C.fo=I.uLC([C.fJ3])
+C.bfK=I.uLC([C.fJ3])
 C.ip=I.uLC(["==","!=","<=",">=","||","&&"])
 C.jY=I.uLC(["as","in","this"])
 C.jx=I.uLC([0,0,32722,12287,65534,34815,65534,18431])
-C.Jp=I.uLC(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
+C.QC=I.uLC(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
 C.bg=I.uLC([43,45,42,47,33,38,37,60,61,62,63,94,124])
 C.B2=I.uLC([0,0,24576,1023,65534,34815,65534,18431])
 C.aa=I.uLC([0,0,32754,11263,65534,34815,65534,18431])
 C.ZJ=I.uLC([0,0,65490,12287,65535,34815,65534,18431])
-C.jr=I.uLC([0,0,32722,12287,65535,34815,65534,18431])
-C.ML=I.uLC([40,41,91,93,123,125])
+C.yk=I.uLC([0,0,32722,12287,65535,34815,65534,18431])
+C.iq=I.uLC([40,41,91,93,123,125])
 C.zao=I.uLC(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.lY=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.zao)
+C.bq=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.zao)
 C.Vgv=I.uLC(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.yt=new H.LPe(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
 C.rW=I.uLC(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
@@ -23509,17 +23569,17 @@
 C.kKi=I.uLC(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
 C.w0=new H.LPe(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
 C.MEG=I.uLC(["enumerate"])
-C.c7=new H.LPe(1,{enumerate:K.HZg()},C.MEG)
+C.mB=new H.LPe(1,{enumerate:K.oJ()},C.MEG)
 C.tq=H.Kxv('Bo')
 C.uwj=H.Kxv('wA')
 C.wE=I.uLC([C.uwj])
 C.Tb=new A.rv(!1,!1,!0,C.tq,!1,!0,C.wE,null)
 C.eQn=H.Kxv('Yj')
 C.Qnw=I.uLC([C.eQn])
-C.jJ=new A.rv(!0,!0,!0,C.tq,!1,!1,C.Qnw,null)
+C.m8=new A.rv(!0,!0,!0,C.tq,!1,!1,C.Qnw,null)
 C.jUO=H.Kxv('xn')
-C.qv=I.uLC([C.jUO])
-C.V4=new A.rv(!0,!0,!0,C.tq,!1,!1,C.qv,null)
+C.erP=I.uLC([C.jUO])
+C.V4=new A.rv(!0,!0,!0,C.tq,!1,!1,C.erP,null)
 C.wj=new D.M9x("Internal")
 C.Cn=new D.M9x("Listening")
 C.lT=new D.M9x("Normal")
@@ -23527,7 +23587,7 @@
 C.BE=new H.tx("averageCollectionPeriodInMillis")
 C.IH=new H.tx("address")
 C.j2=new H.tx("app")
-C.ke=new H.tx("architecture")
+C.US=new H.tx("architecture")
 C.Wq=new H.tx("asStringLiteral")
 C.ET=new H.tx("assertsEnabled")
 C.WC=new H.tx("bpt")
@@ -23645,7 +23705,7 @@
 C.b5=new H.tx("jumpTarget")
 C.z6=new H.tx("key")
 C.Lc=new H.tx("kind")
-C.qa=new H.tx("lastTokenPos")
+C.kA=new H.tx("lastTokenPos")
 C.GI=new H.tx("lastUpdate")
 C.ur=new H.tx("lib")
 C.VN=new H.tx("libraries")
@@ -23666,7 +23726,7 @@
 C.BJ=new H.tx("newSpace")
 C.OV=new H.tx("noSuchMethod")
 C.c6=new H.tx("notifications")
-C.as=new H.tx("objectClass")
+C.jo=new H.tx("objectClass")
 C.zO=new H.tx("objectPool")
 C.vg=new H.tx("oldSpace")
 C.Yp=new H.tx("owner")
@@ -23691,7 +23751,7 @@
 C.KX=new H.tx("refreshCoverage")
 C.ja=new H.tx("refreshGC")
 C.mn=new H.tx("refreshRateChange")
-C.L9=new H.tx("registerCallback")
+C.SE=new H.tx("registerCallback")
 C.ir=new H.tx("relativeLink")
 C.dx=new H.tx("remoteAddress")
 C.ni=new H.tx("remotePort")
@@ -23737,7 +23797,7 @@
 C.dA=new H.tx("tokenPos")
 C.bc=new H.tx("topFrame")
 C.h5=new H.tx("totalCollectionTimeInSeconds")
-C.Kj=new H.tx("totalSamplesInProfile")
+C.kr=new H.tx("totalSamplesInProfile")
 C.ep=new H.tx("tree")
 C.hB=new H.tx("type")
 C.J2=new H.tx("typeChecksEnabled")
@@ -23748,7 +23808,7 @@
 C.Fh=new H.tx("url")
 C.yv=new H.tx("usageCounter")
 C.LP=new H.tx("used")
-C.ct=new H.tx("userName")
+C.Gy=new H.tx("userName")
 C.jh=new H.tx("v")
 C.zd=new H.tx("value")
 C.Db=new H.tx("valueAsString")
@@ -23767,15 +23827,15 @@
 C.Dl=H.Kxv('F1')
 C.mK=H.Kxv('Mb')
 C.UJ=H.Kxv('oa')
-C.E0=H.Kxv('aI')
+C.uh=H.Kxv('aI')
 C.Y3=H.Kxv('CY')
 C.QJ=H.Kxv('WG')
+C.Bc=H.Kxv('Hl')
 C.ra=H.Kxv('Nn')
 C.j4=H.Kxv('IW')
 C.Ke=H.Kxv('EZ')
 C.Vx=H.Kxv('MJ')
 C.Vh=H.Kxv('Pz')
-C.HC=H.Kxv('F0')
 C.rR=H.Kxv('wN')
 C.kt=H.Kxv('Um')
 C.yS=H.Kxv('G6')
@@ -23796,21 +23856,20 @@
 C.dD=H.Kxv('av')
 C.FA=H.Kxv('Ya')
 C.PFz=H.Kxv('yyN')
-C.T1=H.Kxv('Wy')
 C.Th=H.Kxv('fI')
+C.cz=H.Kxv('Vf')
 C.tU=H.Kxv('L4')
-C.yT=H.Kxv('FK')
 C.cK=H.Kxv('I5')
 C.jA=H.Kxv('Eg')
 C.K4=H.Kxv('hV')
 C.Mt=H.Kxv('hu')
-C.qB=H.Kxv('ZX')
-C.CR=H.Kxv('CP')
+C.laj=H.Kxv('ZX')
 C.ca=H.Kxv('Z4')
 C.pJ=H.Kxv('Q6')
 C.Yy=H.Kxv('uE')
-C.M5=H.Kxv('yc')
-C.kA=H.Kxv('G0')
+C.WU=H.Kxv('lf')
+C.nC=H.Kxv('cQ')
+C.u9=H.Kxv('yc')
 C.Yxm=H.Kxv('Pg')
 C.il=H.Kxv('xI')
 C.lp=H.Kxv('LU')
@@ -23819,12 +23878,10 @@
 C.EG=H.Kxv('Oz')
 C.nw=H.Kxv('eo')
 C.OG=H.Kxv('eW')
-C.hD=H.Kxv('lM')
 C.km=H.Kxv('fl')
 C.jV=H.Kxv('rF')
 C.rC=H.Kxv('qV')
 C.OZ=H.Kxv('Ce')
-C.Ho=H.Kxv('zt')
 C.Tq=H.Kxv('vj')
 C.ou=H.Kxv('ak')
 C.JW=H.Kxv('Ww')
@@ -23839,23 +23896,26 @@
 C.Nw=H.Kxv('vr')
 C.kq=H.Kxv('NT')
 C.a8=H.Kxv('Zx')
+C.YZ=H.Kxv('zt')
 C.NR=H.Kxv('nm')
 C.Fn=H.Kxv('qn')
 C.DD=H.Kxv('Zn')
-C.Ev=H.Kxv('Un')
+C.nj=H.Kxv('hg')
 C.qF=H.Kxv('mO')
+C.JA3=H.Kxv('b0B')
 C.Ey=H.Kxv('wM')
 C.pF=H.Kxv('WS')
 C.qZ=H.Kxv('DE')
 C.jw=H.Kxv('xc')
 C.NW=H.Kxv('ye')
-C.jRi=H.Kxv('we')
 C.pi=H.Kxv('FB')
 C.Xv=H.Kxv('n5')
 C.KO=H.Kxv('ZP')
+C.nW=H.Kxv('V2')
 C.he=H.Kxv('qM')
 C.Wz=H.Kxv('pR')
 C.tc=H.Kxv('Ma')
+C.Wr=H.Kxv('m9')
 C.Io=H.Kxv('Qh')
 C.Qt=H.Kxv('NK')
 C.wk=H.Kxv('nJ')
@@ -23870,7 +23930,7 @@
 C.Az=H.Kxv('Gk')
 C.GX=H.Kxv('c8')
 C.R9=H.Kxv('f7')
-C.J0=H.Kxv('vi')
+C.QP=H.Kxv('vi')
 C.tQ=H.Kxv('Vu')
 C.X8=H.Kxv('Ti')
 C.Lg=H.Kxv('JI')
@@ -23881,28 +23941,28 @@
 C.oT=H.Kxv('VY')
 C.jK=H.Kxv('el')
 C.xM=new P.u5F(!1)
-C.rj=new P.Ls(C.NU,P.Uwa())
-C.Xk=new P.Ls(C.NU,P.Dk())
-C.pm=new P.Ls(C.NU,P.zi())
-C.Rt=new P.Ls(C.NU,P.wLZ())
-C.Sq=new P.Ls(C.NU,P.zci())
-C.mc=new P.Ls(C.NU,P.xN())
-C.uo=new P.Ls(C.NU,P.uy1())
-C.pj=new P.Ls(C.NU,P.u3Q())
-C.lk=new P.Ls(C.NU,P.qKH())
-C.Gu=new P.Ls(C.NU,P.xd())
-C.Yl=new P.Ls(C.NU,P.MM())
-C.Zc=new P.Ls(C.NU,P.yA())
-C.Qq=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
+C.NA=new P.Uf(C.NU,P.RN())
+C.Xk=new P.Uf(C.NU,P.Dk())
+C.F6=new P.Uf(C.NU,P.H9())
+C.Rt=new P.Uf(C.NU,P.wLZ())
+C.Sq=new P.Uf(C.NU,P.zci())
+C.mc=new P.Uf(C.NU,P.OjX())
+C.uo=new P.Uf(C.NU,P.uy1())
+C.pj=new P.Uf(C.NU,P.W7())
+C.lk=new P.Uf(C.NU,P.qKH())
+C.Gu=new P.Uf(C.NU,P.xd())
+C.Yl=new P.Uf(C.NU,P.MM())
+C.Zc=new P.Uf(C.NU,P.yA())
+C.zb=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
 $.libraries_to_load = {}
 $.VzC=null
-$.v0=1
+$.tye=1
 $.z7="$cachedFunction"
 $.Mr="$cachedInvocation"
 $.xG=null
 $.hG=null
 $.OK=0
-$.bf=null
+$.mJs=null
 $.P4=null
 $.lcs=!1
 $.NF=null
@@ -23927,113 +23987,113 @@
 $.RL=!1
 $.DR=C.IF
 $.xO=0
-$.dL=0
+$.Nc=0
 $.Oo=null
 $.Td=!1
 $.jq1=0
-$.ng=1
-$.H2=2
+$.ljh=1
+$.ls=2
 $.rf=null
 $.ok=!1
-$.DG=!1
+$.HE=!1
 $.M6=null
 $.UG=!0
 $.RQ="objects/"
 $.vU=null
-$.Hg=null
-$.hm=null
-$.uv=[C.tq,W.Bo,{},C.hP,E.uz,{created:E.z1},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.PU},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.mK,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.Zgg},C.Y3,Q.CY,{created:Q.AlS},C.QJ,U.WG,{created:U.KTC},C.j4,D.IW,{created:D.v8},C.Ke,Z.EZ,{created:Z.CoW},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.wZ7},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.KU},C.Sb,A.kn,{created:A.Thl},C.kH,U.NY,{created:U.ui},C.IZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.Qje},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.FeK},C.uC,O.Im,{created:O.eka},C.PT,M.CX,{created:M.ec},C.iD,O.Vb,{created:O.dF},C.ce,X.kK,{created:X.CM},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.P5Z},C.PFz,W.yyN,{},C.Th,U.fI,{created:U.Ln},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.egu},C.kA,Y.G0,{created:Y.zE},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.Le},C.u4,U.VZ,{created:U.Wzx},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.zf},C.rC,L.qV,{created:L.P5f},C.OZ,Q.Ce,{created:Q.FMr},C.Tq,Z.vj,{created:Z.mA},C.ou,Z.ak,{created:Z.zB},C.JW,A.Ww,{created:A.wC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.Mz,Z.uL,{created:Z.LD},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.cua},C.bC,V.D2,{created:V.n5p},C.Nw,T.vr,{created:T.aed},C.kq,L.NT,{created:L.di},C.a8,A.Zx,{created:A.yno},C.NR,K.nm,{created:K.ant},C.Fn,N.qn,{created:N.hYg},C.DD,E.Zn,{created:E.n0},C.qF,E.mO,{created:E.V6},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.lIg},C.jw,A.xc,{created:A.yk},C.NW,A.ye,{created:A.mBQ},C.jRi,H.we,{"":H.m6},C.pi,N.FB,{created:N.kUw},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.TEI},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.kR},C.wk,L.nJ,{created:L.Rpj},C.Bi,G.Tk,{created:G.aMd},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJ},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.fU,N.I2,{created:N.rI3},C.Az,A.Gk,{created:A.cYO},C.R9,Q.f7,{created:Q.wzV},C.tQ,X.Vu,{created:X.lt2},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.EDe},C.mq,L.qk,{created:L.Qtp},C.XW,T.uV,{created:T.CvM},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.E3U},C.jK,U.el,{created:U.oH}]
+$.Xa=null
+$.ax=null
+$.AuW=[C.tq,W.Bo,{},C.hP,E.uz,{created:E.z1},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.Br},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.VO},C.mK,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.Zgg},C.Y3,Q.CY,{created:Q.AlS},C.QJ,U.WG,{created:U.z0},C.j4,D.IW,{created:D.dmb},C.Ke,Z.EZ,{created:Z.CoW},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.KU},C.Sb,A.kn,{created:A.Thl},C.kH,U.NY,{created:U.q5n},C.IZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.Qje},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.fm},C.uC,O.Im,{created:O.eka},C.PT,M.CX,{created:M.SPd},C.iD,O.Vb,{created:O.teo},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.JR},C.PFz,W.yyN,{},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.egu},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.bUN},C.u4,U.VZ,{created:U.Wzx},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.YtF},C.rC,L.qV,{created:L.P5f},C.OZ,Q.Ce,{created:Q.FMr},C.Tq,Z.vj,{created:Z.mA},C.ou,Z.ak,{created:Z.TH},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.qa},C.Mz,Z.uL,{created:Z.ew},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.cua},C.bC,V.D2,{created:V.Hr},C.Nw,T.vr,{created:T.aed},C.kq,L.NT,{created:L.di},C.a8,A.Zx,{created:A.yno},C.NR,K.nm,{created:K.ant},C.Fn,N.qn,{created:N.hYg},C.DD,E.Zn,{created:E.kf},C.nj,Y.hg,{created:Y.Ifw},C.qF,E.mO,{created:E.Ch},C.JA3,H.b0B,{"":H.m6},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.l5s},C.qZ,E.DE,{created:E.lIg},C.jw,A.xc,{created:A.oaJ},C.NW,A.ye,{created:A.mBQ},C.pi,N.FB,{created:N.kUw},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Wz,B.pR,{created:B.luW},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rpj},C.Bi,G.Tk,{created:G.oo},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJ},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.fU,N.I2,{created:N.rI3},C.Az,A.Gk,{created:A.cYO},C.R9,Q.f7,{created:Q.nk},C.tQ,X.Vu,{created:X.lt2},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.EDe},C.mq,L.qk,{created:L.Qtp},C.XW,T.uV,{created:T.CvM},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.E3U},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
-I.$lazy($,"workerIds","Fa","cz",function(){return H.VM(new P.qo(null),[P.KN])})
+I.$lazy($,"workerIds","rS","qv",function(){return H.VM(new P.qo(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
-I.$lazy($,"notClosurePattern","xq","bN",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
+I.$lazy($,"notClosurePattern","k1","Up",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
 I.$lazy($,"nullCallPattern","Re","PH",function(){return H.cM(H.S7(null))})
 I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"undefinedCallPattern","GK","BN",function(){return H.cM(H.S7(void 0))})
-I.$lazy($,"undefinedLiteralCallPattern","rZ","Y9",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
+I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{(void 0).$method$($argumentsExpr$)}catch(z){return z.message}}())})
 I.$lazy($,"nullPropertyPattern","BX","W6",function(){return H.cM(H.Mj(null))})
 I.$lazy($,"nullLiteralPropertyPattern","tt","PB",function(){return H.cM(function(){try{null.$method$}catch(z){return z.message}}())})
 I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.cM(H.Mj(void 0))})
 I.$lazy($,"undefinedLiteralPropertyPattern","Ai","qK",function(){return H.cM(function(){try{(void 0).$method$}catch(z){return z.message}}())})
 I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_matcher","lZ","NP",function(){return new H.VR("isolates/.*/metrics",H.Vq("isolates/.*/metrics",!1,!0,!1),null,null)})
-I.$lazy($,"_isolateMatcher","M2","Il",function(){return new H.VR("isolates/.*/",H.Vq("isolates/.*/",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","lZ","NP",function(){return new H.VR("isolates/.*/metrics",H.v4("isolates/.*/metrics",!1,!0,!1),null,null)})
+I.$lazy($,"_isolateMatcher","AX","qL",function(){return new H.VR("isolates/.*/",H.v4("isolates/.*/",!1,!0,!1),null,null)})
 I.$lazy($,"POLL_PERIODS","Bw","c3",function(){return[8000,4000,2000,1000,100]})
 I.$lazy($,"_storage","wZ","Vy",function(){return window.localStorage})
 I.$lazy($,"scheduleImmediateClosure","Mn","zp",function(){return P.xg()})
-I.$lazy($,"_rootMap","ln","wb",function(){return P.YM(null,null,null,null,null)})
+I.$lazy($,"_rootMap","ln","OL",function(){return P.YM(null,null,null,null,null)})
 I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
 I.$lazy($,"context","Lt","Xw",function(){return P.ND(self)})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","xu","LZ",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","fK","iW",function(){return function DartObject(a){this.o=a}})
 I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
-I.$lazy($,"_pageSeparationColor","dg","vl",function(){return[0,0,0,255]})
+I.$lazy($,"_pageSeparationColor","Os","Qg",function(){return[0,0,0,255]})
 I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.TJ)})
-I.$lazy($,"_logger","y7","aT",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","l7","O3",function(){return new L.vH([])})
-I.$lazy($,"_identRegExp","fZ","cD",function(){return new L.MdQ().$0()})
-I.$lazy($,"_logger","y7Y","Nd",function(){return N.QM("observe.PathObserver")})
-I.$lazy($,"_pathCache","un","aB",function(){return P.L5(null,null,null,P.qU,L.Tv)})
-I.$lazy($,"_polymerSyntax","Kb","Cl",function(){return new A.Li(T.GF(null,C.qY),null)})
+I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
+I.$lazy($,"_instance","HS","ptP",function(){return new L.vH([])})
+I.$lazy($,"_identRegExp","pVY","cx",function(){return new L.lPa().$0()})
+I.$lazy($,"_logger","y7Y","YLt",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_pathCache","zC","Nu",function(){return P.L5(null,null,null,P.qU,L.Zl)})
+I.$lazy($,"_polymerSyntax","Kb","Ak",function(){return new A.Li(T.Mo(null,C.qY),null)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.Lz)})
-I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.qU,A.XP)})
-I.$lazy($,"_hasShadowDomPolyfill","PR","oo",function(){return $.Xw().Eg("ShadowDOMPolyfill")})
+I.$lazy($,"_declarations","Hq","w3G",function(){return P.L5(null,null,null,P.qU,A.So)})
+I.$lazy($,"_hasShadowDomPolyfill","Yx","Ep",function(){return $.Xw().Eg("ShadowDOMPolyfill")})
 I.$lazy($,"_ShadowCss","qP","lx",function(){var z=$.Kc()
 return z!=null?J.UQ(z,"ShadowCSS"):null})
-I.$lazy($,"_sheetLog","pe","eU",function(){return N.QM("polymer.stylesheet")})
-I.$lazy($,"_changedMethodQueryOptions","cq","or",function(){return new A.rv(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
-I.$lazy($,"_ATTRIBUTES_REGEX","TS","FF",function(){return new H.VR("\\s|,",H.Vq("\\s|,",!1,!0,!1),null,null)})
+I.$lazy($,"_sheetLog","pe","Is",function(){return N.QM("polymer.stylesheet")})
+I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.rv(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
+I.$lazy($,"_ATTRIBUTES_REGEX","TS","FF",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
 I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Xw(),"Platform")})
 I.$lazy($,"_Polymer","kz","uj",function(){return J.UQ($.Xw(),"Polymer")})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.Vq("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"bindPattern","ZA","VCp",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
 I.$lazy($,"_onReady","T8g","j6",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_observeLog","DZ","a3",function(){return N.QM("polymer.observe")})
-I.$lazy($,"_eventsLog","PK","xW",function(){return N.QM("polymer.events")})
-I.$lazy($,"_unbindLog","Ne","UW",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","xz","aQ",function(){return N.QM("polymer.bind")})
-I.$lazy($,"_watchLog","p5","Is",function(){return N.QM("polymer.watch")})
-I.$lazy($,"_readyLog","nS","Fs",function(){return N.QM("polymer.ready")})
-I.$lazy($,"_PolymerGestures","Yd","Op",function(){return J.UQ($.Xw(),"PolymerGestures")})
-I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
-I.$lazy($,"_typeHandlers","lq","RO",function(){return P.EF([C.Gh,new Z.DO(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.Ow,new Z.Ra(),C.yw,new Z.wJY(),C.CR,new Z.zOQ()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w5(),"-",new K.w10(),"*",new K.w11(),"/",new K.w12(),"%",new K.w13(),"==",new K.w14(),"!=",new K.w15(),"===",new K.w16(),"!==",new K.w17(),">",new K.w18(),">=",new K.w19(),"<",new K.w20(),"<=",new K.w21(),"||",new K.w22(),"&&",new K.w23(),"|",new K.w24()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","oQ","EU",function(){return P.EF(["+",new K.lPa(),"-",new K.Ufa(),"!",new K.Raa()],null,null)})
+I.$lazy($,"_observeLog","DZ","dn",function(){return N.QM("polymer.observe")})
+I.$lazy($,"_eventsLog","fo","vo",function(){return N.QM("polymer.events")})
+I.$lazy($,"_unbindLog","eu","iX",function(){return N.QM("polymer.unbind")})
+I.$lazy($,"_bindLog","xz","Lu",function(){return N.QM("polymer.bind")})
+I.$lazy($,"_watchLog","p5","REM",function(){return N.QM("polymer.watch")})
+I.$lazy($,"_readyLog","nS","lg",function(){return N.QM("polymer.ready")})
+I.$lazy($,"_PolymerGestures","Jm","tNi",function(){return J.UQ($.Xw(),"PolymerGestures")})
+I.$lazy($,"_polymerElementProto","f8","Dw",function(){return new A.Md().$0()})
+I.$lazy($,"_typeHandlers","FZ4","h2",function(){return P.EF([C.lY,new Z.lP(),C.GX,new Z.wJY(),C.Yc,new Z.zOQ(),C.Ow,new Z.W6o(),C.yw,new Z.MdQ(),C.cz,new Z.YJG()],null,null)})
+I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w12(),"-",new K.w13(),"*",new K.w14(),"/",new K.w15(),"%",new K.w16(),"==",new K.w17(),"!=",new K.w18(),"===",new K.w19(),"!==",new K.w20(),">",new K.w21(),">=",new K.w22(),"<",new K.w23(),"<=",new K.w24(),"||",new K.w25(),"&&",new K.w26(),"|",new K.w27()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.EF(["+",new K.w5(),"-",new K.w10(),"!",new K.w11()],null,null)})
 I.$lazy($,"_instance","jC","Pk",function(){return new K.me()})
-I.$lazy($,"_currentIsolateMatcher","vf","jN",function(){return new H.VR("isolates/\\d+",H.Vq("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","r0",function(){return new H.VR("isolates/\\d+/",H.Vq("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"kRegularFunction","et","xK",function(){return new D.yz("function")})
-I.$lazy($,"kClosureFunction","jX","HU",function(){return new D.yz("closure function")})
-I.$lazy($,"kGetterFunction","PZ","rQ",function(){return new D.yz("getter function")})
-I.$lazy($,"kSetterFunction","Bs","en",function(){return new D.yz("setter function")})
-I.$lazy($,"kConstructor","G8","kj",function(){return new D.yz("constructor")})
-I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.yz("implicit getter function")})
-I.$lazy($,"kImplicitSetterFunction","ab","AH",function(){return new D.yz("implicit setter function")})
-I.$lazy($,"kStaticInitializer","Sp","y5",function(){return new D.yz("static initializer")})
-I.$lazy($,"kMethodExtractor","Et","Ot",function(){return new D.yz("method extractor")})
-I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.yz("noSuchMethod dispatcher")})
-I.$lazy($,"kInvokeFieldDispatcher","fJ","bh",function(){return new D.yz("invoke field dispatcher")})
-I.$lazy($,"kCollected","bt","Dh",function(){return new D.yz("Collected")})
-I.$lazy($,"kNative","dQ","Nk",function(){return new D.yz("Native")})
-I.$lazy($,"kTag","z3","zx",function(){return new D.yz("Tag")})
-I.$lazy($,"kReused","tT","OA",function(){return new D.yz("Reused")})
-I.$lazy($,"kUNKNOWN","ve","lC",function(){return new D.yz("UNKNOWN")})
+I.$lazy($,"_currentIsolateMatcher","vf","fA",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"kRegularFunction","Ij","qu",function(){return new D.ma("function")})
+I.$lazy($,"kClosureFunction","jX","xq",function(){return new D.ma("closure function")})
+I.$lazy($,"kGetterFunction","F0","xW",function(){return new D.ma("getter function")})
+I.$lazy($,"kSetterFunction","Bs","Kw",function(){return new D.ma("setter function")})
+I.$lazy($,"kConstructor","G8","kj",function(){return new D.ma("constructor")})
+I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.ma("implicit getter function")})
+I.$lazy($,"kImplicitSetterFunction","ab","AH",function(){return new D.ma("implicit setter function")})
+I.$lazy($,"kStaticInitializer","Sp","y5",function(){return new D.ma("static initializer")})
+I.$lazy($,"kMethodExtractor","Et","Ot",function(){return new D.ma("method extractor")})
+I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.ma("noSuchMethod dispatcher")})
+I.$lazy($,"kInvokeFieldDispatcher","HU","f6",function(){return new D.ma("invoke field dispatcher")})
+I.$lazy($,"kCollected","bt","b1",function(){return new D.ma("Collected")})
+I.$lazy($,"kNative","dQ","YK",function(){return new D.ma("Native")})
+I.$lazy($,"kTag","z3","zx",function(){return new D.ma("Tag")})
+I.$lazy($,"kReused","Gh","dh",function(){return new D.ma("Reused")})
+I.$lazy($,"kUNKNOWN","ve","lC",function(){return new D.ma("UNKNOWN")})
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
-I.$lazy($,"typeInspector","Yv","II",function(){return D.kP()})
+I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","vu",function(){return D.kP()})
-I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.VE(null)})
+I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.vE(null)})
 I.$lazy($,"_contentsOwner","Ub","B8",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_ownerStagingDocument","Xi","MO",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","S1",function(){return C.yo.g("template, ",J.ZG(J.kl(C.lY.gvc(C.lY),new M.W6o()),", "))})
-I.$lazy($,"_templateObserver","joK","TQ",function(){return W.Ws(new M.YJG())})
-I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.DOe().$0()})
-I.$lazy($,"_instanceExtension","lET","Uo",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_isStagingDocument","Fg","Tg",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.qo("template_binding"),[null])})
+I.$lazy($,"_ownerStagingDocument","v2","Ou",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_allTemplatesSelectors","YO","S1",function(){return C.yo.g("template, ",J.ZG(J.kl(C.bq.gvc(C.bq),new M.DOe()),", "))})
+I.$lazy($,"_templateObserver","joK","ik",function(){return W.Ws(new M.Ufa())})
+I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.Raa().$0()})
+I.$lazy($,"_instanceExtension","nB","nR",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_isStagingDocument","Fg","Ks",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_expando","fF","as",function(){return H.VM(new P.qo("template_binding"),[null])})
 
-init.metadata=["object","sender","e",{func:"rb",args:[P.qU]},{func:"Za",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"qt",void:true},{func:"n9F",void:true,args:[{func:"qt",void:true}]},{func:"G5O",void:true,args:[null]},"value",{func:"Vx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"rE",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"h2",args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},"f",{func:"aE",args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]},null,null]},{func:"HQr",ret:{func:"ny"},args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"qs",ret:{func:"aB",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]}]},{func:"tD",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"Uk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"qt",void:true}]},"duration","callback",{func:"zk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"pe",void:true,args:[P.kWp]}]},{func:"SA",void:true,args:[P.JBS,P.e4y,P.JBS,P.qU]},"line",{func:"DM",void:true,args:[P.qU]},{func:"Jj",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.n7,P.T8]},"specification","zoneValues",{func:"qa",ret:P.SQ,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"Dl",ret:P.KN,args:[P.fRn,P.fRn]},{func:"I8",ret:P.SQ,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.SQ,args:[P.IN]},"symbol","v",{func:"DW",ret:U.hw,args:[P.qU]},{func:"ZU",args:[U.hw,null],named:{globals:[P.T8,P.qU,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.O1],args:[P.QV]},"iterable",{func:"Tx",ret:P.KN,args:[D.af,D.af]},{func:"mb",ret:P.qU},"invocation","fractionDigits",{func:"ny"},{func:"N4",args:[P.EH]},"code","key","val",{func:"bh",args:[null,null]},{func:"HF",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},"event",{func:"F3",void:true,args:[D.N7]},{func:"Cj",void:true,args:[D.Ix]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.SQ,args:[null]},"oldEvent",{func:"ai",void:true,args:[W.niR]},"obj","i","responseText",{func:"Om",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Hj",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"de",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"le",args:[D.uq]},{func:"jM",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},{func:"ff",void:true,args:[P.SQ,P.EH]},"expand","onDone","result",{func:"hF",void:true,args:[P.EH]},{func:"jF",args:[{func:"qt",void:true}]},"data","theError","theStackTrace",{func:"Tw",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"uu",void:true,args:[P.a],opt:[P.BpP]},{func:"Hp",args:[null],opt:[null]},{func:"cA",ret:P.SQ},"ignored","convert","element",{func:"K5",args:[P.SQ]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"DR",ret:P.KN,args:[null,P.KN]},{func:"v0",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"nY",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.SQ,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.qU],opt:[null]},"xhr",{func:"QO",void:true,args:[W.v3]},{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"DT",ret:P.qU,args:[P.SQ]},"newSpace",{func:"Z5",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"OE",ret:P.QV,args:[{func:"rb",args:[P.qU]}]},{func:"T5",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.qU]}]},"s","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"d4C",void:true,args:[W.v3,null,W.h4]},{func:"zs",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"FJ",ret:P.qU,args:[P.qU],opt:[P.SQ]},"wasTruncated",{func:"B4",args:[P.e4y,P.JBS]},{func:"djS",args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]}]},"x",{func:"VL8",void:true,args:[P.a,P.a]},"prop","records",{func:"My",args:[L.Tv,null]},"model","node","oneTime",{func:"zI",args:[null,null,null]},{func:"jk",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.T8,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"changes","jsElem","extendee",{func:"zi",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.SQ]},{func:"qj",ret:P.SQ,args:[null],named:{skipChanges:P.SQ}},"skipChanges",{func:"Gm",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.vn,args:[U.hw,U.hw]},{func:"mM9",args:[U.hw]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"rP",args:[V.qC]},{func:"rl6",ret:P.b8},"scriptCoverage","owningIsolate",{func:"K7",void:true,args:[[P.WO,P.KN]]},"counters",{func:"a6",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"RC",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"NuY",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"T2",void:true,args:[P.qU,L.Z8]},{func:"Riv",args:[P.Wy]},{func:"Kg",args:[P.qU,L.Z8]},"CloseEvent","Event",{func:"cOy",args:[W.cxu]},"msg",{func:"K8",void:true,args:[P.SQ,null]},"exp","details",{func:"kn",ret:A.Ap,args:[P.qU]},"ref","ifValue",{func:"PzC",void:true,args:[[P.WO,G.Zq]]},"splices",{func:"U8",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"nUs",ret:Z.lX,args:[P.qU],named:{map:P.T8}},"message","targets",];$=null
+init.metadata=["object","sender","e",{func:"pd",args:[P.qU]},{func:"a1",ret:P.lf},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"T9",void:true},{func:"n9F",void:true,args:[{func:"T9",void:true}]},{func:"G5O",void:true,args:[null]},"value",{func:"Vx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"rE",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"h2",args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},"f",{func:"aE",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]},null,null]},{func:"HQr",ret:{func:"ny"},args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"qs",ret:{func:"l4",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},{func:"tD",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"ny"}]},{func:"Uk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"T9",void:true}]},"duration","callback",{func:"zk",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"JX",void:true,args:[P.kWp]}]},{func:"SA",void:true,args:[P.JBS,P.e4y,P.JBS,P.qU]},"line",{func:"DM",void:true,args:[P.qU]},{func:"Jj",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.n7,P.T8]},"specification","zoneValues",{func:"qa",ret:P.SQ,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"Dl",ret:P.KN,args:[P.fRn,P.fRn]},{func:"I8",ret:P.SQ,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.SQ,args:[P.IN]},"symbol","v",{func:"DW",ret:U.rx,args:[P.qU]},{func:"ZU",args:[U.rx,null],named:{globals:[P.T8,P.qU,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Tx",ret:P.KN,args:[D.af,D.af]},{func:"I6a",ret:P.qU},"invocation","fractionDigits",{func:"ny"},{func:"N4",args:[P.EH]},"code","key","val",{func:"bh",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"Ab",void:true,args:[D.Mk]},"event",{func:"lrq",void:true,args:[D.N7]},{func:"Cj",void:true,args:[D.Ix]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.SQ,args:[null]},"oldEvent",{func:"ai",void:true,args:[W.niR]},"obj","i","responseText",{func:"Om",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Hj",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"de",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"jB",args:[D.uq]},{func:"Np8",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},{func:"ux",void:true,args:[P.SQ,P.EH]},"expand","onDone","result",{func:"aG",void:true,args:[P.EH]},{func:"lJL",args:[{func:"T9",void:true}]},"data","theError","theStackTrace",{func:"Tw",args:[P.a]},{func:"YP",void:true,opt:[null]},{func:"uu",void:true,args:[P.a],opt:[P.BpP]},{func:"yV",args:[null],opt:[null]},{func:"Wy",ret:P.SQ},"ignored","convert","element",{func:"K5",args:[P.SQ]},{func:"a9",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"DR",ret:P.KN,args:[null,P.KN]},{func:"v0",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.Vf,args:[P.qU]},{func:"cd",ret:P.SQ,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.qU],opt:[null]},"xhr",{func:"bB",void:true,args:[W.N2]},{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"DT",ret:P.qU,args:[P.SQ]},"newSpace",{func:"Z5",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"OE",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"T5",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.qU]}]},"s","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"d4C",void:true,args:[W.N2,null,W.h4]},{func:"Ig",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.Vf]},"time",{func:"FJ",ret:P.qU,args:[P.qU],opt:[P.SQ]},"wasTruncated",{func:"B4",args:[P.e4y,P.JBS]},{func:"djS",args:[P.JBS,P.e4y,P.JBS,{func:"l4",args:[null]}]},"x",{func:"VL8",void:true,args:[P.a,P.a]},"prop","records",{func:"My",args:[L.Zl,null]},"model","node","oneTime",{func:"cq",args:[null,null,null]},{func:"jk",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.T8,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"changes","jsElem","extendee",{func:"zi",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.SQ]},{func:"pD",ret:P.SQ,args:[null],named:{skipChanges:P.SQ}},"skipChanges",{func:"Gm",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.vn,args:[U.rx,U.rx]},{func:"Qc",args:[U.rx]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"rP",args:[V.qC]},{func:"rl6",ret:P.b8},"scriptCoverage","owningIsolate",{func:"K7",void:true,args:[[P.WO,P.KN]]},"counters",{func:"a6",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"RC",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer","newBpts",{func:"NuY",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"T2",void:true,args:[P.qU,L.U2]},{func:"Riv",args:[P.V2]},{func:"T3G",args:[P.qU,L.U2]},"CloseEvent","Event",{func:"cOy",args:[W.cxu]},"msg",{func:"S0",void:true,args:[P.SQ,null]},"exp","details",{func:"D2",ret:A.Ap,args:[P.qU]},"ref","ifValue",{func:"PzC",void:true,args:[[P.WO,G.Zq]]},"splices",{func:"U8",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"nUs",ret:Z.lX,args:[P.qU],named:{map:P.T8}},"message","targets",];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -24168,7 +24228,7 @@
 a[c]=y
 a[d]=function(){var w=$[c]
 try{if(w===y){$[c]=x
-try{w=$[c]=e()}finally{if(w===y)$[c]=null}}else{if(w===x)H.eQK(b)}return w}finally{$[d]=function(){return this[c]}}}}
+try{w=$[c]=e()}finally{if(w===y)if($[c]===x)$[c]=null}}else{if(w===x)H.eQK(b)}return w}finally{$[d]=function(){return this[c]}}}}
 I.$finishIsolateConstructor=function(a){var y=a.p
 function Isolate(){var x=Object.prototype.hasOwnProperty
 for(var w in y)if(x.call(y,w))this[w]=y[w]
@@ -24194,5 +24254,5 @@
 return}if(document.currentScript){a(document.currentScript)
 return}var z=document.scripts
 function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.V7A(),b)},[])}else{(function(b){H.wW(E.V7A(),b)})([])}})
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.jk(),b)},[])}else{(function(b){H.wW(E.jk(),b)})([])}})
 })()
diff --git a/runtime/bin/vmservice/observatory/lib/service_common.dart b/runtime/bin/vmservice/observatory/lib/service_common.dart
index 1354888..b460174 100644
--- a/runtime/bin/vmservice/observatory/lib/service_common.dart
+++ b/runtime/bin/vmservice/observatory/lib/service_common.dart
@@ -87,6 +87,7 @@
       new Map<String, _WebSocketRequest>();
   int _requestSerial = 0;
   bool _hasInitiatedConnect = false;
+  bool _hasFinishedConnect = false;
   Utf8Decoder _utf8Decoder = new Utf8Decoder();
 
   CommonWebSocket _webSocket;
@@ -96,6 +97,7 @@
   }
 
   void _notifyConnect() {
+    _hasFinishedConnect = true;
     if (!_connected.isCompleted) {
       Logger.root.info('WebSocketVM connection opened: ${target.networkAddress}');
       _connected.complete(this);
@@ -103,6 +105,9 @@
   }
   Future get onConnect => _connected.future;
   void _notifyDisconnect() {
+    if (!_hasFinishedConnect) {
+      return;
+    }
     if (!_disconnected.isCompleted) {
       Logger.root.info('WebSocketVM connection error: ${target.networkAddress}');
       _disconnected.complete(this);
diff --git a/runtime/bin/vmservice/observatory/lib/service_io.dart b/runtime/bin/vmservice/observatory/lib/service_io.dart
index 77b7964..5bae3e8 100644
--- a/runtime/bin/vmservice/observatory/lib/service_io.dart
+++ b/runtime/bin/vmservice/observatory/lib/service_io.dart
@@ -29,6 +29,8 @@
           onDone: onClose,
           cancelOnError: true);
       onOpen();
+    }).catchError((e, st) {
+      onError();
     });
   }
   
@@ -40,7 +42,9 @@
   }
   
   void close() {
-    _webSocket.close();
+    if (_webSocket != null) {
+      _webSocket.close();
+    }
   }
   
   Future<ByteData> nonStringToByteData(dynamic data) {
diff --git a/runtime/bin/vmservice/observatory/test/bad_web_socket_address_test.dart b/runtime/bin/vmservice/observatory/test/bad_web_socket_address_test.dart
new file mode 100644
index 0000000..65de6cf
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/test/bad_web_socket_address_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.
+
+import "package:observatory/service_io.dart";
+import 'package:unittest/unittest.dart';
+
+void testBadWebSocket() {
+  var vm = new WebSocketVM(new WebSocketVMTarget('ws://karatekid/ws'));
+  vm.load().catchError(expectAsync((error) {
+        expect(error is ServiceException, isTrue);
+      }));
+}
+
+main() {
+  test('bad web socket address', testBadWebSocket);
+}
+
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index d56241d..cd5b76f 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -720,6 +720,9 @@
  *   eventually run.  This is provided for advisory purposes only to
  *   improve debugging messages.  The main function is not invoked by
  *   this function.
+ * \param package_root The package root path for this isolate to resolve
+ *   package imports against. If this parameter is NULL, the package root path
+ *   of the parent isolate should be used.
  * \param callback_data The callback data which was passed to the
  *   parent isolate when it was created by calling Dart_CreateIsolate().
  * \param error A structure into which the embedder can place a
@@ -730,6 +733,7 @@
  */
 typedef Dart_Isolate (*Dart_IsolateCreateCallback)(const char* script_uri,
                                                    const char* main,
+                                                   const char* package_root,
                                                    void* callback_data,
                                                    char** error);
 
@@ -1325,6 +1329,7 @@
 DART_EXPORT bool Dart_IsClosure(Dart_Handle object);
 DART_EXPORT bool Dart_IsTypedData(Dart_Handle object);
 DART_EXPORT bool Dart_IsByteBuffer(Dart_Handle object);
+DART_EXPORT bool Dart_IsFuture(Dart_Handle object);
 
 
 /*
diff --git a/runtime/lib/bigint.dart b/runtime/lib/bigint.dart
index 108b8f7..92cdde0 100644
--- a/runtime/lib/bigint.dart
+++ b/runtime/lib/bigint.dart
@@ -46,18 +46,11 @@
 
   // Bits per half digit.
   static const int DIGIT2_BITS = DIGIT_BITS >> 1;
-  static const int DIGIT2_BASE = 1 << DIGIT2_BITS;
   static const int DIGIT2_MASK = (1 << DIGIT2_BITS) - 1;
 
   // Allocate extra digits so the bigint can be reused.
   static const int EXTRA_DIGITS = 4;
 
-  // Floating-point unit integer precision.
-  static const int FP_BITS = 52;
-  static const int FP_BASE = 1 << FP_BITS;
-  static const int FP_D1 = FP_BITS - DIGIT_BITS;
-  static const int FP_D2 = 2 * DIGIT_BITS - FP_BITS;
-
   // Min and max of non bigint values.
   static const int MIN_INT64 = (-1) << 63;
   static const int MAX_INT64 = 0x7fffffffffffffff;
@@ -68,6 +61,11 @@
   static _Bigint ZERO = new _Bigint();
   static _Bigint ONE = new _Bigint()._setInt(1);
 
+  // Argument passing for _mulAdd function preventing Mint allocation.
+  static const int MA_MULTIPLIER = 0;  // Index of multiplier digit.
+  static const int MA_CARRY_OUT = 1;  // Index of carry out digit.
+  static final Uint32List _MulAddArgs = new Uint32List(2);
+
   // Digit conversion table for parsing.
   static final Map<int, int> DIGIT_TABLE = _createDigitTable();
 
@@ -77,7 +75,13 @@
   int get _used native "Bigint_getUsed";
   void set _used(int used) native "Bigint_setUsed";
   Uint32List get _digits native "Bigint_getDigits";
-  void set _digits(Uint32List digits) native "Bigint_setDigits";
+  void set _digits(Uint32List digits) {
+    // The VM expects digits_ to be a Uint32List.
+    assert(digits != null);
+    _set_digits(digits);
+  }
+
+  void _set_digits(Uint32List digits) native "Bigint_setDigits";
 
   // Factory returning an instance initialized to value 0.
   factory _Bigint() native "Bigint_allocate";
@@ -133,6 +137,7 @@
     var hexDigitIndex = s.length;
     _ensureLength((hexDigitIndex + HEX_DIGITS_PER_DIGIT - 1) ~/ HEX_DIGITS_PER_DIGIT);
     var bitIndex = 0;
+    var digits = _digits;
     while (--hexDigitIndex >= 0) {
       var digit = DIGIT_TABLE[s.codeUnitAt(hexDigitIndex)];
       if (digit = null) {
@@ -141,11 +146,11 @@
       }
       _neg = false;  // Ignore "-" if not at index 0.
       if (bitIndex == 0) {
-        _digits[_used++] = digit;
+        digits[_used++] = digit;
         // TODO(regis): What if too many bad digits were ignored and
         // _used becomes larger than _digits.length? error or reallocate?
       } else {
-        _digits[_used - 1] |= digit << bitIndex;
+        digits[_used - 1] |= digit << bitIndex;
       }
       bitIndex = (bitIndex + HEX_BITS) % DIGIT_BITS;
     }
@@ -182,19 +187,21 @@
   // TODO(regis): Intrinsify.
   int _toValidInt() {
     assert(DIGIT_BITS == 32);  // Otherwise this code needs to be revised.
-    if (_used == 0) return 0;
-    if (_used == 1) return _neg ? -_digits[0] : _digits[0];
-    if (_used > 2) return this;
+    var used = _used;
+    if (used == 0) return 0;
+    var digits = _digits;
+    if (used == 1) return _neg ? -digits[0] : digits[0];
+    if (used > 2) return this;
     if (_neg) {
-      if (_digits[1] > 0x80000000) return this;
-      if (_digits[1] == 0x80000000) {
-        if (_digits[0] > 0) return this;
+      if (digits[1] > 0x80000000) return this;
+      if (digits[1] == 0x80000000) {
+        if (digits[0] > 0) return this;
         return MIN_INT64;
       }
-      return -((_digits[1] << DIGIT_BITS) | _digits[0]);
+      return -((digits[1] << DIGIT_BITS) | digits[0]);
     }
-    if (_digits[1] >= 0x80000000) return this;
-    return (_digits[1] << DIGIT_BITS) | _digits[0];
+    if (digits[1] >= 0x80000000) return this;
+    return (digits[1] << DIGIT_BITS) | digits[0];
   }
 
   // Conversion from int to bigint.
@@ -204,12 +211,11 @@
   // Copy existing _digits if reallocation is necessary.
   // TODO(regis): Check that we are not preserving _digits unnecessarily.
   void _ensureLength(int length) {
-    if (length > 0 && (_digits == null || length > _digits.length)) {
+    var digits = _digits;
+    if (length > 0 && (length > digits.length)) {
       var new_digits = new Uint32List(length + EXTRA_DIGITS);
-      if (_digits != null) {
-        for (var i = _used; --i >= 0; ) {
-          new_digits[i] = _digits[i];
-        }
+      for (var i = _used; --i >= 0; ) {
+        new_digits[i] = digits[i];
       }
       _digits = new_digits;
     }
@@ -217,17 +223,19 @@
 
   // Clamp off excess high _digits.
   void _clamp() {
-    while (_used > 0 && _digits[_used - 1] == 0) {
+    var digits = _digits;
+    while (_used > 0 && digits[_used - 1] == 0) {
       --_used;
     }
-    assert(_used > 0 || !_neg);
   }
 
   // Copy this to r.
   void _copyTo(_Bigint r) {
     r._ensureLength(_used);
+    var digits = _digits;
+    var r_digits = r._digits;
     for (var i = _used - 1; i >= 0; --i) {
-      r._digits[i] = _digits[i];
+      r_digits[i] = digits[i];
     }
     r._used = _used;
     r._neg = _neg;
@@ -248,11 +256,13 @@
   void _dlShiftTo(int n, _Bigint r) {
     var r_used = _used + n;
     r._ensureLength(r_used);
+    var digits = _digits;
+    var r_digits = r._digits;
     for (var i = _used - 1; i >= 0; --i) {
-      r._digits[i + n] = _digits[i];
+      r_digits[i + n] = digits[i];
     }
     for (var i = n - 1; i >= 0; --i) {
-      r._digits[i] = 0;
+      r_digits[i] = 0;
     }
     r._used = r_used;
     r._neg = _neg;
@@ -276,15 +286,18 @@
       return;
     }
     r._ensureLength(r_used);
-    for (var i = n; i < _used; ++i) {
-      r._digits[i - n] = _digits[i];
+    var digits = _digits;
+    var r_digits = r._digits;
+    var used = _used;
+    for (var i = n; i < used; ++i) {
+      r_digits[i - n] = digits[i];
     }
     r._used = r_used;
     r._neg = _neg;
     if (_neg) {
       // Round down if any bit was shifted out.
       for (var i = 0; i < n; i++) {
-        if (_digits[i] != 0) {
+        if (digits[i] != 0) {
           r._subTo(ONE, r);
           break;
         }
@@ -304,15 +317,17 @@
     var bm = (1 << cbs) - 1;
     var r_used = _used + ds + 1;
     r._ensureLength(r_used);
+    var digits = _digits;
+    var r_digits = r._digits;
     var c = 0;
     for (var i = _used - 1; i >= 0; --i) {
-      r._digits[i + ds + 1] = (_digits[i] >> cbs) | c;
-      c = (_digits[i] & bm) << bs;
+      r_digits[i + ds + 1] = (digits[i] >> cbs) | c;
+      c = (digits[i] & bm) << bs;
     }
     for (var i = ds - 1; i >= 0; --i) {
-      r._digits[i] = 0;
+      r_digits[i] = 0;
     }
-    r._digits[ds] = c;
+    r_digits[ds] = c;
     r._used = r_used;
     r._neg = _neg;
     r._clamp();
@@ -344,22 +359,25 @@
     var cbs = DIGIT_BITS - bs;
     var bm = (1 << bs) - 1;
     r._ensureLength(r_used);
-    r._digits[0] = _digits[ds] >> bs;
-    for (var i = ds + 1; i < _used; ++i) {
-      r._digits[i - ds - 1] |= (_digits[i] & bm) << cbs;
-      r._digits[i - ds] = _digits[i] >> bs;
+    var digits = _digits;
+    var r_digits = r._digits;
+    r_digits[0] = digits[ds] >> bs;
+    var used = _used;
+    for (var i = ds + 1; i < used; ++i) {
+      r_digits[i - ds - 1] |= (digits[i] & bm) << cbs;
+      r_digits[i - ds] = digits[i] >> bs;
     }
     r._neg = _neg;
     r._used = r_used;
     r._clamp();
     if (_neg) {
       // Round down if any bit was shifted out.
-      if ((_digits[ds] & bm) != 0) {
+      if ((digits[ds] & bm) != 0) {
         r._subTo(ONE, r);
         return;
       }
       for (var i = 0; i < ds; i++) {
-        if (_digits[i] != 0) {
+        if (digits[i] != 0) {
           r._subTo(ONE, r);
           return;
         }
@@ -374,7 +392,9 @@
     var r = _used - a._used;
     if (r == 0) {
       var i = _used;
-      while (--i >= 0 && (r = _digits[i] - a._digits[i]) == 0);
+      var digits = _digits;
+      var a_digits = a._digits;
+      while (--i >= 0 && (r = digits[i] - a_digits[i]) == 0);
     }
     return r;
   }
@@ -399,63 +419,73 @@
 
   // r = abs(this) + abs(a).
   void _absAddTo(_Bigint a, _Bigint r) {
-    if (_used < a._used) {
+    var used = _used;
+    var a_used = a._used;
+    if (used < a_used) {
       a._absAddTo(this, r);
       return;
     }
-    if (_used == 0) {
+    if (used == 0) {
       // Set r to 0.
       r._neg = false;
       r._used = 0;
       return;
     }
-    if (a._used == 0) {
+    if (a_used == 0) {
       _copyTo(r);
       return;
     }
-    r._ensureLength(_used + 1);
+    r._ensureLength(used + 1);
+    var digits = _digits;
+    var a_digits = a._digits;
+    var r_digits = r._digits;
     var c = 0;
-    for (var i = 0; i < a._used; i++) {
-      c += _digits[i] + a._digits[i];
-      r._digits[i] = c & DIGIT_MASK;
+    for (var i = 0; i < a_used; i++) {
+      c += digits[i] + a_digits[i];
+      r_digits[i] = c & DIGIT_MASK;
       c >>= DIGIT_BITS;
     }
-    for (var i = a._used; i < _used; i++) {
-      c += _digits[i];
-      r._digits[i] = c & DIGIT_MASK;
+    for (var i = a_used; i < used; i++) {
+      c += digits[i];
+      r_digits[i] = c & DIGIT_MASK;
       c >>= DIGIT_BITS;
     }
-    r._digits[_used] = c;
-    r._used = _used + 1;
+    r_digits[used] = c;
+    r._used = used + 1;
     r._clamp();
   }
 
   // r = abs(this) - abs(a), with abs(this) >= abs(a).
   void _absSubTo(_Bigint a, _Bigint r) {
     assert(_absCompareTo(a) >= 0);
-    if (_used == 0) {
+    var used = _used;
+    if (used == 0) {
       // Set r to 0.
       r._neg = false;
       r._used = 0;
       return;
     }
-    if (a._used == 0) {
+    var a_used = a._used;
+    if (a_used == 0) {
       _copyTo(r);
       return;
     }
-    r._ensureLength(_used);
+    r._ensureLength(used);
+    var digits = _digits;
+    var a_digits = a._digits;
+    var r_digits = r._digits;
     var c = 0;
-    for (var i = 0; i < a._used; i++) {
-      c += _digits[i] - a._digits[i];
-      r._digits[i] = c & DIGIT_MASK;
+    for (var i = 0; i < a_used; i++) {
+      c += digits[i] - a_digits[i];
+      r_digits[i] = c & DIGIT_MASK;
       c >>= DIGIT_BITS;
     }
-    for (var i = a._used; i < _used; i++) {
-      c += _digits[i];
-      r._digits[i] = c & DIGIT_MASK;
+    for (var i = a_used; i < used; i++) {
+      c += digits[i];
+      r_digits[i] = c & DIGIT_MASK;
       c >>= DIGIT_BITS;
     }
-    r._used = _used;
+    r._used = used;
     r._clamp();
   }
 
@@ -463,8 +493,11 @@
   void _absAndTo(_Bigint a, _Bigint r) {
     var r_used = (_used < a._used) ? _used : a._used;
     r._ensureLength(r_used);
+    var digits = _digits;
+    var a_digits = a._digits;
+    var r_digits = r._digits;
     for (var i = 0; i < r_used; i++) {
-      r._digits[i] = _digits[i] & a._digits[i];
+      r_digits[i] = digits[i] & a_digits[i];
     }
     r._used = r_used;
     r._clamp();
@@ -474,12 +507,15 @@
   void _absAndNotTo(_Bigint a, _Bigint r) {
     var r_used = _used;
     r._ensureLength(r_used);
+    var digits = _digits;
+    var a_digits = a._digits;
+    var r_digits = r._digits;
     var m = (r_used < a._used) ? r_used : a._used;
     for (var i = 0; i < m; i++) {
-      r._digits[i] = _digits[i] &~ a._digits[i];
+      r_digits[i] = digits[i] &~ a_digits[i];
     }
     for (var i = m; i < r_used; i++) {
-      r._digits[i] = _digits[i];
+      r_digits[i] = digits[i];
     }
     r._used = r_used;
     r._clamp();
@@ -487,21 +523,27 @@
 
   // r = abs(this) | abs(a).
   void _absOrTo(_Bigint a, _Bigint r) {
-    var r_used = (_used > a._used) ? _used : a._used;
+    var used = _used;
+    var a_used = a._used;
+    var r_used = (used > a_used) ? used : a_used;
     r._ensureLength(r_used);
+    var digits = _digits;
+    var a_digits = a._digits;
+    var r_digits = r._digits;
     var l, m;
-    if (_used < a._used) {
+    if (used < a_used) {
       l = a;
-      m = _used;
+      m = used;
     } else {
       l = this;
-      m = a._used;
+      m = a_used;
     }
     for (var i = 0; i < m; i++) {
-      r._digits[i] = _digits[i] | a._digits[i];
+      r_digits[i] = digits[i] | a_digits[i];
     }
+    var l_digits = l._digits;
     for (var i = m; i < r_used; i++) {
-      r._digits[i] = l._digits[i];
+      r_digits[i] = l_digits[i];
     }
     r._used = r_used;
     r._clamp();
@@ -509,21 +551,27 @@
 
   // r = abs(this) ^ abs(a).
   void _absXorTo(_Bigint a, _Bigint r) {
-    var r_used = (_used > a._used) ? _used : a._used;
+    var used = _used;
+    var a_used = a._used;
+    var r_used = (used > a_used) ? used : a_used;
     r._ensureLength(r_used);
+    var digits = _digits;
+    var a_digits = a._digits;
+    var r_digits = r._digits;
     var l, m;
-    if (_used < a._used) {
+    if (used < a_used) {
       l = a;
-      m = _used;
+      m = used;
     } else {
       l = this;
-      m = a._used;
+      m = a_used;
     }
     for (var i = 0; i < m; i++) {
-      r._digits[i] = _digits[i] ^ a._digits[i];
+      r_digits[i] = digits[i] ^ a_digits[i];
     }
+    var l_digits = l._digits;
     for (var i = m; i < r_used; i++) {
-      r._digits[i] = l._digits[i];
+      r_digits[i] = l_digits[i];
     }
     r._used = r_used;
     r._clamp();
@@ -734,41 +782,52 @@
     return r;
   }
 
-  // Accumulate multiply.
-  // this[i..i+n-1]: bigint multiplicand.
-  // x: digit multiplier, 0 <= x < DIGIT_BASE (i.e. 32-bit multiplier).
-  // w[j..j+n-1]: bigint accumulator.
-  // Returns carry out.
-  // w[j..j+n-1] += this[i..i+n-1] * x.
-  // Returns carry out.
-  int _am(int i, int x, _Bigint w, int j, int n) {
+  // Multiply and accumulate.
+  // Input:
+  //   args[MA_MULTIPLIER]: multiplier digit, 0 <= x < DIGIT_BASE (i.e. 32-bit).
+  //   m_digits[i..i+n-1]: multiplicand digits.
+  //   a_digits[j..j+n-1]: accumulator digits.
+  // Operation:
+  //   a_digits[j..j+n-1] += x*m_digits[i..i+n-1].
+  // Output:
+  //   args[MA_CARRY_OUT].
+  // Note: Passing single digits as elements of args prevents Mint allocation.
+  static void _mulAdd(Uint32List args,
+                      Uint32List m_digits, int i,
+                      Uint32List a_digits, int j, int n) {
+    int x = args[MA_MULTIPLIER];
     if (x == 0) {
       // No-op if x is 0.
-      return 0;
+      args[MA_CARRY_OUT] = 0;
+      return;
     }
     int c = 0;
     int xl = x & DIGIT2_MASK;
     int xh = x >> DIGIT2_BITS;
     while (--n >= 0) {
-      int l = _digits[i] & DIGIT2_MASK;
-      int h = _digits[i++] >> DIGIT2_BITS;
+      int l = m_digits[i] & DIGIT2_MASK;
+      int h = m_digits[i++] >> DIGIT2_BITS;
       int m = xh*l + h*xl;
-      l = xl*l + ((m & DIGIT2_MASK) << DIGIT2_BITS) + w._digits[j] + c;
+      l = xl*l + ((m & DIGIT2_MASK) << DIGIT2_BITS) + a_digits[j] + c;
       c = (l >> DIGIT_BITS) + (m >> DIGIT2_BITS) + xh*h;
-      w._digits[j++] = l & DIGIT_MASK;
+      a_digits[j++] = l & DIGIT_MASK;
     }
-    return c;
+    args[MA_CARRY_OUT] = c;
   }
 
-  // Accumulate multiply with carry.
-  // this[i..i+n-1]: bigint multiplicand.
-  // x: digit multiplier, 0 <= x < 2*DIGIT_BASE  (i.e. 33-bit multiplier).
-  // w[j..j+n-1]: bigint accumulator.
-  // c: int carry in.
-  // Returns carry out.
-  // w[j..j+n-1] += this[i..i+n-1] * x + c.
-  // Returns carry out.
-  int _amc(int i, int x, _Bigint w, int j, int c, int n) {
+  // Multiply and accumulate with carry in.
+  // Input:
+  //   x: multiplier digit, 0 <= x < 2*DIGIT_BASE (i.e. 33-bit multiplier).
+  //   m_digits[i..i+n-1]: multiplicand digits.
+  //   a_digits[j..j+n-1]: accumulator digits.
+  //   c: carry in.
+  // Operation:
+  //   a_digits[j..j+n-1] += x*m_digits[i..i+n-1] + c.
+  // Output:
+  //   carry out.
+  // TODO(regis): Use an argument buffer as in _mulAdd.
+  static int _mulAddc(int x, Uint32List m_digits, int i,
+                      Uint32List a_digits, int j, int c, int n) {
     if (x == 0 && c == 0) {
       // No-op if both x and c are 0.
       return 0;
@@ -776,12 +835,12 @@
     int xl = x & DIGIT2_MASK;
     int xh = x >> DIGIT2_BITS;
     while (--n >= 0) {
-      int l = _digits[i] & DIGIT2_MASK;
-      int h = _digits[i++] >> DIGIT2_BITS;
+      int l = m_digits[i] & DIGIT2_MASK;
+      int h = m_digits[i++] >> DIGIT2_BITS;
       int m = xh*l + h*xl;
-      l = xl*l + ((m & DIGIT2_MASK) << DIGIT2_BITS) + w._digits[j] + c;
+      l = xl*l + ((m & DIGIT2_MASK) << DIGIT2_BITS) + a_digits[j] + c;
       c = (l >> DIGIT_BITS) + (m >> DIGIT2_BITS) + xh*h;
-      w._digits[j++] = l & DIGIT_MASK;
+      a_digits[j++] = l & DIGIT_MASK;
     }
     return c;
   }
@@ -789,14 +848,21 @@
   // r = this * a.
   void _mulTo(_Bigint a, _Bigint r) {
     // TODO(regis): Use karatsuba multiplication when appropriate.
-    var i = _used;
-    r._ensureLength(i + a._used);
-    r._used = i + a._used;
+    var used = _used;
+    var a_used = a._used;
+    var i = used;
+    r._ensureLength(i + a_used);
+    var digits = _digits;
+    var a_digits = a._digits;
+    var r_digits = r._digits;
+    r._used = i + a_used;
     while (--i >= 0) {
-      r._digits[i] = 0;
+      r_digits[i] = 0;
     }
-    for (i = 0; i < a._used; ++i) {
-      r._digits[i + _used] = _am(0, a._digits[i], r, i, _used);
+    for (i = 0; i < a_used; ++i) {
+      _MulAddArgs[MA_MULTIPLIER] = a_digits[i];
+      _mulAdd(_MulAddArgs, digits, 0, r_digits, i, used);
+      r_digits[i + used] = _MulAddArgs[MA_CARRY_OUT];
     }
     r._clamp();
     r._neg = r._used > 0 && _neg != a._neg;  // Zero cannot be negative.
@@ -804,26 +870,35 @@
 
   // r = this^2, r != this.
   void _sqrTo(_Bigint r) {
-    var i = 2 * _used;
-    r._ensureLength(i);
-    r._used = i;
+    var used = _used;
+    var r_used = 2 * used;
+    r._ensureLength(r_used);
+    var digits = _digits;
+    var r_digits = r._digits;
+    var i = r_used;
     while (--i >= 0) {
-      r._digits[i] = 0;
+      r_digits[i] = 0;
     }
-    for (i = 0; i < _used - 1; ++i) {
-      var c = _am(i, _digits[i], r, 2*i, 1);
-      var d = r._digits[i + _used];
-      d += _amc(i + 1, _digits[i] << 1, r, 2*i + 1, c, _used - i - 1);
+    for (i = 0; i < used - 1; ++i) {
+      _MulAddArgs[MA_MULTIPLIER] = digits[i];
+      _mulAdd(_MulAddArgs, digits, i, r_digits, 2*i, 1);
+      var c = _MulAddArgs[MA_CARRY_OUT];
+      var d = r_digits[i + used];
+      d += _mulAddc(digits[i] << 1, digits, i + 1,
+                    r_digits, 2*i + 1, c, used - i - 1);
       if (d >= DIGIT_BASE) {
-        r._digits[i + _used] = d - DIGIT_BASE;
-        r._digits[i + _used + 1] = 1;
+        r_digits[i + used] = d - DIGIT_BASE;
+        r_digits[i + used + 1] = 1;
       } else {
-        r._digits[i + _used] = d;
+        r_digits[i + used] = d;
       }
     }
-    if (r._used > 0) {
-      r._digits[r._used - 1] += _am(i, _digits[i], r, 2*i, 1);
+    if (r_used > 0) {
+      _MulAddArgs[MA_MULTIPLIER] = digits[i];
+      _mulAdd(_MulAddArgs, digits, i, r_digits, 2*i, 1);
+      r_digits[r_used - 1] += _MulAddArgs[MA_CARRY_OUT];
     }
+    r._used = r_used;
     r._neg = false;
     r._clamp();
   }
@@ -847,8 +922,8 @@
     if (r == null) {
       r = new _Bigint();
     }
-    var y = new _Bigint();
-    var nsh = DIGIT_BITS - _nbits(a._digits[a._used - 1]);  // normalize modulus
+    var y = new _Bigint();  // Normalized modulus.
+    var nsh = DIGIT_BITS - _nbits(a._digits[a._used - 1]);
     if (nsh > 0) {
       a._lShiftTo(nsh, y);
       _lShiftTo(nsh, r);
@@ -861,36 +936,46 @@
     y._neg = false;
     r._neg = false;
     var y_used = y._used;
-    var y0 = y._digits[y_used - 1];
+    var y_digits = y._digits;
+    var y0 = y_digits[y_used - 1];
     if (y0 == 0) return;
-    var yt = y0*(1 << FP_D1) + ((y_used > 1) ? y._digits[y_used - 2] >> FP_D2 : 0);
-    var d1 = FP_BASE/yt;
-    var d2 = (1 << FP_D1)/yt;
-    var e = 1 << FP_D2;
+    var yt = y0 >> 1;  // Chop off one bit, see below. y is normalized: yt != 0.
     var i = r._used;
     var j = i - y_used;
     _Bigint t = (q == null) ? new _Bigint() : q;
-
     y._dlShiftTo(j, t);
-
+    var r_digits = r._digits;
     if (r._compareTo(t) >= 0) {
-      r._digits[r._used++] = 1;
+      r_digits[r._used++] = 1;
       r._subTo(t, r);
     }
     ONE._dlShiftTo(y_used, t);
-    t._subTo(y, y);  // "negative" y so we can replace sub with _am later
+    t._subTo(y, y);  // Negate y so we can replace sub with _mulAdd later.
     while (y._used < y_used) {
-      y._digits[y._used++] = 0;
+      y_digits[y._used++] = 0;
     }
     while (--j >= 0) {
-      // Estimate quotient digit
-      var qd = (r._digits[--i] == y0)
-          ? DIGIT_MASK
-          : (r._digits[i]*d1 + (r._digits[i - 1] + e)*d2).floor();
-      if ((r._digits[i] += y._amc(0, qd, r, j, 0, y_used)) < qd) {  // Try it out
+      // Estimate quotient digit.
+      // TODO(regis): Move the expensive mint division below to a function that
+      // can be intrinsified using an uint64_t by uint32_t division instruction,
+      // e.g. qd = _estqd(r_digits, --i, y0).
+      var qd;  // TODO(regis): Is it more efficient to use
+               //_MulAddArgs[MA_MULTIPLIER] directly instead of qd (Mint)?
+      if (r_digits[--i] == y0) {
+        qd = DIGIT_MASK;
+      } else {
+        // Chop off one bit, since a Mint cannot hold 2 DIGITs.
+        qd = ((r_digits[i] << (DIGIT_BITS - 1)) | (r_digits[i - 1] >> 1)) ~/ yt;
+        if (qd > DIGIT_MASK) {
+          qd = DIGIT_MASK;
+        }
+      }
+      _MulAddArgs[MA_MULTIPLIER] = qd;
+      _mulAdd(_MulAddArgs, y_digits, 0, r_digits, j, y_used);
+      if ((r_digits[i] += _MulAddArgs[MA_CARRY_OUT]) < qd) {
         y._dlShiftTo(j, t);
         r._subTo(t, r);
-        while (r._digits[i] < --qd) {
+        while (r_digits[i] < --qd) {
           r._subTo(t, r);
         }
       }
@@ -904,7 +989,7 @@
     r._used = y_used;
     r._clamp();
     if (nsh > 0) {
-      r._rShiftTo(nsh, r);  // Denormalize remainder
+      r._rShiftTo(nsh, r);  // Denormalize remainder.
     }
     if (_neg) {
       ZERO._subTo(r, r);
@@ -932,7 +1017,7 @@
     if (_neg) throw "negative shift amount";  // TODO(regis): What exception?
     assert(DIGIT_BITS == 32);  // Otherwise this code needs to be revised.
     var shift;
-    if (_used > 2 || (_used == 2 && _digits[1] > 0x10000000)) {
+    if ((_used > 2) || ((_used == 2) && (_digits[1] > 0x10000000))) {
       if (other < 0) {
         return -1;
       } else {
@@ -1118,22 +1203,24 @@
   }
 
   // TODO(regis): Make this method private once the plumbing to invoke it from
-  // dart:math is in place.
+  // dart:math is in place. Move the argument checking to dart:math.
   // Return pow(this, e) % m.
   int modPow(int e, int m) {
-    // TODO(regis): Where/how do we handle values of e smaller than 256?
-    // TODO(regis): Where/how do we handle even values of m?
-    assert(e >= 256 && !m.isEven());
-    if (e is! _Bigint) {
-      _Reduction z = new _Montgomery(m);
+    if (e is! int) throw new ArgumentError(e);
+    if (m is! int) throw new ArgumentError(m);
+    int i = e.bitLength;
+    if (i <= 0) return 1;
+    if ((e is! _Bigint) || m.isEven) {
+      _Reduction z = (i < 8 || m.isEven) ? new _Classic(m) : new _Montgomery(m);
+      // TODO(regis): Should we use Barrett reduction for an even modulus?
       var r = new _Bigint();
       var r2 = new _Bigint();
       var g = z._convert(this);
-      int i = _nbits(e) - 1;
+      i--;
       g._copyTo(r);
       while (--i >= 0) {
         z._sqrTo(r, r2);
-        if ((e & (1 << i)) > 0) {
+        if ((e & (1 << i)) != 0) {
           z._mulTo(r2, g, r);
         } else {
           var t = r;
@@ -1143,12 +1230,9 @@
       }
       return z._revert(r)._toValidInt();
     }
-    var i = e.bitLength;
     var k;
-    var r = new _Bigint()._setInt(1);
-    if (i <= 0) return r;
     // TODO(regis): Are these values of k really optimal for our implementation?
-    else if (i < 18) k = 1;
+    if (i < 18) k = 1;
     else if (i < 48) k = 3;
     else if (i < 144) k = 4;
     else if (i < 768) k = 5;
@@ -1171,16 +1255,18 @@
     var j = e._used - 1;
     var w;
     var is1 = true;
+    var r = new _Bigint()._setInt(1);
     var r2 = new _Bigint();
     var t;
-    i = _nbits(e._digits[j]) - 1;
+    var e_digits = e._digits;
+    i = _nbits(e_digits[j]) - 1;
     while (j >= 0) {
       if (i >= k1) {
-        w = (e._digits[j] >> (i - k1)) & km;
+        w = (e_digits[j] >> (i - k1)) & km;
       } else {
-        w = (e._digits[j] & ((1 << (i + 1)) - 1)) << (k1 - i);
+        w = (e_digits[j] & ((1 << (i + 1)) - 1)) << (k1 - i);
         if (j > 0) {
-          w |= e._digits[j - 1] >> (DIGIT_BITS + i - k1);
+          w |= e_digits[j - 1] >> (DIGIT_BITS + i - k1);
         }
       }
       n = k;
@@ -1212,7 +1298,7 @@
         z._mulTo(r2,g[w], r);
       }
 
-      while (j >= 0 && (e._digits[j] & (1 << i)) == 0) {
+      while (j >= 0 && (e_digits[j] & (1 << i)) == 0) {
         z._sqrTo(r, r2);
         t = r;
         r = r2;
@@ -1227,32 +1313,25 @@
   }
 }
 
-// New classes to support crypto (modPow method).
-
+// Interface for modular reduction.
 class _Reduction {
-  const _Reduction();
-  _Bigint _convert(_Bigint x) => x;
-  _Bigint _revert(_Bigint x) => x;
-
-  void _mulTo(_Bigint x, _Bigint y, _Bigint r) {
-    x._mulTo(y, r);
-  }
-
-  void _sqrTo(_Bigint x, _Bigint r) {
-    x._sqrTo(r);
-  }
+  _Bigint _convert(_Bigint x);
+  _Bigint _revert(_Bigint x);
+  void _mulTo(_Bigint x, _Bigint y, _Bigint r);
+  void _sqrTo(_Bigint x, _Bigint r);
 }
 
 // Montgomery reduction on _Bigint.
 class _Montgomery implements _Reduction {
-  final _Bigint _m;
+  _Bigint _m;
   var _mp;
   var _mpl;
   var _mph;
   var _um;
   var _mused2;
 
-  _Montgomery(this._m) {
+  _Montgomery(m) {
+    _m = m._toBigint();
     _mp = _m._invDigit();
     _mpl = _mp & _Bigint.DIGIT2_MASK;
     _mph = _mp >> _Bigint.DIGIT2_BITS;
@@ -1282,31 +1361,36 @@
   // x = x/R mod _m
   void _reduce(_Bigint x) {
     x._ensureLength(_mused2 + 1);
-    while (x._used <= _mused2) {  // Pad x so _am has enough room later.
-      x._digits[x._used++] = 0;
+    var x_digits = x._digits;
+    while (x._used <= _mused2) {  // Pad x so _mulAdd has enough room later.
+      x_digits[x._used++] = 0;
     }
-    for (var i = 0; i < _m._used; ++i) {
+    var m_used = _m._used;
+    var m_digits = _m._digits;
+    for (var i = 0; i < m_used; ++i) {
       // Faster way of calculating u0 = x[i]*mp mod DIGIT_BASE.
-      var j = x._digits[i] & _Bigint.DIGIT2_MASK;
-      var u0 = (j*_mpl + (((j*_mph + (x._digits[i] >> _Bigint.DIGIT2_BITS)
+      var j = x_digits[i] & _Bigint.DIGIT2_MASK;
+      var u0 = (j*_mpl + (((j*_mph + (x_digits[i] >> _Bigint.DIGIT2_BITS)
           *_mpl) & _um) << _Bigint.DIGIT2_BITS)) & _Bigint.DIGIT_MASK;
-      // Use _am to combine the multiply-shift-add into one call.
-      j = i + _m._used;
-      var digit = x._digits[j];
-      digit += _m ._am(0, u0, x, i, _m._used);
+      // Use _mulAdd to combine the multiply-shift-add into one call.
+      j = i + m_used;
+      var digit = x_digits[j];
+      _Bigint._MulAddArgs[_Bigint.MA_MULTIPLIER] = u0;
+      _Bigint._mulAdd(_Bigint._MulAddArgs, m_digits, 0, x_digits, i, m_used);
+      digit += _Bigint._MulAddArgs[_Bigint.MA_CARRY_OUT];
       // Propagate carry.
       while (digit >= _Bigint.DIGIT_BASE) {
         digit -= _Bigint.DIGIT_BASE;
-        x._digits[j++] = digit;
-        digit = x._digits[j];
+        x_digits[j++] = digit;
+        digit = x_digits[j];
         digit++;
       }
-      x._digits[j] = digit;
+      x_digits[j] = digit;
     }
     x._clamp();
-    x._drShiftTo(_m ._used, x);
-    if (x._compareTo(_m ) >= 0) {
-      x._subTo(_m , x);
+    x._drShiftTo(m_used, x);
+    if (x._compareTo(_m) >= 0) {
+      x._subTo(_m, x);
     }
   }
 
@@ -1323,3 +1407,41 @@
   }
 }
 
+// Modular reduction using "classic" algorithm.
+class _Classic implements _Reduction {
+  _Bigint _m;
+
+  _Classic(int m) {
+    _m = m._toBigint();
+  }
+
+  _Bigint _convert(_Bigint x) {
+    if (x._neg || x._compareTo(_m) >= 0) {
+      var r = new _Bigint();
+      x._divRemTo(_m, null, r);
+      if (x._neg && !r._neg && r._used > 0) {
+        _m._subTo(r, r);
+      }
+      return r;
+    }
+    return x;
+  }
+
+  _Bigint _revert(_Bigint x) {
+    return x;
+  }
+
+  void _reduce(_Bigint x) {
+    x._divRemTo(_m, null, x);
+  }
+
+  void _sqrTo(_Bigint x, _Bigint r) {
+    x._sqrTo(r);
+    _reduce(r);
+  }
+
+  void _mulTo(_Bigint x, _Bigint y, _Bigint r) {
+    x._mulTo(y, r);
+    _reduce(r);
+  }
+}
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index 3e9fa095..b888106 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -263,6 +263,31 @@
   }
 
   _leftShiftWithMask32(count, mask)  native "Integer_leftShiftWithMask32";
+
+  // TODO(regis): Make this method private once the plumbing to invoke it from
+  // dart:math is in place. Move the argument checking to dart:math.
+  // Return pow(this, e) % m.
+  int modPow(int e, int m) {
+    if (e is! int) throw new ArgumentError(e);
+    if (m is! int) throw new ArgumentError(m);
+    if (e is _Bigint || m is _Bigint) {
+      return _toBigint().modPow(e, m);
+    }
+    if (e < 1) return 1;
+    int b = this;
+    if (b < 0 || b > m) {
+      b = b % m;
+    }
+    int r = 1;
+    while (e > 0) {
+     if ((e & 1) != 0) {
+       r = (r * b) % m;
+     }
+     e >>= 1;
+     b = (b * b) % m;
+    }
+    return r;
+  }
 }
 
 class _Smi extends _IntegerImplementation implements int {
diff --git a/runtime/lib/integers_patch.dart b/runtime/lib/integers_patch.dart
index 4ac46dc..f6bc484 100644
--- a/runtime/lib/integers_patch.dart
+++ b/runtime/lib/integers_patch.dart
@@ -22,17 +22,17 @@
         return null;  // Empty.
       }
     }
-    int smiLimit = is64Bit() ? 18 : 9;
+    var smiLimit = is64Bit() ? 18 : 9;
     if ((last - ix) >= smiLimit) {
       return null;  // May not fit into a Smi.
     }
     var result = 0;
     for (int i = ix; i <= last; i++) {
-      var c = str.codeUnitAt(i) - 0x30;
-      if ((c > 9) || (c < 0)) {
+      var c = 0x30 ^ str.codeUnitAt(i);
+      if (9 < c) {
         return null;
       }
-      result = result * 10 + c;
+      result = 10 * result + c;
     }
     return sign * result;
   }
@@ -62,6 +62,7 @@
   /* patch */ static int parse(String source,
                                { int radix,
                                  int onError(String str) }) {
+    if (source == null) throw new ArgumentError(source);
     if (radix == null) {
       int result;
       if (source.isNotEmpty) result = _parse(source);
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index f85726d..82a0fc1 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -18,6 +18,7 @@
 #include "vm/resolver.h"
 #include "vm/snapshot.h"
 #include "vm/symbols.h"
+#include "vm/unicode.h"
 
 namespace dart {
 
@@ -153,6 +154,7 @@
   Isolate* child_isolate = reinterpret_cast<Isolate*>(
       (callback)(state->script_url(),
                  state->function_name(),
+                 state->package_root(),
                  init_data,
                  error));
   if (child_isolate == NULL) {
@@ -216,11 +218,12 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 4) {
+DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 5) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(String, uri, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, args, arguments->NativeArgAt(2));
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, message, arguments->NativeArgAt(3));
+  GET_NATIVE_ARGUMENT(String, package_root, arguments->NativeArgAt(4));
 
   // Canonicalize the uri with respect to the current isolate.
   char* error = NULL;
@@ -233,8 +236,17 @@
     ThrowIsolateSpawnException(msg);
   }
 
-  return Spawn(isolate, new IsolateSpawnState(port.Id(), canonical_uri,
-                                              args, message));
+  char* utf8_package_root = NULL;
+  if (!package_root.IsNull()) {
+    const intptr_t len = Utf8::Length(package_root);
+    Zone* zone = isolate->current_zone();
+    utf8_package_root = zone->Alloc<char>(len + 1);
+    package_root.ToUTF8(reinterpret_cast<uint8_t*>(utf8_package_root), len);
+    utf8_package_root[len] = '\0';
+  }
+
+  return Spawn(isolate, new IsolateSpawnState(
+      port.Id(), canonical_uri, utf8_package_root, args, message));
 }
 
 
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index e0194fc..1313609 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -277,13 +277,14 @@
       Uri uri, List<String> args, var message,
       { bool paused: false, Uri packageRoot }) {
     // `paused` isn't handled yet.
-    // `packageRoot` isn't handled yet.
-    if (packageRoot != null) throw new UnimplementedError("packageRoot");
     RawReceivePort readyPort;
     try {
       // The VM will invoke [_startIsolate] and not `main`.
       readyPort = new RawReceivePort();
-      _spawnUri(readyPort.sendPort, uri.toString(), args, message);
+      var packageRootString =
+          (packageRoot == null) ? null : packageRoot.toString();
+      _spawnUri(
+          readyPort.sendPort, uri.toString(), args, message, packageRootString);
       Completer completer = new Completer<Isolate>.sync();
       readyPort.handler = (readyMessage) {
         readyPort.close();
@@ -316,7 +317,8 @@
       native "Isolate_spawnFunction";
 
   static SendPort _spawnUri(SendPort readyPort, String uri,
-                            List<String> args, var message)
+                            List<String> args, var message,
+                            String packageRoot)
       native "Isolate_spawnUri";
 
   static void _sendOOB(port, msg) native "Isolate_sendOOB";
diff --git a/runtime/lib/profiler.cc b/runtime/lib/profiler.cc
index a32d40e..a734250 100644
--- a/runtime/lib/profiler.cc
+++ b/runtime/lib/profiler.cc
@@ -45,7 +45,7 @@
   if (FLAG_trace_intrinsified_natives) {
     OS::Print("UserTag_defaultTag\n");
   }
-  return isolate->object_store()->default_tag();
+  return isolate->default_tag();
 }
 
 
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index bb147a1..0365086 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -137,20 +137,22 @@
 
 DEFINE_NATIVE_ENTRY(OneByteString_allocate, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, length_obj, arguments->NativeArgAt(0));
-  return OneByteString::New(length_obj.Value(), Heap::kNew);
+  Heap::Space space = isolate->heap()->SpaceForAllocation(kOneByteStringCid);
+  return OneByteString::New(length_obj.Value(), space);
 }
 
 
 DEFINE_NATIVE_ENTRY(OneByteString_allocateFromOneByteList, 1) {
   Instance& list = Instance::CheckedHandle(arguments->NativeArgAt(0));
+  Heap::Space space = isolate->heap()->SpaceForAllocation(kOneByteStringCid);
   if (list.IsTypedData()) {
     const TypedData& array = TypedData::Cast(list);
     intptr_t length = array.LengthInBytes();
-    return OneByteString::New(array, 0, length);
+    return OneByteString::New(array, 0, length, space);
   } else if (list.IsExternalTypedData()) {
     const ExternalTypedData& array = ExternalTypedData::Cast(list);
     intptr_t length = array.LengthInBytes();
-    return OneByteString::New(array, 0, length);
+    return OneByteString::New(array, 0, length, space);
   } else if (RawObject::IsTypedDataViewClassId(list.GetClassId())) {
     const Instance& view = Instance::Cast(list);
     intptr_t length = Smi::Value(TypedDataView::Length(view));
@@ -158,15 +160,15 @@
     intptr_t data_offset = Smi::Value(TypedDataView::OffsetInBytes(view));
     if (data_obj.IsTypedData()) {
       const TypedData& array = TypedData::Cast(data_obj);
-      return OneByteString::New(array, data_offset, length);
+      return OneByteString::New(array, data_offset, length, space);
     } else if (data_obj.IsExternalTypedData()) {
       const ExternalTypedData& array = ExternalTypedData::Cast(data_obj);
-      return OneByteString::New(array, data_offset, length);
+      return OneByteString::New(array, data_offset, length, space);
     }
   } else if (list.IsArray()) {
     const Array& array = Array::Cast(list);
     intptr_t length = array.Length();
-    String& string = String::Handle(OneByteString::New(length, Heap::kNew));
+    String& string = String::Handle(OneByteString::New(length, space));
     for (int i = 0; i < length; i++) {
       intptr_t value = Smi::Value(reinterpret_cast<RawSmi*>(array.At(i)));
       OneByteString::SetCharAt(string, i, value);
@@ -175,7 +177,7 @@
   } else if (list.IsGrowableObjectArray()) {
     const GrowableObjectArray& array = GrowableObjectArray::Cast(list);
     intptr_t length = array.Length();
-    String& string = String::Handle(OneByteString::New(length, Heap::kNew));
+    String& string = String::Handle(OneByteString::New(length, space));
     for (int i = 0; i < length; i++) {
       intptr_t value = Smi::Value(reinterpret_cast<RawSmi*>(array.At(i)));
       OneByteString::SetCharAt(string, i, value);
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index de9330b..ac0ab6f 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -13,15 +13,39 @@
 
 #if defined(_WIN32)
 // Cut down on the amount of stuff that gets included via windows.h.
+#if !defined(WIN32_LEAN_AND_MEAN)
 #define WIN32_LEAN_AND_MEAN
+#endif
+
+#if !defined(NOMINMAX)
 #define NOMINMAX
+#endif
+
+#if !defined(NOKERNEL)
 #define NOKERNEL
+#endif
+
+#if !defined(NOUSER)
 #define NOUSER
+#endif
+
+#if !defined(NOSERVICE)
 #define NOSERVICE
+#endif
+
+#if !defined(NOSOUND)
 #define NOSOUND
+#endif
+
+#if !defined(NOMCX)
 #define NOMCX
+#endif
+
+#if !defined(UNICODE)
 #define _UNICODE
 #define UNICODE
+#endif
+
 #include <windows.h>
 #include <winsock2.h>
 #include <Rpc.h>
diff --git a/runtime/tests/vm/dart/byte_array_test.dart b/runtime/tests/vm/dart/byte_array_test.dart
index 19fecb3..f1ff69e 100644
--- a/runtime/tests/vm/dart/byte_array_test.dart
+++ b/runtime/tests/vm/dart/byte_array_test.dart
@@ -1,7 +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
+// VMOptions=--optimization_counter_threshold=10 --disable_alloc_stubs_after_gc
 
 // Library tag to be able to run in html test framework.
 library byte_array_test;
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index a135048..9970056 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -3170,25 +3170,30 @@
     ASSERT(instance_reg != temp_reg);
     ASSERT(temp_reg != IP);
     const intptr_t instance_size = cls.instance_size();
-
-    LoadImmediate(temp_reg, Isolate::Current()->heap()->NewSpaceAddress());
-
-    ldr(instance_reg, Address(temp_reg, Scavenger::top_offset()));
+    ASSERT(instance_size != 0);
+    Heap* heap = Isolate::Current()->heap();
+    Heap::Space space = heap->SpaceForAllocation(cls.id());
+    const uword top_address = heap->TopAddress(space);
+    LoadImmediate(temp_reg, top_address);
+    ldr(instance_reg, Address(temp_reg));
     AddImmediate(instance_reg, instance_size);
 
     // instance_reg: potential next object start.
-    ldr(IP, Address(temp_reg, Scavenger::end_offset()));
+    const uword end_address = heap->EndAddress(space);
+    ASSERT(top_address < end_address);
+    // Could use ldm to load (top, end), but no benefit seen experimentally.
+    ldr(IP, Address(temp_reg, end_address - top_address));
     cmp(IP, Operand(instance_reg));
     // fail if heap end unsigned less than or equal to instance_reg.
     b(failure, LS);
 
     // Successfully allocated the object, now update top to point to
     // next object start and store the class in the class field of object.
-    str(instance_reg, Address(temp_reg, Scavenger::top_offset()));
+    str(instance_reg, Address(temp_reg));
 
     ASSERT(instance_size >= kHeapObjectTag);
     AddImmediate(instance_reg, -instance_size + kHeapObjectTag);
-    UpdateAllocationStats(cls.id(), temp_reg);
+    UpdateAllocationStats(cls.id(), temp_reg, space);
 
     uword tags = 0;
     tags = RawObject::SizeTag::update(instance_size, tags);
@@ -3212,7 +3217,8 @@
   if (FLAG_inline_alloc) {
     Isolate* isolate = Isolate::Current();
     Heap* heap = isolate->heap();
-    LoadImmediate(temp1, heap->TopAddress());
+    Heap::Space space = heap->SpaceForAllocation(cid);
+    LoadImmediate(temp1, heap->TopAddress(space));
     ldr(instance, Address(temp1, 0));  // Potential new object start.
     AddImmediate(end_address, instance, instance_size);
     b(failure, VS);
@@ -3220,7 +3226,7 @@
     // Check if the allocation fits into the remaining space.
     // instance: potential new object start.
     // end_address: potential next object start.
-    LoadImmediate(temp2, heap->EndAddress());
+    LoadImmediate(temp2, heap->EndAddress(space));
     ldr(temp2, Address(temp2, 0));
     cmp(end_address, Operand(temp2));
     b(failure, CS);
@@ -3230,7 +3236,7 @@
     str(end_address, Address(temp1, 0));
     add(instance, instance, Operand(kHeapObjectTag));
     LoadImmediate(temp2, instance_size);
-    UpdateAllocationStatsWithSize(cid, temp2, temp1);
+    UpdateAllocationStatsWithSize(cid, temp2, temp1, space);
 
     // Initialize the tags.
     // instance: new object start as a tagged pointer.
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index da452b6..96be8be 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -303,6 +303,7 @@
   void PopRegister(Register r) { Pop(r); }
 
   void Bind(Label* label);
+  void Jump(Label* label) { b(label); }
 
   // Misc. functionality
   intptr_t CodeSize() const { return buffer_.Size(); }
@@ -798,12 +799,12 @@
 
   void UpdateAllocationStats(intptr_t cid,
                              Register temp_reg,
-                             Heap::Space space = Heap::kNew);
+                             Heap::Space space);
 
   void UpdateAllocationStatsWithSize(intptr_t cid,
                                      Register size_reg,
                                      Register temp_reg,
-                                     Heap::Space space = Heap::kNew);
+                                     Heap::Space space);
 
   Address ElementAddressForIntIndex(bool is_load,
                                     bool is_external,
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index 3f7986a..d294364 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -1396,26 +1396,31 @@
                             Register pp) {
   ASSERT(failure != NULL);
   if (FLAG_inline_alloc) {
-    Heap* heap = Isolate::Current()->heap();
     const intptr_t instance_size = cls.instance_size();
-    LoadImmediate(temp_reg, heap->NewSpaceAddress(), pp);
-    ldr(instance_reg, Address(temp_reg, Scavenger::top_offset()));
+    Heap* heap = Isolate::Current()->heap();
+    Heap::Space space = heap->SpaceForAllocation(cls.id());
+    const uword top_address = heap->TopAddress(space);
+    LoadImmediate(temp_reg, top_address, pp);
+    ldr(instance_reg, Address(temp_reg));
     AddImmediate(instance_reg, instance_reg, instance_size, pp);
 
     // instance_reg: potential next object start.
-    ldr(TMP, Address(temp_reg, Scavenger::end_offset()));
+    const uword end_address = heap->EndAddress(space);
+    ASSERT(top_address < end_address);
+    // Could use ldm to load (top, end), but no benefit seen experimentally.
+    ldr(TMP, Address(temp_reg, end_address - top_address));
     CompareRegisters(TMP, instance_reg);
     // fail if heap end unsigned less than or equal to instance_reg.
     b(failure, LS);
 
     // Successfully allocated the object, now update top to point to
     // next object start and store the class in the class field of object.
-    str(instance_reg, Address(temp_reg, Scavenger::top_offset()));
+    str(instance_reg, Address(temp_reg));
 
     ASSERT(instance_size >= kHeapObjectTag);
     AddImmediate(
         instance_reg, instance_reg, -instance_size + kHeapObjectTag, pp);
-    UpdateAllocationStats(cls.id(), pp);
+    UpdateAllocationStats(cls.id(), pp, space);
 
     uword tags = 0;
     tags = RawObject::SizeTag::update(instance_size, tags);
@@ -1439,7 +1444,8 @@
   if (FLAG_inline_alloc) {
     Isolate* isolate = Isolate::Current();
     Heap* heap = isolate->heap();
-    LoadImmediate(temp1, heap->TopAddress(), PP);
+    Heap::Space space = heap->SpaceForAllocation(cid);
+    LoadImmediate(temp1, heap->TopAddress(space), PP);
     ldr(instance, Address(temp1, 0));  // Potential new object start.
     AddImmediate(end_address, instance, instance_size, PP);
     b(failure, VS);
@@ -1447,7 +1453,7 @@
     // Check if the allocation fits into the remaining space.
     // instance: potential new object start.
     // end_address: potential next object start.
-    LoadImmediate(temp2, heap->EndAddress(), PP);
+    LoadImmediate(temp2, heap->EndAddress(space), PP);
     ldr(temp2, Address(temp2, 0));
     cmp(end_address, Operand(temp2));
     b(failure, CS);
@@ -1457,7 +1463,7 @@
     str(end_address, Address(temp1, 0));
     add(instance, instance, Operand(kHeapObjectTag));
     LoadImmediate(temp2, instance_size, PP);
-    UpdateAllocationStatsWithSize(cid, temp2, PP);
+    UpdateAllocationStatsWithSize(cid, temp2, PP, space);
 
     // Initialize the tags.
     // instance: new object start as a tagged pointer.
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index e960df7..10f9331 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -394,6 +394,7 @@
   }
 
   void Bind(Label* label);
+  void Jump(Label* label) { b(label); }
 
   // Misc. functionality
   intptr_t CodeSize() const { return buffer_.Size(); }
@@ -1001,20 +1002,13 @@
     andis(ZR, rn, imm);
   }
 
-  void Lsl(Register rd, Register rn, int shift) {
+  void LslImmediate(Register rd, Register rn, int shift) {
     add(rd, ZR, Operand(rn, LSL, shift));
   }
-  void Lslw(Register rd, Register rn, int shift) {
-    addw(rd, ZR, Operand(rn, LSL, shift));
-  }
-  void Lsr(Register rd, Register rn, int shift) {
+  void LsrImmediate(Register rd, Register rn, int shift) {
     add(rd, ZR, Operand(rn, LSR, shift));
   }
-  void Lsrw(Register rd, Register rn, int shift) {
-    ASSERT((shift >= 0) && (shift < 32));
-    addw(rd, ZR, Operand(rn, LSR, shift));
-  }
-  void Asr(Register rd, Register rn, int shift) {
+  void AsrImmediate(Register rd, Register rn, int shift) {
     add(rd, ZR, Operand(rn, ASR, shift));
   }
 
@@ -1022,13 +1016,16 @@
   void VRSqrts(VRegister vd, VRegister vn);
 
   void SmiUntag(Register reg) {
-    Asr(reg, reg, kSmiTagSize);
+    AsrImmediate(reg, reg, kSmiTagSize);
   }
   void SmiUntag(Register dst, Register src) {
-    Asr(dst, src, kSmiTagSize);
+    AsrImmediate(dst, src, kSmiTagSize);
   }
   void SmiTag(Register reg) {
-    Lsl(reg, reg, kSmiTagSize);
+    LslImmediate(reg, reg, kSmiTagSize);
+  }
+  void SmiTag(Register dst, Register src) {
+    LslImmediate(dst, src, kSmiTagSize);
   }
 
   // Branching to ExternalLabels.
@@ -1214,12 +1211,12 @@
 
   void UpdateAllocationStats(intptr_t cid,
                              Register pp,
-                             Heap::Space space = Heap::kNew);
+                             Heap::Space space);
 
   void UpdateAllocationStatsWithSize(intptr_t cid,
                                      Register size_reg,
                                      Register pp,
-                                     Heap::Space space = Heap::kNew);
+                                     Heap::Space space);
 
   // Inlined allocation of an instance of class 'cls', code has no runtime
   // calls. Jump to 'failure' if the instance cannot be allocated here.
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index 5b8b619..150ccc6 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -2502,15 +2502,16 @@
   if (FLAG_inline_alloc) {
     Heap* heap = Isolate::Current()->heap();
     const intptr_t instance_size = cls.instance_size();
-    movl(instance_reg, Address::Absolute(heap->TopAddress()));
+    Heap::Space space = heap->SpaceForAllocation(cls.id());
+    movl(instance_reg, Address::Absolute(heap->TopAddress(space)));
     addl(instance_reg, Immediate(instance_size));
     // instance_reg: potential next object start.
-    cmpl(instance_reg, Address::Absolute(heap->EndAddress()));
+    cmpl(instance_reg, Address::Absolute(heap->EndAddress(space)));
     j(ABOVE_EQUAL, failure, near_jump);
     // Successfully allocated the object, now update top to point to
     // next object start and store the class in the class field of object.
-    movl(Address::Absolute(heap->TopAddress()), instance_reg);
-    UpdateAllocationStats(cls.id(), temp_reg);
+    movl(Address::Absolute(heap->TopAddress(space)), instance_reg);
+    UpdateAllocationStats(cls.id(), temp_reg, space);
     ASSERT(instance_size >= kHeapObjectTag);
     subl(instance_reg, Immediate(instance_size - kHeapObjectTag));
     uword tags = 0;
@@ -2534,7 +2535,8 @@
   if (FLAG_inline_alloc) {
     Isolate* isolate = Isolate::Current();
     Heap* heap = isolate->heap();
-    movl(instance, Address::Absolute(heap->TopAddress()));
+    Heap::Space space = heap->SpaceForAllocation(cid);
+    movl(instance, Address::Absolute(heap->TopAddress(space)));
     movl(end_address, instance);
 
     addl(end_address, Immediate(instance_size));
@@ -2543,14 +2545,14 @@
     // Check if the allocation fits into the remaining space.
     // EAX: potential new object start.
     // EBX: potential next object start.
-    cmpl(end_address, Address::Absolute(heap->EndAddress()));
+    cmpl(end_address, Address::Absolute(heap->EndAddress(space)));
     j(ABOVE_EQUAL, failure);
 
     // Successfully allocated the object(s), now update top to point to
     // next object start and initialize the object.
-    movl(Address::Absolute(heap->TopAddress()), end_address);
+    movl(Address::Absolute(heap->TopAddress(space)), end_address);
     addl(instance, Immediate(kHeapObjectTag));
-    UpdateAllocationStatsWithSize(cid, instance_size, kNoRegister);
+    UpdateAllocationStatsWithSize(cid, instance_size, kNoRegister, space);
 
     // Initialize the tags.
     uword tags = 0;
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index 30fc201..7416006 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -728,6 +728,7 @@
   intptr_t PreferredLoopAlignment() { return 16; }
   void Align(intptr_t alignment, intptr_t offset);
   void Bind(Label* label);
+  void Jump(Label* label) { jmp(label); }
 
   intptr_t CodeSize() const { return buffer_.Size(); }
   intptr_t prologue_offset() const { return prologue_offset_; }
@@ -799,16 +800,16 @@
 
   void UpdateAllocationStats(intptr_t cid,
                              Register temp_reg,
-                             Heap::Space space = Heap::kNew);
+                             Heap::Space space);
 
   void UpdateAllocationStatsWithSize(intptr_t cid,
                                      Register size_reg,
                                      Register temp_reg,
-                                     Heap::Space space = Heap::kNew);
+                                     Heap::Space space);
   void UpdateAllocationStatsWithSize(intptr_t cid,
                                      intptr_t instance_size,
                                      Register temp_reg,
-                                     Heap::Space space = Heap::kNew);
+                                     Heap::Space space);
 
   // Inlined allocation of an instance of class 'cls', code has no runtime
   // calls. Jump to 'failure' if the instance cannot be allocated here.
diff --git a/runtime/vm/assembler_ia32_test.cc b/runtime/vm/assembler_ia32_test.cc
index 1d17e4c..5fb460d 100644
--- a/runtime/vm/assembler_ia32_test.cc
+++ b/runtime/vm/assembler_ia32_test.cc
@@ -2048,6 +2048,45 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(Int64ToDoubleConversion, assembler) {
+  __ movl(EAX, Immediate(0));
+  __ movl(EDX, Immediate(6));
+  __ pushl(EAX);
+  __ pushl(EDX);
+  __ fildl(Address(ESP, 0));
+  __ popl(EAX);
+  __ popl(EAX);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Int64ToDoubleConversion, test) {
+  typedef double (*Int64ToDoubleConversionCode)();
+  double res = reinterpret_cast<Int64ToDoubleConversionCode>(test->entry())();
+  EXPECT_EQ(6.0, res);
+}
+
+
+ASSEMBLER_TEST_GENERATE(NegativeInt64ToDoubleConversion, assembler) {
+  __ movl(EAX, Immediate(0xFFFFFFFF));
+  __ movl(EDX, Immediate(0xFFFFFFFA));
+  __ pushl(EAX);
+  __ pushl(EDX);
+  __ fildl(Address(ESP, 0));
+  __ popl(EAX);
+  __ popl(EAX);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(NegativeInt64ToDoubleConversion, test) {
+  typedef double (*NegativeInt64ToDoubleConversionCode)();
+  double res =
+      reinterpret_cast<NegativeInt64ToDoubleConversionCode>(test->entry())();
+  EXPECT_EQ(-6.0, res);
+}
+
+
 ASSEMBLER_TEST_GENERATE(IntToFloatConversion, assembler) {
   __ movl(EDX, Immediate(6));
   __ cvtsi2ss(XMM1, EDX);
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index 60f9f5c..79eeb69 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -857,25 +857,28 @@
   ASSERT(!in_delay_slot_);
   ASSERT(failure != NULL);
   if (FLAG_inline_alloc) {
-    Heap* heap = Isolate::Current()->heap();
     const intptr_t instance_size = cls.instance_size();
-
-    LoadImmediate(temp_reg, heap->NewSpaceAddress());
-    lw(instance_reg, Address(temp_reg, Scavenger::top_offset()));
+    Heap* heap = Isolate::Current()->heap();
+    Heap::Space space = heap->SpaceForAllocation(cls.id());
+    const uword top_address = heap->TopAddress(space);
+    LoadImmediate(temp_reg, top_address);
+    lw(instance_reg, Address(temp_reg));
     AddImmediate(instance_reg, instance_size);
 
     // instance_reg: potential next object start.
-    lw(TMP, Address(temp_reg, Scavenger::end_offset()));
+    const uword end_address = heap->EndAddress(space);
+    ASSERT(top_address < end_address);
+    lw(TMP, Address(temp_reg, end_address - top_address));
     // Fail if heap end unsigned less than or equal to instance_reg.
     BranchUnsignedLessEqual(TMP, instance_reg, failure);
 
     // Successfully allocated the object, now update top to point to
     // next object start and store the class in the class field of object.
-    sw(instance_reg, Address(temp_reg, Scavenger::top_offset()));
+    sw(instance_reg, Address(temp_reg));
 
     ASSERT(instance_size >= kHeapObjectTag);
     AddImmediate(instance_reg, -instance_size + kHeapObjectTag);
-    UpdateAllocationStats(cls.id(), temp_reg);
+    UpdateAllocationStats(cls.id(), temp_reg, space);
     uword tags = 0;
     tags = RawObject::SizeTag::update(instance_size, tags);
     ASSERT(cls.id() != kIllegalCid);
@@ -898,8 +901,8 @@
   if (FLAG_inline_alloc) {
     Isolate* isolate = Isolate::Current();
     Heap* heap = isolate->heap();
-
-    LoadImmediate(temp1, heap->TopAddress());
+    Heap::Space space = heap->SpaceForAllocation(cid);
+    LoadImmediate(temp1, heap->TopAddress(space));
     lw(instance, Address(temp1, 0));  // Potential new object start.
     // Potential next object start.
     AddImmediateDetectOverflow(end_address, instance, instance_size, CMPRES1);
@@ -908,7 +911,7 @@
     // Check if the allocation fits into the remaining space.
     // instance: potential new object start.
     // end_address: potential next object start.
-    LoadImmediate(temp2, heap->EndAddress());
+    LoadImmediate(temp2, heap->EndAddress(space));
     lw(temp2, Address(temp2, 0));
     BranchUnsignedGreaterEqual(end_address, temp2, failure);
 
@@ -918,7 +921,7 @@
     sw(end_address, Address(temp1, 0));
     addiu(instance, instance, Immediate(kHeapObjectTag));
     LoadImmediate(temp1, instance_size);
-    UpdateAllocationStatsWithSize(cid, temp1, temp2);
+    UpdateAllocationStatsWithSize(cid, temp1, temp2, space);
 
     // Initialize the tags.
     // instance: new object start as a tagged pointer.
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index eb8c28e..c0b1003 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -151,6 +151,7 @@
   void PopRegister(Register r) { Pop(r); }
 
   void Bind(Label* label);
+  void Jump(Label* label) { b(label); }
 
   // Misc. functionality
   intptr_t CodeSize() const { return buffer_.Size(); }
@@ -201,12 +202,12 @@
 
   void UpdateAllocationStats(intptr_t cid,
                              Register temp_reg,
-                             Heap::Space space = Heap::kNew);
+                             Heap::Space space);
 
   void UpdateAllocationStatsWithSize(intptr_t cid,
                                      Register size_reg,
                                      Register temp_reg,
-                                     Heap::Space space = Heap::kNew);
+                                     Heap::Space space);
 
 
   // Inlined allocation of an instance of class 'cls', code has no runtime
@@ -927,6 +928,10 @@
     }
   }
 
+  void BranchEqual(Register rd, Register rn, Label* l) {
+    beq(rd, rn, l);
+  }
+
   void BranchEqual(Register rd, int32_t value, Label* l) {
     ASSERT(!in_delay_slot_);
     if (value == 0) {
@@ -945,6 +950,10 @@
     beq(rd, CMPRES2, l);
   }
 
+  void BranchNotEqual(Register rd, Register rn, Label* l) {
+    bne(rd, rn, l);
+  }
+
   void BranchNotEqual(Register rd, int32_t value, Label* l) {
     ASSERT(!in_delay_slot_);
     if (value == 0) {
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index a181206..57bbb50 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -3212,18 +3212,19 @@
   if (FLAG_inline_alloc) {
     Heap* heap = Isolate::Current()->heap();
     const intptr_t instance_size = cls.instance_size();
-    LoadImmediate(TMP, Immediate(heap->TopAddress()), pp);
+    Heap::Space space = heap->SpaceForAllocation(cls.id());
+    LoadImmediate(TMP, Immediate(heap->TopAddress(space)), pp);
     movq(instance_reg, Address(TMP, 0));
     AddImmediate(instance_reg, Immediate(instance_size), pp);
     // instance_reg: potential next object start.
-    LoadImmediate(TMP, Immediate(heap->EndAddress()), pp);
+    LoadImmediate(TMP, Immediate(heap->EndAddress(space)), pp);
     cmpq(instance_reg, Address(TMP, 0));
     j(ABOVE_EQUAL, failure, near_jump);
     // Successfully allocated the object, now update top to point to
     // next object start and store the class in the class field of object.
-    LoadImmediate(TMP, Immediate(heap->TopAddress()), pp);
+    LoadImmediate(TMP, Immediate(heap->TopAddress(space)), pp);
     movq(Address(TMP, 0), instance_reg);
-    UpdateAllocationStats(cls.id());
+    UpdateAllocationStats(cls.id(), space);
     ASSERT(instance_size >= kHeapObjectTag);
     AddImmediate(instance_reg, Immediate(kHeapObjectTag - instance_size), pp);
     uword tags = 0;
@@ -3248,8 +3249,8 @@
   if (FLAG_inline_alloc) {
     Isolate* isolate = Isolate::Current();
     Heap* heap = isolate->heap();
-
-    movq(instance, Immediate(heap->TopAddress()));
+    Heap::Space space = heap->SpaceForAllocation(kArrayCid);
+    movq(instance, Immediate(heap->TopAddress(space)));
     movq(instance, Address(instance, 0));
     movq(end_address, RAX);
 
@@ -3259,16 +3260,16 @@
     // Check if the allocation fits into the remaining space.
     // instance: potential new object start.
     // end_address: potential next object start.
-    movq(TMP, Immediate(heap->EndAddress()));
+    movq(TMP, Immediate(heap->EndAddress(space)));
     cmpq(end_address, Address(TMP, 0));
     j(ABOVE_EQUAL, failure);
 
     // Successfully allocated the object(s), now update top to point to
     // next object start and initialize the object.
-    movq(TMP, Immediate(heap->TopAddress()));
+    movq(TMP, Immediate(heap->TopAddress(space)));
     movq(Address(TMP, 0), end_address);
     addq(instance, Immediate(kHeapObjectTag));
-    UpdateAllocationStatsWithSize(kArrayCid, instance_size);
+    UpdateAllocationStatsWithSize(kArrayCid, instance_size, space);
 
     // Initialize the tags.
     // instance: new object start as a tagged pointer.
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index 5396d97..b60b2a7 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -779,6 +779,7 @@
   int PreferredLoopAlignment() { return 16; }
   void Align(int alignment, intptr_t offset);
   void Bind(Label* label);
+  void Jump(Label* label) { jmp(label); }
 
   void Comment(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
   static bool EmittingComments();
@@ -870,14 +871,14 @@
   }
 
   void UpdateAllocationStats(intptr_t cid,
-                             Heap::Space space = Heap::kNew);
+                             Heap::Space space);
 
   void UpdateAllocationStatsWithSize(intptr_t cid,
                                      Register size_reg,
-                                     Heap::Space space = Heap::kNew);
+                                     Heap::Space space);
   void UpdateAllocationStatsWithSize(intptr_t cid,
                                      intptr_t instance_size,
-                                     Heap::Space space = Heap::kNew);
+                                     Heap::Space space);
 
   // Inlined allocation of an instance of class 'cls', code has no runtime
   // calls. Jump to 'failure' if the instance cannot be allocated here.
diff --git a/runtime/vm/bit_vector.h b/runtime/vm/bit_vector.h
index 69a9d3f..4157968 100644
--- a/runtime/vm/bit_vector.h
+++ b/runtime/vm/bit_vector.h
@@ -44,10 +44,10 @@
     friend class BitVector;
   };
 
-  explicit BitVector(intptr_t length)
+  BitVector(Isolate* isolate, intptr_t length)
       : length_(length),
         data_length_(SizeFor(length)),
-        data_(Isolate::Current()->current_zone()->Alloc<uword>(data_length_)) {
+        data_(isolate->current_zone()->Alloc<uword>(data_length_)) {
     Clear();
   }
 
diff --git a/runtime/vm/bit_vector_test.cc b/runtime/vm/bit_vector_test.cc
index 83bc2cf..873b81a 100644
--- a/runtime/vm/bit_vector_test.cc
+++ b/runtime/vm/bit_vector_test.cc
@@ -8,8 +8,10 @@
 
 namespace dart {
 
+#define I Isolate::Current()
+
 TEST_CASE(BitVector) {
-  { BitVector* v = new BitVector(15);
+  { BitVector* v = new BitVector(I, 15);
     v->Add(1);
     EXPECT_EQ(true, v->Contains(1));
     EXPECT_EQ(false, v->Contains(0));
@@ -31,7 +33,7 @@
     }
   }
 
-  { BitVector* v = new BitVector(128);
+  { BitVector* v = new BitVector(I, 128);
     v->Add(49);
     v->Add(62);
     v->Add(63);
@@ -53,9 +55,9 @@
     EXPECT(iter.Done());
   }
 
-  { BitVector* a = new BitVector(128);
-    BitVector* b = new BitVector(128);
-    BitVector* c = new BitVector(128);
+  { BitVector* a = new BitVector(I, 128);
+    BitVector* b = new BitVector(I, 128);
+    BitVector* c = new BitVector(I, 128);
     b->Add(0);
     b->Add(32);
     b->Add(64);
@@ -84,8 +86,8 @@
     EXPECT_EQ(false, a->Contains(96));
   }
 
-  { BitVector* a = new BitVector(34);
-    BitVector* b = new BitVector(34);
+  { BitVector* a = new BitVector(I, 34);
+    BitVector* b = new BitVector(I, 34);
     a->SetAll();
     b->Add(0);
     b->Add(1);
@@ -95,16 +97,16 @@
     EXPECT_EQ(true, a->Equals(*b));
   }
 
-  { BitVector* a = new BitVector(2);
-    BitVector* b = new BitVector(2);
+  { BitVector* a = new BitVector(I, 2);
+    BitVector* b = new BitVector(I, 2);
     a->SetAll();
     a->Remove(0);
     a->Remove(1);
     EXPECT_EQ(true, a->Equals(*b));
   }
 
-  { BitVector* a = new BitVector(128);
-    BitVector* b = new BitVector(128);
+  { BitVector* a = new BitVector(I, 128);
+    BitVector* b = new BitVector(I, 128);
     b->Add(0);
     b->Add(32);
     b->Add(64);
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index 6f1b882..56b7ea2 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -315,16 +315,16 @@
   if (error.IsNull()) {
     SetupNativeResolver();
     ClassFinalizer::ProcessPendingClasses();
-  }
 
-  Class& cls = Class::Handle(isolate);
-  // Eagerly compile the function implementation class as it is the super
-  // class of signature classes. This allows us to just finalize signature
-  // classes without going through the hoops of trying to compile them.
-  const Type& type =
-      Type::Handle(isolate, isolate->object_store()->function_impl_type());
-  cls = type.type_class();
-  Compiler::CompileClass(cls);
+    Class& cls = Class::Handle(isolate);
+    // Eagerly compile the function implementation class as it is the super
+    // class of signature classes. This allows us to just finalize signature
+    // classes without going through the hoops of trying to compile them.
+    const Type& type =
+        Type::Handle(isolate, isolate->object_store()->function_impl_type());
+    cls = type.type_class();
+    Compiler::CompileClass(cls);
+  }
 
   // Restore the library tag handler for the isolate.
   isolate->set_library_tag_handler(saved_tag_handler);
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 851bc60..8aaa4b3 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -291,7 +291,7 @@
   V(Int32x4_setFlagW, 2)                                                       \
   V(Int32x4_select, 3)                                                         \
   V(Isolate_spawnFunction, 3)                                                  \
-  V(Isolate_spawnUri, 4)                                                       \
+  V(Isolate_spawnUri, 5)                                                       \
   V(Isolate_sendOOB, 2)                                                        \
   V(Mirrors_evalInLibraryWithPrivateKey, 2)                                    \
   V(Mirrors_makeLocalClassMirror, 1)                                           \
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index f453b29..ab854bf 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -74,7 +74,7 @@
 
 class StackmapTableBuilder : public ZoneAllocated {
  public:
-  explicit StackmapTableBuilder()
+  StackmapTableBuilder()
       : stack_map_(Stackmap::ZoneHandle()),
         list_(GrowableObjectArray::ZoneHandle(
             GrowableObjectArray::New(Heap::kOld))) { }
@@ -162,6 +162,9 @@
 
   RawExceptionHandlers* FinalizeExceptionHandlers(uword entry_point) {
     intptr_t num_handlers = Length();
+    if (num_handlers == 0) {
+      return Object::empty_exception_handlers().raw();
+    }
     const ExceptionHandlers& handlers =
         ExceptionHandlers::Handle(ExceptionHandlers::New(num_handlers));
     for (intptr_t i = 0; i < num_handlers; i++) {
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index d6edcc9..ae1fd68 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -117,7 +117,8 @@
     Exceptions::ThrowArgumentError(error);
   }
 
-  const Array& array = Array::Handle(Array::New(len));
+  Heap::Space space = isolate->heap()->SpaceForAllocation(kArrayCid);
+  const Array& array = Array::Handle(Array::New(len, space));
   arguments.SetReturn(array);
   TypeArguments& element_type =
       TypeArguments::CheckedHandle(arguments.ArgAt(1));
@@ -156,8 +157,8 @@
     }
   }
 #endif
-
-  const Instance& instance = Instance::Handle(Instance::New(cls));
+  Heap::Space space = isolate->heap()->SpaceForAllocation(cls.id());
+  const Instance& instance = Instance::Handle(Instance::New(cls, space));
 
   arguments.SetReturn(instance);
   if (cls.NumTypeArguments() == 0) {
@@ -1378,9 +1379,10 @@
                                    alloc_stub.EntryPoint());
   }
   if (FLAG_trace_patching) {
-    OS::PrintErr("FixAllocationStubTarget: caller %#" Px " "
+    OS::PrintErr("FixAllocationStubTarget: caller %#" Px " alloc-class %s "
         " -> %#" Px "\n",
         frame->pc(),
+        alloc_class.ToCString(),
         alloc_stub.EntryPoint());
   }
   arguments.SetReturn(alloc_stub);
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index 3c0d507..24729b8b 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -13,6 +13,8 @@
 
 namespace dart {
 
+DECLARE_FLAG(bool, enable_type_checks);
+
 TEST_CASE(CompileScript) {
   const char* kScriptChars =
       "class A {\n"
@@ -75,10 +77,12 @@
             "}\n"
             "unOpt() => new A(); \n"
             "optIt() => new A(); \n"
-            "main() {\n"
+            "A main() {\n"
             "  return unOpt();\n"
             "}\n";
 
+  bool old_enable_type_checks = FLAG_enable_type_checks;
+  FLAG_enable_type_checks = true;
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
@@ -94,9 +98,19 @@
                                   stub_code->GetAllocationStubForClass(cls));
   Class& owner = Class::Handle();
   owner ^= stub.owner();
-  owner.DisableAllocationStub();
+  owner.SwitchAllocationStub();
   result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
+
+  owner.SwitchAllocationStub();
+  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  owner.SwitchAllocationStub();
+  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  FLAG_enable_type_checks = old_enable_type_checks;
 }
 
 
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index d354726..1f5fb04 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -71,9 +71,9 @@
     const Instance& instance = Instance::Cast(obj);
     const Class& obj_class = Class::Handle(isolate, obj.clazz());
     Error& malformed_type_error = Error::Handle(isolate);
-    if (obj_class.IsSubtypeOf(TypeArguments::Handle(isolate),
+    if (obj_class.IsSubtypeOf(Object::null_type_arguments(),
                               list_class,
-                              TypeArguments::Handle(isolate),
+                              Object::null_type_arguments(),
                               &malformed_type_error)) {
       ASSERT(malformed_type_error.IsNull());  // Type is a raw List.
       return instance.raw();
@@ -91,9 +91,9 @@
     const Instance& instance = Instance::Cast(obj);
     const Class& obj_class = Class::Handle(isolate, obj.clazz());
     Error& malformed_type_error = Error::Handle(isolate);
-    if (obj_class.IsSubtypeOf(TypeArguments::Handle(isolate),
+    if (obj_class.IsSubtypeOf(Object::null_type_arguments(),
                               map_class,
-                              TypeArguments::Handle(isolate),
+                              Object::null_type_arguments(),
                               &malformed_type_error)) {
       ASSERT(malformed_type_error.IsNull());  // Type is a raw Map.
       return instance.raw();
@@ -1870,6 +1870,30 @@
 }
 
 
+DART_EXPORT bool Dart_IsFuture(Dart_Handle handle) {
+  TRACE_API_CALL(CURRENT_FUNC);
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
+  if (obj.IsInstance()) {
+    const Library& async_lib =
+        Library::Handle(isolate, Library::AsyncLibrary());
+    const Class& future_class =
+        Class::Handle(isolate, async_lib.LookupClass(Symbols::Future()));
+    ASSERT(!future_class.IsNull());
+    const Class& obj_class = Class::Handle(isolate, obj.clazz());
+    Error& malformed_type_error = Error::Handle(isolate);
+    bool is_future = obj_class.IsSubtypeOf(Object::null_type_arguments(),
+                                           future_class,
+                                           Object::null_type_arguments(),
+                                           &malformed_type_error);
+    ASSERT(malformed_type_error.IsNull());  // Type is a raw Future.
+    return is_future;
+  }
+  return false;
+}
+
+
 // --- Instances ----
 
 DART_EXPORT Dart_Handle Dart_InstanceGetType(Dart_Handle instance) {
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 4b0b5d5..3daea80 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -1384,6 +1384,32 @@
 }
 
 
+TEST_CASE(IsFuture) {
+  const char* kScriptChars =
+      "import 'dart:async';"
+      "Future testMain() {"
+      "  return new Completer().future;"
+      "}";
+  Dart_Handle result;
+
+  // Create a test library and Load up a test script in it.
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+
+  // Invoke a function which returns an object of type Future.
+  result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+  EXPECT_VALID(result);
+  EXPECT(Dart_IsFuture(result));
+
+  EXPECT(!Dart_IsFuture(lib));  // Non-instance.
+  Dart_Handle anInteger = Dart_NewInteger(0);
+  EXPECT(!Dart_IsFuture(anInteger));
+  Dart_Handle aString = NewString("I am not a Future");
+  EXPECT(!Dart_IsFuture(aString));
+  Dart_Handle null = Dart_Null();
+  EXPECT(!Dart_IsFuture(null));
+}
+
+
 TEST_CASE(TypedDataViewListGetAsBytes) {
   const int kSize = 1000;
 
@@ -7048,6 +7074,7 @@
 
 static Dart_Isolate RunLoopTestCallback(const char* script_name,
                                         const char* main,
+                                        const char* package_root,
                                         void* data,
                                         char** error) {
   const char* kScriptChars =
@@ -7117,7 +7144,7 @@
   Dart_IsolateCreateCallback saved = Isolate::CreateCallback();
   Isolate::SetCreateCallback(RunLoopTestCallback);
   Isolate::SetUnhandledExceptionCallback(RunLoopUnhandledExceptionCallback);
-  Dart_Isolate isolate = RunLoopTestCallback(NULL, NULL, NULL, NULL);
+  Dart_Isolate isolate = RunLoopTestCallback(NULL, NULL, NULL, NULL, NULL);
 
   Dart_EnterIsolate(isolate);
   Dart_EnterScope();
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index ffe13e2..a601017 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -91,11 +91,17 @@
 }
 
 
+_Dart_CObject* ApiMessageReader::singleton_uint32_typed_data_ = NULL;
+
 Dart_CObject* ApiMessageReader::AllocateDartCObjectBigint() {
   Dart_CObject* value = AllocateDartCObject(Dart_CObject_kBigint);
   value->value.as_bigint.neg = false;
   value->value.as_bigint.used = 0;
-  value->value.as_bigint.digits = NULL;
+  if (singleton_uint32_typed_data_ == NULL) {
+    singleton_uint32_typed_data_ =
+        AllocateDartCObjectTypedData(Dart_TypedData_kUint32, 0);
+  }
+  value->value.as_bigint.digits = singleton_uint32_typed_data_;
   value->type = Dart_CObject_kBigint;
   return value;
 }
diff --git a/runtime/vm/dart_api_message.h b/runtime/vm/dart_api_message.h
index ccd853b..d5d754f 100644
--- a/runtime/vm/dart_api_message.h
+++ b/runtime/vm/dart_api_message.h
@@ -136,6 +136,7 @@
 
   Dart_CObject type_arguments_marker;
   Dart_CObject dynamic_type_marker;
+  static _Dart_CObject* singleton_uint32_typed_data_;
 };
 
 
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 1f7bf94..6e25bb9 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -557,7 +557,7 @@
     while (try_index >= 0) {
       // Detect circles in the exception handler data.
       num_handlers_checked++;
-      ASSERT(num_handlers_checked <= handlers.Length());
+      ASSERT(num_handlers_checked <= handlers.num_entries());
       handled_types = handlers.GetHandledTypes(try_index);
       const intptr_t num_types = handled_types.Length();
       for (intptr_t k = 0; k < num_types; k++) {
@@ -733,8 +733,8 @@
   StackFrame* frame = iterator.NextFrame();
   intptr_t num = 0;
   while ((frame != NULL)) {
-    frame = iterator.NextFrame();
     OS::PrintErr("#%04" Pd " %s\n", num++, frame->ToCString());
+    frame = iterator.NextFrame();
   }
 }
 
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index 82bf692..1964a81 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -95,7 +95,8 @@
   ConstantInstr* constant = constant_instr_pool_.Lookup(object);
   if (constant == NULL) {
     // Otherwise, allocate and add it to the pool.
-    constant = new(isolate()) ConstantInstr(object);
+    constant = new(isolate()) ConstantInstr(
+        Object::ZoneHandle(isolate(), object.raw()));
     constant->set_ssa_temp_index(alloc_ssa_temp_index());
     AddToInitialDefinitions(constant);
     constant_instr_pool_.Insert(constant);
@@ -337,9 +338,9 @@
 void LivenessAnalysis::Analyze() {
   const intptr_t block_count = postorder_.length();
   for (intptr_t i = 0; i < block_count; i++) {
-    live_out_.Add(new(isolate()) BitVector(variable_count_));
-    kill_.Add(new(isolate()) BitVector(variable_count_));
-    live_in_.Add(new(isolate()) BitVector(variable_count_));
+    live_out_.Add(new(isolate()) BitVector(isolate(), variable_count_));
+    kill_.Add(new(isolate()) BitVector(isolate(), variable_count_));
+    live_in_.Add(new(isolate()) BitVector(isolate(), variable_count_));
   }
 
   ComputeInitialSets();
@@ -450,7 +451,7 @@
 void VariableLivenessAnalysis::ComputeInitialSets() {
   const intptr_t block_count = postorder_.length();
 
-  BitVector* last_loads = new(isolate()) BitVector(variable_count_);
+  BitVector* last_loads = new(isolate()) BitVector(isolate(), variable_count_);
   for (intptr_t i = 0; i < block_count; i++) {
     BlockEntryInstr* block = postorder_[i];
 
@@ -574,7 +575,7 @@
     idom.Add(parent_[i]);
     semi.Add(i);
     label.Add(i);
-    dominance_frontier->Add(new(isolate()) BitVector(size));
+    dominance_frontier->Add(new(isolate()) BitVector(isolate(), size));
   }
 
   // Loop over the blocks in reverse preorder (not including the graph
@@ -1065,7 +1066,7 @@
 // Design & Implementation" (Muchnick) p192.
 BitVector* FlowGraph::FindLoop(BlockEntryInstr* m, BlockEntryInstr* n) const {
   GrowableArray<BlockEntryInstr*> stack;
-  BitVector* loop = new(isolate()) BitVector(preorder_.length());
+  BitVector* loop = new(isolate()) BitVector(isolate(), preorder_.length());
 
   loop->Add(n->preorder_number());
   if (n != m) {
@@ -1162,7 +1163,7 @@
   const intptr_t block_count = flow_graph->postorder().length();
 
   // Set of blocks that contain side-effects.
-  BitVector* kill = new(isolate) BitVector(block_count);
+  BitVector* kill = new(isolate) BitVector(isolate, block_count);
 
   // Per block available-after sets. Block A is available after the block B if
   // and only if A is either equal to B or A is available at B and B contains no
@@ -1188,7 +1189,7 @@
     }
   }
 
-  BitVector* temp = new(isolate) BitVector(block_count);
+  BitVector* temp = new(isolate) BitVector(isolate, block_count);
 
   // Recompute available-at based on predecessors' available-after until the fix
   // point is reached.
@@ -1221,9 +1222,9 @@
         // Available-at changed: update it and recompute available-after.
         if (available_at_[block_num] == NULL) {
           current = available_at_[block_num] =
-              new(isolate) BitVector(block_count);
+              new(isolate) BitVector(isolate, block_count);
           available_after[block_num] =
-              new(isolate) BitVector(block_count);
+              new(isolate) BitVector(isolate, block_count);
           // Block is always available after itself.
           available_after[block_num]->Add(block_num);
         }
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index 85ffc22..03f8f2f 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -518,6 +518,7 @@
   const intptr_t block_count = postorder_.length();
   ASSERT(postorder_.Last()->IsGraphEntry());
   BitVector* current_interference_set = NULL;
+  Isolate* isolate = flow_graph_.isolate();
   for (intptr_t i = 0; i < (block_count - 1); i++) {
     BlockEntryInstr* block = postorder_[i];
 
@@ -535,8 +536,8 @@
 
     BlockInfo* loop_header = block_info->loop_header();
     if ((loop_header != NULL) && (loop_header->last_block() == block)) {
-      current_interference_set =
-          new BitVector(flow_graph_.max_virtual_register_number());
+      current_interference_set = new(isolate) BitVector(
+          isolate, flow_graph_.max_virtual_register_number());
       ASSERT(loop_header->backedge_interference() == NULL);
       // All values flowing into the loop header are live at the back-edge and
       // can interfere with phi moves.
@@ -2005,8 +2006,9 @@
 void ReachingDefs::AddPhi(PhiInstr* phi) {
   // TODO(johnmccutchan): Fix handling of PhiInstr with PairLocation.
   if (phi->reaching_defs() == NULL) {
-    phi->set_reaching_defs(
-        new BitVector(flow_graph_.max_virtual_register_number()));
+    Isolate* isolate = Isolate::Current();
+    phi->set_reaching_defs(new(isolate) BitVector(
+        isolate, flow_graph_.max_virtual_register_number()));
 
     // Compute initial set reaching defs set.
     bool depends_on_phi = false;
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index cdefacb..9f92375 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -2387,17 +2387,38 @@
     StringInterpolateNode* node) {
   ValueGraphVisitor for_argument(owner());
   ArrayNode* arguments = node->value();
-  bool is_singleton = false;
   if (arguments->length() == 1) {
+    ZoneGrowableArray<PushArgumentInstr*>* values =
+        new(I) ZoneGrowableArray<PushArgumentInstr*>(1);
     arguments->ElementAt(0)->Visit(&for_argument);
-    is_singleton = true;
-  } else {
-    arguments->Visit(&for_argument);
+    Append(for_argument);
+    PushArgumentInstr* push_arg = PushArgument(for_argument.value());
+    values->Add(push_arg);
+    const int kNumberOfArguments = 1;
+    const Array& kNoArgumentNames = Object::null_array();
+    const Class& cls =
+        Class::Handle(Library::LookupCoreClass(Symbols::StringBase()));
+    ASSERT(!cls.IsNull());
+    const Function& function = Function::ZoneHandle(
+        isolate(),
+        Resolver::ResolveStatic(
+            cls,
+            Library::PrivateCoreLibName(Symbols::InterpolateSingle()),
+            kNumberOfArguments,
+            kNoArgumentNames));
+    StaticCallInstr* call =
+        new(I) StaticCallInstr(node->token_pos(),
+                               function,
+                               kNoArgumentNames,
+                               values,
+                               owner()->ic_data_array());
+    ReturnDefinition(call);
+    return;
   }
+  arguments->Visit(&for_argument);
   Append(for_argument);
   StringInterpolateInstr* instr =
-      new(I) StringInterpolateInstr(for_argument.value(), node->token_pos(),
-                                    is_singleton);
+      new(I) StringInterpolateInstr(for_argument.value(), node->token_pos());
   ReturnDefinition(instr);
 }
 
@@ -3290,9 +3311,7 @@
             Bigint::digits_offset(),
             Type::ZoneHandle(I, Type::DynamicType()),
             node->token_pos());
-        // TODO(srdjan): Enabling the correct result type throws an NPE.
-        // load->set_result_cid(kTypedDataUint32ArrayCid);
-        load->set_result_cid(kDynamicCid);
+        load->set_result_cid(kTypedDataUint32ArrayCid);
         load->set_recognized_kind(kind);
         return ReturnDefinition(load);
       }
@@ -4254,7 +4273,7 @@
 
 void FlowGraphBuilder::PruneUnreachable() {
   ASSERT(osr_id_ != Isolate::kNoDeoptId);
-  BitVector* block_marks = new(I) BitVector(last_used_block_id_ + 1);
+  BitVector* block_marks = new(I) BitVector(I, last_used_block_id_ + 1);
   bool found = graph_entry_->PruneUnreachable(this, graph_entry_, NULL, osr_id_,
                                               block_marks);
   ASSERT(found);
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index cb830fa..f533354 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -63,6 +63,18 @@
 }
 
 
+static bool CanConvertUnboxedMintToDouble() {
+#if defined(TARGET_ARCH_IA32)
+  return true;
+#else
+  // ARM does not have a short instruction sequence for converting int64 to
+  // double.
+  // TODO(johnmccutchan): Investigate possibility on MIPS once
+  // mints are implemented there.
+  return false;
+#endif
+}
+
 // Optimize instance calls using ICData.
 void FlowGraphOptimizer::ApplyICData() {
   VisitBlocks();
@@ -291,7 +303,7 @@
   if (smi_shift_left == NULL) return;
 
   // Pattern recognized.
-  smi_shift_left->set_is_truncating(true);
+  smi_shift_left->mark_truncating();
   ASSERT(bit_and_instr->IsBinarySmiOp() || bit_and_instr->IsBinaryMintOp());
   if (bit_and_instr->IsBinaryMintOp()) {
     // Replace Mint op with Smi op.
@@ -299,8 +311,7 @@
         Token::kBIT_AND,
         new(I) Value(left_instr),
         new(I) Value(right_instr),
-        Isolate::kNoDeoptId,  // BIT_AND cannot deoptimize.
-        Scanner::kNoSourcePos);
+        Isolate::kNoDeoptId);  // BIT_AND cannot deoptimize.
     bit_and_instr->ReplaceWith(smi_op, current_iterator());
   }
 }
@@ -638,21 +649,21 @@
     converted = new UnboxUint32Instr(use->CopyWithType(), deopt_id);
   } else if (from == kUnboxedMint && to == kUnboxedDouble) {
     ASSERT(CanUnboxDouble());
-    // Convert by boxing/unboxing.
-    // TODO(fschneider): Implement direct unboxed mint-to-double conversion.
-    BoxIntegerInstr* boxed =
-        new(I) BoxIntegerInstr(use->CopyWithType());
-    use->BindTo(boxed);
-    InsertBefore(insert_before, boxed, NULL, FlowGraph::kValue);
-
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(I) UnboxDoubleInstr(new(I) Value(boxed), deopt_id);
-
+    if (CanConvertUnboxedMintToDouble()) {
+      // Fast path.
+      converted = new MintToDoubleInstr(use->CopyWithType(), deopt_id);
+    } else {
+      // Slow path.
+      BoxIntegerInstr* boxed = new(I) BoxIntegerInstr(use->CopyWithType());
+      use->BindTo(boxed);
+      InsertBefore(insert_before, boxed, NULL, FlowGraph::kValue);
+      converted = new(I) UnboxDoubleInstr(new(I) Value(boxed), deopt_id);
+    }
   } else if ((from == kUnboxedDouble) && (to == kTagged)) {
     ASSERT(CanUnboxDouble());
     converted = new(I) BoxDoubleInstr(use->CopyWithType());
-
   } else if ((from == kTagged) && (to == kUnboxedDouble)) {
     ASSERT(CanUnboxDouble());
     ASSERT((deopt_target != NULL) ||
@@ -2249,8 +2260,7 @@
             new(I) BinarySmiOpInstr(Token::kBIT_AND,
                                     new(I) Value(left),
                                     new(I) Value(constant),
-                                    call->deopt_id(),
-                                    call->token_pos());
+                                    call->deopt_id());
         ReplaceCall(call, bin_op);
         return true;
       }
@@ -2261,9 +2271,9 @@
     AddCheckSmi(right, call->deopt_id(), call->env(), call);
     BinarySmiOpInstr* bin_op =
         new(I) BinarySmiOpInstr(op_kind,
-                                        new(I) Value(left),
-                                        new(I) Value(right),
-                                        call->deopt_id(), call->token_pos());
+                                new(I) Value(left),
+                                new(I) Value(right),
+                                call->deopt_id());
     ReplaceCall(call, bin_op);
   } else {
     ASSERT(operands_type == kSmiCid);
@@ -2280,8 +2290,10 @@
     }
     BinarySmiOpInstr* bin_op =
         new(I) BinarySmiOpInstr(
-            op_kind, new(I) Value(left), new(I) Value(right),
-            call->deopt_id(), call->token_pos());
+            op_kind,
+            new(I) Value(left),
+            new(I) Value(right),
+            call->deopt_id());
     ReplaceCall(call, bin_op);
   }
   return true;
@@ -3051,14 +3063,21 @@
 
   if (CanUnboxDouble() &&
       (recognized_kind == MethodRecognizer::kIntegerToDouble) &&
-      (ic_data.NumberOfChecks() == 1) &&
-      (class_ids[0] == kSmiCid)) {
-    AddReceiverCheck(call);
-    ReplaceCall(call,
-                new(I) SmiToDoubleInstr(
-                    new(I) Value(call->ArgumentAt(0)),
-                    call->token_pos()));
-    return true;
+      (ic_data.NumberOfChecks() == 1)) {
+    if (class_ids[0] == kSmiCid) {
+      AddReceiverCheck(call);
+      ReplaceCall(call,
+                  new(I) SmiToDoubleInstr(
+                      new(I) Value(call->ArgumentAt(0)),
+                      call->token_pos()));
+      return true;
+    } else if ((class_ids[0] == kMintCid) && CanConvertUnboxedMintToDouble()) {
+      AddReceiverCheck(call);
+      ReplaceCall(call,
+                  new(I) MintToDoubleInstr(new(I) Value(call->ArgumentAt(0)),
+                                           call->deopt_id()));
+      return true;
+    }
   }
 
   if (class_ids[0] == kDoubleCid) {
@@ -3222,8 +3241,8 @@
           new(I) BinarySmiOpInstr(Token::kSHL,
                                   new(I) Value(value),
                                   new(I) Value(count),
-                                  call->deopt_id(), call->token_pos());
-      left_shift->set_is_truncating(true);
+                                  call->deopt_id());
+      left_shift->mark_truncating();
       if ((kBitsPerWord == 32) && (mask_value == 0xffffffffLL)) {
         // No BIT_AND operation needed.
         ReplaceCall(call, left_shift);
@@ -3233,8 +3252,7 @@
             new(I) BinarySmiOpInstr(Token::kBIT_AND,
                                     new(I) Value(left_shift),
                                     new(I) Value(int32_mask),
-                                    call->deopt_id(),
-                                    call->token_pos());
+                                    call->deopt_id());
         ReplaceCall(call, bit_and);
       }
       return true;
@@ -3913,7 +3931,7 @@
       new(I) BinarySmiOpInstr(Token::kMUL,
                               new(I) Value(length),
                               new(I) Value(bytes_per_element),
-                              call->deopt_id(), call->token_pos());
+                              call->deopt_id());
   *cursor = flow_graph()->AppendTo(*cursor, len_in_bytes, call->env(),
                                    FlowGraph::kValue);
 
@@ -3927,7 +3945,7 @@
         new(I) BinarySmiOpInstr(Token::kSUB,
                                 new(I) Value(len_in_bytes),
                                 new(I) Value(length_adjustment),
-                                call->deopt_id(), call->token_pos());
+                                call->deopt_id());
     *cursor = flow_graph()->AppendTo(*cursor, adjusted_length, call->env(),
                                      FlowGraph::kValue);
   }
@@ -4505,18 +4523,20 @@
   } else if (recognized_kind == MethodRecognizer::kDoubleFromInteger) {
     if (call->HasICData() && (call->ic_data()->NumberOfChecks() == 1)) {
       const ICData& ic_data = *call->ic_data();
-      if (CanUnboxDouble() && ArgIsAlways(kSmiCid, ic_data, 0)) {
-        Definition* arg = call->ArgumentAt(0);
-        InsertBefore(call,
-                     new(I) CheckSmiInstr(
-                         new(I) Value(arg),
-                         call->deopt_id(),
-                         call->token_pos()),
-                     call->env(),
-                     FlowGraph::kEffect);
-        ReplaceCall(call,
-                    new(I) SmiToDoubleInstr(new(I) Value(arg),
-                                            call->token_pos()));
+      if (CanUnboxDouble()) {
+        if (ArgIsAlways(kSmiCid, ic_data, 1)) {
+          Definition* arg = call->ArgumentAt(1);
+          AddCheckSmi(arg, call->deopt_id(), call->env(), call);
+          ReplaceCall(call,
+                      new(I) SmiToDoubleInstr(new(I) Value(arg),
+                                              call->token_pos()));
+        } else if (ArgIsAlways(kMintCid, ic_data, 1) &&
+                   CanConvertUnboxedMintToDouble()) {
+          Definition* arg = call->ArgumentAt(1);
+          ReplaceCall(call,
+                      new(I) MintToDoubleInstr(new(I) Value(arg),
+                                               call->deopt_id()));
+        }
       }
     }
   } else if (call->function().IsFactory()) {
@@ -4711,7 +4731,8 @@
   DefinitionWorklist(FlowGraph* flow_graph,
                      intptr_t initial_capacity)
       : defs_(initial_capacity),
-        contains_vector_(new BitVector(flow_graph->current_ssa_temp_index())) {
+        contains_vector_(new(flow_graph->isolate()) BitVector(
+            flow_graph->isolate(), flow_graph->current_ssa_temp_index())) {
   }
 
   void Add(Definition* defn) {
@@ -4816,7 +4837,8 @@
 
   // BitVector containing SSA indexes of all processed definitions. Used to skip
   // those candidates that belong to dependency graph of another candidate.
-  BitVector* processed = new BitVector(flow_graph_->current_ssa_temp_index());
+  BitVector* processed =
+      new(I) BitVector(I, flow_graph_->current_ssa_temp_index());
 
   // Worklist used to collect dependency graph.
   DefinitionWorklist worklist(flow_graph_, candidates.length());
@@ -5683,7 +5705,7 @@
         aliases_map_(),
         representatives_(),
         killed_(),
-        aliased_by_effects_(new(isolate) BitVector(places->length())) {
+        aliased_by_effects_(new(isolate) BitVector(isolate, places->length())) {
     InsertAlias(Place::CreateAnyInstanceAnyIndexAlias(isolate_,
         kAnyInstanceAnyIndexAlias));
     for (intptr_t i = 0; i < places_.length(); i++) {
@@ -5858,7 +5880,7 @@
 
     BitVector* set = (*sets)[alias];
     if (set == NULL) {
-      (*sets)[alias] = set = new(isolate_) BitVector(max_place_id());
+      (*sets)[alias] = set = new(isolate_) BitVector(isolate_, max_place_id());
     }
     return set;
   }
@@ -6284,9 +6306,9 @@
     const intptr_t num_blocks = graph_->preorder().length();
     for (intptr_t i = 0; i < num_blocks; i++) {
       out_.Add(NULL);
-      gen_.Add(new(I) BitVector(aliased_set_->max_place_id()));
-      kill_.Add(new(I) BitVector(aliased_set_->max_place_id()));
-      in_.Add(new(I) BitVector(aliased_set_->max_place_id()));
+      gen_.Add(new(I) BitVector(I, aliased_set_->max_place_id()));
+      kill_.Add(new(I) BitVector(I, aliased_set_->max_place_id()));
+      in_.Add(new(I) BitVector(I, aliased_set_->max_place_id()));
 
       exposed_values_.Add(NULL);
       out_values_.Add(NULL);
@@ -6534,9 +6556,10 @@
   // Compute OUT sets by propagating them iteratively until fix point
   // is reached.
   void ComputeOutSets() {
-    BitVector* temp = new(I) BitVector(aliased_set_->max_place_id());
-    BitVector* forwarded_loads = new(I) BitVector(aliased_set_->max_place_id());
-    BitVector* temp_out = new(I) BitVector(aliased_set_->max_place_id());
+    BitVector* temp = new(I) BitVector(I, aliased_set_->max_place_id());
+    BitVector* forwarded_loads =
+        new(I) BitVector(I, aliased_set_->max_place_id());
+    BitVector* temp_out = new(I) BitVector(I, aliased_set_->max_place_id());
 
     bool changed = true;
     while (changed) {
@@ -6588,7 +6611,7 @@
           if ((block_out == NULL) || !block_out->Equals(*temp)) {
             if (block_out == NULL) {
               block_out = out_[preorder_number] =
-                  new(I) BitVector(aliased_set_->max_place_id());
+                  new(I) BitVector(I, aliased_set_->max_place_id());
             }
             block_out->CopyFrom(temp);
             changed = true;
@@ -6725,7 +6748,7 @@
         continue;
       }
 
-      BitVector* loop_gen = new(I) BitVector(aliased_set_->max_place_id());
+      BitVector* loop_gen = new(I) BitVector(I, aliased_set_->max_place_id());
       for (BitVector::Iterator loop_it(header->loop_info());
            !loop_it.Done();
            loop_it.Advance()) {
@@ -6877,7 +6900,7 @@
 
     worklist_.Clear();
     if (in_worklist_ == NULL) {
-      in_worklist_ = new(I) BitVector(graph_->current_ssa_temp_index());
+      in_worklist_ = new(I) BitVector(I, graph_->current_ssa_temp_index());
     } else {
       in_worklist_->Clear();
     }
@@ -7000,7 +7023,7 @@
 
     congruency_worklist_.Clear();
     if (in_worklist_ == NULL) {
-      in_worklist_ = new(I) BitVector(graph_->current_ssa_temp_index());
+      in_worklist_ = new(I) BitVector(I, graph_->current_ssa_temp_index());
     } else {
       in_worklist_->Clear();
     }
@@ -7212,7 +7235,7 @@
 
   virtual void ComputeInitialSets() {
     Isolate* isolate = graph_->isolate();
-    BitVector* all_places = new(isolate) BitVector(
+    BitVector* all_places = new(isolate) BitVector(isolate,
         aliased_set_->max_place_id());
     all_places->SetAll();
     for (BlockIterator block_it = graph_->postorder_iterator();
@@ -7554,9 +7577,10 @@
       graph_(graph),
       unknown_(Object::unknown_constant()),
       non_constant_(Object::non_constant()),
-      reachable_(new(graph->isolate()) BitVector(graph->preorder().length())),
+      reachable_(new(graph->isolate()) BitVector(
+          graph->isolate(), graph->preorder().length())),
       definition_marks_(new(graph->isolate()) BitVector(
-          graph->max_virtual_register_number())),
+          graph->isolate(), graph->max_virtual_register_number())),
       block_worklist_(),
       definition_worklist_() {}
 
@@ -7748,12 +7772,16 @@
 
 void ConstantPropagator::VisitCheckClass(CheckClassInstr* instr) { }
 
+
 void ConstantPropagator::VisitCheckClassId(CheckClassIdInstr* instr) { }
 
+
 void ConstantPropagator::VisitGuardFieldClass(GuardFieldClassInstr* instr) { }
 
+
 void ConstantPropagator::VisitGuardFieldLength(GuardFieldLengthInstr* instr) { }
 
+
 void ConstantPropagator::VisitCheckSmi(CheckSmiInstr* instr) { }
 
 
@@ -7764,6 +7792,11 @@
 void ConstantPropagator::VisitCheckArrayBound(CheckArrayBoundInstr* instr) { }
 
 
+void ConstantPropagator::VisitDeoptimize(DeoptimizeInstr* instr) {
+  // TODO(vegorov) remove all code after DeoptimizeInstr as dead.
+}
+
+
 // --------------------------------------------------------------------------
 // Analysis of definitions.  Compute the constant value.  If it has changed
 // and the definition has input uses, add the definition to the definition
@@ -8071,11 +8104,8 @@
 }
 
 
-
-
 void ConstantPropagator::VisitStringInterpolate(StringInterpolateInstr* instr) {
   SetValue(instr, non_constant_);
-  return;
 }
 
 
@@ -8318,107 +8348,53 @@
 }
 
 
-void ConstantPropagator::HandleBinaryOp(Definition* instr,
-                                        Token::Kind op_kind,
-                                        const Value& left_val,
-                                        const Value& right_val) {
-  const Object& left = left_val.definition()->constant_value();
-  const Object& right = right_val.definition()->constant_value();
-  if (IsNonConstant(left) || IsNonConstant(right)) {
-    // TODO(srdjan): Add arithmetic simplifications, e.g, add with 0.
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(left) && IsConstant(right)) {
+void ConstantPropagator::VisitBinaryIntegerOp(BinaryIntegerOpInstr* binary_op) {
+  const Object& left = binary_op->left()->definition()->constant_value();
+  const Object& right = binary_op->right()->definition()->constant_value();
+  if (IsConstant(left) && IsConstant(right)) {
     if (left.IsInteger() && right.IsInteger()) {
       const Integer& left_int = Integer::Cast(left);
       const Integer& right_int = Integer::Cast(right);
-      switch (op_kind) {
-        case Token::kTRUNCDIV:
-        case Token::kMOD:
-          // Check right value for zero.
-          if (right_int.AsInt64Value() == 0) {
-            SetValue(instr, non_constant_);
-            break;
-          }
-          // Fall through.
-        case Token::kADD:
-        case Token::kSUB:
-        case Token::kMUL: {
-          Instance& result = Integer::ZoneHandle(I,
-              left_int.ArithmeticOp(op_kind, right_int));
-          if (result.IsNull()) {
-            // TODO(regis): A bigint operation is required. Invoke dart?
-            // Punt for now.
-            SetValue(instr, non_constant_);
-            break;
-          }
-          result = result.CheckAndCanonicalize(NULL);
-          ASSERT(!result.IsNull());
-          SetValue(instr, result);
-          break;
-        }
-        case Token::kSHL:
-        case Token::kSHR:
-          if (left.IsSmi() &&
-              right.IsSmi() &&
-              (Smi::Cast(right).Value() >= 0)) {
-            Instance& result = Integer::ZoneHandle(I,
-                Smi::Cast(left_int).ShiftOp(op_kind, Smi::Cast(right_int)));
-            result = result.CheckAndCanonicalize(NULL);
-            ASSERT(!result.IsNull());
-            SetValue(instr, result);
-          } else {
-            SetValue(instr, non_constant_);
-          }
-          break;
-        case Token::kBIT_AND:
-        case Token::kBIT_OR:
-        case Token::kBIT_XOR: {
-          Instance& result = Integer::ZoneHandle(I,
-              left_int.BitOp(op_kind, right_int));
-          result = result.CheckAndCanonicalize(NULL);
-          ASSERT(!result.IsNull());
-          SetValue(instr, result);
-          break;
-        }
-        case Token::kDIV:
-          SetValue(instr, non_constant_);
-          break;
-        default:
-          UNREACHABLE();
+      const Integer& result =
+          Integer::Handle(I, binary_op->Evaluate(left_int, right_int));
+      if (!result.IsNull()) {
+        SetValue(binary_op, Integer::ZoneHandle(I, result.raw()));
+        return;
       }
-    } else {
-      // TODO(kmillikin): support other types.
-      SetValue(instr, non_constant_);
     }
   }
-}
 
-
-void ConstantPropagator::TruncateInteger(Definition* defn, int64_t mask) {
-  const Object& value = defn->constant_value();
-  if (IsNonConstant(value)) {
-    return;
-  }
-  ASSERT(IsConstant(value));
-  if (!value.IsInteger()) {
-    return;
-  }
-  const Integer& value_int = Integer::Cast(value);
-  int64_t truncated = value_int.AsInt64Value() & mask;
-  Instance& result = Integer::ZoneHandle(I, Integer::New(truncated));
-  result = result.CheckAndCanonicalize(NULL);
-  ASSERT(!result.IsNull());
-  SetValue(defn, result);
+  SetValue(binary_op, non_constant_);
 }
 
 
 void ConstantPropagator::VisitBinarySmiOp(BinarySmiOpInstr* instr) {
-  HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
+  VisitBinaryIntegerOp(instr);
 }
 
 
 void ConstantPropagator::VisitBinaryInt32Op(BinaryInt32OpInstr* instr) {
-  HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
+  VisitBinaryIntegerOp(instr);
+}
+
+
+void ConstantPropagator::VisitBinaryUint32Op(BinaryUint32OpInstr* instr) {
+  VisitBinaryIntegerOp(instr);
+}
+
+
+void ConstantPropagator::VisitShiftUint32Op(ShiftUint32OpInstr* instr) {
+  VisitBinaryIntegerOp(instr);
+}
+
+
+void ConstantPropagator::VisitBinaryMintOp(BinaryMintOpInstr* instr) {
+  VisitBinaryIntegerOp(instr);
+}
+
+
+void ConstantPropagator::VisitShiftMintOp(ShiftMintOpInstr* instr) {
+  VisitBinaryIntegerOp(instr);
 }
 
 
@@ -8434,16 +8410,6 @@
 }
 
 
-void ConstantPropagator::VisitBinaryMintOp(BinaryMintOpInstr* instr) {
-  HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
-}
-
-
-void ConstantPropagator::VisitShiftMintOp(ShiftMintOpInstr* instr) {
-  HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
-}
-
-
 void ConstantPropagator::VisitUnaryMintOp(UnaryMintOpInstr* instr) {
   // TODO(kmillikin): Handle unary operations.
   SetValue(instr, non_constant_);
@@ -8483,6 +8449,17 @@
 }
 
 
+void ConstantPropagator::VisitMintToDouble(MintToDoubleInstr* instr) {
+  const Object& value = instr->value()->definition()->constant_value();
+  if (IsConstant(value) && value.IsInteger()) {
+    SetValue(instr, Double::Handle(I,
+        Double::New(Integer::Cast(value).AsDoubleValue(), Heap::kOld)));
+  } else if (IsNonConstant(value)) {
+    SetValue(instr, non_constant_);
+  }
+}
+
+
 void ConstantPropagator::VisitInt32ToDouble(Int32ToDoubleInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
   if (IsConstant(value) && value.IsInteger()) {
@@ -8564,19 +8541,28 @@
 }
 
 
+static bool IsIntegerOrDouble(const Object& value) {
+  return value.IsInteger() || value.IsDouble();
+}
+
+
+static double ToDouble(const Object& value) {
+  return value.IsInteger() ? Integer::Cast(value).AsDoubleValue()
+                           : Double::Cast(value).value();
+}
+
+
 void ConstantPropagator::VisitBinaryDoubleOp(
     BinaryDoubleOpInstr* instr) {
   const Object& left = instr->left()->definition()->constant_value();
   const Object& right = instr->right()->definition()->constant_value();
   if (IsNonConstant(left) || IsNonConstant(right)) {
     SetValue(instr, non_constant_);
-  } else if (IsConstant(left) && IsConstant(right)) {
-    ASSERT(left.IsSmi() || left.IsDouble());
-    ASSERT(right.IsSmi() || right.IsDouble());
-    double left_val = left.IsSmi()
-        ? Smi::Cast(left).AsDoubleValue() : Double::Cast(left).value();
-    double right_val = right.IsSmi()
-        ? Smi::Cast(right).AsDoubleValue() : Double::Cast(right).value();
+  } else if (left.IsInteger() && right.IsInteger()) {
+    SetValue(instr, non_constant_);
+  } else if (IsIntegerOrDouble(left) && IsIntegerOrDouble(right)) {
+    const double left_val = ToDouble(left);
+    const double right_val = ToDouble(right);
     double result_val = 0.0;
     switch (instr->op_kind()) {
       case Token::kADD:
@@ -8919,18 +8905,6 @@
 }
 
 
-void ConstantPropagator::VisitBinaryUint32Op(BinaryUint32OpInstr* instr) {
-  HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
-  TruncateInteger(instr, static_cast<int64_t>(0xFFFFFFFF));
-}
-
-
-void ConstantPropagator::VisitShiftUint32Op(ShiftUint32OpInstr* instr) {
-  HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
-  TruncateInteger(instr, static_cast<int64_t>(0xFFFFFFFF));
-}
-
-
 void ConstantPropagator::VisitUnaryUint32Op(UnaryUint32OpInstr* instr) {
   // TODO(kmillikin): Handle unary operations.
   SetValue(instr, non_constant_);
@@ -8986,7 +8960,7 @@
   // Canonicalize branches that have no side-effects and where true- and
   // false-targets are the same.
   bool changed = false;
-  BitVector* empty_blocks = new(I) BitVector(graph_->preorder().length());
+  BitVector* empty_blocks = new(I) BitVector(I, graph_->preorder().length());
   for (BlockIterator b = graph_->postorder_iterator();
        !b.Done();
        b.Advance()) {
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 8f6c260..3415b6d 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -361,12 +361,7 @@
     return !IsNonConstant(value) && !IsUnknown(value);
   }
 
-  void HandleBinaryOp(Definition* instr,
-                      Token::Kind op_kind,
-                      const Value& left,
-                      const Value& right);
-
-  void TruncateInteger(Definition* instr, int64_t mask);
+  void VisitBinaryIntegerOp(BinaryIntegerOpInstr* binary_op);
 
   virtual void VisitBlocks() { UNREACHABLE(); }
 
diff --git a/runtime/vm/flow_graph_range_analysis.cc b/runtime/vm/flow_graph_range_analysis.cc
index 9d2da24..e726859 100644
--- a/runtime/vm/flow_graph_range_analysis.cc
+++ b/runtime/vm/flow_graph_range_analysis.cc
@@ -578,7 +578,7 @@
   }
 
   // Initialize bitvector for quick filtering of int values.
-  BitVector* set = new(I) BitVector(flow_graph_->current_ssa_temp_index());
+  BitVector* set = new(I) BitVector(I, flow_graph_->current_ssa_temp_index());
   for (intptr_t i = 0; i < values_.length(); i++) {
     set->Add(values_[i]->ssa_temp_index());
   }
@@ -701,7 +701,7 @@
                                mint_op->right()->CopyWithType(),
                                mint_op->DeoptimizationTarget());
     int32_op->set_range(*mint_op->range());
-    int32_op->set_overflow(false);
+    int32_op->set_can_overflow(false);
     mint_op->ReplaceWith(int32_op, NULL);
   }
 }
@@ -722,7 +722,7 @@
                                mint_op->right()->CopyWithType(),
                                mint_op->DeoptimizationTarget());
     int32_op->set_range(*mint_op->range());
-    int32_op->set_overflow(false);
+    int32_op->set_can_overflow(false);
     mint_op->ReplaceWith(int32_op, NULL);
   }
 }
@@ -746,7 +746,7 @@
   isolate_ = flow_graph_->isolate();
   ASSERT(isolate_ != NULL);
   selected_uint32_defs_ =
-      new(I) BitVector(flow_graph_->current_ssa_temp_index());
+      new(I) BitVector(I, flow_graph_->current_ssa_temp_index());
 }
 
 
@@ -1993,14 +1993,26 @@
 }
 
 
-void BinarySmiOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
-  // TODO(vegorov): canonicalize BinarySmiOp to always have constant on the
+static RangeBoundary::RangeSize RepresentationToRangeSize(Representation r) {
+  switch (r) {
+    case kTagged:
+      return RangeBoundary::kRangeBoundarySmi;
+    case kUnboxedInt32:
+      return RangeBoundary::kRangeBoundaryInt32;
+    case kUnboxedMint:
+      return RangeBoundary::kRangeBoundaryInt64;
+    default:
+      UNREACHABLE();
+      return RangeBoundary::kRangeBoundarySmi;
+  }
+}
+
+
+void BinaryIntegerOpInstr::InferRangeHelper(const Range* left_range,
+                                            const Range* right_range,
+                                            Range* range) {
+  // TODO(vegorov): canonicalize BinaryIntegerOp to always have constant on the
   // right and a non-constant on the left.
-  Definition* left_defn = left()->definition();
-
-  const Range* left_range = analysis->GetSmiRange(left());
-  const Range* right_range = analysis->GetSmiRange(right());
-
   if (Range::IsUnknown(left_range) || Range::IsUnknown(right_range)) {
     return;
   }
@@ -2008,17 +2020,49 @@
   Range::BinaryOp(op_kind(),
                   left_range,
                   right_range,
-                  left_defn,
+                  left()->definition(),
                   range);
   ASSERT(!Range::IsUnknown(range));
 
-  // Calculate overflowed status before clamping.
-  const bool overflowed = range->min().LowerBound().OverflowedSmi() ||
-                          range->max().UpperBound().OverflowedSmi();
-  set_overflow(overflowed);
+  const RangeBoundary::RangeSize range_size =
+      RepresentationToRangeSize(representation());
 
-  // Clamp value to be within smi range.
-  range->Clamp(RangeBoundary::kRangeBoundarySmi);
+  // Calculate overflowed status before clamping if operation is
+  // not truncating.
+  if (!is_truncating()) {
+    set_can_overflow(!range->Fits(range_size));
+  }
+
+  range->Clamp(range_size);
+}
+
+
+void BinarySmiOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  // TODO(vegorov) completely remove this once GetSmiRange is eliminated.
+  InferRangeHelper(analysis->GetSmiRange(left()),
+                   analysis->GetSmiRange(right()),
+                   range);
+}
+
+
+void BinaryInt32OpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  InferRangeHelper(analysis->GetSmiRange(left()),
+                   analysis->GetSmiRange(right()),
+                   range);
+}
+
+
+void BinaryMintOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  InferRangeHelper(left()->definition()->range(),
+                   right()->definition()->range(),
+                   range);
+}
+
+
+void ShiftMintOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  InferRangeHelper(left()->definition()->range(),
+                   right()->definition()->range(),
+                   range);
 }
 
 
@@ -2077,86 +2121,6 @@
 }
 
 
-void BinaryInt32OpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
-  // TODO(vegorov): canonicalize BinarySmiOp to always have constant on the
-  // right and a non-constant on the left.
-  Definition* left_defn = left()->definition();
-
-  const Range* left_range = analysis->GetSmiRange(left());
-  const Range* right_range = analysis->GetSmiRange(right());
-
-  if (Range::IsUnknown(left_range) || Range::IsUnknown(right_range)) {
-    return;
-  }
-
-  Range::BinaryOp(op_kind(),
-                  left_range,
-                  right_range,
-                  left_defn,
-                  range);
-  ASSERT(!Range::IsUnknown(range));
-
-  // Calculate overflowed status before clamping.
-  set_overflow(!range->Fits(RangeBoundary::kRangeBoundaryInt32));
-
-  // Clamp value to be within smi range.
-  range->Clamp(RangeBoundary::kRangeBoundaryInt32);
-}
-
-void BinaryMintOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
-  // TODO(vegorov): canonicalize BinaryMintOpInstr to always have constant on
-  // the right and a non-constant on the left.
-  Definition* left_defn = left()->definition();
-
-  const Range* left_range = left_defn->range();
-  const Range* right_range = right()->definition()->range();
-
-  if (Range::IsUnknown(left_range) || Range::IsUnknown(right_range)) {
-    return;
-  }
-
-  Range::BinaryOp(op_kind(),
-                  left_range,
-                  right_range,
-                  left_defn,
-                  range);
-  ASSERT(!Range::IsUnknown(range));
-
-  // Calculate overflowed status before clamping.
-  set_can_overflow(!range->Fits(RangeBoundary::kRangeBoundaryInt64));
-
-  // Clamp value to be within mint range.
-  range->Clamp(RangeBoundary::kRangeBoundaryInt64);
-}
-
-
-void ShiftMintOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
-  Definition* left_defn = left()->definition();
-
-  const Range* left_range = left_defn->range();
-  const Range* right_range = right()->definition()->range();
-
-  if (Range::IsUnknown(left_range) || Range::IsUnknown(right_range)) {
-    return;
-  }
-
-  Range::BinaryOp(op_kind(),
-                  left_range,
-                  right_range,
-                  left_defn,
-                  range);
-  ASSERT(!Range::IsUnknown(range));
-
-  // Calculate overflowed status before clamping.
-  const bool overflowed = range->min().LowerBound().OverflowedMint() ||
-                          range->max().UpperBound().OverflowedMint();
-  set_can_overflow(overflowed);
-
-  // Clamp value to be within mint range.
-  range->Clamp(RangeBoundary::kRangeBoundaryInt64);
-}
-
-
 void BoxIntegerInstr::InferRange(RangeAnalysis* analysis, Range* range) {
   const Range* input_range = value()->definition()->range();
   if (input_range != NULL) {
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index f702ed5..0501f6a 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -27,9 +27,11 @@
 FlowGraphTypePropagator::FlowGraphTypePropagator(FlowGraph* flow_graph)
     : FlowGraphVisitor(flow_graph->reverse_postorder()),
       flow_graph_(flow_graph),
-      visited_blocks_(new BitVector(flow_graph->reverse_postorder().length())),
+      visited_blocks_(new(flow_graph->isolate()) BitVector(
+          flow_graph->isolate(), flow_graph->reverse_postorder().length())),
       types_(flow_graph->current_ssa_temp_index()),
-      in_worklist_(new BitVector(flow_graph->current_ssa_temp_index())),
+      in_worklist_(new(flow_graph->isolate()) BitVector(
+          flow_graph->isolate(), flow_graph->current_ssa_temp_index())),
       asserts_(NULL),
       collected_asserts_(NULL) {
   for (intptr_t i = 0; i < flow_graph->current_ssa_temp_index(); i++) {
@@ -1336,6 +1338,11 @@
 }
 
 
+CompileType MintToDoubleInstr::ComputeType() const {
+  return CompileType::FromCid(kDoubleCid);
+}
+
+
 CompileType DoubleToDoubleInstr::ComputeType() const {
   return CompileType::FromCid(kDoubleCid);
 }
diff --git a/runtime/vm/gc_sweeper.cc b/runtime/vm/gc_sweeper.cc
index 2428f62..a98bb02 100644
--- a/runtime/vm/gc_sweeper.cc
+++ b/runtime/vm/gc_sweeper.cc
@@ -104,7 +104,7 @@
 
   virtual void Run() {
     Isolate::SetCurrent(task_isolate_);
-    GCSweeper sweeper(NULL);
+    GCSweeper sweeper;
 
     HeapPage* page = first_;
     HeapPage* prev_page = NULL;
diff --git a/runtime/vm/gc_sweeper.h b/runtime/vm/gc_sweeper.h
index 13bbb55..d367472 100644
--- a/runtime/vm/gc_sweeper.h
+++ b/runtime/vm/gc_sweeper.h
@@ -20,7 +20,7 @@
 // memory.
 class GCSweeper {
  public:
-  explicit GCSweeper(Heap* heap) : heap_(heap) {}
+  GCSweeper() {}
   ~GCSweeper() {}
 
   // Sweep the memory area for the page while clearing the mark bits and adding
@@ -37,11 +37,6 @@
                               HeapPage* first,
                               HeapPage* last,
                               FreeList* freelist);
-
- private:
-  Heap* heap_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(GCSweeper);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index f9a5d27..69c8d62 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -55,6 +55,13 @@
   (reinterpret_cast<intptr_t>(                                                 \
       (reinterpret_cast<type*>(kOffsetOfPtr)->accessor())) - kOffsetOfPtr)
 
+#define OPEN_ARRAY_START(type, align)                                          \
+  do {                                                                         \
+    const uword result = reinterpret_cast<uword>(this) + sizeof(*this);        \
+    ASSERT(Utils::IsAligned(result, sizeof(align)));                           \
+    return reinterpret_cast<type*>(result);                                    \
+  } while (0)
+
 
 // A type large enough to contain the value of the C++ vtable. This is needed
 // to support the handle operations.
diff --git a/runtime/vm/hash_table.h b/runtime/vm/hash_table.h
index c8eae14..29dc198 100644
--- a/runtime/vm/hash_table.h
+++ b/runtime/vm/hash_table.h
@@ -562,9 +562,14 @@
     }
   }
 
+  void Clear() const {
+    BaseIterTable::Initialize();
+  }
+
  protected:
   void EnsureCapacity() const {
     static const double kMaxLoadFactor = 0.75;
+    // We currently never shrink.
     HashTables::EnsureLoadFactor(0.0, kMaxLoadFactor, *this);
   }
 };
@@ -651,9 +656,14 @@
     }
   }
 
+  void Clear() const {
+    BaseIterTable::Initialize();
+  }
+
  protected:
   void EnsureCapacity() const {
     static const double kMaxLoadFactor = 0.75;
+    // We currently never shrink.
     HashTables::EnsureLoadFactor(0.0, kMaxLoadFactor, *this);
   }
 };
diff --git a/runtime/vm/hash_table_test.cc b/runtime/vm/hash_table_test.cc
index ad6eaac..0aab291 100644
--- a/runtime/vm/hash_table_test.cc
+++ b/runtime/vm/hash_table_test.cc
@@ -245,7 +245,8 @@
       VerifyStringSetsEqual(expected, actual, ordered);
     }
   }
-  // TODO(koda): Delete all entries.
+  actual.Clear();
+  EXPECT_EQ(0, actual.NumOccupied());
   actual.Release();
 }
 
@@ -275,7 +276,8 @@
       VerifyStringMapsEqual(expected, actual, ordered);
     }
   }
-  // TODO(koda): Delete all entries.
+  actual.Clear();
+  EXPECT_EQ(0, actual.NumOccupied());
   actual.Release();
 }
 
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index a60d35f..91746db 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -24,19 +24,22 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, verbose_gc, false, "Enables verbose GC.");
-DEFINE_FLAG(int, verbose_gc_hdr, 40, "Print verbose GC header interval.");
-DEFINE_FLAG(bool, verify_before_gc, false,
-            "Enables heap verification before GC.");
-DEFINE_FLAG(bool, verify_after_gc, false,
-            "Enables heap verification after GC.");
+DEFINE_FLAG(bool, disable_alloc_stubs_after_gc, false, "Stress testing flag.");
 DEFINE_FLAG(bool, gc_at_alloc, false, "GC at every allocation.");
 DEFINE_FLAG(int, new_gen_ext_limit, 64,
             "maximum total external size (MB) in new gen before triggering GC");
-DEFINE_FLAG(int, pretenure_threshold, 98,
-            "Trigger pretenuring when this many percent are promoted.");
 DEFINE_FLAG(int, pretenure_interval, 10,
             "Back off pretenuring after this many cycles.");
+DEFINE_FLAG(int, pretenure_threshold, 98,
+            "Trigger pretenuring when this many percent are promoted.");
+DEFINE_FLAG(bool, verbose_gc, false, "Enables verbose GC.");
+DEFINE_FLAG(int, verbose_gc_hdr, 40, "Print verbose GC header interval.");
+DEFINE_FLAG(bool, verify_after_gc, false,
+            "Enables heap verification after GC.");
+DEFINE_FLAG(bool, verify_before_gc, false,
+            "Enables heap verification before GC.");
+DEFINE_FLAG(bool, pretenure_all, false, "Global pretenuring (for testing).");
+
 
 Heap::Heap(Isolate* isolate,
            intptr_t max_new_gen_semi_words,
@@ -363,6 +366,15 @@
 
 
 void Heap::UpdatePretenurePolicy() {
+  if (FLAG_disable_alloc_stubs_after_gc) {
+    ClassTable* table = isolate_->class_table();
+    for (intptr_t cid = kNumPredefinedCids; cid < table->NumCids(); ++cid) {
+      if (table->IsValidIndex(cid) && table->HasValidClassAt(cid)) {
+        const Class& cls = Class::Handle(isolate_, table->At(cid));
+        cls.SwitchAllocationStub();
+      }
+    }
+  }
   ClassHeapStats* stats =
       isolate_->class_table()->StatsWithUpdatedSize(kOneByteStringCid);
   int allocated = stats->pre_gc.new_count;
@@ -393,13 +405,28 @@
 }
 
 
-uword Heap::TopAddress() {
-  return reinterpret_cast<uword>(new_space_->TopAddress());
+uword Heap::TopAddress(Heap::Space space) {
+  if (space == kNew) {
+    return reinterpret_cast<uword>(new_space_->TopAddress());
+  } else {
+    ASSERT(space == kPretenured);
+    return reinterpret_cast<uword>(old_space_->TopAddress());
+  }
 }
 
 
-uword Heap::EndAddress() {
-  return reinterpret_cast<uword>(new_space_->EndAddress());
+uword Heap::EndAddress(Heap::Space space) {
+  if (space == kNew) {
+    return reinterpret_cast<uword>(new_space_->EndAddress());
+  } else {
+    ASSERT(space == kPretenured);
+    return reinterpret_cast<uword>(old_space_->EndAddress());
+  }
+}
+
+
+Heap::Space Heap::SpaceForAllocation(intptr_t cid) const {
+  return FLAG_pretenure_all ? kPretenured : kNew;
 }
 
 
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 133de79..645ebd1 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -33,6 +33,7 @@
     kNew,
     kOld,
     kCode,
+    // TODO(koda): Harmonize all old-space allocation and get rid of this.
     kPretenured,
   };
 
@@ -145,10 +146,9 @@
   }
 
   // Accessors for inlined allocation in generated code.
-  uword TopAddress();
-  uword EndAddress();
-  static intptr_t new_space_offset() { return OFFSET_OF(Heap, new_space_); }
-  uword NewSpaceAddress() const { return reinterpret_cast<uword>(new_space_); }
+  uword TopAddress(Space space);
+  uword EndAddress(Space space);
+  Space SpaceForAllocation(intptr_t class_id) const;
 
   // Initialize the heap and register it with the isolate.
   static void Init(Isolate* isolate,
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 4afa845..e9eea97 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -592,30 +592,20 @@
 }
 
 
-void BinarySmiOpInstr::PrintTo(BufferFormatter* f) const {
-  Definition::PrintTo(f);
-  f->Print(" %co", overflow_ ? '+' : '-');
-  f->Print(" %ct", IsTruncating() ? '+' : '-');
+void UnaryIntegerOpInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s, ", Token::Str(op_kind()));
+  value()->PrintTo(f);
 }
 
 
-void BinarySmiOpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(op_kind()));
-  left()->PrintTo(f);
+void BinaryIntegerOpInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s", Token::Str(op_kind()));
+  if (is_truncating()) {
+    f->Print(" [tr]");
+  } else if (!can_overflow()) {
+    f->Print(" [-o]");
+  }
   f->Print(", ");
-  right()->PrintTo(f);
-}
-
-
-void BinaryInt32OpInstr::PrintTo(BufferFormatter* f) const {
-  Definition::PrintTo(f);
-  f->Print(" %co", overflow_ ? '+' : '-');
-  f->Print(" %ct", IsTruncating() ? '+' : '-');
-}
-
-
-void BinaryInt32OpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(op_kind()));
   left()->PrintTo(f);
   f->Print(", ");
   right()->PrintTo(f);
@@ -871,62 +861,21 @@
 }
 
 
-void BinaryMintOpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(op_kind()));
-  left()->PrintTo(f);
-  f->Print(", ");
-  right()->PrintTo(f);
-}
-
-
-void ShiftMintOpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(op_kind()));
-  left()->PrintTo(f);
-  f->Print(", ");
-  right()->PrintTo(f);
-}
-
-
-void UnaryMintOpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(op_kind()));
-  value()->PrintTo(f);
-}
-
-
-void BinaryUint32OpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(op_kind()));
-  left()->PrintTo(f);
-  f->Print(", ");
-  right()->PrintTo(f);
-}
-
-
-void ShiftUint32OpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(op_kind()));
-  left()->PrintTo(f);
-  f->Print(", ");
-  right()->PrintTo(f);
-}
-
-
-void UnaryUint32OpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(op_kind()));
-  value()->PrintTo(f);
-}
-
-
-void UnarySmiOpInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("%s, ", Token::Str(op_kind()));
-  value()->PrintTo(f);
-}
-
-
 void UnaryDoubleOpInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("%s, ", Token::Str(op_kind()));
   value()->PrintTo(f);
 }
 
 
+void CheckClassIdInstr::PrintOperandsTo(BufferFormatter* f) const {
+  value()->PrintTo(f);
+
+  const Class& cls =
+    Class::Handle(Isolate::Current()->class_table()->At(cid()));
+  f->Print(", %s", String::Handle(cls.PrettyName()).ToCString());
+}
+
+
 void CheckClassInstr::PrintOperandsTo(BufferFormatter* f) const {
   value()->PrintTo(f);
   PrintICDataHelper(f, unary_checks());
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 3c12e4b..69fcda1 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -302,21 +302,12 @@
 }
 
 
-bool BinarySmiOpInstr::AttributesEqual(Instruction* other) const {
-  BinarySmiOpInstr* other_op = other->AsBinarySmiOp();
-  ASSERT(other_op != NULL);
+bool BinaryIntegerOpInstr::AttributesEqual(Instruction* other) const {
+  ASSERT(other->tag() == tag());
+  BinaryIntegerOpInstr* other_op = other->AsBinaryIntegerOp();
   return (op_kind() == other_op->op_kind()) &&
-      (overflow_ == other_op->overflow_) &&
-      (is_truncating_ == other_op->is_truncating_);
-}
-
-
-bool BinaryInt32OpInstr::AttributesEqual(Instruction* other) const {
-  BinaryInt32OpInstr* other_op = other->AsBinaryInt32Op();
-  ASSERT(other_op != NULL);
-  return (op_kind() == other_op->op_kind()) &&
-      (overflow_ == other_op->overflow_) &&
-      (is_truncating_ == other_op->is_truncating_);
+      (can_overflow() == other_op->can_overflow()) &&
+      (is_truncating() == other_op->is_truncating());
 }
 
 
@@ -1209,7 +1200,7 @@
     }
 
     default:
-      return overflow_;
+      return can_overflow();
   }
 }
 
@@ -1232,7 +1223,7 @@
     }
     case Token::kSHL: {
       Range* right_range = this->right()->definition()->range();
-      if ((right_range != NULL) && IsTruncating()) {
+      if ((right_range != NULL) && !can_overflow()) {
         // Can deoptimize if right can be negative.
         return !right_range->IsPositive();
       }
@@ -1243,12 +1234,12 @@
       return (right_range == NULL) || right_range->Overlaps(0, 0);
     }
     default:
-      return overflow_;
+      return can_overflow();
   }
 }
 
 
-bool BinarySmiOpInstr::RightIsPowerOfTwoConstant() const {
+bool BinaryIntegerOpInstr::RightIsPowerOfTwoConstant() const {
   if (!right()->definition()->IsConstant()) return false;
   const Object& constant = right()->definition()->AsConstant()->value();
   if (!constant.IsSmi()) return false;
@@ -1283,27 +1274,22 @@
 }
 
 
-static Definition* CanonicalizeCommutativeArithmetic(
+static Definition* CanonicalizeCommutativeDoubleArithmetic(
     Token::Kind op,
-    intptr_t cid,
     Value* left,
-    Value* right,
-    int64_t mask = static_cast<int64_t>(0xFFFFFFFFFFFFFFFFLL)) {
-  ASSERT((cid == kSmiCid) || (cid == kDoubleCid) || (cid == kMintCid));
-
+    Value* right) {
   int64_t left_value;
   if (!ToIntegerConstant(left, &left_value)) {
     return NULL;
   }
 
-  // Apply truncation mask to left_value.
-  left_value &= mask;
-
+  // Can't apply 0.0 * x -> 0.0 equivalence to double operation because
+  // 0.0 * NaN is NaN not 0.0.
+  // Can't apply 0.0 + x -> x to double because 0.0 + (-0.0) is 0.0 not -0.0.
   switch (op) {
     case Token::kMUL:
       if (left_value == 1) {
-        if ((cid == kDoubleCid) &&
-            (right->definition()->representation() != kUnboxedDouble)) {
+        if (right->definition()->representation() != kUnboxedDouble) {
           // Can't yet apply the equivalence because representation selection
           // did not run yet. We need it to guarantee that right value is
           // correctly coerced to double. The second canonicalization pass
@@ -1312,39 +1298,6 @@
         } else {
           return right->definition();
         }
-      } else if ((left_value == 0) && (cid != kDoubleCid)) {
-        // Can't apply this equivalence to double operation because
-        // 0.0 * NaN is NaN not 0.0.
-        return left->definition();
-      }
-      break;
-    case Token::kADD:
-      if ((left_value == 0) && (cid != kDoubleCid)) {
-        // Can't apply this equivalence to double operations because
-        // 0.0 + (-0.0) is 0.0 not -0.0.
-        return right->definition();
-      }
-      break;
-    case Token::kBIT_AND:
-      ASSERT(cid != kDoubleCid);
-      if (left_value == 0) {
-        return left->definition();
-      } else if (left_value == mask) {
-        return right->definition();
-      }
-      break;
-    case Token::kBIT_OR:
-      ASSERT(cid != kDoubleCid);
-      if (left_value == 0) {
-        return right->definition();
-      } else if (left_value == mask) {
-        return left->definition();
-      }
-      break;
-    case Token::kBIT_XOR:
-      ASSERT(cid != kDoubleCid);
-      if (left_value == 0) {
-        return right->definition();
       }
       break;
     default:
@@ -1389,16 +1342,12 @@
 
   Definition* result = NULL;
 
-  result = CanonicalizeCommutativeArithmetic(op_kind(),
-                                             kDoubleCid,
-                                             left(),
-                                             right());
-  if (result == NULL) {
-    result = CanonicalizeCommutativeArithmetic(op_kind(),
-                                               kDoubleCid,
-                                               right(),
-                                               left());
+  result = CanonicalizeCommutativeDoubleArithmetic(op_kind(), left(), right());
+  if (result != NULL) {
+    return result;
   }
+
+  result = CanonicalizeCommutativeDoubleArithmetic(op_kind(), right(), left());
   if (result != NULL) {
     return result;
   }
@@ -1417,96 +1366,337 @@
 }
 
 
-Definition* BinarySmiOpInstr::Canonicalize(FlowGraph* flow_graph) {
-  Definition* result = NULL;
-
-  result = CanonicalizeCommutativeArithmetic(op_kind(),
-                                             kSmiCid,
-                                             left(),
-                                             right());
-  if (result != NULL) {
-    return result;
+static bool IsCommutative(Token::Kind op) {
+  switch (op) {
+    case Token::kMUL:
+    case Token::kADD:
+    case Token::kBIT_AND:
+    case Token::kBIT_OR:
+    case Token::kBIT_XOR:
+      return true;
+    default:
+      return false;
   }
-
-  result = CanonicalizeCommutativeArithmetic(op_kind(),
-                                             kSmiCid,
-                                             right(),
-                                             left());
-  if (result != NULL) {
-    return result;
-  }
-
-  return this;
 }
 
 
-Definition* BinaryMintOpInstr::Canonicalize(FlowGraph* flow_graph) {
-  Definition* result = NULL;
-
-  result = CanonicalizeCommutativeArithmetic(op_kind(),
-                                             kMintCid,
-                                             left(),
-                                             right());
-  if (result != NULL) {
-    return result;
+static intptr_t RepresentationBits(Representation r) {
+  switch (r) {
+    case kTagged:
+      return kBitsPerWord - 1;
+    case kUnboxedInt32:
+    case kUnboxedUint32:
+      return 32;
+    case kUnboxedMint:
+      return 64;
+    default:
+      UNREACHABLE();
+      return 0;
   }
-
-  result = CanonicalizeCommutativeArithmetic(op_kind(),
-                                             kMintCid,
-                                             right(),
-                                             left());
-  if (result != NULL) {
-    return result;
-  }
-
-  return this;
 }
 
 
-Definition* BinaryUint32OpInstr::Canonicalize(FlowGraph* flow_graph) {
-  Definition* result = NULL;
-
-  const int64_t truncation_mask = static_cast<int64_t>(0xFFFFFFFF);
-
-  result = CanonicalizeCommutativeArithmetic(op_kind(),
-                                             kMintCid,
-                                             left(),
-                                             right(),
-                                             truncation_mask);
-  if (result != NULL) {
-    return result;
-  }
-
-  result = CanonicalizeCommutativeArithmetic(op_kind(),
-                                             kMintCid,
-                                             right(),
-                                             left(),
-                                             truncation_mask);
-  if (result != NULL) {
-    return result;
-  }
-
-  return this;
+static int64_t RepresentationMask(Representation r) {
+  return static_cast<int64_t>(
+      static_cast<uint64_t>(-1) >> (64 - RepresentationBits(r)));
 }
 
 
-Definition* BinaryInt32OpInstr::Canonicalize(FlowGraph* flow_graph) {
-  Definition* result = NULL;
-
-  result = CanonicalizeCommutativeArithmetic(op_kind(),
-                                             kSmiCid,
-                                             left(),
-                                             right());
-  if (result != NULL) {
-    return result;
+UnaryIntegerOpInstr* UnaryIntegerOpInstr::Make(Representation representation,
+                                               Token::Kind op_kind,
+                                               Value* value,
+                                               intptr_t deopt_id,
+                                               Range* range) {
+  UnaryIntegerOpInstr* op = NULL;
+  switch (representation) {
+    case kTagged:
+      op = new UnarySmiOpInstr(op_kind, value, deopt_id);
+      break;
+    case kUnboxedInt32:
+      return NULL;
+    case kUnboxedUint32:
+      op = new UnaryUint32OpInstr(op_kind, value, deopt_id);
+      break;
+    case kUnboxedMint:
+      op = new UnaryMintOpInstr(op_kind, value, deopt_id);
+      break;
+    default:
+      UNREACHABLE();
+      return NULL;
   }
 
-  result = CanonicalizeCommutativeArithmetic(op_kind(),
-                                             kSmiCid,
-                                             right(),
-                                             left());
-  if (result != NULL) {
-    return result;
+  if (op == NULL) {
+    return op;
+  }
+
+  if (!Range::IsUnknown(range)) {
+    op->set_range(*range);
+  }
+
+  ASSERT(op->representation() == representation);
+  return op;
+}
+
+
+BinaryIntegerOpInstr* BinaryIntegerOpInstr::Make(Representation representation,
+                                                 Token::Kind op_kind,
+                                                 Value* left,
+                                                 Value* right,
+                                                 intptr_t deopt_id,
+                                                 bool can_overflow,
+                                                 bool is_truncating,
+                                                 Range* range) {
+  BinaryIntegerOpInstr* op = NULL;
+  switch (representation) {
+    case kTagged:
+      op = new BinarySmiOpInstr(op_kind, left, right, deopt_id);
+      break;
+    case kUnboxedInt32:
+      if (!BinaryInt32OpInstr::IsSupported(op_kind, left, right)) {
+        return NULL;
+      }
+      op = new BinaryInt32OpInstr(op_kind, left, right, deopt_id);
+      break;
+    case kUnboxedUint32:
+      if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
+        op = new ShiftUint32OpInstr(op_kind, left, right, deopt_id);
+      } else {
+        op = new BinaryUint32OpInstr(op_kind, left, right, deopt_id);
+      }
+      break;
+    case kUnboxedMint:
+      if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
+        op = new ShiftMintOpInstr(op_kind, left, right, deopt_id);
+      } else {
+        op = new BinaryMintOpInstr(op_kind, left, right, deopt_id);
+      }
+      break;
+    default:
+      UNREACHABLE();
+      return NULL;
+  }
+
+  if (!Range::IsUnknown(range)) {
+    op->set_range(*range);
+  }
+
+  op->set_can_overflow(can_overflow);
+  if (is_truncating) {
+    op->mark_truncating();
+  }
+
+  ASSERT(op->representation() == representation);
+  return op;
+}
+
+
+RawInteger* BinaryIntegerOpInstr::Evaluate(const Integer& left,
+                                           const Integer& right) const {
+  Integer& result = Integer::Handle();
+
+  switch (op_kind()) {
+    case Token::kTRUNCDIV:
+    case Token::kMOD:
+      // Check right value for zero.
+      if (right.AsInt64Value() == 0) {
+        break;  // Will throw.
+      }
+      // Fall through.
+    case Token::kADD:
+    case Token::kSUB:
+    case Token::kMUL: {
+      result = left.ArithmeticOp(op_kind(), right);
+      break;
+    }
+    case Token::kSHL:
+    case Token::kSHR:
+      if (left.IsSmi() && right.IsSmi() && (Smi::Cast(right).Value() >= 0)) {
+        result = Smi::Cast(left).ShiftOp(op_kind(), Smi::Cast(right));
+      }
+      break;
+    case Token::kBIT_AND:
+    case Token::kBIT_OR:
+    case Token::kBIT_XOR: {
+      result = left.BitOp(op_kind(), right);
+      break;
+    }
+    case Token::kDIV:
+      break;
+    default:
+      UNREACHABLE();
+  }
+
+  if (!result.IsNull()) {
+    if (is_truncating()) {
+      int64_t truncated = result.AsTruncatedInt64Value();
+      truncated &= RepresentationMask(representation());
+      result = Integer::New(truncated);
+    }
+    result ^= result.CheckAndCanonicalize(NULL);
+  }
+
+  return result.raw();
+}
+
+
+Definition* BinaryIntegerOpInstr::Canonicalize(FlowGraph* flow_graph) {
+  // If both operands are constants evaluate this expression. Might
+  // occur due to load forwarding after constant propagation pass
+  // have already been run.
+  if (left()->BindsToConstant() &&
+      left()->BoundConstant().IsInteger() &&
+      right()->BindsToConstant() &&
+      right()->BoundConstant().IsInteger()) {
+    const Integer& result = Integer::Handle(
+        Evaluate(Integer::Cast(left()->BoundConstant()),
+                 Integer::Cast(right()->BoundConstant())));
+    if (!result.IsNull()) {
+      return flow_graph->GetConstant(result);
+    }
+  }
+
+  if (left()->BindsToConstant() &&
+      !right()->BindsToConstant() &&
+      IsCommutative(op_kind())) {
+    Value* l = left();
+    Value* r = right();
+    SetInputAt(0, r);
+    SetInputAt(1, l);
+  }
+
+  int64_t rhs;
+  if (!ToIntegerConstant(right(), &rhs)) {
+    return this;
+  }
+
+  const int64_t range_mask = RepresentationMask(representation());
+  if (is_truncating()) {
+    switch (op_kind()) {
+      case Token::kMUL:
+      case Token::kSUB:
+      case Token::kADD:
+      case Token::kBIT_AND:
+      case Token::kBIT_OR:
+      case Token::kBIT_XOR:
+        rhs = (rhs & range_mask);
+        break;
+      default:
+        break;
+    }
+  }
+
+  switch (op_kind()) {
+    case Token::kMUL:
+      if (rhs == 1) {
+        return left()->definition();
+      } else if (rhs == 0) {
+        return right()->definition();
+      } else if (rhs == 2) {
+        ConstantInstr* constant_1 =
+            flow_graph->GetConstant(Smi::Handle(Smi::New(1)));
+        BinaryIntegerOpInstr* shift =
+            BinaryIntegerOpInstr::Make(representation(),
+                                       Token::kSHL,
+                                       left()->CopyWithType(),
+                                       new Value(constant_1),
+                                       deopt_id_,
+                                       can_overflow(),
+                                       is_truncating(),
+                                       range());
+        if (shift != NULL) {
+          flow_graph->InsertBefore(this, shift, env(), FlowGraph::kValue);
+          return shift;
+        }
+      }
+
+      break;
+    case Token::kADD:
+      if (rhs == 0) {
+        return left()->definition();
+      }
+      break;
+    case Token::kBIT_AND:
+      if (rhs == 0) {
+        return right()->definition();
+      } else if (rhs == range_mask) {
+        return left()->definition();
+      }
+      break;
+    case Token::kBIT_OR:
+      if (rhs == 0) {
+        return left()->definition();
+      } else if (rhs == range_mask) {
+        return right()->definition();
+      }
+      break;
+    case Token::kBIT_XOR:
+      if (rhs == 0) {
+        return left()->definition();
+      } else if (rhs == range_mask) {
+        UnaryIntegerOpInstr* bit_not =
+            UnaryIntegerOpInstr::Make(representation(),
+                                      Token::kBIT_NOT,
+                                      left()->CopyWithType(),
+                                      deopt_id_,
+                                      range());
+        if (bit_not != NULL) {
+          flow_graph->InsertBefore(this, bit_not, env(), FlowGraph::kValue);
+          return bit_not;
+        }
+      }
+      break;
+
+    case Token::kSUB:
+      if (rhs == 0) {
+        return left()->definition();
+      }
+      break;
+
+    case Token::kTRUNCDIV:
+      if (rhs == 1) {
+        return left()->definition();
+      } else if (rhs == -1) {
+        UnaryIntegerOpInstr* negation =
+            UnaryIntegerOpInstr::Make(representation(),
+                                      Token::kNEGATE,
+                                      left()->CopyWithType(),
+                                      deopt_id_,
+                                      range());
+        if (negation != NULL) {
+          flow_graph->InsertBefore(this, negation, env(), FlowGraph::kValue);
+          return negation;
+        }
+      }
+      break;
+
+    case Token::kSHR:
+      if (rhs == 0) {
+        return left()->definition();
+      } else if (rhs < 0) {
+        DeoptimizeInstr* deopt =
+            new DeoptimizeInstr(ICData::kDeoptBinarySmiOp, deopt_id_);
+        flow_graph->InsertBefore(this, deopt, env(), FlowGraph::kEffect);
+        return flow_graph->GetConstant(Smi::Handle(Smi::New(0)));
+      }
+      break;
+
+    case Token::kSHL: {
+      const intptr_t kMaxShift = RepresentationBits(representation()) - 1;
+      if (rhs == 0) {
+        return left()->definition();
+      } else if ((rhs < 0) || (rhs >= kMaxShift)) {
+        if ((rhs < 0) || !is_truncating()) {
+          DeoptimizeInstr* deopt =
+              new DeoptimizeInstr(ICData::kDeoptBinarySmiOp, deopt_id_);
+          flow_graph->InsertBefore(this, deopt, env(), FlowGraph::kEffect);
+        }
+        return flow_graph->GetConstant(Smi::Handle(Smi::New(0)));
+      }
+      break;
+    }
+
+    default:
+      break;
   }
 
   return this;
@@ -1747,7 +1937,8 @@
           box_defn->value()->definition()->representation(),
           representation(),
           box_defn->value()->CopyWithType(),
-          representation() == kUnboxedInt32 ? deopt_id_ : Isolate::kNoDeoptId);
+          (representation() == kUnboxedInt32) ?
+              deopt_id_ : Isolate::kNoDeoptId);
       if ((representation() == kUnboxedInt32) && is_truncating()) {
         converter->mark_truncating();
       }
@@ -1774,7 +1965,7 @@
         box_defn->from(),
         representation(),
         box_defn->value()->CopyWithType(),
-        to() == kUnboxedInt32 ? deopt_id_ : NULL);
+        (to() == kUnboxedInt32) ? deopt_id_ : Isolate::kNoDeoptId);
     if ((representation() == kUnboxedInt32) && is_truncating()) {
       converter->mark_truncating();
     }
@@ -2630,8 +2821,6 @@
     int num_args_checked = 0;
     switch (recognized_kind) {
       case MethodRecognizer::kDoubleFromInteger:
-        num_args_checked = 1;
-        break;
       case MethodRecognizer::kMathMin:
       case MethodRecognizer::kMathMax:
         num_args_checked = 2;
@@ -2666,6 +2855,17 @@
 }
 
 
+LocationSummary* DeoptimizeInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
+}
+
+
+void DeoptimizeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  __ Jump(compiler->AddDeoptStub(deopt_id(), deopt_reason_));
+}
+
+
 Environment* Environment::From(Isolate* isolate,
                                const GrowableArray<Definition*>& definitions,
                                intptr_t fixed_parameter_count,
@@ -2885,9 +3085,7 @@
     function_ =
         Resolver::ResolveStatic(
             cls,
-            is_singleton_
-                ? Library::PrivateCoreLibName(Symbols::InterpolateSingle())
-                : Library::PrivateCoreLibName(Symbols::Interpolate()),
+            Library::PrivateCoreLibName(Symbols::Interpolate()),
             kNumberOfArguments,
             kNoArgumentNames);
   }
@@ -2906,35 +3104,12 @@
   //   StoreIndexed(v2, v3, v4)   -- v3:constant index, v4: value.
   //   ..
   //   v8 <- StringInterpolate(v2)
-  // or for a single element:
-  //   v2 <- StringInterpolateSingle(v0)
 
   // Don't compile-time fold when optimizing the interpolation function itself.
   if (flow_graph->parsed_function().function().raw() == CallFunction().raw()) {
     return this;
   }
 
-  if (is_singleton_) {
-    Value* value = this->value();
-    if (!value->definition()->IsConstant()) return this;
-    const Object& obj = value->definition()->AsConstant()->value();
-    if (!obj.IsNumber() && !obj.IsString() && !obj.IsBool() && !obj.IsNull()) {
-      return this;
-    }
-    // This is only really useful for numbers, so we don't bother optimizing
-    // for strings, bool or null.
-    const Array& interpolate_arg = Array::Handle(Array::New(1));
-    interpolate_arg.SetAt(0, obj);
-    const Object& result = Object::Handle(
-        DartEntry::InvokeFunction(CallFunction(), interpolate_arg));
-    if (result.IsUnhandledException()) {
-      return this;
-    }
-    ASSERT(result.IsString());
-    const String& converted =
-        String::ZoneHandle(Symbols::New(String::Cast(result)));
-    return flow_graph->GetConstant(converted);
-  }
   CreateArrayInstr* create_array = value()->definition()->AsCreateArray();
   ASSERT(create_array != NULL);
   // Check if the string interpolation has only constant inputs.
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 4325952..e7933fc 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -476,6 +476,7 @@
   M(CheckStackOverflow)                                                        \
   M(SmiToDouble)                                                               \
   M(Int32ToDouble)                                                             \
+  M(MintToDouble)                                                              \
   M(DoubleToInteger)                                                           \
   M(DoubleToSmi)                                                               \
   M(DoubleToDouble)                                                            \
@@ -556,21 +557,32 @@
   M(BoxInt32)                                                                  \
   M(UnboxInt32)                                                                \
   M(UnboxedIntConverter)                                                       \
+  M(Deoptimize)
 
+#define FOR_EACH_ABSTRACT_INSTRUCTION(M)                                       \
+  M(BlockEntry)                                                                \
+  M(BoxIntN)                                                                   \
+  M(UnboxIntN)                                                                 \
+  M(Comparison)                                                                \
+  M(UnaryIntegerOp)                                                            \
+  M(BinaryIntegerOp)                                                           \
 
 #define FORWARD_DECLARATION(type) class type##Instr;
 FOR_EACH_INSTRUCTION(FORWARD_DECLARATION)
+FOR_EACH_ABSTRACT_INSTRUCTION(FORWARD_DECLARATION)
 #undef FORWARD_DECLARATION
 
+#define DEFINE_INSTRUCTION_TYPE_CHECK(type)                                    \
+  virtual type##Instr* As##type() { return this; }                             \
+  virtual const char* DebugName() const { return #type; }                      \
 
 // Functions required in all concrete instruction classes.
 #define DECLARE_INSTRUCTION_NO_BACKEND(type)                                   \
   virtual Tag tag() const { return k##type; }                                  \
   virtual void Accept(FlowGraphVisitor* visitor);                              \
-  virtual type##Instr* As##type() { return this; }                             \
-  virtual const char* DebugName() const { return #type; }                      \
+  DEFINE_INSTRUCTION_TYPE_CHECK(type)
 
-#define DECLARE_INSTRUCTION_BACKEND(type)                                      \
+#define DECLARE_INSTRUCTION_BACKEND()                                          \
   virtual LocationSummary* MakeLocationSummary(Isolate* isolate,               \
                                                bool optimizing) const;         \
   virtual void EmitNativeCode(FlowGraphCompiler* compiler);                    \
@@ -578,7 +590,7 @@
 // Functions required in all concrete instruction classes.
 #define DECLARE_INSTRUCTION(type)                                              \
   DECLARE_INSTRUCTION_NO_BACKEND(type)                                         \
-  DECLARE_INSTRUCTION_BACKEND(type)                                            \
+  DECLARE_INSTRUCTION_BACKEND()                                                \
 
 class Instruction : public ZoneAllocated {
  public:
@@ -609,15 +621,6 @@
   const ICData* GetICData(
       const ZoneGrowableArray<const ICData*>& ic_data_array) const;
 
-  bool IsBlockEntry() { return (AsBlockEntry() != NULL); }
-  virtual BlockEntryInstr* AsBlockEntry() { return NULL; }
-
-  bool IsDefinition() { return (AsDefinition() != NULL); }
-  virtual Definition* AsDefinition() { return NULL; }
-
-  virtual BoxIntNInstr* AsBoxIntN() { return NULL; }
-  virtual UnboxIntNInstr* AsUnboxIntN() { return NULL; }
-
   virtual intptr_t token_pos() const { return Scanner::kNoSourcePos; }
 
   virtual intptr_t InputCount() const = 0;
@@ -695,11 +698,18 @@
   virtual void PrintTo(BufferFormatter* f) const;
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
-#define INSTRUCTION_TYPE_CHECK(type)                                           \
-  bool Is##type() { return (As##type() != NULL); }                             \
-  virtual type##Instr* As##type() { return NULL; }
+#define DECLARE_INSTRUCTION_TYPE_CHECK(Name, Type)                             \
+  bool Is##Name() { return (As##Name() != NULL); }                             \
+  virtual Type* As##Name() { return NULL; }
+#define INSTRUCTION_TYPE_CHECK(Name)                                           \
+  DECLARE_INSTRUCTION_TYPE_CHECK(Name, Name##Instr)
+
+DECLARE_INSTRUCTION_TYPE_CHECK(Definition, Definition)
 FOR_EACH_INSTRUCTION(INSTRUCTION_TYPE_CHECK)
+FOR_EACH_ABSTRACT_INSTRUCTION(INSTRUCTION_TYPE_CHECK)
+
 #undef INSTRUCTION_TYPE_CHECK
+#undef DECLARE_INSTRUCTION_TYPE_CHECK
 
   // Returns structure describing location constraints required
   // to emit native code for this instruction.
@@ -873,12 +883,7 @@
   friend class Int32x4ToFloat32x4Instr;
   friend class BinaryInt32x4OpInstr;
   friend class BinaryFloat64x2OpInstr;
-  friend class BinaryMintOpInstr;
-  friend class BinarySmiOpInstr;
-  friend class UnarySmiOpInstr;
   friend class UnaryDoubleOpInstr;
-  friend class ShiftMintOpInstr;
-  friend class UnaryMintOpInstr;
   friend class MathUnaryInstr;
   friend class MathMinMaxInstr;
   friend class CheckClassInstr;
@@ -904,20 +909,20 @@
   friend class InstanceOfInstr;
   friend class PolymorphicInstanceCallInstr;
   friend class SmiToDoubleInstr;
+  friend class MintToDoubleInstr;
   friend class DoubleToIntegerInstr;
   friend class BranchSimplifier;
   friend class BlockEntryInstr;
   friend class RelationalOpInstr;
   friend class EqualityCompareInstr;
   friend class TestCidsInstr;
-  friend class BinaryUint32OpInstr;
-  friend class UnaryUint32OpInstr;
-  friend class ShiftUint32OpInstr;
   friend class UnboxIntNInstr;
   friend class UnboxInt32Instr;
   friend class UnboxUint32Instr;
-  friend class BinaryInt32OpInstr;
   friend class UnboxedIntConverterInstr;
+  friend class UnaryIntegerOpInstr;
+  friend class BinaryIntegerOpInstr;
+  friend class DeoptimizeInstr;
 
   virtual void RawSetInputAt(intptr_t i, Value* value) = 0;
 
@@ -1061,8 +1066,6 @@
 // branches.
 class BlockEntryInstr : public Instruction {
  public:
-  virtual BlockEntryInstr* AsBlockEntry() { return this; }
-
   virtual intptr_t PredecessorCount() const = 0;
   virtual BlockEntryInstr* PredecessorAt(intptr_t index) const = 0;
 
@@ -1188,6 +1191,8 @@
   // environment) from their definition's use lists for all instructions.
   void ClearAllInstructions();
 
+  DEFINE_INSTRUCTION_TYPE_CHECK(BlockEntry)
+
  protected:
   BlockEntryInstr(intptr_t block_id, intptr_t try_index)
       : block_id_(block_id),
@@ -1591,11 +1596,6 @@
  public:
   Definition();
 
-  virtual Definition* AsDefinition() { return this; }
-
-  bool IsComparison() { return (AsComparison() != NULL); }
-  virtual ComparisonInstr* AsComparison() { return NULL; }
-
   // Overridden by definitions that have pushed arguments.
   virtual intptr_t ArgumentCount() const { return 0; }
 
@@ -1762,6 +1762,8 @@
 
   Definition* OriginalDefinition();
 
+  virtual Definition* AsDefinition() { return this; }
+
  protected:
   friend class RangeAnalysis;
   friend class Value;
@@ -2144,8 +2146,6 @@
   Value* left() const { return inputs_[0]; }
   Value* right() const { return inputs_[1]; }
 
-  virtual ComparisonInstr* AsComparison() { return this; }
-
   virtual intptr_t token_pos() const { return token_pos_; }
   Token::Kind kind() const { return kind_; }
 
@@ -2169,6 +2169,8 @@
     kind_ = Token::NegateComparison(kind_);
   }
 
+  DEFINE_INSTRUCTION_TYPE_CHECK(Comparison)
+
  protected:
   ComparisonInstr(intptr_t token_pos,
                   Token::Kind kind,
@@ -2325,6 +2327,35 @@
 };
 
 
+class DeoptimizeInstr : public TemplateInstruction<0> {
+ public:
+  DeoptimizeInstr(ICData::DeoptReasonId deopt_reason, intptr_t deopt_id)
+      : deopt_reason_(deopt_reason) {
+    deopt_id_ = deopt_id;
+  }
+
+  virtual intptr_t ArgumentCount() const { return 0; }
+
+  virtual bool CanDeoptimize() const { return true; }
+
+  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; }
+
+  DECLARE_INSTRUCTION(Deoptimize)
+
+ private:
+  const ICData::DeoptReasonId deopt_reason_;
+
+  DISALLOW_COPY_AND_ASSIGN(DeoptimizeInstr);
+};
+
+
 class RedefinitionInstr : public TemplateDefinition<1> {
  public:
   explicit RedefinitionInstr(Value* value) {
@@ -2713,6 +2744,7 @@
         ic_data_(ic_data),
         with_checks_(with_checks) {
     ASSERT(instance_call_ != NULL);
+    ASSERT(ic_data.NumberOfChecks() > 0);
     deopt_id_ = instance_call->deopt_id();
   }
 
@@ -3800,10 +3832,8 @@
 
 class StringInterpolateInstr : public TemplateDefinition<1> {
  public:
-  StringInterpolateInstr(Value* value, intptr_t token_pos, bool is_singleton)
-      : token_pos_(token_pos),
-        function_(Function::Handle()),
-        is_singleton_(is_singleton) {
+  StringInterpolateInstr(Value* value, intptr_t token_pos)
+      : token_pos_(token_pos), function_(Function::Handle()) {
     SetInputAt(0, value);
   }
 
@@ -3825,7 +3855,6 @@
  private:
   const intptr_t token_pos_;
   Function& function_;
-  const bool is_singleton_;
 
   DISALLOW_COPY_AND_ASSIGN(StringInterpolateInstr);
 };
@@ -6689,166 +6718,114 @@
 };
 
 
-class BinaryMintOpInstr : public TemplateDefinition<2> {
+class UnaryIntegerOpInstr : public TemplateDefinition<1> {
  public:
-  BinaryMintOpInstr(Token::Kind op_kind,
-                    Value* left,
-                    Value* right,
-                    intptr_t deopt_id)
-      : op_kind_(op_kind), can_overflow_(true) {
-    SetInputAt(0, left);
-    SetInputAt(1, right);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
-  }
-
-  Value* left() const { return inputs_[0]; }
-  Value* right() const { return inputs_[1]; }
-
-  Token::Kind op_kind() const { return op_kind_; }
-
-  bool can_overflow() const { return can_overflow_; }
-  void set_can_overflow(bool value) { can_overflow_ = value; }
-
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
-
-  virtual bool CanDeoptimize() const {
-    return FLAG_throw_on_javascript_int_overflow
-        || (can_overflow() && ((op_kind() == Token::kADD) ||
-                               (op_kind() == Token::kSUB)))
-        || (op_kind() == Token::kMUL);  // Deopt if inputs are not int32.
-  }
-
-  virtual Representation representation() const {
-    return kUnboxedMint;
-  }
-
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    ASSERT((idx == 0) || (idx == 1));
-    return kUnboxedMint;
-  }
-
-  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_;
-  }
-
-  virtual void InferRange(RangeAnalysis* analysis, Range* range);
-
-  virtual Definition* Canonicalize(FlowGraph* flow_graph);
-
-  DECLARE_INSTRUCTION(BinaryMintOp)
-  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->IsBinaryMintOp());
-    return op_kind() == other->AsBinaryMintOp()->op_kind();
-  }
-
-  virtual bool MayThrow() const { return false; }
-
- private:
-  const Token::Kind op_kind_;
-  bool can_overflow_;
-
-  DISALLOW_COPY_AND_ASSIGN(BinaryMintOpInstr);
-};
-
-
-class ShiftMintOpInstr : public TemplateDefinition<2> {
- public:
-  ShiftMintOpInstr(Token::Kind op_kind,
-                   Value* left,
-                   Value* right,
-                   intptr_t deopt_id)
-      : op_kind_(op_kind), can_overflow_(true) {
-    ASSERT(op_kind == Token::kSHR || op_kind == Token::kSHL);
-    SetInputAt(0, left);
-    SetInputAt(1, right);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
-  }
-
-  Value* left() const { return inputs_[0]; }
-  Value* right() const { return inputs_[1]; }
-
-  Token::Kind op_kind() const { return op_kind_; }
-
-  bool can_overflow() const { return can_overflow_; }
-  void set_can_overflow(bool value) { can_overflow_ = value; }
-
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
-
-  bool has_shift_count_check() const;
-
-  virtual bool CanDeoptimize() const {
-    return FLAG_throw_on_javascript_int_overflow
-        || has_shift_count_check()
-        || (can_overflow() && (op_kind() == Token::kSHL));
-  }
-
-  virtual CompileType ComputeType() const;
-
-  virtual Representation representation() const {
-    return kUnboxedMint;
-  }
-
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    ASSERT((idx == 0) || (idx == 1));
-    return (idx == 0) ? kUnboxedMint : kTagged;
-  }
-
-  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_;
-  }
-
-  virtual void InferRange(RangeAnalysis* analysis, Range* range);
-
-  DECLARE_INSTRUCTION(ShiftMintOp)
-
-  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->AsShiftMintOp()->op_kind();
-  }
-
-  virtual bool MayThrow() const { return false; }
-
- private:
-  const Token::Kind op_kind_;
-  bool can_overflow_;
-
-  DISALLOW_COPY_AND_ASSIGN(ShiftMintOpInstr);
-};
-
-
-class UnaryMintOpInstr : public TemplateDefinition<1> {
- public:
-  UnaryMintOpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id)
+  UnaryIntegerOpInstr(Token::Kind op_kind,
+                      Value* value,
+                      intptr_t deopt_id)
       : op_kind_(op_kind) {
-    ASSERT(op_kind == Token::kBIT_NOT);
+    ASSERT((op_kind == Token::kNEGATE) ||
+           (op_kind == Token::kBIT_NOT));
     SetInputAt(0, value);
     // Override generated deopt-id.
     deopt_id_ = deopt_id;
   }
 
-  Value* value() const { return inputs_[0]; }
+  static UnaryIntegerOpInstr* Make(Representation representation,
+                                   Token::Kind op_kind,
+                                   Value* value,
+                                   intptr_t deopt_id,
+                                   Range* range);
 
+  Value* value() const { return inputs_[0]; }
   Token::Kind op_kind() const { return op_kind_; }
 
+  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 other->AsUnaryIntegerOp()->op_kind() == op_kind();
+  }
+
+  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_;
+  }
+
+  virtual bool MayThrow() const { return false; }
+
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
+  DEFINE_INSTRUCTION_TYPE_CHECK(UnaryIntegerOp)
+
+ private:
+  const Token::Kind op_kind_;
+};
+
+
+// Handles both Smi operations: BIT_OR and NEGATE.
+class UnarySmiOpInstr : public UnaryIntegerOpInstr {
+ public:
+  UnarySmiOpInstr(Token::Kind op_kind,
+                  Value* value,
+                  intptr_t deopt_id)
+      : UnaryIntegerOpInstr(op_kind, value, deopt_id) {
+  }
+
+  virtual bool CanDeoptimize() const { return op_kind() == Token::kNEGATE; }
+
+  virtual CompileType ComputeType() const;
+
+  DECLARE_INSTRUCTION(UnarySmiOp)
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(UnarySmiOpInstr);
+};
+
+
+class UnaryUint32OpInstr : public UnaryIntegerOpInstr {
+ public:
+  UnaryUint32OpInstr(Token::Kind op_kind,
+                     Value* value,
+                     intptr_t deopt_id)
+      : UnaryIntegerOpInstr(op_kind, value, deopt_id) {
+    ASSERT(op_kind == Token::kBIT_NOT);
+  }
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual CompileType ComputeType() const;
+
+  virtual Representation representation() const {
+    return kUnboxedUint32;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return kUnboxedUint32;
+  }
+
+  DECLARE_INSTRUCTION(UnaryUint32Op)
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(UnaryUint32OpInstr);
+};
+
+
+class UnaryMintOpInstr : public UnaryIntegerOpInstr {
+ public:
+  UnaryMintOpInstr(Token::Kind op_kind, Value* value, intptr_t deopt_id)
+      : UnaryIntegerOpInstr(op_kind, value, deopt_id) {
+    ASSERT(op_kind == Token::kBIT_NOT);
+  }
+
   virtual bool CanDeoptimize() const {
     return FLAG_throw_on_javascript_int_overflow;
   }
 
+  virtual CompileType ComputeType() const;
+
   virtual Representation representation() const {
     return kUnboxedMint;
   }
@@ -6858,112 +6835,117 @@
     return kUnboxedMint;
   }
 
-  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(UnaryMintOp)
-  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->AsUnaryMintOp()->op_kind();
-  }
-
-  virtual bool MayThrow() const { return false; }
 
  private:
-  const Token::Kind op_kind_;
-
   DISALLOW_COPY_AND_ASSIGN(UnaryMintOpInstr);
 };
 
 
-class BinarySmiOpInstr : public TemplateDefinition<2> {
+class BinaryIntegerOpInstr : public TemplateDefinition<2> {
  public:
-  BinarySmiOpInstr(Token::Kind op_kind,
-                   Value* left,
-                   Value* right,
-                   intptr_t deopt_id,
-                   intptr_t token_pos)
+  BinaryIntegerOpInstr(Token::Kind op_kind,
+                       Value* left,
+                       Value* right,
+                       intptr_t deopt_id)
       : op_kind_(op_kind),
-        overflow_(true),
-        is_truncating_(false),
-        token_pos_(token_pos) {
+        can_overflow_(true),
+        is_truncating_(false) {
     SetInputAt(0, left);
     SetInputAt(1, right);
     // Override generated deopt-id.
     deopt_id_ = deopt_id;
   }
 
+  static BinaryIntegerOpInstr* Make(Representation representation,
+                                    Token::Kind op_kind,
+                                    Value* left,
+                                    Value* right,
+                                    intptr_t deopt_id,
+                                    bool can_overflow,
+                                    bool is_truncating,
+                                    Range* range);
+
+  Token::Kind op_kind() const { return op_kind_; }
   Value* left() const { return inputs_[0]; }
   Value* right() const { return inputs_[1]; }
 
-  virtual intptr_t token_pos() const { return token_pos_; }
-  Token::Kind op_kind() const { return op_kind_; }
+  bool can_overflow() const { return can_overflow_; }
+  void set_can_overflow(bool overflow) {
+    ASSERT(!is_truncating_ || !overflow);
+    can_overflow_ = overflow;
+  }
 
-  void set_overflow(bool overflow) { overflow_ = overflow; }
+  bool is_truncating() const { return is_truncating_; }
+  void mark_truncating() {
+    is_truncating_ = true;
+    set_can_overflow(false);
+  }
 
-  void set_is_truncating(bool value) { is_truncating_ = value; }
-  bool IsTruncating() const { return is_truncating_ || !overflow_; }
+  // Returns true if right is a non-zero Smi constant which absolute value is
+  // a power of two.
+  bool RightIsPowerOfTwoConstant() const;
 
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
+  RawInteger* Evaluate(const Integer& left, const Integer& right) const;
 
-  DECLARE_INSTRUCTION(BinarySmiOp)
-  virtual CompileType ComputeType() const;
-
-  virtual bool CanDeoptimize() const;
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
   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;
 
-  void PrintTo(BufferFormatter* f) const;
-
-  virtual void InferRange(RangeAnalysis* analysis, Range* range);
-
-  virtual Definition* Canonicalize(FlowGraph* flow_graph);
-
-  // Returns true if right is a non-zero Smi constant which absolute value is
-  // a power of two.
-  bool RightIsPowerOfTwoConstant() const;
+  virtual intptr_t DeoptimizationTarget() const { return deopt_id_; }
 
   virtual bool MayThrow() const { return false; }
 
-  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_;
-  }
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  DEFINE_INSTRUCTION_TYPE_CHECK(BinaryIntegerOp)
+
+ protected:
+  void InferRangeHelper(const Range* left_range,
+                        const Range* right_range,
+                        Range* range);
 
  private:
   const Token::Kind op_kind_;
-  bool overflow_;
-  bool is_truncating_;
-  const intptr_t token_pos_;
 
+  bool can_overflow_;
+  bool is_truncating_;
+};
+
+
+class BinarySmiOpInstr : public BinaryIntegerOpInstr {
+ public:
+  BinarySmiOpInstr(Token::Kind op_kind,
+                   Value* left,
+                   Value* right,
+                   intptr_t deopt_id)
+      : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
+  }
+
+  virtual bool CanDeoptimize() const;
+
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
+  virtual CompileType ComputeType() const;
+
+  DECLARE_INSTRUCTION(BinarySmiOp)
+
+ private:
   DISALLOW_COPY_AND_ASSIGN(BinarySmiOpInstr);
 };
 
 
-class BinaryInt32OpInstr : public TemplateDefinition<2> {
+class BinaryInt32OpInstr : public BinaryIntegerOpInstr {
  public:
   BinaryInt32OpInstr(Token::Kind op_kind,
                      Value* left,
                      Value* right,
                      intptr_t deopt_id)
-      : op_kind_(op_kind),
-        overflow_(true),
-        is_truncating_(false) {
+      : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
     SetInputAt(0, left);
     SetInputAt(1, right);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
   }
 
   static bool IsSupported(Token::Kind op, Value* left, Value* right) {
@@ -6989,33 +6971,8 @@
 #endif
   }
 
-  Value* left() const { return inputs_[0]; }
-  Value* right() const { return inputs_[1]; }
-
-  Token::Kind op_kind() const { return op_kind_; }
-
-  void set_overflow(bool overflow) { overflow_ = overflow; }
-
-  void set_is_truncating(bool value) { is_truncating_ = value; }
-  bool IsTruncating() const { return is_truncating_ || !overflow_; }
-
-  void PrintTo(BufferFormatter* f) const;
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
-
-  DECLARE_INSTRUCTION(BinaryInt32Op)
-  virtual CompileType ComputeType() const;
-
   virtual bool CanDeoptimize() 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;
-
-  virtual void InferRange(RangeAnalysis* analysis, Range* range);
-
-  virtual Definition* Canonicalize(FlowGraph* flow_graph);
-
   virtual Representation representation() const {
     return kUnboxedInt32;
   }
@@ -7025,59 +6982,147 @@
     return kUnboxedInt32;
   }
 
-  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_;
-  }
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
+  virtual CompileType ComputeType() const;
 
-  virtual bool MayThrow() const { return false; }
+  DECLARE_INSTRUCTION(BinaryInt32Op)
 
  private:
-  const Token::Kind op_kind_;
-  bool overflow_;
-  bool is_truncating_;
-
   DISALLOW_COPY_AND_ASSIGN(BinaryInt32OpInstr);
 };
 
 
-// Handles both Smi operations: BIT_OR and NEGATE.
-class UnarySmiOpInstr : public TemplateDefinition<1> {
+class BinaryUint32OpInstr : public BinaryIntegerOpInstr {
  public:
-  UnarySmiOpInstr(Token::Kind op_kind,
-                  Value* value,
-                  intptr_t deopt_id)
-      : op_kind_(op_kind) {
-    ASSERT((op_kind == Token::kNEGATE) || (op_kind == Token::kBIT_NOT));
-    SetInputAt(0, value);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
+  BinaryUint32OpInstr(Token::Kind op_kind,
+                      Value* left,
+                      Value* right,
+                      intptr_t deopt_id)
+      : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
+    mark_truncating();
   }
 
-  Value* value() const { return inputs_[0]; }
-  Token::Kind op_kind() const { return op_kind_; }
+  virtual bool CanDeoptimize() const {
+    return false;
+  }
 
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
+  virtual Representation representation() const {
+    return kUnboxedUint32;
+  }
 
-  DECLARE_INSTRUCTION(UnarySmiOp)
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT((idx == 0) || (idx == 1));
+    return kUnboxedUint32;
+  }
+
   virtual CompileType ComputeType() const;
 
-  virtual bool CanDeoptimize() const { return op_kind() == Token::kNEGATE; }
-
-  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 other->AsUnarySmiOp()->op_kind() == op_kind();
-  }
-
-  virtual bool MayThrow() const { return false; }
+  DECLARE_INSTRUCTION(BinaryUint32Op)
 
  private:
-  const Token::Kind op_kind_;
+  DISALLOW_COPY_AND_ASSIGN(BinaryUint32OpInstr);
+};
 
-  DISALLOW_COPY_AND_ASSIGN(UnarySmiOpInstr);
+
+class ShiftUint32OpInstr : public BinaryIntegerOpInstr {
+ public:
+  ShiftUint32OpInstr(Token::Kind op_kind,
+                     Value* left,
+                     Value* right,
+                     intptr_t deopt_id)
+      : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
+    ASSERT((op_kind == Token::kSHR) || (op_kind == Token::kSHL));
+  }
+
+  virtual bool CanDeoptimize() const { return true; }
+
+  virtual Representation representation() const {
+    return kUnboxedUint32;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT((idx == 0) || (idx == 1));
+    return (idx == 0) ? kUnboxedUint32 : kTagged;
+  }
+
+  virtual CompileType ComputeType() const;
+
+  DECLARE_INSTRUCTION(ShiftUint32Op)
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ShiftUint32OpInstr);
+};
+
+
+class BinaryMintOpInstr : public BinaryIntegerOpInstr {
+ public:
+  BinaryMintOpInstr(Token::Kind op_kind,
+                    Value* left,
+                    Value* right,
+                    intptr_t deopt_id)
+      : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
+  }
+
+  virtual bool CanDeoptimize() const {
+    return FLAG_throw_on_javascript_int_overflow
+        || (can_overflow() && ((op_kind() == Token::kADD) ||
+                               (op_kind() == Token::kSUB)))
+        || (op_kind() == Token::kMUL);  // Deopt if inputs are not int32.
+  }
+
+  virtual Representation representation() const {
+    return kUnboxedMint;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT((idx == 0) || (idx == 1));
+    return kUnboxedMint;
+  }
+
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
+  virtual CompileType ComputeType() const;
+
+  DECLARE_INSTRUCTION(BinaryMintOp)
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BinaryMintOpInstr);
+};
+
+
+class ShiftMintOpInstr : public BinaryIntegerOpInstr {
+ public:
+  ShiftMintOpInstr(Token::Kind op_kind,
+                   Value* left,
+                   Value* right,
+                   intptr_t deopt_id)
+      : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
+    ASSERT((op_kind == Token::kSHR) || (op_kind == Token::kSHL));
+  }
+
+  virtual bool CanDeoptimize() const {
+    return FLAG_throw_on_javascript_int_overflow
+        || has_shift_count_check()
+        || (can_overflow() && (op_kind() == Token::kSHL));
+  }
+
+  virtual Representation representation() const {
+    return kUnboxedMint;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT((idx == 0) || (idx == 1));
+    return (idx == 0) ? kUnboxedMint : kTagged;
+  }
+
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
+  virtual CompileType ComputeType() const;
+
+  DECLARE_INSTRUCTION(ShiftMintOp)
+
+ private:
+  bool has_shift_count_check() const;
+
+  DISALLOW_COPY_AND_ASSIGN(ShiftMintOpInstr);
 };
 
 
@@ -7180,8 +7225,6 @@
     return kUnboxedDouble;
   }
 
-  virtual intptr_t ArgumentCount() const { return 1; }
-
   virtual bool CanDeoptimize() const { return false; }
 
   virtual bool AllowsCSE() const { return true; }
@@ -7232,6 +7275,49 @@
 };
 
 
+class MintToDoubleInstr : public TemplateDefinition<1> {
+ public:
+  MintToDoubleInstr(Value* value, intptr_t deopt_id)
+      : deopt_id_(deopt_id) {
+    SetInputAt(0, value);
+  }
+
+  Value* value() const { return inputs_[0]; }
+
+  DECLARE_INSTRUCTION(MintToDouble)
+  virtual CompileType ComputeType() const;
+
+  virtual Representation RequiredInputRepresentation(intptr_t index) const {
+    ASSERT(index == 0);
+    return kUnboxedMint;
+  }
+
+  virtual Representation representation() const {
+    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_;
+  }
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  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:
+  const intptr_t deopt_id_;
+
+  DISALLOW_COPY_AND_ASSIGN(MintToDoubleInstr);
+};
+
+
 class DoubleToIntegerInstr : public TemplateDefinition<1> {
  public:
   DoubleToIntegerInstr(Value* value, InstanceCallInstr* instance_call)
@@ -7761,6 +7847,8 @@
 
   virtual bool MayThrow() const { return false; }
 
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
  private:
   intptr_t cid_;
 
@@ -7813,183 +7901,6 @@
 };
 
 
-class BinaryUint32OpInstr : public TemplateDefinition<2> {
- public:
-  BinaryUint32OpInstr(Token::Kind op_kind,
-                      Value* left,
-                      Value* right,
-                      intptr_t deopt_id)
-      : op_kind_(op_kind) {
-    SetInputAt(0, left);
-    SetInputAt(1, right);
-    // Override generated deopt-id.
-    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 void PrintOperandsTo(BufferFormatter* f) const;
-
-  virtual bool CanDeoptimize() const {
-    return false;
-  }
-
-  virtual Representation representation() const {
-    return kUnboxedUint32;
-  }
-
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    ASSERT((idx == 0) || (idx == 1));
-    return kUnboxedUint32;
-  }
-
-  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_;
-  }
-
-  virtual Definition* Canonicalize(FlowGraph* flow_graph);
-
-  DECLARE_INSTRUCTION(BinaryUint32Op)
-  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->IsBinaryUint32Op());
-    return op_kind() == other->AsBinaryUint32Op()->op_kind();
-  }
-
-  virtual bool MayThrow() const { return false; }
-
- private:
-  const Token::Kind op_kind_;
-
-  DISALLOW_COPY_AND_ASSIGN(BinaryUint32OpInstr);
-};
-
-
-class ShiftUint32OpInstr : public TemplateDefinition<2> {
- public:
-  ShiftUint32OpInstr(Token::Kind op_kind,
-                     Value* left,
-                     Value* right,
-                     intptr_t deopt_id)
-      : op_kind_(op_kind) {
-    ASSERT(op_kind == Token::kSHR || op_kind == Token::kSHL);
-    SetInputAt(0, left);
-    SetInputAt(1, right);
-    // Override generated deopt-id.
-    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 void PrintOperandsTo(BufferFormatter* f) const;
-
-  virtual bool CanDeoptimize() const {
-    return true;
-  }
-
-  virtual CompileType ComputeType() const;
-
-  virtual Representation representation() const {
-    return kUnboxedUint32;
-  }
-
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    ASSERT((idx == 0) || (idx == 1));
-    return (idx == 0) ? kUnboxedUint32 : kTagged;
-  }
-
-  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(ShiftUint32Op)
-
-  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->AsShiftUint32Op()->op_kind();
-  }
-
-  virtual bool MayThrow() const { return false; }
-
- private:
-  const Token::Kind op_kind_;
-
-  DISALLOW_COPY_AND_ASSIGN(ShiftUint32OpInstr);
-};
-
-
-class UnaryUint32OpInstr : public TemplateDefinition<1> {
- public:
-  UnaryUint32OpInstr(Token::Kind op_kind,
-                     Value* value,
-                     intptr_t deopt_id)
-      : op_kind_(op_kind) {
-    ASSERT(op_kind == Token::kBIT_NOT);
-    SetInputAt(0, value);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
-  }
-
-  Value* value() const { return inputs_[0]; }
-
-  Token::Kind op_kind() const { return op_kind_; }
-
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
-
-  virtual bool CanDeoptimize() const {
-    return false;
-  }
-
-  virtual Representation representation() const {
-    return kUnboxedUint32;
-  }
-
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    ASSERT(idx == 0);
-    return kUnboxedUint32;
-  }
-
-  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(UnaryUint32Op)
-  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->AsUnaryUint32Op()->op_kind();
-  }
-
-  virtual bool MayThrow() const { return false; }
-
- private:
-  const Token::Kind op_kind_;
-
-  DISALLOW_COPY_AND_ASSIGN(UnaryUint32OpInstr);
-};
-
-
 class BoxIntNInstr : public TemplateDefinition<1> {
  public:
   BoxIntNInstr(Representation representation, Value* value)
@@ -8027,9 +7938,8 @@
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
-  virtual BoxIntNInstr* AsBoxIntN() { return this; }
-
-  DECLARE_INSTRUCTION_BACKEND(BoxIntN)
+  DEFINE_INSTRUCTION_TYPE_CHECK(BoxIntN)
+  DECLARE_INSTRUCTION_BACKEND()
 
  private:
   const Representation from_representation_;
@@ -8099,11 +8009,10 @@
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
-  virtual UnboxIntNInstr* AsUnboxIntN() { return this; }
-
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
-  DECLARE_INSTRUCTION_BACKEND(UnboxIntNInstr);
+  DEFINE_INSTRUCTION_TYPE_CHECK(UnboxIntN)
+  DECLARE_INSTRUCTION_BACKEND()
 
  private:
   const Representation representation_;
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 1716228..9f0fc6f 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -2845,7 +2845,6 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
@@ -2858,34 +2857,22 @@
     // Immediate shift operation takes 5 bits for the count.
     const intptr_t kCountLimit = 0x1F;
     const intptr_t value = Smi::Cast(constant).Value();
-    if (value == 0) {
-      __ MoveRegister(result, left);
-    } else if ((value < 0) || (value >= kCountLimit)) {
-      // This condition may not be known earlier in some cases because
-      // of constant propagation, inlining, etc.
-      if ((value >= kCountLimit) && is_truncating) {
-        __ mov(result, Operand(0));
-      } else {
-        // Result is Mint or exception.
-        __ b(deopt);
-      }
-    } else {
-      if (!is_truncating) {
-        // Check for overflow (preserve left).
-        __ Lsl(IP, left, value);
-        __ cmp(left, Operand(IP, ASR, value));
-        __ b(deopt, NE);  // Overflow.
-      }
-      // Shift for result now we know there is no overflow.
-      __ Lsl(result, left, value);
+    ASSERT((0 < value) && (value < kCountLimit));
+    if (shift_left->can_overflow()) {
+      // Check for overflow (preserve left).
+      __ Lsl(IP, left, value);
+      __ cmp(left, Operand(IP, ASR, value));
+      __ b(deopt, NE);  // Overflow.
     }
+    // Shift for result now we know there is no overflow.
+    __ Lsl(result, left, value);
     return;
   }
 
   // Right (locs.in(1)) is not constant.
   const Register right = locs.in(1).reg();
   Range* right_range = shift_left->right()->definition()->range();
-  if (shift_left->left()->BindsToConstant() && !is_truncating) {
+  if (shift_left->left()->BindsToConstant() && shift_left->can_overflow()) {
     // TODO(srdjan): Implement code below for is_truncating().
     // If left is constant, we know the maximal allowed size for right.
     const Object& obj = shift_left->left()->BoundConstant();
@@ -2912,7 +2899,7 @@
 
   const bool right_needs_check =
       !RangeUtils::IsWithin(right_range, 0, (Smi::kBits - 1));
-  if (is_truncating) {
+  if (!shift_left->can_overflow()) {
     if (right_needs_check) {
       const bool right_may_be_negative =
           (right_range == NULL) || !right_range->IsPositive();
@@ -2963,7 +2950,7 @@
     }
   } else if (op_kind() == Token::kMOD) {
     num_temps = 2;
-  } else if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
+  } else if (((op_kind() == Token::kSHL) && can_overflow()) ||
              (op_kind() == Token::kSHR)) {
     num_temps = 1;
   } else if ((op_kind() == Token::kMUL) &&
@@ -2996,7 +2983,7 @@
   }
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
-  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
+  if (((op_kind() == Token::kSHL) && can_overflow()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
   }
@@ -3054,55 +3041,32 @@
         // Keep left value tagged and untag right value.
         const intptr_t value = Smi::Cast(constant).Value();
         if (deopt == NULL) {
-          if (value == 2) {
-            __ mov(result, Operand(left, LSL, 1));
-          } else {
-            __ LoadImmediate(IP, value);
-            __ mul(result, left, IP);
-          }
+          __ LoadImmediate(IP, value);
+          __ mul(result, left, IP);
         } else {
-          if (value == 2) {
-            __ mov(IP, Operand(left, ASR, 31));  // IP = sign of left.
-            __ mov(result, Operand(left, LSL, 1));
+          if (TargetCPUFeatures::arm_version() == ARMv7) {
+            __ LoadImmediate(IP, value);
+            __ smull(result, IP, left, IP);
             // IP: result bits 32..63.
             __ cmp(IP, Operand(result, ASR, 31));
             __ b(deopt, NE);
+          } else if (TargetCPUFeatures::can_divide()) {
+            const QRegister qtmp = locs()->temp(0).fpu_reg();
+            const DRegister dtmp0 = EvenDRegisterOf(qtmp);
+            const DRegister dtmp1 = OddDRegisterOf(qtmp);
+            __ LoadImmediate(IP, value);
+            __ CheckMultSignedOverflow(left, IP, result, dtmp0, dtmp1, deopt);
+            __ mul(result, left, IP);
           } else {
-            if (TargetCPUFeatures::arm_version() == ARMv7) {
-              __ LoadImmediate(IP, value);
-              __ smull(result, IP, left, IP);
-              // IP: result bits 32..63.
-              __ cmp(IP, Operand(result, ASR, 31));
-              __ b(deopt, NE);
-            } else if (TargetCPUFeatures::can_divide()) {
-              const QRegister qtmp = locs()->temp(0).fpu_reg();
-              const DRegister dtmp0 = EvenDRegisterOf(qtmp);
-              const DRegister dtmp1 = OddDRegisterOf(qtmp);
-              __ LoadImmediate(IP, value);
-              __ CheckMultSignedOverflow(left, IP, result, dtmp0, dtmp1, deopt);
-              __ mul(result, left, IP);
-            } else {
-             // TODO(vegorov): never emit this instruction if hardware does not
-             // support it! This will lead to deopt cycle penalizing the code.
-              __ b(deopt);
-            }
+           // TODO(vegorov): never emit this instruction if hardware does not
+           // support it! This will lead to deopt cycle penalizing the code.
+            __ b(deopt);
           }
         }
         break;
       }
       case Token::kTRUNCDIV: {
         const intptr_t value = Smi::Cast(constant).Value();
-        if (value == 1) {
-          __ MoveRegister(result, left);
-          break;
-        } else if (value == -1) {
-          // Check the corner case of dividing the 'MIN_SMI' with -1, in which
-          // case we cannot negate the result.
-          __ CompareImmediate(left, 0x80000000);
-          __ b(deopt, EQ);
-          __ rsb(result, left, Operand(0));
-          break;
-        }
         ASSERT(Utils::IsPowerOfTwo(Utils::Abs(value)));
         const intptr_t shift_count =
             Utils::ShiftForPowerOfTwo(Utils::Abs(value)) + kSmiTagSize;
@@ -3158,23 +3122,7 @@
         // sarl operation masks the count to 5 bits.
         const intptr_t kCountLimit = 0x1F;
         intptr_t value = Smi::Cast(constant).Value();
-
-        if (value == 0) {
-          // TODO(vegorov): should be handled outside.
-          __ MoveRegister(result, left);
-          break;
-        } else if (value < 0) {
-          // TODO(vegorov): should be handled outside.
-          __ b(deopt);
-          break;
-        }
-
-        value = value + kSmiTagSize;
-        if (value >= kCountLimit) {
-          value = kCountLimit;
-        }
-
-        __ Asr(result, left, value);
+        __ Asr(result, left, Utils::Minimum(value + kSmiTagSize, kCountLimit));
         __ SmiTag(result);
         break;
       }
@@ -3350,7 +3298,6 @@
 
 static void EmitInt32ShiftLeft(FlowGraphCompiler* compiler,
                                BinaryInt32OpInstr* shift_left) {
-  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
@@ -3363,27 +3310,15 @@
   // Immediate shift operation takes 5 bits for the count.
   const intptr_t kCountLimit = 0x1F;
   const intptr_t value = Smi::Cast(constant).Value();
-  if (value == 0) {
-    __ MoveRegister(result, left);
-  } else if ((value < 0) || (value >= kCountLimit)) {
-    // This condition may not be known earlier in some cases because
-    // of constant propagation, inlining, etc.
-    if ((value >= kCountLimit) && is_truncating) {
-      __ mov(result, Operand(0));
-    } else {
-      // Result is Mint or exception.
-      __ b(deopt);
-    }
-  } else {
-    if (!is_truncating) {
-      // Check for overflow (preserve left).
-      __ Lsl(IP, left, value);
-      __ cmp(left, Operand(IP, ASR, value));
-      __ b(deopt, NE);  // Overflow.
-    }
-    // Shift for result now we know there is no overflow.
-    __ Lsl(result, left, value);
+  ASSERT((0 < value) && (value < kCountLimit));
+  if (shift_left->can_overflow()) {
+    // Check for overflow (preserve left).
+    __ Lsl(IP, left, value);
+    __ cmp(left, Operand(IP, ASR, value));
+    __ b(deopt, NE);  // Overflow.
   }
+  // Shift for result now we know there is no overflow.
+  __ Lsl(result, left, value);
 }
 
 
@@ -3392,7 +3327,7 @@
   const intptr_t kNumInputs = 2;
   // Calculate number of temporaries.
   intptr_t num_temps = 0;
-  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
+  if (((op_kind() == Token::kSHL) && can_overflow()) ||
       (op_kind() == Token::kSHR)) {
     num_temps = 1;
   } else if ((op_kind() == Token::kMUL) &&
@@ -3403,7 +3338,7 @@
       isolate, kNumInputs, num_temps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
-  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
+  if (((op_kind() == Token::kSHL) && can_overflow()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
   }
@@ -3435,7 +3370,7 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    const int32_t value = Smi::Cast(constant).Value();
+    const intptr_t value = Smi::Cast(constant).Value();
     switch (op_kind()) {
       case Token::kADD: {
         if (deopt == NULL) {
@@ -3459,36 +3394,26 @@
       }
       case Token::kMUL: {
         if (deopt == NULL) {
-          if (value == 2) {
-            __ mov(result, Operand(left, LSL, 1));
-          } else {
-            __ LoadImmediate(IP, value);
-            __ mul(result, left, IP);
-          }
+          __ LoadImmediate(IP, value);
+          __ mul(result, left, IP);
         } else {
-          if (value == 2) {
-            __ CompareImmediate(left, 0xC0000000);
-            __ b(deopt, MI);
-            __ mov(result, Operand(left, LSL, 1));
+          if (TargetCPUFeatures::arm_version() == ARMv7) {
+            __ LoadImmediate(IP, value);
+            __ smull(result, IP, left, IP);
+            // IP: result bits 32..63.
+            __ cmp(IP, Operand(result, ASR, 31));
+            __ b(deopt, NE);
+          } else if (TargetCPUFeatures::can_divide()) {
+            const QRegister qtmp = locs()->temp(0).fpu_reg();
+            const DRegister dtmp0 = EvenDRegisterOf(qtmp);
+            const DRegister dtmp1 = OddDRegisterOf(qtmp);
+            __ LoadImmediate(IP, value);
+            __ CheckMultSignedOverflow(left, IP, result, dtmp0, dtmp1, deopt);
+            __ mul(result, left, IP);
           } else {
-            if (TargetCPUFeatures::arm_version() == ARMv7) {
-              __ LoadImmediate(IP, value);
-              __ smull(result, IP, left, IP);
-              // IP: result bits 32..63.
-              __ cmp(IP, Operand(result, ASR, 31));
-              __ b(deopt, NE);
-            } else if (TargetCPUFeatures::can_divide()) {
-              const QRegister qtmp = locs()->temp(0).fpu_reg();
-              const DRegister dtmp0 = EvenDRegisterOf(qtmp);
-              const DRegister dtmp1 = OddDRegisterOf(qtmp);
-              __ LoadImmediate(IP, value);
-              __ CheckMultSignedOverflow(left, IP, result, dtmp0, dtmp1, deopt);
-              __ mul(result, left, IP);
-            } else {
-              // TODO(vegorov): never emit this instruction if hardware does not
-              // support it! This will lead to deopt cycle penalizing the code.
-              __ b(deopt);
-            }
+            // TODO(vegorov): never emit this instruction if hardware does not
+            // support it! This will lead to deopt cycle penalizing the code.
+            __ b(deopt);
           }
         }
         break;
@@ -3531,22 +3456,7 @@
       case Token::kSHR: {
         // sarl operation masks the count to 5 bits.
         const intptr_t kCountLimit = 0x1F;
-
-        if (value == 0) {
-          // TODO(vegorov): should be handled outside.
-          __ MoveRegister(result, left);
-          break;
-        } else if (value < 0) {
-          // TODO(vegorov): should be handled outside.
-          __ b(deopt);
-          break;
-        }
-
-        if (value >= kCountLimit) {
-          __ Asr(result, left, kCountLimit);
-        } else {
-          __ Asr(result, left, value);
-        }
+        __ Asr(result, left, Utils::Minimum(value, kCountLimit));
         break;
       }
 
@@ -5378,6 +5288,18 @@
 }
 
 
+LocationSummary* MintToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MintToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -5848,12 +5770,6 @@
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(
-      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
-  if (ic_data().NumberOfChecks() == 0) {
-    __ b(deopt);
-    return;
-  }
   ASSERT(ic_data().NumArgsTested() == 1);
   if (!with_checks()) {
     ASSERT(ic_data().HasOneTarget());
@@ -5872,6 +5788,8 @@
   __ LoadFromOffset(kWord, R0, SP,
                     (instance_call()->ArgumentCount() - 1) * kWordSize);
 
+  Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
   LoadValueCid(compiler, R2, R0,
                (ic_data().GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
 
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index c977a8e..da1e92a 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -179,7 +179,7 @@
   if (is_power_of_two_kind) {
     const intptr_t shift =
         Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value));
-    __ Lsl(result, result, shift + kSmiTagSize);
+    __ LslImmediate(result, result, shift + kSmiTagSize);
   } else {
     __ sub(result, result, Operand(1));
     const int64_t val =
@@ -848,7 +848,7 @@
       result, reinterpret_cast<uword>(Symbols::PredefinedAddress()), PP);
   __ AddImmediate(
       result, result, Symbols::kNullCharCodeSymbolOffset * kWordSize, PP);
-  __ Asr(TMP, char_code, kSmiTagShift);  // Untag to use scaled adress mode.
+  __ SmiUntag(TMP, char_code);  // Untag to use scaled adress mode.
   __ ldr(result, Address(result, TMP, UXTX, Address::Scaled));
 }
 
@@ -2532,7 +2532,6 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
@@ -2545,27 +2544,15 @@
     // Immediate shift operation takes 6 bits for the count.
     const intptr_t kCountLimit = 0x3F;
     const intptr_t value = Smi::Cast(constant).Value();
-    if (value == 0) {
-      __ mov(result, left);
-    } else if ((value < 0) || (value >= kCountLimit)) {
-      // This condition may not be known earlier in some cases because
-      // of constant propagation, inlining, etc.
-      if ((value >= kCountLimit) && is_truncating) {
-        __ mov(result, ZR);
-      } else {
-        // Result is Mint or exception.
-        __ b(deopt);
-      }
-    } else {
-      if (!is_truncating) {
-        // Check for overflow (preserve left).
-        __ Lsl(TMP, left, value);
-        __ cmp(left, Operand(TMP, ASR, value));
-        __ b(deopt, NE);  // Overflow.
-      }
-      // Shift for result now we know there is no overflow.
-      __ Lsl(result, left, value);
+    ASSERT((0 < value) && (value < kCountLimit));
+    if (shift_left->can_overflow()) {
+      // Check for overflow (preserve left).
+      __ LslImmediate(TMP, left, value);
+      __ cmp(left, Operand(TMP, ASR, value));
+      __ b(deopt, NE);  // Overflow.
     }
+    // Shift for result now we know there is no overflow.
+    __ LslImmediate(result, left, value);
     if (FLAG_throw_on_javascript_int_overflow) {
       EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result);
     }
@@ -2575,7 +2562,7 @@
   // Right (locs.in(1)) is not constant.
   const Register right = locs.in(1).reg();
   Range* right_range = shift_left->right()->definition()->range();
-  if (shift_left->left()->BindsToConstant() && !is_truncating) {
+  if (shift_left->left()->BindsToConstant() && shift_left->can_overflow()) {
     // TODO(srdjan): Implement code below for is_truncating().
     // If left is constant, we know the maximal allowed size for right.
     const Object& obj = shift_left->left()->BoundConstant();
@@ -2606,7 +2593,7 @@
 
   const bool right_needs_check =
       !RangeUtils::IsWithin(right_range, 0, (Smi::kBits - 1));
-  if (is_truncating) {
+  if (!shift_left->can_overflow()) {
     if (right_needs_check) {
       const bool right_may_be_negative =
           (right_range == NULL) || !right_range->IsPositive();
@@ -2655,7 +2642,7 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
-      (((op_kind() == Token::kSHL) && !IsTruncating()) ||
+      (((op_kind() == Token::kSHL) && can_overflow()) ||
        (op_kind() == Token::kSHR)) ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
@@ -2678,7 +2665,7 @@
   }
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
-  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
+  if (((op_kind() == Token::kSHL) && can_overflow()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
   }
@@ -2730,54 +2717,28 @@
       case Token::kMUL: {
         // Keep left value tagged and untag right value.
         const intptr_t value = Smi::Cast(constant).Value();
-        if (deopt == NULL) {
-          if (value == 2) {
-            __ Lsl(result, left, 1);
-          } else {
-            __ LoadImmediate(TMP, value, PP);
-            __ mul(result, left, TMP);
-          }
-        } else {
-          if (value == 2) {
-            __ Asr(TMP, left, 63);  // TMP = sign of left.
-            __ Lsl(result, left, 1);
-            // TMP: result bits 32..63.
-            __ cmp(TMP, Operand(result, ASR, 63));
-            __ b(deopt, NE);
-          } else {
-            __ LoadImmediate(TMP, value, PP);
-            __ mul(result, left, TMP);
-            __ smulh(TMP, left, TMP);
-            // TMP: result bits 64..127.
-            __ cmp(TMP, Operand(result, ASR, 63));
-            __ b(deopt, NE);
-          }
+        __ LoadImmediate(TMP, value, PP);
+        __ mul(result, left, TMP);
+        if (deopt != NULL) {
+          __ smulh(TMP, left, TMP);
+          // TMP: result bits 64..127.
+          __ cmp(TMP, Operand(result, ASR, 63));
+          __ b(deopt, NE);
         }
         break;
       }
       case Token::kTRUNCDIV: {
         const intptr_t value = Smi::Cast(constant).Value();
-        if (value == 1) {
-          __ mov(result, left);
-          break;
-        } else if (value == -1) {
-          // Check the corner case of dividing the 'MIN_SMI' with -1, in which
-          // case we cannot negate the result.
-          __ CompareImmediate(left, 0x8000000000000000LL, kNoPP);
-          __ b(deopt, EQ);
-          __ sub(result, ZR, Operand(left));
-          break;
-        }
         ASSERT(Utils::IsPowerOfTwo(Utils::Abs(value)));
         const intptr_t shift_count =
             Utils::ShiftForPowerOfTwo(Utils::Abs(value)) + kSmiTagSize;
         ASSERT(kSmiTagSize == 1);
-        __ Asr(TMP, left, 63);
+        __ AsrImmediate(TMP, left, 63);
         ASSERT(shift_count > 1);  // 1, -1 case handled above.
         const Register temp = TMP2;
         __ add(temp, left, Operand(TMP, LSR, 64 - shift_count));
         ASSERT(shift_count > 0);
-        __ Asr(result, temp, shift_count);
+        __ AsrImmediate(result, temp, shift_count);
         if (value < 0) {
           __ sub(result, ZR, Operand(result));
         }
@@ -2800,23 +2761,8 @@
         // Asr operation masks the count to 6 bits.
         const intptr_t kCountLimit = 0x3F;
         intptr_t value = Smi::Cast(constant).Value();
-
-        if (value == 0) {
-          // TODO(vegorov): should be handled outside.
-          __ mov(result, left);
-          break;
-        } else if (value < 0) {
-          // TODO(vegorov): should be handled outside.
-          __ b(deopt);
-          break;
-        }
-
-        value = value + kSmiTagSize;
-        if (value >= kCountLimit) {
-          value = kCountLimit;
-        }
-
-        __ Asr(result, left, value);
+        __ AsrImmediate(
+            result, left, Utils::Minimum(value + kSmiTagSize, kCountLimit));
         __ SmiTag(result);
         break;
       }
@@ -3054,7 +3000,7 @@
   if (value_cid == kDoubleCid) {
     __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP);
   } else if (value_cid == kSmiCid) {
-    __ Asr(TMP, value, kSmiTagSize);  // Untag input before conversion.
+    __ SmiUntag(TMP, value);  // Untag input before conversion.
     __ scvtfd(result, TMP);
   } else {
     Label* deopt = compiler->AddDeoptStub(deopt_id_,
@@ -3074,7 +3020,7 @@
       __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP);
       __ b(&done);
       __ Bind(&is_smi);
-      __ Asr(TMP, value, kSmiTagSize);  // Copy and untag.
+      __ SmiUntag(TMP, value);  // Copy and untag.
       __ scvtfd(result, TMP);
       __ Bind(&done);
     }
@@ -3429,18 +3375,18 @@
 
   // X lane.
   __ vmovrs(out, value, 0);
-  __ Lsr(out, out, 31);
+  __ LsrImmediate(out, out, 31);
   // Y lane.
   __ vmovrs(temp, value, 1);
-  __ Lsr(temp, temp, 31);
+  __ LsrImmediate(temp, temp, 31);
   __ orr(out, out, Operand(temp, LSL, 1));
   // Z lane.
   __ vmovrs(temp, value, 2);
-  __ Lsr(temp, temp, 31);
+  __ LsrImmediate(temp, temp, 31);
   __ orr(out, out, Operand(temp, LSL, 2));
   // W lane.
   __ vmovrs(temp, value, 3);
-  __ Lsr(temp, temp, 31);
+  __ LsrImmediate(temp, temp, 31);
   __ orr(out, out, Operand(temp, LSL, 3));
   // Tag.
   __ SmiTag(out);
@@ -3940,10 +3886,10 @@
 
     // Bits of X lane.
     __ vmovrd(out, value, 0);
-    __ Lsr(out, out, 63);
+    __ LsrImmediate(out, out, 63);
     // Bits of Y lane.
     __ vmovrd(TMP, value, 1);
-    __ Lsr(TMP, TMP, 63);
+    __ LsrImmediate(TMP, TMP, 63);
     __ orr(out, out, Operand(TMP, LSL, 1));
     // Tag.
     __ SmiTag(out);
@@ -4460,6 +4406,18 @@
 }
 
 
+LocationSummary* MintToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MintToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -4877,12 +4835,6 @@
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(
-      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
-  if (ic_data().NumberOfChecks() == 0) {
-    __ b(deopt);
-    return;
-  }
   ASSERT(ic_data().NumArgsTested() == 1);
   if (!with_checks()) {
     ASSERT(ic_data().HasOneTarget());
@@ -4901,6 +4853,8 @@
   __ LoadFromOffset(
       R0, SP, (instance_call()->ArgumentCount() - 1) * kWordSize, PP);
 
+  Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
   LoadValueCid(compiler, R2, R0,
                (ic_data().GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
 
@@ -4986,7 +4940,7 @@
       ASSERT(cids_.length() > 2);
       Register mask_reg = locs()->temp(1).reg();
       __ LoadImmediate(mask_reg, 1, PP);
-      __ Lsl(mask_reg, mask_reg, temp);
+      __ lslv(mask_reg, mask_reg, temp);
       __ TestImmediate(mask_reg, mask, PP);
       __ b(deopt, EQ);
     }
@@ -5255,12 +5209,12 @@
 
   ASSERT(kSmiTagSize == 1);
   // TODO(vegorov) implement and use UBFM/SBFM for this.
-  __ Lsl(out, value, 32);
+  __ LslImmediate(out, value, 32);
   if (from_representation() == kUnboxedInt32) {
-    __ Asr(out, out, 32 - kSmiTagSize);
+    __ AsrImmediate(out, out, 32 - kSmiTagSize);
   } else {
     ASSERT(from_representation() == kUnboxedUint32);
-    __ Lsr(out, out, 32 - kSmiTagSize);
+    __ LsrImmediate(out, out, 32 - kSmiTagSize);
   }
 }
 
@@ -5294,8 +5248,8 @@
     // TODO(vegorov) if we ensure that we never use kDoubleWord size
     // with it then we could avoid this.
     // TODO(vegorov) implement and use UBFM for zero extension.
-    __ Lsl(out, value, 32);
-    __ Lsr(out, out, 32);
+    __ LslImmediate(out, value, 32);
+    __ LsrImmediate(out, out, 32);
   } else if (from() == kUnboxedUint32 && to() == kUnboxedInt32) {
     // Representations are bitwise equivalent.
     // TODO(vegorov) if we ensure that we never use kDoubleWord size
@@ -5303,8 +5257,8 @@
     // TODO(vegorov) implement and use SBFM for sign extension.
     const Register value = locs()->in(0).reg();
     const Register out = locs()->out(0).reg();
-    __ Lsl(out, value, 32);
-    __ Asr(out, out, 32);
+    __ LslImmediate(out, value, 32);
+    __ AsrImmediate(out, out, 32);
     if (CanDeoptimize()) {
       Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 629a225..d931ba6 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -2663,7 +2663,6 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
@@ -2677,38 +2676,26 @@
     // shll operation masks the count to 5 bits.
     const intptr_t kCountLimit = 0x1F;
     const intptr_t value = Smi::Cast(constant).Value();
-    if (value == 0) {
-      // No code needed.
-    } else if ((value < 0) || (value >= kCountLimit)) {
-      // This condition may not be known earlier in some cases because
-      // of constant propagation, inlining, etc.
-      if ((value >= kCountLimit) && is_truncating) {
-        __ xorl(result, result);
-      } else {
-        // Result is Mint or exception.
-        __ jmp(deopt);
-      }
-    } else {
-      if (!is_truncating) {
-        // Check for overflow.
-        Register temp = locs.temp(0).reg();
-        __ movl(temp, left);
-        __ shll(left, Immediate(value));
-        __ sarl(left, Immediate(value));
-        __ cmpl(left, temp);
-        __ j(NOT_EQUAL, deopt);  // Overflow.
-      }
-      // Shift for result now we know there is no overflow.
+    ASSERT((0 < value) && (value < kCountLimit));
+    if (shift_left->can_overflow()) {
+      // Check for overflow.
+      Register temp = locs.temp(0).reg();
+      __ movl(temp, left);
       __ shll(left, Immediate(value));
+      __ sarl(left, Immediate(value));
+      __ cmpl(left, temp);
+      __ j(NOT_EQUAL, deopt);  // Overflow.
     }
+    // Shift for result now we know there is no overflow.
+    __ shll(left, Immediate(value));
     return;
   }
 
   // Right (locs.in(1)) is not constant.
   Register right = locs.in(1).reg();
   Range* right_range = shift_left->right()->definition()->range();
-  if (shift_left->left()->BindsToConstant() && !is_truncating) {
-    // TODO(srdjan): Implement code below for is_truncating().
+  if (shift_left->left()->BindsToConstant() && shift_left->can_overflow()) {
+    // TODO(srdjan): Implement code below for can_overflow().
     // If left is constant, we know the maximal allowed size for right.
     const Object& obj = shift_left->left()->BoundConstant();
     if (obj.IsSmi()) {
@@ -2735,7 +2722,7 @@
   const bool right_needs_check =
       !RangeUtils::IsWithin(right_range, 0, (Smi::kBits - 1));
   ASSERT(right == ECX);  // Count must be in ECX
-  if (is_truncating) {
+  if (!shift_left->can_overflow()) {
     if (right_needs_check) {
       const bool right_may_be_negative =
           (right_range == NULL) || !right_range->IsPositive();
@@ -2824,12 +2811,12 @@
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
-    const intptr_t kNumTemps = !IsTruncating() ? 1 : 0;
+    const intptr_t kNumTemps = can_overflow() ? 1 : 0;
     LocationSummary* summary = new(isolate) LocationSummary(
         isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
-    if (!IsTruncating()) {
+    if (can_overflow()) {
       summary->set_temp(0, Location::RequiresRegister());
     }
     summary->set_out(0, Location::SameAsFirstInput());
@@ -2851,6 +2838,38 @@
 }
 
 
+template<typename OperandType>
+static void EmitIntegerArithmetic(FlowGraphCompiler* compiler,
+                                  Token::Kind op_kind,
+                                  Register left,
+                                  const OperandType& right,
+                                  Label* deopt) {
+  switch (op_kind) {
+    case Token::kADD:
+      __ addl(left, right);
+      break;
+    case Token::kSUB:
+      __ subl(left, right);
+      break;
+    case Token::kBIT_AND:
+      __ andl(left, right);
+      break;
+    case Token::kBIT_OR:
+      __ orl(left, right);
+      break;
+    case Token::kBIT_XOR:
+      __ xorl(left, right);
+      break;
+    case Token::kMUL:
+      __ imull(left, right);
+      break;
+    default:
+      UNREACHABLE();
+  }
+  if (deopt != NULL) __ j(OVERFLOW, deopt);
+}
+
+
 void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (op_kind() == Token::kSHL) {
     EmitSmiShiftLeft(compiler, this);
@@ -2868,47 +2887,25 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    const int32_t imm = reinterpret_cast<int32_t>(constant.raw());
+    const intptr_t value = Smi::Cast(constant).Value();
     switch (op_kind()) {
-    case Token::kADD:
-        if (imm != 0) {
-          // Checking overflow without emitting an instruction would be wrong.
-          __ addl(left, Immediate(imm));
-          if (deopt != NULL) __ j(OVERFLOW, deopt);
-        }
-        break;
-      case Token::kSUB: {
-        if (imm != 0) {
-          // Checking overflow without emitting an instruction would be wrong.
-          __ subl(left, Immediate(imm));
-          if (deopt != NULL) __ j(OVERFLOW, deopt);
-        }
-        break;
-      }
+      case Token::kADD:
+      case Token::kSUB:
+      case Token::kBIT_AND:
+      case Token::kBIT_OR:
+      case Token::kBIT_XOR:
       case Token::kMUL: {
-        // Keep left value tagged and untag right value.
-        const intptr_t value = Smi::Cast(constant).Value();
-        if (value == 2) {
-          __ shll(left, Immediate(1));
-        } else {
-          __ imull(left, Immediate(value));
-        }
-        if (deopt != NULL) __ j(OVERFLOW, deopt);
+        const intptr_t imm = (op_kind() == Token::kMUL) ? value
+                                                        : Smi::RawValue(value);
+        EmitIntegerArithmetic(compiler,
+                              op_kind(),
+                              left,
+                              Immediate(imm),
+                              deopt);
         break;
       }
+
       case Token::kTRUNCDIV: {
-        const intptr_t value = Smi::Cast(constant).Value();
-        if (value == 1) {
-          // Do nothing.
-          break;
-        } else if (value == -1) {
-          // Check the corner case of dividing the 'MIN_SMI' with -1, in which
-          // case we cannot negate the result.
-          __ cmpl(left, Immediate(0x80000000));
-          __ j(EQUAL, deopt);
-          __ negl(left);
-          break;
-        }
         ASSERT(Utils::IsPowerOfTwo(Utils::Abs(value)));
         const intptr_t shift_count =
             Utils::ShiftForPowerOfTwo(Utils::Abs(value)) + kSmiTagSize;
@@ -2927,39 +2924,12 @@
         __ SmiTag(left);
         break;
       }
-      case Token::kBIT_AND: {
-        // No overflow check.
-        __ andl(left, Immediate(imm));
-        break;
-      }
-      case Token::kBIT_OR: {
-        // No overflow check.
-        __ orl(left, Immediate(imm));
-        break;
-      }
-      case Token::kBIT_XOR: {
-        // No overflow check.
-        __ xorl(left, Immediate(imm));
-        break;
-      }
+
       case Token::kSHR: {
         // sarl operation masks the count to 5 bits.
         const intptr_t kCountLimit = 0x1F;
-        intptr_t value = Smi::Cast(constant).Value();
-
-        if (value == 0) {
-          // TODO(vegorov): should be handled outside.
-          break;
-        } else if (value < 0) {
-          // TODO(vegorov): should be handled outside.
-          __ jmp(deopt);
-          break;
-        }
-
-        value = value + kSmiTagSize;
-        if (value >= kCountLimit) value = kCountLimit;
-
-        __ sarl(left, Immediate(value));
+        __ sarl(left, Immediate(
+            Utils::Minimum(value + kSmiTagSize, kCountLimit)));
         __ SmiTag(left);
         break;
       }
@@ -2973,79 +2943,30 @@
 
   if (locs()->in(1).IsStackSlot()) {
     const Address& right = locs()->in(1).ToStackSlotAddress();
-    switch (op_kind()) {
-      case Token::kADD: {
-        __ addl(left, right);
-        if (deopt != NULL) __ j(OVERFLOW, deopt);
-        break;
-      }
-      case Token::kSUB: {
-        __ subl(left, right);
-        if (deopt != NULL) __ j(OVERFLOW, deopt);
-        break;
-      }
-      case Token::kMUL: {
-        __ SmiUntag(left);
-        __ imull(left, right);
-        if (deopt != NULL) __ j(OVERFLOW, deopt);
-        break;
-      }
-      case Token::kBIT_AND: {
-        // No overflow check.
-        __ andl(left, right);
-        break;
-      }
-      case Token::kBIT_OR: {
-        // No overflow check.
-        __ orl(left, right);
-        break;
-      }
-      case Token::kBIT_XOR: {
-        // No overflow check.
-        __ xorl(left, right);
-        break;
-      }
-      default:
-        UNREACHABLE();
+    if (op_kind() == Token::kMUL) {
+      __ SmiUntag(left);
     }
+    EmitIntegerArithmetic(compiler, op_kind(), left, right, deopt);
     return;
-  }  // if locs()->in(1).IsStackSlot.
+  }
 
   // if locs()->in(1).IsRegister.
   Register right = locs()->in(1).reg();
   Range* right_range = this->right()->definition()->range();
   switch (op_kind()) {
-    case Token::kADD: {
-      __ addl(left, right);
-      if (deopt != NULL) __ j(OVERFLOW, deopt);
+    case Token::kADD:
+    case Token::kSUB:
+    case Token::kBIT_AND:
+    case Token::kBIT_OR:
+    case Token::kBIT_XOR:
+    case Token::kMUL:
+      if (op_kind() == Token::kMUL) {
+        __ SmiUntag(left);
+      }
+      EmitIntegerArithmetic(compiler, op_kind(), left, right, deopt);
       break;
-    }
-    case Token::kSUB: {
-      __ subl(left, right);
-      if (deopt != NULL) __ j(OVERFLOW, deopt);
-      break;
-    }
-    case Token::kMUL: {
-      __ SmiUntag(left);
-      __ imull(left, right);
-      if (deopt != NULL) __ j(OVERFLOW, deopt);
-      break;
-    }
-    case Token::kBIT_AND: {
-      // No overflow check.
-      __ andl(left, right);
-      break;
-    }
-    case Token::kBIT_OR: {
-      // No overflow check.
-      __ orl(left, right);
-      break;
-    }
-    case Token::kBIT_XOR: {
-      // No overflow check.
-      __ xorl(left, right);
-      break;
-    }
+
+
     case Token::kTRUNCDIV: {
       if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
         // Handle divide by zero in runtime.
@@ -3174,12 +3095,12 @@
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
-    const intptr_t kNumTemps = !IsTruncating() ? 1 : 0;
+    const intptr_t kNumTemps = can_overflow() ? 1 : 0;
     LocationSummary* summary = new(isolate) LocationSummary(
         isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
-    if (!IsTruncating()) {
+    if (can_overflow()) {
       summary->set_temp(0, Location::RequiresRegister());
     }
     summary->set_out(0, Location::SameAsFirstInput());
@@ -3203,7 +3124,6 @@
 
 static void EmitInt32ShiftLeft(FlowGraphCompiler* compiler,
                                BinaryInt32OpInstr* shift_left) {
-  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
@@ -3218,30 +3138,18 @@
   // shll operation masks the count to 5 bits.
   const intptr_t kCountLimit = 0x1F;
   const intptr_t value = Smi::Cast(constant).Value();
-  if (value == 0) {
-    // No code needed.
-  } else if ((value < 0) || (value >= kCountLimit)) {
-    // This condition may not be known earlier in some cases because
-    // of constant propagation, inlining, etc.
-    if ((value >= kCountLimit) && is_truncating) {
-      __ xorl(result, result);
-    } else {
-      // Result is Mint or exception.
-      __ jmp(deopt);
-    }
-  } else {
-    if (!is_truncating) {
-      // Check for overflow.
-      Register temp = locs.temp(0).reg();
-      __ movl(temp, left);
-      __ shll(left, Immediate(value));
-      __ sarl(left, Immediate(value));
-      __ cmpl(left, temp);
-      __ j(NOT_EQUAL, deopt);  // Overflow.
-    }
-    // Shift for result now we know there is no overflow.
+  ASSERT((0 < value) && (value < kCountLimit));
+  if (shift_left->can_overflow()) {
+    // Check for overflow.
+    Register temp = locs.temp(0).reg();
+    __ movl(temp, left);
     __ shll(left, Immediate(value));
+    __ sarl(left, Immediate(value));
+    __ cmpl(left, temp);
+    __ j(NOT_EQUAL, deopt);  // Overflow.
   }
+  // Shift for result now we know there is no overflow.
+  __ shll(left, Immediate(value));
 }
 
 
@@ -3264,67 +3172,30 @@
     ASSERT(constant.IsSmi());
     const intptr_t value = Smi::Cast(constant).Value();
     switch (op_kind()) {
-    case Token::kADD:
-        if (value != 0) {
-          // Checking overflow without emitting an instruction would be wrong.
-          __ addl(left, Immediate(value));
-          if (deopt != NULL) __ j(OVERFLOW, deopt);
-        }
+      case Token::kADD:
+      case Token::kSUB:
+      case Token::kMUL:
+      case Token::kBIT_AND:
+      case Token::kBIT_OR:
+      case Token::kBIT_XOR:
+        EmitIntegerArithmetic(compiler,
+                              op_kind(),
+                              left,
+                              Immediate(value),
+                              deopt);
         break;
-      case Token::kSUB: {
-        if (value != 0) {
-          // Checking overflow without emitting an instruction would be wrong.
-          __ subl(left, Immediate(value));
-          if (deopt != NULL) __ j(OVERFLOW, deopt);
-        }
-        break;
-      }
-      case Token::kMUL: {
-        if (value == 2) {
-          __ shll(left, Immediate(1));
-        } else {
-          __ imull(left, Immediate(value));
-        }
-        if (deopt != NULL) __ j(OVERFLOW, deopt);
-        break;
-      }
+
+
+
       case Token::kTRUNCDIV: {
         UNREACHABLE();
         break;
       }
-      case Token::kBIT_AND: {
-        // No overflow check.
-        __ andl(left, Immediate(value));
-        break;
-      }
-      case Token::kBIT_OR: {
-        // No overflow check.
-        __ orl(left, Immediate(value));
-        break;
-      }
-      case Token::kBIT_XOR: {
-        // No overflow check.
-        __ xorl(left, Immediate(value));
-        break;
-      }
+
       case Token::kSHR: {
         // sarl operation masks the count to 5 bits.
         const intptr_t kCountLimit = 0x1F;
-        if (value == 0) {
-          // TODO(vegorov): should be handled outside.
-          break;
-        } else if (value < 0) {
-          // TODO(vegorov): should be handled outside.
-          __ jmp(deopt);
-          break;
-        }
-
-        if (value >= kCountLimit) {
-          __ sarl(left, Immediate(kCountLimit));
-        } else {
-          __ sarl(left, Immediate(value));
-        }
-
+        __ sarl(left, Immediate(Utils::Minimum(value, kCountLimit)));
         break;
       }
 
@@ -3337,101 +3208,30 @@
 
   if (locs()->in(1).IsStackSlot()) {
     const Address& right = locs()->in(1).ToStackSlotAddress();
-    switch (op_kind()) {
-      case Token::kADD: {
-        __ addl(left, right);
-        if (deopt != NULL) __ j(OVERFLOW, deopt);
-        break;
-      }
-      case Token::kSUB: {
-        __ subl(left, right);
-        if (deopt != NULL) __ j(OVERFLOW, deopt);
-        break;
-      }
-      case Token::kMUL: {
-        __ imull(left, right);
-        if (deopt != NULL) __ j(OVERFLOW, deopt);
-        break;
-      }
-      case Token::kBIT_AND: {
-        // No overflow check.
-        __ andl(left, right);
-        break;
-      }
-      case Token::kBIT_OR: {
-        // No overflow check.
-        __ orl(left, right);
-        break;
-      }
-      case Token::kBIT_XOR: {
-        // No overflow check.
-        __ xorl(left, right);
-        break;
-      }
-      default:
-        UNREACHABLE();
-    }
+    EmitIntegerArithmetic(compiler,
+                          op_kind(),
+                          left,
+                          right,
+                          deopt);
     return;
   }  // if locs()->in(1).IsStackSlot.
 
   // if locs()->in(1).IsRegister.
   Register right = locs()->in(1).reg();
   switch (op_kind()) {
-    case Token::kADD: {
-      __ addl(left, right);
-      if (deopt != NULL) __ j(OVERFLOW, deopt);
+    case Token::kADD:
+    case Token::kSUB:
+    case Token::kMUL:
+    case Token::kBIT_AND:
+    case Token::kBIT_OR:
+    case Token::kBIT_XOR:
+      EmitIntegerArithmetic(compiler,
+                            op_kind(),
+                            left,
+                            right,
+                            deopt);
       break;
-    }
-    case Token::kSUB: {
-      __ subl(left, right);
-      if (deopt != NULL) __ j(OVERFLOW, deopt);
-      break;
-    }
-    case Token::kMUL: {
-      __ imull(left, right);
-      if (deopt != NULL) __ j(OVERFLOW, deopt);
-      break;
-    }
-    case Token::kBIT_AND: {
-      // No overflow check.
-      __ andl(left, right);
-      break;
-    }
-    case Token::kBIT_OR: {
-      // No overflow check.
-      __ orl(left, right);
-      break;
-    }
-    case Token::kBIT_XOR: {
-      // No overflow check.
-      __ xorl(left, right);
-      break;
-    }
-    case Token::kTRUNCDIV: {
-      UNREACHABLE();
-      break;
-    }
-    case Token::kMOD: {
-      UNREACHABLE();
-      break;
-    }
-    case Token::kSHR: {
-      UNREACHABLE();
-      break;
-    }
-    case Token::kDIV: {
-      // Dispatches to 'Double./'.
-      // TODO(srdjan): Implement as conversion to double and double division.
-      UNREACHABLE();
-      break;
-    }
-    case Token::kOR:
-    case Token::kAND: {
-      // Flow graph builder has dissected this operation to guarantee correct
-      // behavior (short-circuit evaluation).
-      UNREACHABLE();
-      break;
-    }
+
     default:
       UNREACHABLE();
       break;
@@ -3439,6 +3239,49 @@
 }
 
 
+LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = (op_kind() == Token::kMUL) ? 1 : 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  if (op_kind() == Token::kMUL) {
+    summary->set_in(0, Location::RegisterLocation(EAX));
+    summary->set_temp(0, Location::RegisterLocation(EDX));
+  } else {
+    summary->set_in(0, Location::RequiresRegister());
+  }
+  summary->set_in(1, Location::RequiresRegister());
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(out == left);
+  switch (op_kind()) {
+    case Token::kBIT_AND:
+    case Token::kBIT_OR:
+    case Token::kBIT_XOR:
+    case Token::kADD:
+    case Token::kSUB:
+      EmitIntegerArithmetic(compiler, op_kind(), left, right, NULL);
+      return;
+
+    case Token::kMUL:
+      __ mull(right);  // Result in EDX:EAX.
+      ASSERT(out == EAX);
+      ASSERT(locs()->temp(0).reg() == EDX);
+      break;
+    default:
+      UNREACHABLE();
+  }
+}
+
+
 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
                                                              bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
@@ -5012,6 +4855,41 @@
 }
 
 
+LocationSummary* MintToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  result->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                   Location::RequiresRegister()));
+  result->set_out(0, Location::RequiresFpuRegister());
+  return result;
+}
+
+
+void MintToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  PairLocation* pair = locs()->in(0).AsPairLocation();
+  Register in_lo = pair->At(0).reg();
+  Register in_hi = pair->At(1).reg();
+
+  FpuRegister result = locs()->out(0).fpu_reg();
+
+  // Push hi.
+  __ pushl(in_hi);
+  // Push lo.
+  __ pushl(in_lo);
+  // Perform conversion from Mint to double.
+  __ fildl(Address(ESP, 0));
+  // Pop FPU stack onto regular stack.
+  __ fstpl(Address(ESP, 0));
+  // Copy into result.
+  __ movsd(result, Address(ESP, 0));
+  // Pop args.
+  __ addl(ESP, Immediate(2 * kWordSize));
+}
+
+
 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -5514,12 +5392,6 @@
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(
-      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
-  if (ic_data().NumberOfUsedChecks() == 0) {
-    __ jmp(deopt);
-    return;
-  }
   ASSERT(ic_data().NumArgsTested() == 1);
   if (!with_checks()) {
     ASSERT(ic_data().HasOneTarget());
@@ -5538,6 +5410,8 @@
   __ movl(EAX,
       Address(ESP, (instance_call()->ArgumentCount() - 1) * kWordSize));
 
+  Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
   LoadValueCid(compiler, EDI, EAX,
                (ic_data().GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
 
@@ -6229,56 +6103,6 @@
 }
 
 
-LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
-                                                          bool opt) const {
-  const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = (op_kind() == Token::kMUL) ? 1 : 0;
-  LocationSummary* summary = new(isolate) LocationSummary(
-      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-  if (op_kind() == Token::kMUL) {
-    summary->set_in(0, Location::RegisterLocation(EAX));
-    summary->set_temp(0, Location::RegisterLocation(EDX));
-  } else {
-    summary->set_in(0, Location::RequiresRegister());
-  }
-  summary->set_in(1, Location::RequiresRegister());
-  summary->set_out(0, Location::SameAsFirstInput());
-  return summary;
-}
-
-
-void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register left = locs()->in(0).reg();
-  Register right = locs()->in(1).reg();
-  Register out = locs()->out(0).reg();
-  ASSERT(out == left);
-  switch (op_kind()) {
-    case Token::kBIT_AND:
-      __ andl(out, right);
-      break;
-    case Token::kBIT_OR:
-      __ orl(out, right);
-      break;
-    case Token::kBIT_XOR:
-      __ xorl(out, right);
-      break;
-    case Token::kADD:
-      __ addl(out, right);
-      break;
-    case Token::kSUB:
-      __ subl(out, right);
-      break;
-    case Token::kMUL:
-      __ mull(right);  // Result in EDX:EAX.
-      ASSERT(out == EAX);
-      ASSERT(locs()->temp(0).reg() == EDX);
-      break;
-    default:
-      UNREACHABLE();
-  }
-}
-
-
 LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 4462f6e..4a69d11 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -2629,7 +2629,6 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
@@ -2645,36 +2644,22 @@
     // Immediate shift operation takes 5 bits for the count.
     const intptr_t kCountLimit = 0x1F;
     const intptr_t value = Smi::Cast(constant).Value();
-    if (value == 0) {
-      if (result != left) {
-        __ mov(result, left);
-      }
-    } else if ((value < 0) || (value >= kCountLimit)) {
-      // This condition may not be known earlier in some cases because
-      // of constant propagation, inlining, etc.
-      if ((value >= kCountLimit) && is_truncating) {
-        __ mov(result, ZR);
-      } else {
-        // Result is Mint or exception.
-        __ b(deopt);
-      }
-    } else {
-      if (!is_truncating) {
-        // Check for overflow (preserve left).
-        __ sll(TMP, left, value);
-        __ sra(CMPRES1, TMP, value);
-        __ bne(CMPRES1, left, deopt);  // Overflow.
-      }
-      // Shift for result now we know there is no overflow.
-      __ sll(result, left, value);
+    ASSERT((0 < value) && (value < kCountLimit));
+    if (shift_left->can_overflow()) {
+      // Check for overflow (preserve left).
+      __ sll(TMP, left, value);
+      __ sra(CMPRES1, TMP, value);
+      __ bne(CMPRES1, left, deopt);  // Overflow.
     }
+    // Shift for result now we know there is no overflow.
+    __ sll(result, left, value);
     return;
   }
 
   // Right (locs.in(1)) is not constant.
   Register right = locs.in(1).reg();
   Range* right_range = shift_left->right()->definition()->range();
-  if (shift_left->left()->BindsToConstant() && !is_truncating) {
+  if (shift_left->left()->BindsToConstant() && shift_left->can_overflow()) {
     // TODO(srdjan): Implement code below for is_truncating().
     // If left is constant, we know the maximal allowed size for right.
     const Object& obj = shift_left->left()->BoundConstant();
@@ -2700,7 +2685,7 @@
 
   const bool right_needs_check =
       !RangeUtils::IsWithin(right_range, 0, (Smi::kBits - 1));
-  if (is_truncating) {
+  if (!shift_left->can_overflow()) {
     if (right_needs_check) {
       const bool right_may_be_negative =
           (right_range == NULL) || !right_range->IsPositive();
@@ -2748,7 +2733,7 @@
       ((op_kind() == Token::kADD) ||
        (op_kind() == Token::kMOD) ||
        (op_kind() == Token::kTRUNCDIV) ||
-       (((op_kind() == Token::kSHL) && !IsTruncating()) ||
+       (((op_kind() == Token::kSHL) && can_overflow()) ||
          (op_kind() == Token::kSHR))) ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
@@ -2773,7 +2758,7 @@
   }
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
-  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
+  if (((op_kind() == Token::kSHL) && can_overflow()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
   } else if (op_kind() == Token::kADD) {
@@ -2829,24 +2814,11 @@
       case Token::kMUL: {
         // Keep left value tagged and untag right value.
         const intptr_t value = Smi::Cast(constant).Value();
-        if (deopt == NULL) {
-          if (value == 2) {
-            __ sll(result, left, 1);
-          } else {
-            __ LoadImmediate(TMP, value);
-            __ mult(left, TMP);
-            __ mflo(result);
-          }
-        } else {
-          if (value == 2) {
-            __ sra(CMPRES2, left, 31);  // CMPRES2 = sign of left.
-            __ sll(result, left, 1);
-          } else {
-            __ LoadImmediate(TMP, value);
-            __ mult(left, TMP);
-            __ mflo(result);
-            __ mfhi(CMPRES2);
-          }
+        __ LoadImmediate(TMP, value);
+        __ mult(left, TMP);
+        __ mflo(result);
+        if (deopt != NULL) {
+          __ mfhi(CMPRES2);
           __ sra(CMPRES1, result, 31);
           __ bne(CMPRES1, CMPRES2, deopt);
         }
@@ -2854,18 +2826,6 @@
       }
       case Token::kTRUNCDIV: {
         const intptr_t value = Smi::Cast(constant).Value();
-        if (value == 1) {
-          if (result != left) {
-            __ mov(result, left);
-          }
-          break;
-        } else if (value == -1) {
-          // Check the corner case of dividing the 'MIN_SMI' with -1, in which
-          // case we cannot negate the result.
-          __ BranchEqual(left, 0x80000000, deopt);
-          __ subu(result, ZR, left);
-          break;
-        }
         ASSERT(Utils::IsPowerOfTwo(Utils::Abs(value)));
         const intptr_t shift_count =
             Utils::ShiftForPowerOfTwo(Utils::Abs(value)) + kSmiTagSize;
@@ -2916,28 +2876,9 @@
       case Token::kSHR: {
         // sarl operation masks the count to 5 bits.
         const intptr_t kCountLimit = 0x1F;
-        intptr_t value = Smi::Cast(constant).Value();
-
+        const intptr_t value = Smi::Cast(constant).Value();
         __ TraceSimMsg("kSHR");
-
-        if (value == 0) {
-          // TODO(vegorov): should be handled outside.
-          if (result != left) {
-            __ mov(result, left);
-          }
-          break;
-        } else if (value < 0) {
-          // TODO(vegorov): should be handled outside.
-          __ b(deopt);
-          break;
-        }
-
-        value = value + kSmiTagSize;
-        if (value >= kCountLimit) {
-          value = kCountLimit;
-        }
-
-        __ sra(result, left, value);
+        __ sra(result, left, Utils::Minimum(value + kSmiTagSize, kCountLimit));
         __ SmiTag(result);
         break;
       }
@@ -3891,6 +3832,18 @@
 }
 
 
+LocationSummary* MintToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MintToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -4294,13 +4247,7 @@
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(
-      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
   __ TraceSimMsg("PolymorphicInstanceCallInstr");
-  if (ic_data().NumberOfChecks() == 0) {
-    __ b(deopt);
-    return;
-  }
   ASSERT(ic_data().NumArgsTested() == 1);
   if (!with_checks()) {
     ASSERT(ic_data().HasOneTarget());
@@ -4318,6 +4265,8 @@
   // Load receiver into T0.
   __ lw(T0, Address(SP, (instance_call()->ArgumentCount() - 1) * kWordSize));
 
+  Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
   LoadValueCid(compiler, T2, T0,
                (ic_data().GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
 
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 93b0492..a49bf9b 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -2542,7 +2542,6 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
@@ -2556,30 +2555,18 @@
     // shlq operation masks the count to 6 bits.
     const intptr_t kCountLimit = 0x3F;
     const intptr_t value = Smi::Cast(constant).Value();
-    if (value == 0) {
-      // No code needed.
-    } else if ((value < 0) || (value >= kCountLimit)) {
-      // This condition may not be known earlier in some cases because
-      // of constant propagation, inlining, etc.
-      if ((value >= kCountLimit) && is_truncating) {
-        __ xorq(result, result);
-      } else {
-        // Result is Mint or exception.
-        __ jmp(deopt);
-      }
-    } else {
-      if (!is_truncating) {
-        // Check for overflow.
-        Register temp = locs.temp(0).reg();
-        __ movq(temp, left);
-        __ shlq(left, Immediate(value));
-        __ sarq(left, Immediate(value));
-        __ cmpq(left, temp);
-        __ j(NOT_EQUAL, deopt);  // Overflow.
-      }
-      // Shift for result now we know there is no overflow.
+    ASSERT((0 < value) && (value < kCountLimit));
+    if (shift_left->can_overflow()) {
+      // Check for overflow.
+      Register temp = locs.temp(0).reg();
+      __ movq(temp, left);
       __ shlq(left, Immediate(value));
+      __ sarq(left, Immediate(value));
+      __ cmpq(left, temp);
+      __ j(NOT_EQUAL, deopt);  // Overflow.
     }
+    // Shift for result now we know there is no overflow.
+    __ shlq(left, Immediate(value));
     if (FLAG_throw_on_javascript_int_overflow) {
       EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result);
     }
@@ -2589,7 +2576,7 @@
   // Right (locs.in(1)) is not constant.
   Register right = locs.in(1).reg();
   Range* right_range = shift_left->right()->definition()->range();
-  if (shift_left->left()->BindsToConstant() && !is_truncating) {
+  if (shift_left->left()->BindsToConstant() && shift_left->can_overflow()) {
     // TODO(srdjan): Implement code below for is_truncating().
     // If left is constant, we know the maximal allowed size for right.
     const Object& obj = shift_left->left()->BoundConstant();
@@ -2620,7 +2607,7 @@
   const bool right_needs_check =
       !RangeUtils::IsWithin(right_range, 0, (Smi::kBits - 1));
   ASSERT(right == RCX);  // Count must be in RCX
-  if (is_truncating) {
+  if (!shift_left->can_overflow()) {
     if (right_needs_check) {
       const bool right_may_be_negative =
           (right_range == NULL) || !right_range->IsPositive();
@@ -2734,12 +2721,12 @@
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
-    const intptr_t kNumTemps = !IsTruncating() ? 1 : 0;
+    const intptr_t kNumTemps = can_overflow() ? 1 : 0;
     LocationSummary* summary = new(isolate) LocationSummary(
         isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
-    if (!IsTruncating()) {
+    if (can_overflow()) {
       summary->set_temp(0, Location::RequiresRegister());
     }
     summary->set_out(0, Location::SameAsFirstInput());
@@ -2780,46 +2767,24 @@
     const int64_t imm = reinterpret_cast<int64_t>(constant.raw());
     switch (op_kind()) {
       case Token::kADD: {
-        if (imm != 0) {
-          // Checking overflow without emitting an instruction would be wrong.
-          __ AddImmediate(left, Immediate(imm), PP);
-          if (deopt != NULL) __ j(OVERFLOW, deopt);
-        }
+        __ AddImmediate(left, Immediate(imm), PP);
+        if (deopt != NULL) __ j(OVERFLOW, deopt);
         break;
       }
       case Token::kSUB: {
-        if (imm != 0) {
-          // Checking overflow without emitting an instruction would be wrong.
-          __ SubImmediate(left, Immediate(imm), PP);
-          if (deopt != NULL) __ j(OVERFLOW, deopt);
-        }
+        __ SubImmediate(left, Immediate(imm), PP);
+        if (deopt != NULL) __ j(OVERFLOW, deopt);
         break;
       }
       case Token::kMUL: {
         // Keep left value tagged and untag right value.
         const intptr_t value = Smi::Cast(constant).Value();
-        if (value == 2) {
-          __ shlq(left, Immediate(1));
-        } else {
-          __ MulImmediate(left, Immediate(value), PP);
-        }
+        __ MulImmediate(left, Immediate(value), PP);
         if (deopt != NULL) __ j(OVERFLOW, deopt);
         break;
       }
       case Token::kTRUNCDIV: {
         const intptr_t value = Smi::Cast(constant).Value();
-        if (value == 1) {
-          // Do nothing.
-          break;
-        } else if (value == -1) {
-          // Check the corner case of dividing the 'MIN_SMI' with -1, in which
-          // case we cannot negate the result.
-          __ CompareImmediate(left, Immediate(0x8000000000000000), PP);
-          __ j(EQUAL, deopt);
-          __ negq(left);
-          break;
-        }
-
         ASSERT(Utils::IsPowerOfTwo(Utils::Abs(value)));
         const intptr_t shift_count =
             Utils::ShiftForPowerOfTwo(Utils::Abs(value)) + kSmiTagSize;
@@ -2857,21 +2822,9 @@
       case Token::kSHR: {
         // sarq operation masks the count to 6 bits.
         const intptr_t kCountLimit = 0x3F;
-        intptr_t value = Smi::Cast(constant).Value();
-
-        if (value == 0) {
-          // TODO(vegorov): should be handled outside.
-          break;
-        } else if (value < 0) {
-          // TODO(vegorov): should be handled outside.
-          __ jmp(deopt);
-          break;
-        }
-
-        value = value + kSmiTagSize;
-        if (value >= kCountLimit) value = kCountLimit;
-
-        __ sarq(left, Immediate(value));
+        const intptr_t value = Smi::Cast(constant).Value();
+        __ sarq(left, Immediate(
+            Utils::Minimum(value + kSmiTagSize, kCountLimit)));
         __ SmiTag(left);
         break;
       }
@@ -4685,6 +4638,18 @@
 }
 
 
+LocationSummary* MintToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MintToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -5251,12 +5216,6 @@
 
 
 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(
-      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
-  if (ic_data().NumberOfChecks() == 0) {
-    __ jmp(deopt);
-    return;
-  }
   ASSERT(ic_data().NumArgsTested() == 1);
   if (!with_checks()) {
     ASSERT(ic_data().HasOneTarget());
@@ -5274,8 +5233,12 @@
   // Load receiver into RAX.
   __ movq(RAX,
       Address(RSP, (instance_call()->ArgumentCount() - 1) * kWordSize));
+
+  Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
   LoadValueCid(compiler, RDI, RAX,
                (ic_data().GetReceiverClassIdAt(0) == kSmiCid) ? NULL : deopt);
+
   compiler->EmitTestAndCall(ic_data(),
                             RDI,  // Class id register.
                             instance_call()->ArgumentCount(),
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index e629f75..8451fce 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -277,8 +277,8 @@
   __ AddImmediate(R2, fixed_size);                                             \
   __ bic(R2, R2, Operand(kObjectAlignment - 1));                               \
   Heap* heap = Isolate::Current()->heap();                                     \
-                                                                               \
-  __ LoadImmediate(R0, heap->TopAddress());                                    \
+  Heap::Space space = heap->SpaceForAllocation(cid);                           \
+  __ LoadImmediate(R0, heap->TopAddress(space));                               \
   __ ldr(R0, Address(R0, 0));                                                  \
                                                                                \
   /* R2: allocation size. */                                                   \
@@ -289,17 +289,17 @@
   /* R0: potential new object start. */                                        \
   /* R1: potential next object start. */                                       \
   /* R2: allocation size. */                                                   \
-  __ LoadImmediate(R3, heap->EndAddress());                                    \
+  __ LoadImmediate(R3, heap->EndAddress(space));                               \
   __ ldr(R3, Address(R3, 0));                                                  \
   __ cmp(R1, Operand(R3));                                                     \
   __ b(&fall_through, CS);                                                     \
                                                                                \
   /* Successfully allocated the object(s), now update top to point to */       \
   /* next object start and initialize the object. */                           \
-  __ LoadImmediate(R3, heap->TopAddress());                                    \
+  __ LoadImmediate(R3, heap->TopAddress(space));                               \
   __ str(R1, Address(R3, 0));                                                  \
   __ AddImmediate(R0, kHeapObjectTag);                                         \
-  __ UpdateAllocationStatsWithSize(cid, R2, R4);                               \
+  __ UpdateAllocationStatsWithSize(cid, R2, R4, space);                        \
   /* Initialize the tags. */                                                   \
   /* R0: new object start as a tagged pointer. */                              \
   /* R1: new object end address. */                                            \
@@ -894,6 +894,11 @@
 }
 
 
+void Intrinsifier::Bigint_mulAdd(Assembler* assembler) {
+  // TODO(regis): Implement.
+}
+
+
 // Check if the last argument is a double, jump to label 'is_smi' if smi
 // (easy to convert to double), otherwise jump to label 'not_double_smi',
 // Returns the last argument in R0.
@@ -1379,8 +1384,9 @@
 
   Isolate* isolate = Isolate::Current();
   Heap* heap = isolate->heap();
-
-  __ LoadImmediate(R3, heap->TopAddress());
+  const intptr_t cid = kOneByteStringCid;
+  Heap::Space space = heap->SpaceForAllocation(cid);
+  __ LoadImmediate(R3, heap->TopAddress(space));
   __ ldr(R0, Address(R3, 0));
 
   // length_reg: allocation size.
@@ -1391,8 +1397,8 @@
   // R0: potential new object start.
   // R1: potential next object start.
   // R2: allocation size.
-  // R3: heap->Top->Address().
-  __ LoadImmediate(R7, heap->EndAddress());
+  // R3: heap->TopAddress(space).
+  __ LoadImmediate(R7, heap->EndAddress(space));
   __ ldr(R7, Address(R7, 0));
   __ cmp(R1, Operand(R7));
   __ b(&fail, CS);
@@ -1401,7 +1407,7 @@
   // next object start and initialize the object.
   __ str(R1, Address(R3, 0));
   __ AddImmediate(R0, kHeapObjectTag);
-  __ UpdateAllocationStatsWithSize(kOneByteStringCid, R2, R3);
+  __ UpdateAllocationStatsWithSize(cid, R2, R3, space);
 
   // Initialize the tags.
   // R0: new object start as a tagged pointer.
@@ -1409,8 +1415,6 @@
   // R2: allocation size.
   {
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
-    const Class& cls =
-        Class::Handle(isolate->object_store()->one_byte_string_class());
 
     __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag);
     __ mov(R2, Operand(R2, LSL, shift), LS);
@@ -1418,7 +1422,7 @@
 
     // Get the class index and insert it into the tags.
     // R2: size and bit tags.
-    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()));
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid));
     __ orr(R2, R2, Operand(TMP));
     __ str(R2, FieldAddress(R0, String::tags_offset()));  // Store tags.
   }
@@ -1618,8 +1622,7 @@
   Isolate* isolate = Isolate::Current();
   // Set return value to default tag address.
   __ LoadImmediate(R0,
-      reinterpret_cast<uword>(isolate->object_store()) +
-                              ObjectStore::default_tag_offset());
+         reinterpret_cast<uword>(isolate) + Isolate::default_tag_offset());
   __ ldr(R0, Address(R0, 0));
   __ Ret();
 }
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index 66c78f9..c5d94b3 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -292,13 +292,13 @@
   /* R2: untagged array length. */                                             \
   __ CompareImmediate(R2, max_len, kNoPP);                                     \
   __ b(&fall_through, GT);                                                     \
-  __ Lsl(R2, R2, scale_shift);                                                 \
+  __ LslImmediate(R2, R2, scale_shift);                                        \
   const intptr_t fixed_size = sizeof(Raw##type_name) + kObjectAlignment - 1;   \
   __ AddImmediate(R2, R2, fixed_size, kNoPP);                                  \
   __ andi(R2, R2, ~(kObjectAlignment - 1));                                    \
   Heap* heap = Isolate::Current()->heap();                                     \
-                                                                               \
-  __ LoadImmediate(R0, heap->TopAddress(), kNoPP);                             \
+  Heap::Space space = heap->SpaceForAllocation(cid);                           \
+  __ LoadImmediate(R0, heap->TopAddress(space), kNoPP);                        \
   __ ldr(R0, Address(R0, 0));                                                  \
                                                                                \
   /* R2: allocation size. */                                                   \
@@ -309,24 +309,24 @@
   /* R0: potential new object start. */                                        \
   /* R1: potential next object start. */                                       \
   /* R2: allocation size. */                                                   \
-  __ LoadImmediate(R3, heap->EndAddress(), kNoPP);                             \
+  __ LoadImmediate(R3, heap->EndAddress(space), kNoPP);                        \
   __ ldr(R3, Address(R3, 0));                                                  \
   __ cmp(R1, Operand(R3));                                                     \
   __ b(&fall_through, CS);                                                     \
                                                                                \
   /* Successfully allocated the object(s), now update top to point to */       \
   /* next object start and initialize the object. */                           \
-  __ LoadImmediate(R3, heap->TopAddress(), kNoPP);                             \
+  __ LoadImmediate(R3, heap->TopAddress(space), kNoPP);                        \
   __ str(R1, Address(R3, 0));                                                  \
   __ AddImmediate(R0, R0, kHeapObjectTag, kNoPP);                              \
-  __ UpdateAllocationStatsWithSize(cid, R2, kNoPP);                            \
+  __ UpdateAllocationStatsWithSize(cid, R2, kNoPP, space);                     \
   /* Initialize the tags. */                                                   \
   /* R0: new object start as a tagged pointer. */                              \
   /* R1: new object end address. */                                            \
   /* R2: allocation size. */                                                   \
   {                                                                            \
     __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag, kNoPP);           \
-    __ Lsl(R2, R2, RawObject::kSizeTagPos - kObjectAlignmentLog2);             \
+    __ LslImmediate(R2, R2, RawObject::kSizeTagPos - kObjectAlignmentLog2);    \
     __ csel(R2, ZR, R2, HI);                                                   \
                                                                                \
     /* Get the class index and insert it into the tags. */                     \
@@ -522,7 +522,7 @@
 
   __ CompareRegisters(R1, ZR);
   __ b(&neg_remainder, LT);
-  __ Lsl(R0, R1, 1);  // Tag and move result to R0.
+  __ SmiTag(R0, R1);  // Tag and move result to R0.
   __ ret();
 
   __ Bind(&neg_remainder);
@@ -632,7 +632,7 @@
 
   // Left is not a constant.
   // Check if count too large for handling it inlined.
-  __ Asr(TMP, right, kSmiTagSize);  // SmiUntag right into TMP.
+  __ SmiUntag(TMP, right);  // SmiUntag right into TMP.
   // Overflow test (preserve left, right, and TMP);
   __ lslv(temp, left, TMP);
   __ asrv(TMP2, temp, TMP);
@@ -801,6 +801,11 @@
 }
 
 
+void Intrinsifier::Bigint_mulAdd(Assembler* assembler) {
+  // TODO(regis): Implement.
+}
+
+
 // Check if the last argument is a double, jump to label 'is_smi' if smi
 // (easy to convert to double), otherwise jump to label 'not_double_smi',
 // Returns the last argument in R0.
@@ -995,7 +1000,7 @@
   __ Bind(&is_zero);
   // Check for negative zero by looking at the sign bit.
   __ fmovrd(R1, V0);
-  __ Lsr(R1, R1, 63);
+  __ LsrImmediate(R1, R1, 63);
   __ tsti(R1, 1);
   __ csel(R0, true_reg, false_reg, NE);  // Sign bit set.
   __ ret();
@@ -1072,7 +1077,7 @@
 
   __ LoadImmediate(R0, a_int_value, kNoPP);
   __ LoadFromOffset(R2, R1, disp, kNoPP);
-  __ Lsr(R3, R2, 32);
+  __ LsrImmediate(R3, R2, 32);
   __ andi(R2, R2, 0xffffffff);
   __ mul(R2, R0, R2);
   __ add(R2, R2, Operand(R3));
@@ -1271,8 +1276,9 @@
 
   Isolate* isolate = Isolate::Current();
   Heap* heap = isolate->heap();
-
-  __ LoadImmediate(R3, heap->TopAddress(), kNoPP);
+  const intptr_t cid = kOneByteStringCid;
+  Heap::Space space = heap->SpaceForAllocation(cid);
+  __ LoadImmediate(R3, heap->TopAddress(space), kNoPP);
   __ ldr(R0, Address(R3));
 
   // length_reg: allocation size.
@@ -1283,8 +1289,8 @@
   // R0: potential new object start.
   // R1: potential next object start.
   // R2: allocation size.
-  // R3: heap->Top->Address().
-  __ LoadImmediate(R7, heap->EndAddress(), kNoPP);
+  // R3: heap->TopAddress(space).
+  __ LoadImmediate(R7, heap->EndAddress(space), kNoPP);
   __ ldr(R7, Address(R7));
   __ cmp(R1, Operand(R7));
   __ b(&fail, CS);
@@ -1293,7 +1299,7 @@
   // next object start and initialize the object.
   __ str(R1, Address(R3));
   __ AddImmediate(R0, R0, kHeapObjectTag, kNoPP);
-  __ UpdateAllocationStatsWithSize(kOneByteStringCid, R2, kNoPP);
+  __ UpdateAllocationStatsWithSize(cid, R2, kNoPP, space);
 
   // Initialize the tags.
   // R0: new object start as a tagged pointer.
@@ -1301,16 +1307,14 @@
   // R2: allocation size.
   {
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
-    const Class& cls =
-        Class::Handle(isolate->object_store()->one_byte_string_class());
 
     __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag, kNoPP);
-    __ Lsl(R2, R2, shift);
+    __ LslImmediate(R2, R2, shift);
     __ csel(R2, R2, ZR, LS);
 
     // Get the class index and insert it into the tags.
     // R2: size and bit tags.
-    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()), kNoPP);
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid), kNoPP);
     __ orr(R2, R2, Operand(TMP));
     __ str(R2, FieldAddress(R0, String::tags_offset()));  // Store tags.
   }
@@ -1511,8 +1515,8 @@
   Isolate* isolate = Isolate::Current();
   // Set return value to default tag address.
   __ LoadImmediate(R0,
-      reinterpret_cast<uword>(isolate->object_store()) +
-                              ObjectStore::default_tag_offset(), kNoPP);
+      reinterpret_cast<uword>(isolate) + Isolate::default_tag_offset(),
+      kNoPP);
   __ ldr(R0, Address(R0));
   __ ret();
 }
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 9d78b41..6e24ad8 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -286,8 +286,8 @@
   __ leal(EDI, Address(EDI, scale_factor, fixed_size));                        \
   __ andl(EDI, Immediate(-kObjectAlignment));                                  \
   Heap* heap = Isolate::Current()->heap();                                     \
-                                                                               \
-  __ movl(EAX, Address::Absolute(heap->TopAddress()));                         \
+  Heap::Space space = heap->SpaceForAllocation(cid);                           \
+  __ movl(EAX, Address::Absolute(heap->TopAddress(space)));                    \
   __ movl(EBX, EAX);                                                           \
                                                                                \
   /* EDI: allocation size. */                                                  \
@@ -298,14 +298,14 @@
   /* EAX: potential new object start. */                                       \
   /* EBX: potential next object start. */                                      \
   /* EDI: allocation size. */                                                  \
-  __ cmpl(EBX, Address::Absolute(heap->EndAddress()));                         \
+  __ cmpl(EBX, Address::Absolute(heap->EndAddress(space)));                    \
   __ j(ABOVE_EQUAL, &fall_through);                                            \
                                                                                \
   /* Successfully allocated the object(s), now update top to point to */       \
   /* next object start and initialize the object. */                           \
-  __ movl(Address::Absolute(heap->TopAddress()), EBX);                         \
+  __ movl(Address::Absolute(heap->TopAddress(space)), EBX);                    \
   __ addl(EAX, Immediate(kHeapObjectTag));                                     \
-  __ UpdateAllocationStatsWithSize(cid, EDI, kNoRegister);                     \
+  __ UpdateAllocationStatsWithSize(cid, EDI, kNoRegister, space);              \
                                                                                \
   /* Initialize the tags. */                                                   \
   /* EAX: new object start as a tagged pointer. */                             \
@@ -912,6 +912,107 @@
 }
 
 
+// TODO(regis): Once this intrinsic is implemented on all architectures, the
+// corresponding Dart method will be untested. Add a test with --no-intrinsify.
+void Intrinsifier::Bigint_mulAdd(Assembler* assembler) {
+  // Pseudo code:
+  // static void _mulAdd(Uint32List args,
+  //                     Uint32List m_digits, int i,
+  //                     Uint32List a_digits, int j, int n) {
+  //   uint32_t x = args[MA_MULTIPLIER];
+  //   if (x == 0) {
+  //     args[MA_CARRY_OUT] = 0;
+  //     return;
+  //   }
+  //   uint32_t* mip = &m_digits[i >> 1];  // i is Smi.
+  //   uint32_t* ajp = &a_digits[j >> 1];  // j is Smi.
+  //   uint32_t c = 0;
+  //   while ((n -= 2) >= 0) {  // n is Smi.
+  //     uint32_t mi = *mip++;
+  //     uint32_t aj = *ajp;
+  //     uint64_t t = x*mi + aj + c;  // 32-bit * 32-bit -> 64-bit.
+  //     *ajp++ = low32(t);
+  //     c = high32(t);
+  //   }
+  //   args[MA_CARRY_OUT] = c;
+  // }
+
+  // TODO(regis): Confirm that it is not required to check arguments (and also
+  // convince invocation_fuzz_test).
+
+  // EBX = x
+  Label x_not_zero;
+  __ movl(ECX, Address(ESP, 6 * kWordSize));  // args
+  __ movl(EBX, FieldAddress(ECX, TypedData::data_offset()));  // x
+  __ cmpl(EBX, Immediate(0));
+  __ j(NOT_EQUAL, &x_not_zero, Assembler::kNearJump);
+  // Set args[MA_CARRY_OUT] to 0 and return.
+  __ movl(FieldAddress(ECX, TypedData::data_offset() + kWordSize), EBX);
+  // TODO(regis): Confirm that returning Object::null() is not required.
+  __ ret();
+  __ Bind(&x_not_zero);
+
+  // Preserve CTX to free ESI.
+  __ pushl(CTX);
+  ASSERT(CTX == ESI);
+
+  // EDI = mip = &m_digits[i >> 1]
+  __ movl(EDI, Address(ESP, 6 * kWordSize));  // m_digits
+  __ movl(EAX, Address(ESP, 5 * kWordSize));  // i is Smi
+  __ leal(EDI, FieldAddress(EDI, EAX, TIMES_2, TypedData::data_offset()));
+
+  // ESI = ajp = &a_digits[j >> 1]
+  __ movl(ESI, Address(ESP, 4 * kWordSize));  // a_digits
+  __ movl(EAX, Address(ESP, 3 * kWordSize));  // j is Smi
+  __ leal(ESI, FieldAddress(ESI, EAX, TIMES_2, TypedData::data_offset()));
+
+  // ECX = c = 0
+  __ xorl(ECX, ECX);
+
+  Label loop, done;
+  __ Bind(&loop);
+  // x:   EBX
+  // mip: EDI
+  // ajp: ESI
+  // c:   ECX
+  // t:   EDX:EAX (not live at loop entry)
+
+  // while ((n -= 2) >= 0), n is on stack, above ret addr and saved CTX.
+  __ movl(EAX, Immediate(2));  // 'sub mem32, imm32' not implemented.
+  __ subl(Address(ESP, 2 * kWordSize), EAX);  // --n, n is Smi.
+  __ j(NEGATIVE, &done);
+
+  // uint32_t mi = *mip++
+  __ movl(EAX, Address(EDI, 0));
+  __ addl(EDI, Immediate(kWordSize));
+
+  // uint64_t t = x*mi
+  __ mull(EBX);  // t = EDX:EAX = EAX * EBX
+  __ addl(EAX, ECX);  // t += c
+  __ adcl(EDX, Immediate(0));
+
+  // uint32_t aj = *ajp; t += aj
+  __ addl(EAX, Address(ESI, 0));
+  __ adcl(EDX, Immediate(0));
+
+  // *ajp++ = low32(t)
+  __ movl(Address(ESI, 0), EAX);
+  __ addl(ESI, Immediate(kWordSize));
+
+  // c = high32(t)
+  __ movl(ECX, EDX);
+  __ jmp(&loop, Assembler::kNearJump);
+
+  __ Bind(&done);
+  // Restore CTX, set args[MA_CARRY_OUT] to c and return.
+  __ popl(CTX);
+  __ movl(EAX, Address(ESP, 6 * kWordSize));  // args
+  __ movl(FieldAddress(EAX, TypedData::data_offset() + kWordSize), ECX);
+  // TODO(regis): Confirm that returning Object::null() is not required.
+  __ ret();
+}
+
+
 // Check if the last argument is a double, jump to label 'is_smi' if smi
 // (easy to convert to double), otherwise jump to label 'not_double_smi',
 // Returns the last argument in EAX.
@@ -1401,8 +1502,9 @@
 
   Isolate* isolate = Isolate::Current();
   Heap* heap = isolate->heap();
-
-  __ movl(EAX, Address::Absolute(heap->TopAddress()));
+  const intptr_t cid = kOneByteStringCid;
+  Heap::Space space = heap->SpaceForAllocation(cid);
+  __ movl(EAX, Address::Absolute(heap->TopAddress(space)));
   __ movl(EBX, EAX);
 
   // EDI: allocation size.
@@ -1413,15 +1515,15 @@
   // EAX: potential new object start.
   // EBX: potential next object start.
   // EDI: allocation size.
-  __ cmpl(EBX, Address::Absolute(heap->EndAddress()));
+  __ cmpl(EBX, Address::Absolute(heap->EndAddress(space)));
   __ j(ABOVE_EQUAL, &pop_and_fail, Assembler::kNearJump);
 
   // Successfully allocated the object(s), now update top to point to
   // next object start and initialize the object.
-  __ movl(Address::Absolute(heap->TopAddress()), EBX);
+  __ movl(Address::Absolute(heap->TopAddress(space)), EBX);
   __ addl(EAX, Immediate(kHeapObjectTag));
 
-  __ UpdateAllocationStatsWithSize(kOneByteStringCid, EDI, kNoRegister);
+  __ UpdateAllocationStatsWithSize(cid, EDI, kNoRegister, space);
 
   // Initialize the tags.
   // EAX: new object start as a tagged pointer.
@@ -1439,9 +1541,7 @@
     __ Bind(&done);
 
     // Get the class index and insert it into the tags.
-    const Class& cls =
-        Class::Handle(isolate->object_store()->one_byte_string_class());
-    __ orl(EDI, Immediate(RawObject::ClassIdTag::encode(cls.id())));
+    __ orl(EDI, Immediate(RawObject::ClassIdTag::encode(cid)));
     __ movl(FieldAddress(EAX, String::tags_offset()), EDI);  // Tags.
   }
 
@@ -1627,8 +1727,7 @@
   Isolate* isolate = Isolate::Current();
   const Address default_tag_addr =
       Address::Absolute(
-          reinterpret_cast<uword>(isolate->object_store()) +
-                                  ObjectStore::default_tag_offset());
+          reinterpret_cast<uword>(isolate) + Isolate::default_tag_offset());
   // Set return value.
   __ movl(EAX, default_tag_addr);
   __ ret();
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index 5cfce60..736621b 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -277,8 +277,8 @@
   __ LoadImmediate(TMP, -kObjectAlignment);                                    \
   __ and_(T2, T2, TMP);                                                        \
   Heap* heap = Isolate::Current()->heap();                                     \
-                                                                               \
-  __ LoadImmediate(V0, heap->TopAddress());                                    \
+  Heap::Space space = heap->SpaceForAllocation(cid);                           \
+  __ LoadImmediate(V0, heap->TopAddress(space));                               \
   __ lw(V0, Address(V0, 0));                                                   \
                                                                                \
   /* T2: allocation size. */                                                   \
@@ -289,16 +289,16 @@
   /* V0: potential new object start. */                                        \
   /* T1: potential next object start. */                                       \
   /* T2: allocation size. */                                                   \
-  __ LoadImmediate(T3, heap->EndAddress());                                    \
+  __ LoadImmediate(T3, heap->EndAddress(space));                               \
   __ lw(T3, Address(T3, 0));                                                   \
   __ BranchUnsignedGreaterEqual(T1, T3, &fall_through);                        \
                                                                                \
   /* Successfully allocated the object(s), now update top to point to */       \
   /* next object start and initialize the object. */                           \
-  __ LoadImmediate(T3, heap->TopAddress());                                    \
+  __ LoadImmediate(T3, heap->TopAddress(space));                               \
   __ sw(T1, Address(T3, 0));                                                   \
   __ AddImmediate(V0, kHeapObjectTag);                                         \
-  __ UpdateAllocationStatsWithSize(cid, T2, T4);                               \
+  __ UpdateAllocationStatsWithSize(cid, T2, T4, space);                        \
   /* Initialize the tags. */                                                   \
   /* V0: new object start as a tagged pointer. */                              \
   /* T1: new object end address. */                                            \
@@ -895,6 +895,11 @@
 }
 
 
+void Intrinsifier::Bigint_mulAdd(Assembler* assembler) {
+  // TODO(regis): Implement.
+}
+
+
 // Check if the last argument is a double, jump to label 'is_smi' if smi
 // (easy to convert to double), otherwise jump to label 'not_double_smi',
 // Returns the last argument in T0.
@@ -1432,8 +1437,9 @@
 
   Isolate* isolate = Isolate::Current();
   Heap* heap = isolate->heap();
-
-  __ LoadImmediate(T3, heap->TopAddress());
+  const intptr_t cid = kOneByteStringCid;
+  Heap::Space space = heap->SpaceForAllocation(cid);
+  __ LoadImmediate(T3, heap->TopAddress(space));
   __ lw(V0, Address(T3, 0));
 
   // length_reg: allocation size.
@@ -1444,8 +1450,8 @@
   // V0: potential new object start.
   // T1: potential next object start.
   // T2: allocation size.
-  // T3: heap->TopAddress().
-  __ LoadImmediate(T4, heap->EndAddress());
+  // T3: heap->TopAddress(space).
+  __ LoadImmediate(T4, heap->EndAddress(space));
   __ lw(T4, Address(T4, 0));
   __ BranchUnsignedGreaterEqual(T1, T4, failure);
 
@@ -1454,7 +1460,7 @@
   __ sw(T1, Address(T3, 0));
   __ AddImmediate(V0, kHeapObjectTag);
 
-  __ UpdateAllocationStatsWithSize(kOneByteStringCid, T2, T3);
+  __ UpdateAllocationStatsWithSize(cid, T2, T3, space);
 
   // Initialize the tags.
   // V0: new object start as a tagged pointer.
@@ -1463,8 +1469,6 @@
   {
     Label overflow, done;
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
-    const Class& cls =
-        Class::Handle(isolate->object_store()->one_byte_string_class());
 
     __ BranchUnsignedGreater(T2, RawObject::SizeTag::kMaxSizeTag, &overflow);
     __ b(&done);
@@ -1475,7 +1479,7 @@
 
     // Get the class index and insert it into the tags.
     // T2: size and bit tags.
-    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()));
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid));
     __ or_(T2, T2, TMP);
     __ sw(T2, FieldAddress(V0, String::tags_offset()));  // Store tags.
   }
@@ -1660,8 +1664,7 @@
   Isolate* isolate = Isolate::Current();
   // V0: Address of default tag.
   __ LoadImmediate(V0,
-      reinterpret_cast<uword>(isolate->object_store()) +
-                              ObjectStore::default_tag_offset());
+      reinterpret_cast<uword>(isolate) + Isolate::default_tag_offset());
   __ Ret();
   __ delay_slot()->lw(V0, Address(V0, 0));
 }
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index 41daa4d..1d67654 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -237,8 +237,8 @@
   __ leaq(RDI, Address(RDI, scale_factor, fixed_size));                        \
   __ andq(RDI, Immediate(-kObjectAlignment));                                  \
   Heap* heap = Isolate::Current()->heap();                                     \
-                                                                               \
-  __ movq(RAX, Immediate(heap->TopAddress()));                                 \
+  Heap::Space space = heap->SpaceForAllocation(cid);                           \
+  __ movq(RAX, Immediate(heap->TopAddress(space)));                            \
   __ movq(RAX, Address(RAX, 0));                                               \
   __ movq(RCX, RAX);                                                           \
                                                                                \
@@ -251,16 +251,16 @@
   /* RCX: potential next object start. */                                      \
   /* RDI: allocation size. */                                                  \
   /* R13: scratch register. */                                                 \
-  __ movq(R13, Immediate(heap->EndAddress()));                                 \
+  __ movq(R13, Immediate(heap->EndAddress(space)));                            \
   __ cmpq(RCX, Address(R13, 0));                                               \
   __ j(ABOVE_EQUAL, &fall_through);                                            \
                                                                                \
   /* Successfully allocated the object(s), now update top to point to */       \
   /* next object start and initialize the object. */                           \
-  __ movq(R13, Immediate(heap->TopAddress()));                                 \
+  __ movq(R13, Immediate(heap->TopAddress(space)));                            \
   __ movq(Address(R13, 0), RCX);                                               \
   __ addq(RAX, Immediate(kHeapObjectTag));                                     \
-  __ UpdateAllocationStatsWithSize(cid, RDI);                                  \
+  __ UpdateAllocationStatsWithSize(cid, RDI, space);                           \
   /* Initialize the tags. */                                                   \
   /* RAX: new object start as a tagged pointer. */                             \
   /* RCX: new object end address. */                                           \
@@ -822,6 +822,11 @@
 }
 
 
+void Intrinsifier::Bigint_mulAdd(Assembler* assembler) {
+  // TODO(regis): Implement.
+}
+
+
 // Check if the last argument is a double, jump to label 'is_smi' if smi
 // (easy to convert to double), otherwise jump to label 'not_double_smi',
 // Returns the last argument in RAX.
@@ -1306,8 +1311,9 @@
 
   Isolate* isolate = Isolate::Current();
   Heap* heap = isolate->heap();
-
-  __ movq(RAX, Immediate(heap->TopAddress()));
+  const intptr_t cid = kOneByteStringCid;
+  Heap::Space space = heap->SpaceForAllocation(cid);
+  __ movq(RAX, Immediate(heap->TopAddress(space)));
   __ movq(RAX, Address(RAX, 0));
 
   // RDI: allocation size.
@@ -1319,16 +1325,16 @@
   // RAX: potential new object start.
   // RCX: potential next object start.
   // RDI: allocation size.
-  __ movq(R13, Immediate(heap->EndAddress()));
+  __ movq(R13, Immediate(heap->EndAddress(space)));
   __ cmpq(RCX, Address(R13, 0));
   __ j(ABOVE_EQUAL, &pop_and_fail);
 
   // Successfully allocated the object(s), now update top to point to
   // next object start and initialize the object.
-  __ movq(R13, Immediate(heap->TopAddress()));
+  __ movq(R13, Immediate(heap->TopAddress(space)));
   __ movq(Address(R13, 0), RCX);
   __ addq(RAX, Immediate(kHeapObjectTag));
-  __ UpdateAllocationStatsWithSize(kOneByteStringCid, RDI);
+  __ UpdateAllocationStatsWithSize(cid, RDI, space);
 
   // Initialize the tags.
   // RAX: new object start as a tagged pointer.
@@ -1345,9 +1351,7 @@
     __ Bind(&done);
 
     // Get the class index and insert it into the tags.
-    const Class& cls =
-        Class::Handle(isolate->object_store()->one_byte_string_class());
-    __ orq(RDI, Immediate(RawObject::ClassIdTag::encode(cls.id())));
+    __ orq(RDI, Immediate(RawObject::ClassIdTag::encode(cid)));
     __ movq(FieldAddress(RAX, String::tags_offset()), RDI);  // Tags.
   }
 
@@ -1531,8 +1535,8 @@
   // RBX: Address of default tag.
   Isolate* isolate = Isolate::Current();
   const Immediate& default_tag_addr =
-      Immediate(reinterpret_cast<int64_t>(isolate->object_store()) +
-                                          ObjectStore::default_tag_offset());
+      Immediate(reinterpret_cast<int64_t>(isolate) +
+                Isolate::default_tag_offset());
   __ movq(RBX, default_tag_addr);
   // Set return value.
   __ movq(RAX, Address(RBX, 0));
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 74d0394..82b763c 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -440,6 +440,7 @@
       thread_state_(NULL),
       tag_table_(GrowableObjectArray::null()),
       current_tag_(UserTag::null()),
+      default_tag_(UserTag::null()),
       metrics_list_head_(NULL),
       next_(NULL),
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
@@ -498,6 +499,7 @@
       thread_state_(NULL),
       tag_table_(GrowableObjectArray::null()),
       current_tag_(UserTag::null()),
+      default_tag_(UserTag::null()),
       metrics_list_head_(NULL),
       next_(NULL),
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
@@ -1124,6 +1126,9 @@
   // Visit the current tag which is stored in the isolate.
   visitor->VisitPointer(reinterpret_cast<RawObject**>(&current_tag_));
 
+  // Visit the default tag which is stored in the isolate.
+  visitor->VisitPointer(reinterpret_cast<RawObject**>(&default_tag_));
+
   // Visit the tag table which is stored in the isolate.
   visitor->VisitPointer(reinterpret_cast<RawObject**>(&tag_table_));
 
@@ -1312,12 +1317,18 @@
 
 
 void Isolate::set_current_tag(const UserTag& tag) {
-  intptr_t user_tag = tag.tag();
-  set_user_tag(static_cast<uword>(user_tag));
+  uword user_tag = tag.tag();
+  ASSERT(user_tag < kUwordMax);
+  set_user_tag(user_tag);
   current_tag_ = tag.raw();
 }
 
 
+void Isolate::set_default_tag(const UserTag& tag) {
+  default_tag_ = tag.raw();
+}
+
+
 void Isolate::VisitIsolates(IsolateVisitor* visitor) {
   if (visitor == NULL) {
     return;
@@ -1431,6 +1442,7 @@
     : isolate_(NULL),
       parent_port_(parent_port),
       script_url_(NULL),
+      package_root_(NULL),
       library_url_(NULL),
       class_name_(NULL),
       function_name_(NULL),
@@ -1458,10 +1470,12 @@
 
 IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port,
                                      const char* script_url,
+                                     const char* package_root,
                                      const Instance& args,
                                      const Instance& message)
     : isolate_(NULL),
       parent_port_(parent_port),
+      package_root_(NULL),
       library_url_(NULL),
       class_name_(NULL),
       function_name_(NULL),
@@ -1471,6 +1485,9 @@
       serialized_message_(NULL),
       serialized_message_len_(0) {
   script_url_ = strdup(script_url);
+  if (package_root != NULL) {
+    package_root_ = strdup(package_root);
+  }
   library_url_ = NULL;
   function_name_ = strdup("main");
   exception_callback_name_ = strdup("_unhandledExceptionCallback");
@@ -1481,6 +1498,7 @@
 
 IsolateSpawnState::~IsolateSpawnState() {
   free(script_url_);
+  free(package_root_);
   free(library_url_);
   free(function_name_);
   free(class_name_);
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 0356d59..6d9bee5 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -114,6 +114,10 @@
     return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key));
   }
 
+  static inline uword CurrentAddress() {
+    return reinterpret_cast<uword>(Current());
+  }
+
   static void SetCurrent(Isolate* isolate);
 
   static void InitOnce();
@@ -560,6 +564,9 @@
   static intptr_t current_tag_offset() {
     return OFFSET_OF(Isolate, current_tag_);
   }
+  static intptr_t default_tag_offset() {
+    return OFFSET_OF(Isolate, default_tag_);
+  }
 
 #define ISOLATE_METRIC_ACCESSOR(type, variable, name, unit)                    \
   type* Get##variable##Metric() { return &metric_##variable##_; }
@@ -574,6 +581,9 @@
   RawUserTag* current_tag() const { return current_tag_; }
   void set_current_tag(const UserTag& tag);
 
+  RawUserTag* default_tag() const { return default_tag_; }
+  void set_default_tag(const UserTag& tag);
+
   Metric* metrics_list_head() {
     return metrics_list_head_;
   }
@@ -687,6 +697,7 @@
   uword user_tag_;
   RawGrowableObjectArray* tag_table_;
   RawUserTag* current_tag_;
+  RawUserTag* default_tag_;
 
   Metric* metrics_list_head_;
 
@@ -815,6 +826,7 @@
                     const Instance& message);
   IsolateSpawnState(Dart_Port parent_port,
                     const char* script_url,
+                    const char* package_root,
                     const Instance& args,
                     const Instance& message);
   ~IsolateSpawnState();
@@ -824,6 +836,7 @@
 
   Dart_Port parent_port() const { return parent_port_; }
   char* script_url() const { return script_url_; }
+  char* package_root() const { return package_root_; }
   char* library_url() const { return library_url_; }
   char* class_name() const { return class_name_; }
   char* function_name() const { return function_name_; }
@@ -839,6 +852,7 @@
   Isolate* isolate_;
   Dart_Port parent_port_;
   char* script_url_;
+  char* package_root_;
   char* library_url_;
   char* class_name_;
   char* function_name_;
diff --git a/runtime/vm/method_recognizer.h b/runtime/vm/method_recognizer.h
index 1169a5c..068d223 100644
--- a/runtime/vm/method_recognizer.h
+++ b/runtime/vm/method_recognizer.h
@@ -153,7 +153,8 @@
   V(_Smi, get:bitLength, Smi_bitLength, 869956497)                             \
   V(_Bigint, set:_neg, Bigint_setNeg, 920204960)                               \
   V(_Bigint, set:_used, Bigint_setUsed, 1857576743)                            \
-  V(_Bigint, set:_digits, Bigint_setDigits, 1633805112)                        \
+  V(_Bigint, _set_digits, Bigint_setDigits, 582835804)                         \
+  V(_Bigint, _mulAdd, Bigint_mulAdd, 258927651)                                \
   V(_Double, >, Double_greaterThan, 381325711)                                 \
   V(_Double, >=, Double_greaterEqualThan, 1409267140)                          \
   V(_Double, <, Double_lessThan, 2080387973)                                   \
@@ -364,7 +365,7 @@
   V(_Bigint, get:_neg, Bigint_getNeg, 1151514099)                              \
   V(_Bigint, get:_used, Bigint_getUsed, 1308529543)                            \
   V(_Bigint, get:_digits, Bigint_getDigits, 1408062672)                        \
-
+  V(_Bigint, set:_digits, Bigint_setDigits, 1135754410)                        \
 
 // A list of core functions that internally dispatch based on received id.
 #define POLYMORPHIC_TARGET_LIST(V)                                             \
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 0047e18..1e7881d 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -44,6 +44,7 @@
 #include "vm/tags.h"
 #include "vm/timer.h"
 #include "vm/unicode.h"
+#include "vm/weak_code.h"
 
 namespace dart {
 
@@ -99,6 +100,7 @@
 Array* Object::zero_array_ = NULL;
 PcDescriptors* Object::empty_descriptors_ = NULL;
 LocalVarDescriptors* Object::empty_var_descriptors_ = NULL;
+ExceptionHandlers* Object::empty_exception_handlers_ = NULL;
 Instance* Object::sentinel_ = NULL;
 Instance* Object::transition_sentinel_ = NULL;
 Instance* Object::unknown_constant_ = NULL;
@@ -160,13 +162,24 @@
 // (Library, class name, method name)
 // Additionally, private functions in dart:* that are native or constructors are
 // marked as invisible by the parser.
-#define INVISIBLE_LIST(V)                                                      \
+#define INVISIBLE_CLASS_FUNCTIONS(V)                                           \
   V(CoreLibrary, int, _throwFormatException)                                   \
   V(CoreLibrary, int, _parse)                                                  \
+  V(CoreLibrary, _Bigint, _mulAdd)                                             \
 
-static void MarkFunctionAsInvisible(const Library& lib,
-                                    const char* class_name,
-                                    const char* function_name) {
+#define INVISIBLE_LIBRARY_FUNCTIONS(V)                                         \
+  V(TypedDataLibrary, _toInt8)                                                 \
+  V(TypedDataLibrary, _toInt16)                                                \
+  V(TypedDataLibrary, _toInt32)                                                \
+  V(TypedDataLibrary, _toInt64)                                                \
+  V(TypedDataLibrary, _toUint8)                                                \
+  V(TypedDataLibrary, _toUint16)                                               \
+  V(TypedDataLibrary, _toUint32)                                               \
+  V(TypedDataLibrary, _toUint64)                                               \
+
+static void MarkClassFunctionAsInvisible(const Library& lib,
+                                         const char* class_name,
+                                         const char* function_name) {
   ASSERT(!lib.IsNull());
   const Class& cls = Class::Handle(
       lib.LookupClassAllowPrivate(String::Handle(String::New(class_name))));
@@ -179,13 +192,31 @@
   function.set_is_visible(false);
 }
 
+static void MarkLibraryFunctionAsInvisible(const Library& lib,
+                                           const char* function_name) {
+  ASSERT(!lib.IsNull());
+  const Function& function =
+      Function::Handle(
+          lib.LookupFunctionAllowPrivate(
+              String::Handle(String::New(function_name))));
+  ASSERT(!function.IsNull());
+  function.set_is_visible(false);
+}
+
 
 static void MarkInvisibleFunctions() {
 #define MARK_FUNCTION(lib, class_name, function_name)                          \
-  MarkFunctionAsInvisible(Library::Handle(Library::lib()),                     \
+  MarkClassFunctionAsInvisible(Library::Handle(Library::lib()),                \
       #class_name, #function_name);                                            \
 
-INVISIBLE_LIST(MARK_FUNCTION)
+INVISIBLE_CLASS_FUNCTIONS(MARK_FUNCTION)
+#undef MARK_FUNCTION
+
+#define MARK_FUNCTION(lib, function_name)                                      \
+  MarkLibraryFunctionAsInvisible(Library::Handle(Library::lib()),              \
+      #function_name);                                                         \
+
+INVISIBLE_LIBRARY_FUNCTIONS(MARK_FUNCTION)
 #undef MARK_FUNCTION
 }
 
@@ -437,6 +468,7 @@
   zero_array_ = Array::ReadOnlyHandle();
   empty_descriptors_ = PcDescriptors::ReadOnlyHandle();
   empty_var_descriptors_ = LocalVarDescriptors::ReadOnlyHandle();
+  empty_exception_handlers_ = ExceptionHandlers::ReadOnlyHandle();
   sentinel_ = Instance::ReadOnlyHandle();
   transition_sentinel_ = Instance::ReadOnlyHandle();
   unknown_constant_ =  Instance::ReadOnlyHandle();
@@ -680,6 +712,21 @@
     empty_var_descriptors_->raw_ptr()->num_entries_ = 0;
   }
 
+  // Allocate and initialize the canonical empty exception handler info object.
+  // The vast majority of all functions do not contain an exception handler
+  // and can share this canonical descriptor.
+  {
+    uword address =
+        heap->Allocate(ExceptionHandlers::InstanceSize(0), Heap::kOld);
+    InitializeObject(address,
+                     kExceptionHandlersCid,
+                     ExceptionHandlers::InstanceSize(0));
+    ExceptionHandlers::initializeHandle(
+        empty_exception_handlers_,
+        reinterpret_cast<RawExceptionHandlers*>(address + kHeapObjectTag));
+    empty_exception_handlers_->raw_ptr()->num_entries_ = 0;
+  }
+
   cls = Class::New<Instance>(kDynamicCid);
   cls.set_is_abstract();
   cls.set_num_type_arguments(0);
@@ -698,7 +745,6 @@
   cls = Class::New<Type>();
   cls.set_is_type_finalized();
   cls.set_is_finalized();
-  isolate->object_store()->set_type_class(cls);
 
   cls = dynamic_class_;
   dynamic_type_ = Type::NewNonParameterizedType(cls);
@@ -935,23 +981,16 @@
   object_store->set_canonical_type_arguments(array);
 
   // Setup type class early in the process.
-  cls = Class::New<Type>();
-  object_store->set_type_class(cls);
-
-  cls = Class::New<TypeRef>();
-  object_store->set_type_ref_class(cls);
-
-  cls = Class::New<TypeParameter>();
-  object_store->set_type_parameter_class(cls);
-
-  cls = Class::New<BoundedType>();
-  object_store->set_bounded_type_class(cls);
-
-  cls = Class::New<MixinAppType>();
-  object_store->set_mixin_app_type_class(cls);
-
-  cls = Class::New<LibraryPrefix>();
-  object_store->set_library_prefix_class(cls);
+  const Class& type_cls = Class::Handle(isolate, Class::New<Type>());
+  const Class& type_ref_cls = Class::Handle(isolate, Class::New<TypeRef>());
+  const Class& type_parameter_cls = Class::Handle(isolate,
+                                                  Class::New<TypeParameter>());
+  const Class& bounded_type_cls = Class::Handle(isolate,
+                                                Class::New<BoundedType>());
+  const Class& mixin_app_type_cls = Class::Handle(isolate,
+                                                  Class::New<MixinAppType>());
+  const Class& library_prefix_cls = Class::Handle(isolate,
+                                                  Class::New<LibraryPrefix>());
 
   // Pre-allocate the OneByteString class needed by the symbol table.
   cls = Class::NewStringClass(kOneByteStringCid);
@@ -1056,10 +1095,10 @@
   RegisterPrivateClass(cls, Symbols::_SendPortImpl(), isolate_lib);
   pending_classes.Add(cls);
 
-  cls = Class::New<Stacktrace>();
-  object_store->set_stacktrace_class(cls);
-  RegisterClass(cls, Symbols::StackTrace(), core_lib);
-  pending_classes.Add(cls);
+  const Class& stacktrace_cls = Class::Handle(isolate,
+                                              Class::New<Stacktrace>());
+  RegisterClass(stacktrace_cls, Symbols::StackTrace(), core_lib);
+  pending_classes.Add(stacktrace_cls);
   // Super type set below, after Object is allocated.
 
   cls = Class::New<JSRegExp>();
@@ -1096,30 +1135,24 @@
   RegisterClass(cls, Symbols::Null(), core_lib);
   pending_classes.Add(cls);
 
-  cls = object_store->library_prefix_class();
-  ASSERT(!cls.IsNull());
-  RegisterPrivateClass(cls, Symbols::_LibraryPrefix(), core_lib);
-  pending_classes.Add(cls);
+  ASSERT(!library_prefix_cls.IsNull());
+  RegisterPrivateClass(library_prefix_cls, Symbols::_LibraryPrefix(), core_lib);
+  pending_classes.Add(library_prefix_cls);
 
-  cls = object_store->type_class();
-  RegisterPrivateClass(cls, Symbols::Type(), core_lib);
-  pending_classes.Add(cls);
+  RegisterPrivateClass(type_cls, Symbols::Type(), core_lib);
+  pending_classes.Add(type_cls);
 
-  cls = object_store->type_ref_class();
-  RegisterPrivateClass(cls, Symbols::TypeRef(), core_lib);
-  pending_classes.Add(cls);
+  RegisterPrivateClass(type_ref_cls, Symbols::TypeRef(), core_lib);
+  pending_classes.Add(type_ref_cls);
 
-  cls = object_store->type_parameter_class();
-  RegisterPrivateClass(cls, Symbols::TypeParameter(), core_lib);
-  pending_classes.Add(cls);
+  RegisterPrivateClass(type_parameter_cls, Symbols::TypeParameter(), core_lib);
+  pending_classes.Add(type_parameter_cls);
 
-  cls = object_store->bounded_type_class();
-  RegisterPrivateClass(cls, Symbols::BoundedType(), core_lib);
-  pending_classes.Add(cls);
+  RegisterPrivateClass(bounded_type_cls, Symbols::BoundedType(), core_lib);
+  pending_classes.Add(bounded_type_cls);
 
-  cls = object_store->mixin_app_type_class();
-  RegisterPrivateClass(cls, Symbols::MixinAppType(), core_lib);
-  pending_classes.Add(cls);
+  RegisterPrivateClass(mixin_app_type_cls, Symbols::MixinAppType(), core_lib);
+  pending_classes.Add(mixin_app_type_cls);
 
   cls = Class::New<Integer>();
   object_store->set_integer_implementation_class(cls);
@@ -1233,44 +1266,29 @@
   }
   ASSERT(!lib.IsNull());
   ASSERT(lib.raw() == Library::TypedDataLibrary());
-  const intptr_t typed_data_class_array_length =
-      RawObject::NumberOfTypedDataClasses();
-  Array& typed_data_classes =
-      Array::Handle(Array::New(typed_data_class_array_length));
-  int index = 0;
 #define REGISTER_TYPED_DATA_CLASS(clazz)                                       \
   cls = Class::NewTypedDataClass(kTypedData##clazz##Cid);                      \
-  index = kTypedData##clazz##Cid - kTypedDataInt8ArrayCid;                     \
-  typed_data_classes.SetAt(index, cls);                                        \
   RegisterPrivateClass(cls, Symbols::_##clazz(), lib);                         \
 
   CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_CLASS);
 #undef REGISTER_TYPED_DATA_CLASS
 #define REGISTER_TYPED_DATA_VIEW_CLASS(clazz)                                  \
   cls = Class::NewTypedDataViewClass(kTypedData##clazz##ViewCid);              \
-  index = kTypedData##clazz##ViewCid - kTypedDataInt8ArrayCid;                 \
-  typed_data_classes.SetAt(index, cls);                                        \
   RegisterPrivateClass(cls, Symbols::_##clazz##View(), lib);                   \
   pending_classes.Add(cls);                                                    \
 
   CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_VIEW_CLASS);
   cls = Class::NewTypedDataViewClass(kByteDataViewCid);
-  index = kByteDataViewCid - kTypedDataInt8ArrayCid;
-  typed_data_classes.SetAt(index, cls);
   RegisterPrivateClass(cls, Symbols::_ByteDataView(), lib);
   pending_classes.Add(cls);
 #undef REGISTER_TYPED_DATA_VIEW_CLASS
 #define REGISTER_EXT_TYPED_DATA_CLASS(clazz)                                   \
   cls = Class::NewExternalTypedDataClass(kExternalTypedData##clazz##Cid);      \
-  index = kExternalTypedData##clazz##Cid - kTypedDataInt8ArrayCid;             \
-  typed_data_classes.SetAt(index, cls);                                        \
   RegisterPrivateClass(cls, Symbols::_External##clazz(), lib);                 \
 
   cls = Class::New<Instance>(kByteBufferCid);
   cls.set_instance_size(0);
   cls.set_next_field_offset(-kWordSize);
-  index = kByteBufferCid - kTypedDataInt8ArrayCid;
-  typed_data_classes.SetAt(index, cls);
   RegisterPrivateClass(cls, Symbols::_ByteBuffer(), lib);
   pending_classes.Add(cls);
 
@@ -1314,13 +1332,10 @@
   type = Type::NewNonParameterizedType(cls);
   object_store->set_float64x2_type(type);
 
-  object_store->set_typed_data_classes(typed_data_classes);
-
   // Set the super type of class Stacktrace to Object type so that the
   // 'toString' method is implemented.
-  cls = object_store->stacktrace_class();
   type = object_store->object_type();
-  cls.set_super_type(type);
+  stacktrace_cls.set_super_type(type);
 
   // Abstract class that represents the Dart class Function.
   cls = Class::New<Instance>(kIllegalCid);
@@ -1445,26 +1460,19 @@
   // Set up empty classes in the object store, these will get
   // initialized correctly when we read from the snapshot.
   // This is done to allow bootstrapping of reading classes from the snapshot.
+  // Some classes are not stored in the object store. Yet we still need to
+  // create their Class object so that they get put into the class_table
+  // (as a side effect of Class::New()).
+
   cls = Class::New<Instance>(kInstanceCid);
   object_store->set_object_class(cls);
 
   cls = Class::New<LibraryPrefix>();
-  object_store->set_library_prefix_class(cls);
-
   cls = Class::New<Type>();
-  object_store->set_type_class(cls);
-
   cls = Class::New<TypeRef>();
-  object_store->set_type_ref_class(cls);
-
   cls = Class::New<TypeParameter>();
-  object_store->set_type_parameter_class(cls);
-
   cls = Class::New<BoundedType>();
-  object_store->set_bounded_type_class(cls);
-
   cls = Class::New<MixinAppType>();
-  object_store->set_mixin_app_type_class(cls);
 
   cls = Class::New<Array>();
   object_store->set_array_class(cls);
@@ -1539,22 +1547,14 @@
   cls = Class::New<Capability>();
   cls = Class::New<ReceivePort>();
   cls = Class::New<SendPort>();
-
   cls = Class::New<Stacktrace>();
-  object_store->set_stacktrace_class(cls);
-
   cls = Class::New<JSRegExp>();
-
-  // Some classes are not stored in the object store. Yet we still need to
-  // create their Class object so that they get put into the class_table
-  // (as a side effect of Class::New()).
   cls = Class::New<Number>();
 
   cls = Class::New<WeakProperty>();
   object_store->set_weak_property_class(cls);
 
   cls = Class::New<MirrorReference>();
-
   cls = Class::New<UserTag>();
 }
 
@@ -2591,122 +2591,6 @@
 }
 
 
-// Helper class to handle an array of code weak properties. Implements
-// registration and disabling of stored code objects.
-class WeakCodeReferences : public ValueObject {
- public:
-  explicit WeakCodeReferences(const Array& value) : array_(value) {}
-  virtual ~WeakCodeReferences() {}
-
-  void Register(const Code& value) {
-    if (!array_.IsNull()) {
-      // Try to find and reuse cleared WeakProperty to avoid allocating new one.
-      WeakProperty& weak_property = WeakProperty::Handle();
-      for (intptr_t i = 0; i < array_.Length(); i++) {
-        weak_property ^= array_.At(i);
-        if (weak_property.key() == Code::null()) {
-          // Empty property found. Reuse it.
-          weak_property.set_key(value);
-          return;
-        }
-      }
-    }
-
-    const WeakProperty& weak_property = WeakProperty::Handle(
-        WeakProperty::New(Heap::kOld));
-    weak_property.set_key(value);
-
-    intptr_t length = array_.IsNull() ? 0 : array_.Length();
-    const Array& new_array = Array::Handle(
-        Array::Grow(array_, length + 1, Heap::kOld));
-    new_array.SetAt(length, weak_property);
-    UpdateArrayTo(new_array);
-  }
-
-  virtual void UpdateArrayTo(const Array& array) = 0;
-  virtual void ReportDeoptimization(const Code& code) = 0;
-  virtual void ReportSwitchingCode(const Code& code) = 0;
-
-  static bool IsOptimizedCode(const Array& dependent_code, const Code& code) {
-    if (!code.is_optimized()) {
-      return false;
-    }
-    WeakProperty& weak_property = WeakProperty::Handle();
-    for (intptr_t i = 0; i < dependent_code.Length(); i++) {
-      weak_property ^= dependent_code.At(i);
-      if (code.raw() == weak_property.key()) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  void DisableCode() {
-    const Array& code_objects = Array::Handle(array_.raw());
-    if (code_objects.IsNull()) {
-      return;
-    }
-    UpdateArrayTo(Object::null_array());
-    // Disable all code on stack.
-    Code& code = Code::Handle();
-    {
-      DartFrameIterator iterator;
-      StackFrame* frame = iterator.NextFrame();
-      while (frame != NULL) {
-        code = frame->LookupDartCode();
-        if (IsOptimizedCode(code_objects, code)) {
-          ReportDeoptimization(code);
-          DeoptimizeAt(code, frame->pc());
-        }
-        frame = iterator.NextFrame();
-      }
-    }
-
-    // Switch functions that use dependent code to unoptimized code.
-    WeakProperty& weak_property = WeakProperty::Handle();
-    Function& function = Function::Handle();
-    for (intptr_t i = 0; i < code_objects.Length(); i++) {
-      weak_property ^= code_objects.At(i);
-      code ^= weak_property.key();
-      if (code.IsNull()) {
-        // Code was garbage collected already.
-        continue;
-      }
-
-      function ^= code.function();
-      // If function uses dependent code switch it to unoptimized.
-      if (code.is_optimized() && (function.CurrentCode() == code.raw())) {
-        ReportSwitchingCode(code);
-        function.SwitchToUnoptimizedCode();
-      } else if (function.unoptimized_code() == code.raw()) {
-        ReportSwitchingCode(code);
-        function.ClearICData();
-        // Remove the code object from the function. The next time the
-        // function is invoked, it will be compiled again.
-        function.ClearCode();
-        // Invalidate the old code object so existing references to it
-        // (from optimized code) will fail when invoked.
-        if (!CodePatcher::IsEntryPatched(code)) {
-          CodePatcher::PatchEntry(code);
-        }
-      } else {
-        // Make non-OSR code non-entrant.
-        if (code.GetEntryPatchPc() != 0) {
-          if (!CodePatcher::IsEntryPatched(code)) {
-            ReportSwitchingCode(code);
-            CodePatcher::PatchEntry(code);
-          }
-        }
-      }
-    }
-  }
-
- private:
-  const Array& array_;
-  DISALLOW_COPY_AND_ASSIGN(WeakCodeReferences);
-};
-
-
 class CHACodeArray : public WeakCodeReferences {
  public:
   explicit CHACodeArray(const Class& cls)
@@ -3625,17 +3509,27 @@
 
 
 void Class::set_allocation_stub(const Code& value) const {
+  // Never clear the stub as it may still be a target, but will be GC-d if
+  // not referenced.
   ASSERT(!value.IsNull());
   ASSERT(raw_ptr()->allocation_stub_ == Code::null());
   StorePointer(&raw_ptr()->allocation_stub_, value.raw());
 }
 
 
-void Class::DisableAllocationStub() const {
+void Class::SwitchAllocationStub() const {
   const Code& alloc_stub = Code::Handle(allocation_stub());
   if (!alloc_stub.IsNull()) {
     CodePatcher::PatchEntry(alloc_stub);
-    StorePointer(&raw_ptr()->allocation_stub_, Code::null());
+    const Code& spare_alloc_stub = Code::Handle(spare_allocation_stub());
+    if (spare_alloc_stub.IsNull()) {
+      StorePointer(&raw_ptr()->allocation_stub_, Code::null());
+    } else {
+      ASSERT(CodePatcher::IsEntryPatched(spare_alloc_stub));
+      CodePatcher::RestoreEntry(spare_alloc_stub);
+      StorePointer(&raw_ptr()->allocation_stub_, spare_alloc_stub.raw());
+    }
+    StorePointer(&raw_ptr()->spare_allocation_stub_, alloc_stub.raw());
   }
 }
 
@@ -10158,8 +10052,6 @@
 
 
 RawLibraryPrefix* LibraryPrefix::New() {
-  ASSERT(Isolate::Current()->object_store()->library_prefix_class() !=
-      Class::null());
   RawObject* raw = Object::Allocate(LibraryPrefix::kClassId,
                                     LibraryPrefix::InstanceSize(),
                                     Heap::kOld);
@@ -11026,8 +10918,8 @@
 }
 
 
-intptr_t ExceptionHandlers::Length() const {
-  return raw_ptr()->length_;
+intptr_t ExceptionHandlers::num_entries() const {
+  return raw_ptr()->num_entries_;
 }
 
 
@@ -11036,7 +10928,7 @@
                                        intptr_t handler_pc,
                                        bool needs_stacktrace,
                                        bool has_catch_all) const {
-  ASSERT((try_index >= 0) && (try_index < Length()));
+  ASSERT((try_index >= 0) && (try_index < num_entries()));
   RawExceptionHandlers::HandlerInfo* info = &raw_ptr()->data()[try_index];
   info->outer_try_index = outer_try_index;
   info->handler_pc = handler_pc;
@@ -11047,39 +10939,39 @@
 void ExceptionHandlers::GetHandlerInfo(
     intptr_t try_index,
     RawExceptionHandlers::HandlerInfo* info) const {
-  ASSERT((try_index >= 0) && (try_index < Length()));
+  ASSERT((try_index >= 0) && (try_index < num_entries()));
   ASSERT(info != NULL);
   *info = raw_ptr()->data()[try_index];
 }
 
 
 intptr_t ExceptionHandlers::HandlerPC(intptr_t try_index) const {
-  ASSERT((try_index >= 0) && (try_index < Length()));
+  ASSERT((try_index >= 0) && (try_index < num_entries()));
   return raw_ptr()->data()[try_index].handler_pc;
 }
 
 
 intptr_t ExceptionHandlers::OuterTryIndex(intptr_t try_index) const {
-  ASSERT((try_index >= 0) && (try_index < Length()));
+  ASSERT((try_index >= 0) && (try_index < num_entries()));
   return raw_ptr()->data()[try_index].outer_try_index;
 }
 
 
 bool ExceptionHandlers::NeedsStacktrace(intptr_t try_index) const {
-  ASSERT((try_index >= 0) && (try_index < Length()));
+  ASSERT((try_index >= 0) && (try_index < num_entries()));
   return raw_ptr()->data()[try_index].needs_stacktrace;
 }
 
 
 bool ExceptionHandlers::HasCatchAll(intptr_t try_index) const {
-  ASSERT((try_index >= 0) && (try_index < Length()));
+  ASSERT((try_index >= 0) && (try_index < num_entries()));
   return raw_ptr()->data()[try_index].has_catch_all;
 }
 
 
 void ExceptionHandlers::SetHandledTypes(intptr_t try_index,
                                         const Array& handled_types) const {
-  ASSERT((try_index >= 0) && (try_index < Length()));
+  ASSERT((try_index >= 0) && (try_index < num_entries()));
   const Array& handled_types_data =
       Array::Handle(raw_ptr()->handled_types_data_);
   handled_types_data.SetAt(try_index, handled_types);
@@ -11087,7 +10979,7 @@
 
 
 RawArray* ExceptionHandlers::GetHandledTypes(intptr_t try_index) const {
-  ASSERT((try_index >= 0) && (try_index < Length()));
+  ASSERT((try_index >= 0) && (try_index < num_entries()));
   Array& array = Array::Handle(raw_ptr()->handled_types_data_);
   array ^= array.At(try_index);
   return array.raw();
@@ -11114,7 +11006,7 @@
                                       Heap::kOld);
     NoGCScope no_gc;
     result ^= raw;
-    result.raw_ptr()->length_ = num_handlers;
+    result.raw_ptr()->num_entries_ = num_handlers;
   }
   const Array& handled_types_data = (num_handlers == 0) ?
       Object::empty_array() :
@@ -11125,7 +11017,7 @@
 
 
 const char* ExceptionHandlers::ToCString() const {
-  if (Length() == 0) {
+  if (num_entries() == 0) {
     return "No exception handlers\n";
   }
   Array& handled_types = Array::Handle();
@@ -11136,7 +11028,7 @@
                         " types) (outer %" Pd ")\n";
   const char* kFormat2 = "  %d. %s\n";
   intptr_t len = 1;  // Trailing '\0'.
-  for (intptr_t i = 0; i < Length(); i++) {
+  for (intptr_t i = 0; i < num_entries(); i++) {
     GetHandlerInfo(i, &info);
     handled_types = GetHandledTypes(i);
     ASSERT(!handled_types.IsNull());
@@ -11156,7 +11048,7 @@
   char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len);
   // Layout the fields in the buffer.
   intptr_t num_chars = 0;
-  for (intptr_t i = 0; i < Length(); i++) {
+  for (intptr_t i = 0; i < num_entries(); i++) {
     GetHandlerInfo(i, &info);
     handled_types = GetHandledTypes(i);
     const intptr_t num_types = handled_types.Length();
@@ -14738,7 +14630,6 @@
 
 
 RawType* Type::New(Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->type_class() != Class::null());
   RawObject* raw = Object::Allocate(Type::kClassId,
                                     Type::InstanceSize(),
                                     space);
@@ -14948,7 +14839,6 @@
 
 
 RawTypeRef* TypeRef::New() {
-  ASSERT(Isolate::Current()->object_store()->type_ref_class() != Class::null());
   RawObject* raw = Object::Allocate(TypeRef::kClassId,
                                     TypeRef::InstanceSize(),
                                     Heap::kOld);
@@ -15146,8 +15036,6 @@
 
 
 RawTypeParameter* TypeParameter::New() {
-  ASSERT(Isolate::Current()->object_store()->type_parameter_class() !=
-         Class::null());
   RawObject* raw = Object::Allocate(TypeParameter::kClassId,
                                     TypeParameter::InstanceSize(),
                                     Heap::kOld);
@@ -15367,8 +15255,6 @@
 
 
 RawBoundedType* BoundedType::New() {
-  ASSERT(Isolate::Current()->object_store()->bounded_type_class() !=
-         Class::null());
   RawObject* raw = Object::Allocate(BoundedType::kClassId,
                                     BoundedType::InstanceSize(),
                                     Heap::kOld);
@@ -15474,8 +15360,6 @@
 
 
 RawMixinAppType* MixinAppType::New() {
-  ASSERT(Isolate::Current()->object_store()->mixin_app_type_class() !=
-         Class::null());
   // MixinAppType objects do not survive finalization, so allocate
   // on new heap.
   RawObject* raw = Object::Allocate(MixinAppType::kClassId,
@@ -16237,6 +16121,8 @@
 
 
 void Bigint::set_digits(const TypedData& value) const {
+  // The VM expects digits_ to be a Uint32List (not null).
+  ASSERT(!value.IsNull() && (value.GetClassId() == kTypedDataUint32ArrayCid));
   StorePointer(&raw_ptr()->digits_, value.raw());
 }
 
@@ -16314,15 +16200,16 @@
     ASSERT(!digits_.IsNull());
     set_digits(digits_);
   } else {
-    ASSERT(digits() == TypedData::null());
+    ASSERT(digits() == TypedData::EmptyUint32Array(Isolate::Current()));
   }
   return true;
 }
 
 
 RawBigint* Bigint::New(Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->bigint_class() != Class::null());
-  Bigint& result = Bigint::Handle();
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate->object_store()->bigint_class() != Class::null());
+  Bigint& result = Bigint::Handle(isolate);
   {
     RawObject* raw = Object::Allocate(Bigint::kClassId,
                                       Bigint::InstanceSize(),
@@ -16331,7 +16218,9 @@
     result ^= raw;
   }
   result.set_neg(Bool::Get(false));
-  result.set_used(Smi::Handle(Smi::New(0)));
+  result.set_used(Smi::Handle(isolate, Smi::New(0)));
+  result.set_digits(
+      TypedData::Handle(isolate, TypedData::EmptyUint32Array(isolate)));
   return result.raw();
 }
 
@@ -16396,10 +16285,10 @@
 void Bigint::EnsureLength(intptr_t length, Heap::Space space) const {
   ASSERT(length >= 0);
   TypedData& old_digits = TypedData::Handle(digits());
-  if ((length > 0) && (old_digits.IsNull() || (length > old_digits.Length()))) {
+  if ((length > 0) && (length > old_digits.Length())) {
     TypedData& new_digits = TypedData::Handle(
         TypedData::New(kTypedDataUint32ArrayCid, length + kExtraDigits, space));
-    if (!old_digits.IsNull()) {
+    if (old_digits.Length() > 0) {
       TypedData::Copy(new_digits, TypedData::data_offset(),
                       old_digits, TypedData::data_offset(),
                       old_digits.LengthInBytes());
@@ -16789,8 +16678,7 @@
 }
 
 
-int64_t Bigint::AsInt64Value() const {
-  ASSERT(FitsIntoInt64());
+int64_t Bigint::AsTruncatedInt64Value() const {
   const intptr_t used = Used();
   if (used == 0) return 0;
   const int64_t digit1 = (used > 1) ? DigitAt(1) : 0;
@@ -16799,6 +16687,12 @@
 }
 
 
+int64_t Bigint::AsInt64Value() const {
+  ASSERT(FitsIntoInt64());
+  return AsTruncatedInt64Value();
+}
+
+
 bool Bigint::FitsIntoUint64() const {
   ASSERT(Bigint::kBitsPerDigit == 32);
   return !Neg() && (Used() <= 2);
@@ -19603,6 +19497,20 @@
 }
 
 
+RawTypedData* TypedData::EmptyUint32Array(Isolate* isolate) {
+  ASSERT(isolate != NULL);
+  ASSERT(isolate->object_store() != NULL);
+  if (isolate->object_store()->empty_uint32_array() != TypedData::null()) {
+    // Already created.
+    return isolate->object_store()->empty_uint32_array();
+  }
+  const TypedData& array = TypedData::Handle(isolate,
+      TypedData::New(kTypedDataUint32ArrayCid, 0, Heap::kOld));
+  isolate->object_store()->set_empty_uint32_array(array);
+  return array.raw();
+}
+
+
 const char* TypedData::ToCString() const {
   return "TypedData";
 }
@@ -19835,8 +19743,6 @@
 RawStacktrace* Stacktrace::New(const Array& code_array,
                                const Array& pc_offset_array,
                                Heap::Space space) {
-  ASSERT(Isolate::Current()->object_store()->stacktrace_class() !=
-         Class::null());
   Stacktrace& result = Stacktrace::Handle();
   {
     RawObject* raw = Object::Allocate(Stacktrace::kClassId,
@@ -20283,16 +20189,15 @@
 RawUserTag* UserTag::DefaultTag() {
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
-  ASSERT(isolate->object_store() != NULL);
-  if (isolate->object_store()->default_tag() != UserTag::null()) {
+  if (isolate->default_tag() != UserTag::null()) {
     // Already created.
-    return isolate->object_store()->default_tag();
+    return isolate->default_tag();
   }
   // Create default tag.
   const UserTag& result = UserTag::Handle(isolate,
                                           UserTag::New(Symbols::Default()));
   ASSERT(result.tag() == UserTags::kDefaultUserTag);
-  isolate->object_store()->set_default_tag(result);
+  isolate->set_default_tag(result);
   return result.raw();
 }
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 38f058b..cd60a4f 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -398,6 +398,11 @@
     return *empty_var_descriptors_;
   }
 
+  static const ExceptionHandlers& empty_exception_handlers() {
+    ASSERT(empty_exception_handlers_ != NULL);
+    return *empty_exception_handlers_;
+  }
+
   // The sentinel is a value that cannot be produced by Dart code.
   // It can be used to mark special values, for example to distinguish
   // "uninitialized" fields.
@@ -676,6 +681,7 @@
   static Array* zero_array_;
   static PcDescriptors* empty_descriptors_;
   static LocalVarDescriptors* empty_var_descriptors_;
+  static ExceptionHandlers* empty_exception_handlers_;
   static Instance* sentinel_;
   static Instance* transition_sentinel_;
   static Instance* unknown_constant_;
@@ -1137,7 +1143,7 @@
   }
   void set_allocation_stub(const Code& value) const;
 
-  void DisableAllocationStub() const;
+  void SwitchAllocationStub() const;
 
   RawArray* constants() const;
 
@@ -1270,6 +1276,10 @@
   void set_canonical_types(const Object& value) const;
   RawObject* canonical_types() const;
 
+  RawCode* spare_allocation_stub() const {
+    return raw_ptr()->spare_allocation_stub_;
+  }
+
   RawArray* invocation_dispatcher_cache() const;
   void set_invocation_dispatcher_cache(const Array& cache) const;
   RawFunction* CreateInvocationDispatcher(const String& target_name,
@@ -3311,7 +3321,7 @@
 
 class ExceptionHandlers : public Object {
  public:
-  intptr_t Length() const;
+  intptr_t num_entries() const;
 
   void GetHandlerInfo(intptr_t try_index,
                       RawExceptionHandlers::HandlerInfo* info) const;
@@ -3356,6 +3366,7 @@
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers, Object);
   friend class Class;
+  friend class Object;
 };
 
 
@@ -5157,6 +5168,9 @@
 
   virtual double AsDoubleValue() const;
   virtual int64_t AsInt64Value() const;
+  virtual int64_t AsTruncatedInt64Value() const {
+    return AsInt64Value();
+  }
   virtual uint32_t AsTruncatedUint32Value() const;
 
   virtual bool FitsIntoSmi() const;
@@ -5322,6 +5336,7 @@
 
   virtual double AsDoubleValue() const;
   virtual int64_t AsInt64Value() const;
+  virtual int64_t AsTruncatedInt64Value() const;
   virtual uint32_t AsTruncatedUint32Value() const;
 
   virtual int CompareWith(const Integer& other) const;
@@ -6725,6 +6740,8 @@
     return RawObject::IsTypedDataClassId(cid);
   }
 
+  static RawTypedData* EmptyUint32Array(Isolate* isolate);
+
  protected:
   void SetLength(intptr_t value) const {
     raw_ptr()->length_ = Smi::New(value);
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index c451de3..c25ab7f 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -21,8 +21,6 @@
     null_type_(Type::null()),
     function_type_(Type::null()),
     function_impl_type_(Type::null()),
-    library_prefix_class_(Class::null()),
-    type_class_(Class::null()),
     number_type_(Type::null()),
     int_type_(Type::null()),
     integer_implementation_class_(Class::null()),
@@ -47,9 +45,7 @@
     float32x4_class_(Class::null()),
     int32x4_class_(Class::null()),
     float64x2_class_(Class::null()),
-    typed_data_classes_(Array::null()),
     error_class_(Class::null()),
-    stacktrace_class_(Class::null()),
     weak_property_class_(Class::null()),
     symbol_table_(Array::null()),
     canonical_type_arguments_(Array::null()),
@@ -73,9 +69,9 @@
     out_of_memory_(Instance::null()),
     preallocated_stack_trace_(Stacktrace::null()),
     lookup_port_handler_(Function::null()),
+    empty_uint32_array_(TypedData::null()),
     handle_message_function_(Function::null()),
-    library_load_error_table_(Array::null()),
-    default_tag_(UserTag::null()) {
+    library_load_error_table_(Array::null()) {
 }
 
 
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index a9bcff2..6012c45 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -70,32 +70,6 @@
     function_impl_type_ = value.raw();
   }
 
-  RawClass* library_prefix_class() const { return library_prefix_class_; }
-  void set_library_prefix_class(const Class& value) {
-    library_prefix_class_ = value.raw();
-  }
-
-  RawClass* type_class() const { return type_class_; }
-  void set_type_class(const Class& value) { type_class_ = value.raw(); }
-
-  RawClass* type_ref_class() const { return type_ref_class_; }
-  void set_type_ref_class(const Class& value) { type_ref_class_ = value.raw(); }
-
-  RawClass* type_parameter_class() const { return type_parameter_class_; }
-  void set_type_parameter_class(const Class& value) {
-    type_parameter_class_ = value.raw();
-  }
-
-  RawClass* bounded_type_class() const { return bounded_type_class_; }
-  void set_bounded_type_class(const Class& value) {
-    bounded_type_class_ = value.raw();
-  }
-
-  RawClass* mixin_app_type_class() const { return mixin_app_type_class_; }
-  void set_mixin_app_type_class(const Class& value) {
-    mixin_app_type_class_ = value.raw();
-  }
-
   RawType* number_type() const { return number_type_; }
   void set_number_type(const Type& value) {
     number_type_ = value.raw();
@@ -231,13 +205,6 @@
   RawType* float64x2_type() const { return float64x2_type_; }
   void set_float64x2_type(const Type& value) { float64x2_type_ = value.raw(); }
 
-  RawArray* typed_data_classes() const {
-    return typed_data_classes_;
-  }
-  void set_typed_data_classes(const Array& value) {
-    typed_data_classes_ = value.raw();
-  }
-
   RawClass* error_class() const {
     return error_class_;
   }
@@ -248,16 +215,6 @@
     return OFFSET_OF(ObjectStore, error_class_);
   }
 
-  RawClass* stacktrace_class() const {
-    return stacktrace_class_;
-  }
-  void set_stacktrace_class(const Class& value) {
-    stacktrace_class_ = value.raw();
-  }
-  static intptr_t stacktrace_class_offset() {
-    return OFFSET_OF(ObjectStore, stacktrace_class_);
-  }
-
   RawClass* weak_property_class() const {
     return weak_property_class_;
   }
@@ -415,6 +372,16 @@
     lookup_port_handler_ = function.raw();
   }
 
+  RawTypedData* empty_uint32_array() const {
+    return empty_uint32_array_;
+  }
+  void set_empty_uint32_array(const TypedData& array) {
+    // Only set once.
+    ASSERT(empty_uint32_array_ == TypedData::null());
+    ASSERT(!array.IsNull());
+    empty_uint32_array_ = array.raw();
+  }
+
   RawFunction* handle_message_function() const {
     return handle_message_function_;
   }
@@ -422,19 +389,6 @@
     handle_message_function_ = function.raw();
   }
 
-  RawUserTag* default_tag() const {
-    return default_tag_;
-  }
-  void set_default_tag(const UserTag& tag) {
-    // Only set once.
-    ASSERT(default_tag_ == UserTag::null());
-    ASSERT(!tag.IsNull());
-    default_tag_ = tag.raw();
-  }
-  static intptr_t default_tag_offset() {
-    return OFFSET_OF(ObjectStore, default_tag_);
-  }
-
   RawArray* library_load_error_table() const {
     return library_load_error_table_;
   }
@@ -465,12 +419,6 @@
   RawType* null_type_;
   RawType* function_type_;
   RawType* function_impl_type_;
-  RawClass* library_prefix_class_;
-  RawClass* type_class_;
-  RawClass* type_ref_class_;
-  RawClass* type_parameter_class_;
-  RawClass* bounded_type_class_;
-  RawClass* mixin_app_type_class_;
   RawType* number_type_;
   RawType* int_type_;
   RawClass* integer_implementation_class_;
@@ -499,9 +447,7 @@
   RawClass* float32x4_class_;
   RawClass* int32x4_class_;
   RawClass* float64x2_class_;
-  RawArray* typed_data_classes_;
   RawClass* error_class_;
-  RawClass* stacktrace_class_;
   RawClass* weak_property_class_;
   RawArray* symbol_table_;
   RawArray* canonical_type_arguments_;
@@ -531,9 +477,9 @@
   RawUnhandledException* preallocated_unhandled_exception_;
   RawStacktrace* preallocated_stack_trace_;
   RawFunction* lookup_port_handler_;
+  RawTypedData* empty_uint32_array_;
   RawFunction* handle_message_function_;
   RawArray* library_load_error_table_;
-  RawUserTag* default_tag_;
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&library_load_error_table_);
   }
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index c6773d0..9f35ba0 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2751,7 +2751,7 @@
   // Verify the exception handler table entries by accessing them.
   const ExceptionHandlers& handlers =
       ExceptionHandlers::Handle(code.exception_handlers());
-  EXPECT_EQ(kNumEntries, handlers.Length());
+  EXPECT_EQ(kNumEntries, handlers.num_entries());
   RawExceptionHandlers::HandlerInfo info;
   handlers.GetHandlerInfo(0, &info);
   EXPECT_EQ(-1, handlers.OuterTryIndex(0));
@@ -4355,7 +4355,7 @@
   // UserTag reference
   {
     JSONStream js;
-    Instance& tag = Instance::Handle(isolate->object_store()->default_tag());
+    Instance& tag = Instance::Handle(isolate->default_tag());
     tag.PrintJSON(&js, true);
     elideSubstring("classes", js.ToCString(), buffer);
     elideSubstring("objects", buffer, buffer);
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index c398bc1..5234381 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -403,43 +403,69 @@
 }
 
 
-bool PageSpace::Contains(uword addr) const {
-  MutexLocker ml(pages_lock_);
+// Provides exclusive access to the pages, and ensures they are walkable.
+class ExclusivePageIterator : ValueObject {
+ public:
+  explicit ExclusivePageIterator(const PageSpace* space)
+      : space_(space), ml_(space->pages_lock_) {
+    space_->MakeIterable();
+    page_ = space_->pages_;
+    if (page_ == NULL) {
+      page_ = space_->exec_pages_;
+      if (page_ == NULL) {
+        page_ = space_->large_pages_;
+      }
+    }
+  }
+  HeapPage* page() const { return page_; }
+  bool Done() const { return page_ == NULL; }
+  void Advance() {
+    ASSERT(!Done());
+    page_ = space_->NextPageAnySize(page_);
+  }
+ private:
+  const PageSpace* space_;
+  MutexLocker ml_;
   NoGCScope no_gc;
-  HeapPage* page = pages_;
-  while (page != NULL) {
-    if (page->Contains(addr)) {
+  HeapPage* page_;
+};
+
+
+void PageSpace::MakeIterable() const {
+  // TODO(koda): Assert not called from concurrent sweeper task.
+  if (bump_top_ < bump_end_) {
+    FreeListElement::AsElement(bump_top_, bump_end_ - bump_top_);
+  }
+}
+
+
+bool PageSpace::Contains(uword addr) const {
+  for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
+    if (it.page()->Contains(addr)) {
       return true;
     }
-    page = NextPageAnySize(page);
   }
   return false;
 }
 
 
 bool PageSpace::Contains(uword addr, HeapPage::PageType type) const {
-  MutexLocker ml(pages_lock_);
-  NoGCScope no_gc;
-  HeapPage* page = pages_;
-  while (page != NULL) {
-    if ((page->type() == type) && page->Contains(addr)) {
+  for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
+    if ((it.page()->type() == type) && it.page()->Contains(addr)) {
       return true;
     }
-    page = NextPageAnySize(page);
   }
   return false;
 }
 
 
 void PageSpace::StartEndAddress(uword* start, uword* end) const {
-  MutexLocker ml(pages_lock_);
-  NoGCScope no_gc;
   ASSERT((pages_ != NULL) || (exec_pages_ != NULL) || (large_pages_ != NULL));
   *start = static_cast<uword>(~0);
   *end = 0;
-  for (HeapPage* page = pages_; page != NULL; page = NextPageAnySize(page)) {
-    *start = Utils::Minimum(*start, page->object_start());
-    *end = Utils::Maximum(*end, page->object_end());
+  for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
+    *start = Utils::Minimum(*start, it.page()->object_start());
+    *end = Utils::Maximum(*end, it.page()->object_end());
   }
   ASSERT(*start != static_cast<uword>(~0));
   ASSERT(*end != 0);
@@ -447,53 +473,36 @@
 
 
 void PageSpace::VisitObjects(ObjectVisitor* visitor) const {
-  MutexLocker ml(pages_lock_);
-  NoGCScope no_gc;
-  HeapPage* page = pages_;
-  while (page != NULL) {
-    page->VisitObjects(visitor);
-    page = NextPageAnySize(page);
+  for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
+    it.page()->VisitObjects(visitor);
   }
 }
 
 
 void PageSpace::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
-  MutexLocker ml(pages_lock_);
-  NoGCScope no_gc;
-  HeapPage* page = pages_;
-  while (page != NULL) {
-    page->VisitObjectPointers(visitor);
-    page = NextPageAnySize(page);
+  for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
+    it.page()->VisitObjectPointers(visitor);
   }
 }
 
 
 RawObject* PageSpace::FindObject(FindObjectVisitor* visitor,
                                  HeapPage::PageType type) const {
-  ASSERT(Isolate::Current()->no_gc_scope_depth() != 0);
-  MutexLocker ml(pages_lock_);
-  NoGCScope no_gc;
-  HeapPage* page = pages_;
-  while (page != NULL) {
-    if (page->type() == type) {
-      RawObject* obj = page->FindObject(visitor);
+  for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
+    if (it.page()->type() == type) {
+      RawObject* obj = it.page()->FindObject(visitor);
       if (obj != Object::null()) {
         return obj;
       }
     }
-    page = NextPageAnySize(page);
   }
   return Object::null();
 }
 
 
 void PageSpace::WriteProtect(bool read_only) {
-  MutexLocker ml(pages_lock_);
-  NoGCScope no_gc;
-  HeapPage* page = pages_;
-  while (page != NULL) {
-    page->WriteProtect(read_only);
-    page = NextPageAnySize(page);
+  for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
+    it.page()->WriteProtect(read_only);
   }
 }
 
@@ -554,7 +563,9 @@
   {
     // "pages" is an array [page0, page1, ..., pageN], each page of the form
     // {"object_start": "0x...", "objects": [size, class id, size, ...]}
+    // TODO(19445): Use ExclusivePageIterator once HeapMap supports large pages.
     MutexLocker ml(pages_lock_);
+    MakeIterable();
     NoGCScope no_gc;
     JSONArray all_pages(&heap_map, "pages");
     for (HeapPage* page = pages_; page != NULL; page = page->next()) {
@@ -662,6 +673,7 @@
   int64_t mid1 = OS::GetCurrentTimeMicros();
 
   // Abandon the remainder of the bump allocation block.
+  MakeIterable();
   bump_top_ = 0;
   bump_end_ = 0;
   // Reset the freelists and setup sweeping.
@@ -672,7 +684,7 @@
   int64_t mid3 = 0;
 
   {
-    GCSweeper sweeper(heap_);
+    GCSweeper sweeper;
 
     // During stop-the-world phases we should use bulk lock when adding elements
     // to the free list.
@@ -812,10 +824,14 @@
   uword result = bump_top_;
   bump_top_ += size;
   usage_.used_in_words += size >> kWordSizeLog2;
-  remaining -= size;
-  if (remaining > 0) {
-    FreeListElement::AsElement(bump_top_, remaining);
+  // Note: Remaining block is unwalkable until MakeIterable is called.
+#ifdef DEBUG
+  if (bump_top_ < bump_end_) {
+    // Fail fast if we try to walk the remaining block.
+    COMPILE_ASSERT(kIllegalCid == 0);
+    *reinterpret_cast<uword*>(bump_top_) = 0;
   }
+#endif  // DEBUG
   return result;
 }
 
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index e13e748..2a9d78c 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -306,8 +306,13 @@
   // Attempt to allocate from bump block rather than normal freelist.
   uword TryAllocateDataBump(intptr_t size, GrowthPolicy growth_policy);
   uword TryAllocateDataBumpLocked(intptr_t size, GrowthPolicy growth_policy);
+  // Prefer small freelist blocks, then chip away at the bump block.
   uword TryAllocatePromoLocked(intptr_t size, GrowthPolicy growth_policy);
 
+  // Bump block allocation from generated code.
+  uword* TopAddress() { return &bump_top_; }
+  uword* EndAddress() { return &bump_end_; }
+
  private:
   // Ids for time and data records in Heap::GCStats.
   enum {
@@ -337,6 +342,8 @@
   uword TryAllocateDataBumpInternal(intptr_t size,
                                     GrowthPolicy growth_policy,
                                     bool is_locked);
+  // Makes bump block walkable; do not call concurrently with mutator.
+  void MakeIterable() const;
   HeapPage* AllocatePage(HeapPage::PageType type);
   void FreePage(HeapPage* page, HeapPage* previous_page);
   HeapPage* AllocateLargePage(intptr_t size, HeapPage::PageType type);
@@ -363,6 +370,7 @@
 
   Heap* heap_;
 
+  // Use ExclusivePageIterator for safe access to these.
   Mutex* pages_lock_;
   HeapPage* pages_;
   HeapPage* pages_tail_;
@@ -388,6 +396,7 @@
   int64_t gc_time_micros_;
   intptr_t collections_;
 
+  friend class ExclusivePageIterator;
   friend class PageSpaceController;
   friend class SweeperTask;
 
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index ad0d498..aa547d4 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -7223,28 +7223,26 @@
 AstNode* Parser::ParseForInStatement(intptr_t forin_pos,
                                      SourceLabel* label) {
   TRACE_PARSER("ParseForInStatement");
-  bool is_final = (CurrentToken() == Token::kFINAL);
+  bool loop_var_is_final = (CurrentToken() == Token::kFINAL);
   if (CurrentToken() == Token::kCONST) {
     ReportError("Loop variable cannot be 'const'");
   }
   const String* loop_var_name = NULL;
-  LocalVariable* loop_var = NULL;
   intptr_t loop_var_pos = 0;
+  bool new_loop_var = false;
+  AbstractType& loop_var_type =  AbstractType::ZoneHandle(I);
   if (LookaheadToken(1) == Token::kIN) {
     loop_var_pos = TokenPos();
     loop_var_name = ExpectIdentifier("variable name expected");
   } else {
     // The case without a type is handled above, so require a type here.
-    const AbstractType& type =
-        AbstractType::ZoneHandle(I, ParseConstFinalVarOrType(
-            FLAG_enable_type_checks ? ClassFinalizer::kCanonicalize :
-                                      ClassFinalizer::kIgnore));
-    loop_var_pos = TokenPos();
+    // Delay creation of the local variable until we know its actual
+    // position, which is inside the loop body.
+    new_loop_var = true;
+    loop_var_type = ParseConstFinalVarOrType(
+        FLAG_enable_type_checks ? ClassFinalizer::kCanonicalize :
+                                  ClassFinalizer::kIgnore);
     loop_var_name = ExpectIdentifier("variable name expected");
-    loop_var = new(I) LocalVariable(loop_var_pos, *loop_var_name, type);
-    if (is_final) {
-      loop_var->set_is_final();
-    }
   }
   ExpectToken(Token::kIN);
   const intptr_t collection_pos = TokenPos();
@@ -7286,25 +7284,36 @@
   // loop body.
   OpenLoopBlock();
   current_block_->scope->AddLabel(label);
+  const intptr_t loop_var_assignment_pos = TokenPos();
 
   AstNode* iterator_current = new(I) InstanceGetterNode(
-      collection_pos,
-      new(I) LoadLocalNode(collection_pos, iterator_var),
+      loop_var_assignment_pos,
+      new(I) LoadLocalNode(loop_var_assignment_pos, iterator_var),
       Symbols::Current());
 
   // Generate assignment of next iterator value to loop variable.
   AstNode* loop_var_assignment = NULL;
-  if (loop_var != NULL) {
-    // The for loop declares a new variable. Add it to the loop body scope.
+  if (new_loop_var) {
+    // The for loop variable is new for each iteration.
+    // Create a variable and add it to the loop body scope.
+    LocalVariable* loop_var =
+       new(I) LocalVariable(loop_var_assignment_pos,
+                            *loop_var_name,
+                            loop_var_type);;
+    if (loop_var_is_final) {
+      loop_var->set_is_final();
+    }
     current_block_->scope->AddVariable(loop_var);
-    loop_var_assignment =
-        new(I) StoreLocalNode(loop_var_pos, loop_var, iterator_current);
+    loop_var_assignment = new(I) StoreLocalNode(
+        loop_var_assignment_pos, loop_var, iterator_current);
   } else {
     AstNode* loop_var_primary =
         ResolveIdent(loop_var_pos, *loop_var_name, false);
     ASSERT(!loop_var_primary->IsPrimaryNode());
-    loop_var_assignment = CreateAssignmentNode(
-        loop_var_primary, iterator_current, loop_var_name, loop_var_pos);
+    loop_var_assignment = CreateAssignmentNode(loop_var_primary,
+                                               iterator_current,
+                                               loop_var_name,
+                                               loop_var_assignment_pos);
     ASSERT(loop_var_assignment != NULL);
   }
   current_block_->statements->Add(loop_var_assignment);
diff --git a/runtime/vm/parser_test.cc b/runtime/vm/parser_test.cc
index 0595c9b..3595c16 100644
--- a/runtime/vm/parser_test.cc
+++ b/runtime/vm/parser_test.cc
@@ -19,17 +19,17 @@
 
 void DumpFunction(const Library& lib, const char* cname, const char* fname) {
   const String& classname = String::Handle(Symbols::New(cname));
-  Class& cls = Class::Handle(lib.LookupClass(classname));
-  EXPECT(!cls.IsNull());
-
   String& funcname = String::Handle(String::New(fname));
-  Function& function = Function::ZoneHandle(cls.LookupStaticFunction(funcname));
-  EXPECT(!function.IsNull());
 
   bool retval;
   EXPECT(Isolate::Current() != NULL);
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
+    Class& cls = Class::Handle(lib.LookupClass(classname));
+    EXPECT(!cls.IsNull());
+    Function& function =
+      Function::ZoneHandle(cls.LookupStaticFunction(funcname));
+    EXPECT(!function.IsNull());
     ParsedFunction* parsed_function =
         new ParsedFunction(Isolate::Current(), function);
     Parser::ParseFunction(parsed_function);
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index c4786b0..875704d 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -1968,6 +1968,17 @@
 
   ASSERT(isolate != Dart::vm_isolate());
 
+  uintptr_t sp = 0;
+  if ((isolate->stub_code() != NULL) &&
+      (isolate->top_exit_frame_info() == 0) &&
+      (isolate->vm_tag() == VMTag::kDartTagId)) {
+    // If we're in Dart code, use the Dart stack pointer.
+    sp = state.dsp;
+  } else {
+    // If we're in runtime code, use the C stack pointer.
+    sp = state.csp;
+  }
+
   IsolateProfilerData* profiler_data = isolate->profiler_data();
   if (profiler_data == NULL) {
     // Profiler not initialized.
@@ -1980,12 +1991,12 @@
     return;
   }
 
-  if ((state.sp == 0) || (state.fp == 0) || (state.pc == 0)) {
+  if ((sp == 0) || (state.fp == 0) || (state.pc == 0)) {
     // None of these registers should be zero.
     return;
   }
 
-  if (state.sp > state.fp) {
+  if (sp > state.fp) {
     // Assuming the stack grows down, we should never have a stack pointer above
     // the frame pointer.
     return;
@@ -2006,9 +2017,9 @@
     return;
   }
 
-  if (state.sp > stack_lower) {
+  if (sp > stack_lower) {
     // The stack pointer gives us a tighter lower bound.
-    stack_lower = state.sp;
+    stack_lower = sp;
   }
 
   if (stack_lower >= stack_upper) {
@@ -2016,7 +2027,7 @@
     return;
   }
 
-  if ((state.sp < stack_lower) || (state.sp >= stack_upper)) {
+  if ((sp < stack_lower) || (sp >= stack_upper)) {
     // Stack pointer is outside isolate stack boundary.
     return;
   }
@@ -2039,7 +2050,7 @@
   sample->Init(isolate, OS::GetCurrentTimeMicros(), state.tid);
   sample->set_vm_tag(isolate->vm_tag());
   sample->set_user_tag(isolate->user_tag());
-  sample->set_sp(state.sp);
+  sample->set_sp(sp);
   sample->set_fp(state.fp);
 #if !(defined(TARGET_OS_WINDOWS) && defined(TARGET_ARCH_X64))
   // It is never safe to read other thread's stack unless on Win64
@@ -2055,7 +2066,7 @@
                                           stack_upper,
                                           state.pc,
                                           state.fp,
-                                          state.sp);
+                                          sp);
     stackWalker.walk();
   } else {
     // Attempt to walk only the Dart call stack, falling back to walking
@@ -2076,7 +2087,7 @@
                                           stack_upper,
                                           state.pc,
                                           state.fp,
-                                          state.sp);
+                                          sp);
       stackWalker.walk();
     } else {
 #if defined(TARGET_OS_WINDOWS) && defined(TARGET_ARCH_X64)
@@ -2090,7 +2101,7 @@
                                             stack_upper,
                                             state.pc,
                                             state.fp,
-                                            state.sp);
+                                            sp);
       stackWalker.walk();
 #endif
     }
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index ba4e247..8b04d26 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -163,7 +163,7 @@
       case kExceptionHandlersCid: {
         const RawExceptionHandlers* raw_handlers =
             reinterpret_cast<const RawExceptionHandlers*>(this);
-        intptr_t num_handlers = raw_handlers->ptr()->length_;
+        intptr_t num_handlers = raw_handlers->ptr()->num_entries_;
         instance_size = ExceptionHandlers::InstanceSize(num_handlers);
         break;
       }
@@ -531,7 +531,7 @@
 intptr_t RawExceptionHandlers::VisitExceptionHandlersPointers(
     RawExceptionHandlers* raw_obj, ObjectPointerVisitor* visitor) {
   RawExceptionHandlers* obj = raw_obj->ptr();
-  intptr_t len = obj->length_;
+  intptr_t len = obj->num_entries_;
   visitor->VisitPointer(
       reinterpret_cast<RawObject**>(&obj->handled_types_data_));
   return ExceptionHandlers::InstanceSize(len);
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 87c4062..66ba221 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -227,13 +227,6 @@
     SNAPSHOT_WRITER_SUPPORT()                                                  \
     HEAP_PROFILER_SUPPORT()                                                    \
 
-#define OPEN_ARRAY_START(type, align)                                          \
-  do {                                                                         \
-    const uword result = reinterpret_cast<uword>(this) + sizeof(*this);        \
-    ASSERT(Utils::IsAligned(result, sizeof(align)));                           \
-    return reinterpret_cast<type*>(result);                                    \
-  } while (0)
-
 // RawObject is the base class of all raw objects, even though it carries the
 // class_ field not all raw objects are allocated in the heap and thus cannot
 // be dereferenced (e.g. RawSmi).
@@ -542,6 +535,7 @@
                                 // or the canonical type.
   RawArray* invocation_dispatcher_cache_;  // Cache for dispatcher functions.
   RawArray* cha_codes_;  // CHA optimized codes.
+  RawCode* spare_allocation_stub_;  // Spare stub code for allocation.
   RawCode* allocation_stub_;  // Stub code for allocation of instances.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->allocation_stub_);
@@ -1138,14 +1132,16 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers);
 
   // Number of exception handler entries.
-  int32_t length_;
+  int32_t num_entries_;
 
-  // Array with [length_] entries. Each entry is an array of all handled
+  // Array with [num_entries_] entries. Each entry is an array of all handled
   // exception types.
   RawArray* handled_types_data_;
 
-  // Exception handler info of length [length_].
+  // Exception handler info of length [num_entries_].
   HandlerInfo* data() { OPEN_ARRAY_START(HandlerInfo, intptr_t); }
+
+  friend class Object;
 };
 
 
diff --git a/runtime/vm/signal_handler.h b/runtime/vm/signal_handler.h
index b45c014..27b6674 100644
--- a/runtime/vm/signal_handler.h
+++ b/runtime/vm/signal_handler.h
@@ -52,7 +52,8 @@
   static void Install(SignalAction action);
   static uintptr_t GetProgramCounter(const mcontext_t& mcontext);
   static uintptr_t GetFramePointer(const mcontext_t& mcontext);
-  static uintptr_t GetStackPointer(const mcontext_t& mcontext);
+  static uintptr_t GetCStackPointer(const mcontext_t& mcontext);
+  static uintptr_t GetDartStackPointer(const mcontext_t& mcontext);
  private:
 };
 
diff --git a/runtime/vm/signal_handler_android.cc b/runtime/vm/signal_handler_android.cc
index 4d2873a..ff468b6 100644
--- a/runtime/vm/signal_handler_android.cc
+++ b/runtime/vm/signal_handler_android.cc
@@ -38,7 +38,7 @@
 }
 
 
-uintptr_t SignalHandler::GetStackPointer(const mcontext_t& mcontext) {
+uintptr_t SignalHandler::GetCStackPointer(const mcontext_t& mcontext) {
   uintptr_t sp = 0;
 
 #if defined(TARGET_ARCH_ARM)
@@ -52,6 +52,20 @@
 }
 
 
+uintptr_t SignalHandler::GetDartStackPointer(const mcontext_t& mcontext) {
+  uintptr_t sp = 0;
+
+#if defined(TARGET_ARCH_ARM)
+  sp = static_cast<uintptr_t>(mcontext.arm_sp);
+#elif defined(TARGET_ARCH_ARM64)
+  sp = static_cast<uintptr_t>(mcontext.regs[18]);
+#else
+  UNIMPLEMENTED();
+#endif  // TARGET_ARCH_...
+  return sp;
+}
+
+
 void SignalHandler::Install(SignalAction action) {
   struct sigaction act;
   memset(&act, 0, sizeof(act));
diff --git a/runtime/vm/signal_handler_linux.cc b/runtime/vm/signal_handler_linux.cc
index 7de4697..980733e 100644
--- a/runtime/vm/signal_handler_linux.cc
+++ b/runtime/vm/signal_handler_linux.cc
@@ -20,8 +20,12 @@
   pc = static_cast<uintptr_t>(mcontext.gregs[REG_EIP]);
 #elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR)
   pc = static_cast<uintptr_t>(mcontext.gregs[REG_EIP]);
+#elif defined(TARGET_ARCH_ARM64) && defined(USING_SIMULATOR)
+  pc = static_cast<uintptr_t>(mcontext.gregs[REG_RIP]);
 #elif defined(TARGET_ARCH_ARM)
   pc = static_cast<uintptr_t>(mcontext.arm_pc);
+#elif defined(TARGET_ARCH_ARM64)
+  pc = static_cast<uintptr_t>(mcontext.pc);
 #elif defined(TARGET_ARCH_MIPS)
   pc = static_cast<uintptr_t>(mcontext.pc);
 #else
@@ -42,8 +46,12 @@
   fp = static_cast<uintptr_t>(mcontext.gregs[REG_EBP]);
 #elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR)
   fp = static_cast<uintptr_t>(mcontext.gregs[REG_EBP]);
+#elif defined(TARGET_ARCH_ARM64) && defined(USING_SIMULATOR)
+  fp = static_cast<uintptr_t>(mcontext.gregs[REG_RBP]);
 #elif defined(TARGET_ARCH_ARM)
   fp = static_cast<uintptr_t>(mcontext.arm_fp);
+#elif defined(TARGET_ARCH_ARM64)
+  fp = static_cast<uintptr_t>(mcontext.regs[29]);
 #elif defined(TARGET_ARCH_MIPS)
   fp = static_cast<uintptr_t>(mcontext.gregs[30]);
 #else
@@ -54,7 +62,7 @@
 }
 
 
-uintptr_t SignalHandler::GetStackPointer(const mcontext_t& mcontext) {
+uintptr_t SignalHandler::GetCStackPointer(const mcontext_t& mcontext) {
   uintptr_t sp = 0;
 
 #if defined(TARGET_ARCH_IA32)
@@ -65,8 +73,12 @@
   sp = static_cast<uintptr_t>(mcontext.gregs[REG_ESP]);
 #elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR)
   sp = static_cast<uintptr_t>(mcontext.gregs[REG_ESP]);
+#elif defined(TARGET_ARCH_ARM64) && defined(USING_SIMULATOR)
+  sp = static_cast<uintptr_t>(mcontext.gregs[REG_RSP]);
 #elif defined(TARGET_ARCH_ARM)
   sp = static_cast<uintptr_t>(mcontext.arm_sp);
+#elif defined(TARGET_ARCH_ARM64)
+  sp = static_cast<uintptr_t>(mcontext.sp);
 #elif defined(TARGET_ARCH_MIPS)
   sp = static_cast<uintptr_t>(mcontext.gregs[29]);
 #else
@@ -76,6 +88,15 @@
 }
 
 
+uintptr_t SignalHandler::GetDartStackPointer(const mcontext_t& mcontext) {
+#if defined(TARGET_ARCH_ARM64) && !defined(USING_SIMULATOR)
+  return static_cast<uintptr_t>(mcontext.regs[18]);
+#else
+  return GetCStackPointer(mcontext);
+#endif
+}
+
+
 void SignalHandler::Install(SignalAction action) {
   struct sigaction act;
   act.sa_handler = NULL;
diff --git a/runtime/vm/signal_handler_macos.cc b/runtime/vm/signal_handler_macos.cc
index 11e6234..9d5b1c7 100644
--- a/runtime/vm/signal_handler_macos.cc
+++ b/runtime/vm/signal_handler_macos.cc
@@ -20,6 +20,8 @@
   pc = static_cast<uintptr_t>(mcontext->__ss.__eip);
 #elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR)
   pc = static_cast<uintptr_t>(mcontext->__ss.__eip);
+#elif defined(TARGET_ARCH_ARM64) && defined(USING_SIMULATOR)
+  pc = static_cast<uintptr_t>(mcontext->__ss.__rip);
 #else
   UNIMPLEMENTED();
 #endif  // TARGET_ARCH_...
@@ -39,6 +41,8 @@
   fp = static_cast<uintptr_t>(mcontext->__ss.__ebp);
 #elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR)
   fp = static_cast<uintptr_t>(mcontext->__ss.__ebp);
+#elif defined(TARGET_ARCH_ARM64) && defined(USING_SIMULATOR)
+  fp = static_cast<uintptr_t>(mcontext->__ss.__rbp);
 #else
   UNIMPLEMENTED();
 #endif  // TARGET_ARCH_...
@@ -47,7 +51,7 @@
 }
 
 
-uintptr_t SignalHandler::GetStackPointer(const mcontext_t& mcontext) {
+uintptr_t SignalHandler::GetCStackPointer(const mcontext_t& mcontext) {
   uintptr_t sp = 0;
 
 #if defined(TARGET_ARCH_IA32)
@@ -58,6 +62,8 @@
   sp = static_cast<uintptr_t>(mcontext->__ss.__esp);
 #elif defined(TARGET_ARCH_ARM) && defined(USING_SIMULATOR)
   sp = static_cast<uintptr_t>(mcontext->__ss.__esp);
+#elif defined(TARGET_ARCH_ARM64) && defined(USING_SIMULATOR)
+  sp = static_cast<uintptr_t>(mcontext->__ss.__rsp);
 #else
   UNIMPLEMENTED();
 #endif  // TARGET_ARCH_...
@@ -66,6 +72,11 @@
 }
 
 
+uintptr_t SignalHandler::GetDartStackPointer(const mcontext_t& mcontext) {
+  return GetCStackPointer(mcontext);
+}
+
+
 void SignalHandler::Install(SignalAction action) {
   struct sigaction act;
   act.sa_handler = NULL;
diff --git a/runtime/vm/signal_handler_win.cc b/runtime/vm/signal_handler_win.cc
index 6fc7723..3f052d8 100644
--- a/runtime/vm/signal_handler_win.cc
+++ b/runtime/vm/signal_handler_win.cc
@@ -20,7 +20,13 @@
 }
 
 
-uintptr_t SignalHandler::GetStackPointer(const mcontext_t& mcontext) {
+uintptr_t SignalHandler::GetCStackPointer(const mcontext_t& mcontext) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+uintptr_t SignalHandler::GetDartStackPointer(const mcontext_t& mcontext) {
   UNIMPLEMENTED();
   return 0;
 }
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 649a1f7..5ff66c1 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -1266,7 +1266,7 @@
 typedef void (*SimulatorRuntimeCall)(NativeArguments arguments);
 
 // Calls to leaf Dart runtime functions are based on this interface.
-typedef int32_t (*SimulatorLeafRuntimeCall)(
+typedef int64_t (*SimulatorLeafRuntimeCall)(
     int64_t r0, int64_t r1, int64_t r2, int64_t r3,
     int64_t r4, int64_t r5, int64_t r6, int64_t r7);
 
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 82e689f..117a9a2 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -145,7 +145,7 @@
   static const Snapshot* SetupFromBuffer(const void* raw_memory);
 
   // Getters.
-  const uint8_t* content() const { return content_; }
+  const uint8_t* content() const { OPEN_ARRAY_START(uint8_t, uint8_t); }
   intptr_t length() const {
     return static_cast<intptr_t>(ReadUnaligned(&unaligned_length_));
   }
@@ -172,7 +172,8 @@
   // The following fields are potentially unaligned.
   int64_t unaligned_length_;  // Stream length.
   int64_t unaligned_kind_;  // Kind of snapshot.
-  uint8_t content_[];  // Stream content.
+
+  // Variable length data follows here.
 
   DISALLOW_COPY_AND_ASSIGN(Snapshot);
 };
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index c33c6f0..a22e40a 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -218,7 +218,7 @@
   REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(isolate);
   ExceptionHandlers& handlers = reused_exception_handlers_handle.Handle();
   handlers = code.exception_handlers();
-  if (handlers.Length() == 0) {
+  if (handlers.num_entries() == 0) {
     return false;
   }
 
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 84dd3a6..532804f 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -118,8 +118,10 @@
   if (stub.IsNull()) {
     Assembler assembler;
     const char* name = cls.ToCString();
-    uword patch_code_offset =
-        StubCode::GenerateAllocationStubForClass(&assembler, cls);
+    uword patch_code_offset = 0;
+    uword entry_patch_offset = 0;
+    StubCode::GenerateAllocationStubForClass(
+        &assembler, cls, &entry_patch_offset, &patch_code_offset);
     stub ^= Code::FinalizeCode(name, &assembler);
     stub.set_owner(cls);
     cls.set_allocation_stub(stub);
@@ -129,7 +131,7 @@
       stub.Disassemble(&formatter);
       OS::Print("}\n");
     }
-    stub.set_entry_patch_pc_offset(0);
+    stub.set_entry_patch_pc_offset(entry_patch_offset);
     stub.set_patch_code_pc_offset(patch_code_offset);
   }
   return stub.raw();
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index cd1bd4b..3b5ac2f 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -200,8 +200,9 @@
                            void (*GenerateStub)(Assembler* assembler));
 
   static void GenerateMegamorphicMissStub(Assembler* assembler);
-  static uword GenerateAllocationStubForClass(Assembler* assembler,
-                                              const Class& cls);
+  static void GenerateAllocationStubForClass(
+      Assembler* assembler, const Class& cls,
+      uword* entry_patch_offset, uword* patch_code_pc_offset);
   static void GenerateNArgsCheckInlineCacheStub(
       Assembler* assembler,
       intptr_t num_args,
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index af78719..73f0471 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -637,8 +637,9 @@
 
   Isolate* isolate = Isolate::Current();
   Heap* heap = isolate->heap();
-
-  __ LoadImmediate(R6, heap->TopAddress());
+  const intptr_t cid = kArrayCid;
+  Heap::Space space = heap->SpaceForAllocation(cid);
+  __ LoadImmediate(R6, heap->TopAddress(space));
   __ ldr(R0, Address(R6, 0));  // Potential new object start.
   __ adds(R7, R0, Operand(R8));  // Potential next object start.
   __ b(&slow_case, VS);
@@ -647,7 +648,7 @@
   // R0: potential new object start.
   // R7: potential next object start.
   // R8: allocation size.
-  __ LoadImmediate(R3, heap->EndAddress());
+  __ LoadImmediate(R3, heap->EndAddress(space));
   __ ldr(R3, Address(R3, 0));
   __ cmp(R7, Operand(R3));
   __ b(&slow_case, CS);
@@ -656,7 +657,7 @@
   // next object start and initialize the object.
   __ str(R7, Address(R6, 0));
   __ add(R0, R0, Operand(kHeapObjectTag));
-  __ UpdateAllocationStatsWithSize(kArrayCid, R8, R4);
+  __ UpdateAllocationStatsWithSize(cid, R8, R4, space);
 
   // Initialize the tags.
   // R0: new object start as a tagged pointer.
@@ -664,7 +665,6 @@
   // R8: allocation size.
   {
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
-    const Class& cls = Class::Handle(isolate->object_store()->array_class());
 
     __ CompareImmediate(R8, RawObject::SizeTag::kMaxSizeTag);
     __ mov(R8, Operand(R8, LSL, shift), LS);
@@ -672,7 +672,7 @@
 
     // Get the class index and insert it into the tags.
     // R8: size and bit tags.
-    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()));
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid));
     __ orr(R8, R8, Operand(TMP));
     __ str(R8, FieldAddress(R0, Array::tags_offset()));  // Store tags.
   }
@@ -765,8 +765,8 @@
   // Cache the new Context pointer into CTX while executing Dart code.
   __ ldr(CTX, Address(R3, VMHandles::kOffsetOfRawPtrInHandle));
 
-  // Load Isolate pointer from Context structure into temporary register R8.
-  __ ldr(R8, FieldAddress(CTX, Context::isolate_offset()));
+  // Load Isolate pointer into temporary register R8.
+  __ LoadImmediate(R8, Isolate::CurrentAddress());
 
   // Save the current VMTag on the stack.
   ASSERT(kSavedVMTagSlotFromEntryFp == -25);
@@ -832,8 +832,8 @@
   // Get rid of arguments pushed on the stack.
   __ AddImmediate(SP, FP, kSavedContextSlotFromEntryFp * kWordSize);
 
-  // Load Isolate pointer from Context structure into CTX. Drop Context.
-  __ ldr(CTX, FieldAddress(CTX, Context::isolate_offset()));
+  // Load Isolate pointer into CTX. Drop Context.
+  __ LoadImmediate(CTX, Isolate::CurrentAddress());
 
   // Restore the saved Context pointer into the Isolate structure.
   // Uses R4 as a temporary register for this.
@@ -870,7 +870,6 @@
 //   R0: new allocated RawContext object.
 void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
   if (FLAG_inline_alloc) {
-    const Class& context_class = Class::ZoneHandle(Object::context_class());
     Label slow_case;
     Heap* heap = Isolate::Current()->heap();
     // First compute the rounded instance size.
@@ -884,7 +883,9 @@
     // Now allocate the object.
     // R1: number of context variables.
     // R2: object size.
-    __ LoadImmediate(R5, heap->TopAddress());
+    const intptr_t cid = kContextCid;
+    Heap::Space space = heap->SpaceForAllocation(cid);
+    __ LoadImmediate(R5, heap->TopAddress(space));
     __ ldr(R0, Address(R5, 0));
     __ add(R3, R2, Operand(R0));
     // Check if the allocation fits into the remaining space.
@@ -892,7 +893,7 @@
     // R1: number of context variables.
     // R2: object size.
     // R3: potential next object start.
-    __ LoadImmediate(IP, heap->EndAddress());
+    __ LoadImmediate(IP, heap->EndAddress(space));
     __ ldr(IP, Address(IP, 0));
     __ cmp(R3, Operand(IP));
     if (FLAG_use_slow_path) {
@@ -909,7 +910,7 @@
     // R3: next object start.
     __ str(R3, Address(R5, 0));
     __ add(R0, R0, Operand(kHeapObjectTag));
-    __ UpdateAllocationStatsWithSize(context_class.id(), R2, R5);
+    __ UpdateAllocationStatsWithSize(cid, R2, R5, space);
 
     // Calculate the size tag.
     // R0: new object.
@@ -923,7 +924,7 @@
 
     // Get the class index and insert it into the tags.
     // R2: size and bit tags.
-    __ LoadImmediate(IP, RawObject::ClassIdTag::encode(context_class.id()));
+    __ LoadImmediate(IP, RawObject::ClassIdTag::encode(cid));
     __ orr(R2, R2, Operand(IP));
     __ str(R2, FieldAddress(R0, Context::tags_offset()));
 
@@ -933,10 +934,10 @@
     __ str(R1, FieldAddress(R0, Context::num_variables_offset()));
 
     // Setup isolate field.
-    // Load Isolate pointer from Context structure into R2.
+    // Load Isolate pointer into R2.
     // R0: new object.
     // R1: number of context variables.
-    __ ldr(R2, FieldAddress(CTX, Context::isolate_offset()));
+    __ LoadImmediate(R2, Isolate::CurrentAddress());
     // R2: isolate, not an object.
     __ str(R2, FieldAddress(R0, Context::isolate_offset()));
 
@@ -1004,10 +1005,10 @@
   __ orr(R2, R2, Operand(1 << RawObject::kRememberedBit));
   __ str(R2, FieldAddress(R0, Object::tags_offset()));
 
-  // Load the isolate out of the context.
+  // Load the isolate.
   // Spilled: R1, R2, R3.
   // R0: address being stored.
-  __ ldr(R1, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadImmediate(R1, Isolate::CurrentAddress());
 
   // Load the StoreBuffer block out of the isolate. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
@@ -1034,7 +1035,7 @@
   // Setup frame, push callee-saved registers.
 
   __ EnterCallRuntimeFrame(0 * kWordSize);
-  __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadImmediate(R0, Isolate::CurrentAddress());
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   // Restore callee-saved registers, tear down frame.
   __ LeaveCallRuntimeFrame();
@@ -1048,8 +1049,10 @@
 //   SP + 0 : type arguments object (only if class is parameterized).
 // Returns patch_code_pc offset where patching code for disabling the stub
 // has been generated (similar to regularly generated Dart code).
-uword StubCode::GenerateAllocationStubForClass(Assembler* assembler,
-                                               const Class& cls) {
+void StubCode::GenerateAllocationStubForClass(
+    Assembler* assembler, const Class& cls,
+    uword* entry_patch_offset, uword* patch_code_pc_offset) {
+  *entry_patch_offset = assembler->CodeSize();
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized = cls.NumTypeArguments() > 0;
   ASSERT(!is_cls_parameterized ||
@@ -1070,13 +1073,14 @@
     // next object start and initialize the allocated object.
     // R1: instantiated type arguments (if is_cls_parameterized).
     Heap* heap = Isolate::Current()->heap();
-    __ LoadImmediate(R5, heap->TopAddress());
+    Heap::Space space = heap->SpaceForAllocation(cls.id());
+    __ LoadImmediate(R5, heap->TopAddress(space));
     __ ldr(R2, Address(R5, 0));
     __ AddImmediate(R3, R2, instance_size);
     // Check if the allocation fits into the remaining space.
     // R2: potential new object start.
     // R3: potential next object start.
-    __ LoadImmediate(IP, heap->EndAddress());
+    __ LoadImmediate(IP, heap->EndAddress(space));
     __ ldr(IP, Address(IP, 0));
     __ cmp(R3, Operand(IP));
     if (FLAG_use_slow_path) {
@@ -1085,7 +1089,7 @@
       __ b(&slow_case, CS);  // Unsigned higher or equal.
     }
     __ str(R3, Address(R5, 0));
-    __ UpdateAllocationStats(cls.id(), R5);
+    __ UpdateAllocationStats(cls.id(), R5, space);
 
     // R2: new object start.
     // R3: next object start.
@@ -1167,10 +1171,9 @@
   // Restore the frame pointer.
   __ LeaveStubFrame();
   __ Ret();
-  uword patch_code_pc_offset = assembler->CodeSize();
+  *patch_code_pc_offset = assembler->CodeSize();
   StubCode* stub_code = Isolate::Current()->stub_code();
   __ BranchPatchable(&stub_code->FixAllocationStubTargetLabel());
-  return patch_code_pc_offset;
 }
 
 
@@ -1332,10 +1335,10 @@
   }
 #endif  // DEBUG
 
-  Label stepping, done_stepping;
 
   // Check single stepping.
-  __ ldr(R6, FieldAddress(CTX, Context::isolate_offset()));
+  Label stepping, done_stepping;
+  __ LoadImmediate(R6, Isolate::CurrentAddress());
   __ ldrb(R6, Address(R6, Isolate::single_step_offset()));
   __ CompareImmediate(R6, 0);
   __ b(&stepping, NE);
@@ -1556,7 +1559,7 @@
 
   // Check single stepping.
   Label stepping, done_stepping;
-  __ ldr(R6, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadImmediate(R6, Isolate::CurrentAddress());
   __ ldrb(R6, Address(R6, Isolate::single_step_offset()));
   __ CompareImmediate(R6, 0);
   __ b(&stepping, NE);
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 422a870..1306bdb 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -93,8 +93,7 @@
   __ add(R2, ZR, Operand(R4, LSL, 3));
   __ add(R2, FP, Operand(R2));  // Compute argv.
   // Set argv in NativeArguments.
-  __ AddImmediate(R2, R2, exitframe_last_param_slot_from_fp * kWordSize,
-                  kNoPP);
+  __ AddImmediate(R2, R2, exitframe_last_param_slot_from_fp * kWordSize, kNoPP);
 
     ASSERT(retval_offset == 3 * kWordSize);
   __ AddImmediate(R3, R2, kWordSize, kNoPP);
@@ -657,16 +656,24 @@
   }
   __ cmp(R2, Operand(0));
   __ b(&slow_case, LT);
-  __ LoadFieldFromOffset(R8, CTX, Context::isolate_offset(), kNoPP);
-  __ LoadFromOffset(R8, R8, Isolate::heap_offset(), kNoPP);
-  __ LoadFromOffset(R8, R8, Heap::new_space_offset(), kNoPP);
+
+  Isolate* isolate = Isolate::Current();
+  Heap* heap = isolate->heap();
+  const intptr_t cid = kArrayCid;
+  Heap::Space space = heap->SpaceForAllocation(cid);
+  const uword top_address = heap->TopAddress(space);
+  __ LoadImmediate(R8, top_address, kNoPP);
+  const uword end_address = heap->EndAddress(space);
+  ASSERT(top_address < end_address);
+  const uword top_offset = 0;
+  const uword end_offset = end_address - top_address;
 
   // Calculate and align allocation size.
   // Load new object start and calculate next object start.
   // R1: array element type.
   // R2: array length as Smi.
   // R8: points to new space object.
-  __ LoadFromOffset(R0, R8, Scavenger::top_offset(), kNoPP);
+  __ LoadFromOffset(R0, R8, top_offset, kNoPP);
   intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
   __ LoadImmediate(R3, fixed_size, kNoPP);
   __ add(R3, R3, Operand(R2, LSL, 2));  // R2 is Smi.
@@ -682,7 +689,7 @@
   // R3: array size.
   // R7: potential next object start.
   // R8: points to new space object.
-  __ LoadFromOffset(TMP, R8, Scavenger::end_offset(), kNoPP);
+  __ LoadFromOffset(TMP, R8, end_offset, kNoPP);
   __ CompareRegisters(R7, TMP);
   __ b(&slow_case, CS);  // Branch if unsigned higher or equal.
 
@@ -692,9 +699,9 @@
   // R3: array size.
   // R7: potential next object start.
   // R8: Points to new space object.
-  __ StoreToOffset(R7, R8, Scavenger::top_offset(), kNoPP);
+  __ StoreToOffset(R7, R8, top_offset, kNoPP);
   __ add(R0, R0, Operand(kHeapObjectTag));
-  __ UpdateAllocationStatsWithSize(kArrayCid, R3, kNoPP);
+  __ UpdateAllocationStatsWithSize(cid, R3, kNoPP, space);
 
   // R0: new object start as a tagged pointer.
   // R1: array element type.
@@ -717,12 +724,12 @@
   const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
   __ CompareImmediate(R3, RawObject::SizeTag::kMaxSizeTag, kNoPP);
   // If no size tag overflow, shift R1 left, else set R1 to zero.
-  __ Lsl(TMP, R3, shift);
+  __ LslImmediate(TMP, R3, shift);
   __ csel(R1, TMP, R1, LS);
   __ csel(R1, ZR, R1, HI);
 
   // Get the class index and insert it into the tags.
-  __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(kArrayCid), kNoPP);
+  __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid), kNoPP);
   __ orr(R1, R1, Operand(TMP));
   __ StoreFieldToOffset(R1, R0, Array::tags_offset(), kNoPP);
 
@@ -783,13 +790,9 @@
   const intptr_t kNewContextOffsetFromFp =
       -(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize;
 
-  // Amount of space to reserve with the system stack pointer before setting it
-  // to the stack limit.
-  const intptr_t kRegSaveSpace = Utils::RoundUp(-kNewContextOffsetFromFp, 16);
-
   // Copy the C stack pointer (R31) into the stack pointer we'll actually use
-  // to access the stack.
-  __ SetupDartSP(kRegSaveSpace);
+  // to access the stack, and put the C stack pointer at the stack limit.
+  __ SetupDartSP(Isolate::GetSpecifiedStackSize());
   __ EnterFrame(0);
 
   // Save the callee-saved registers.
@@ -809,6 +812,16 @@
 
   // Push new context.
   __ Push(R3);
+#if defined(DEBUG)
+  {
+    Label ok;
+    __ AddImmediate(R4, FP, kNewContextOffsetFromFp, kNoPP);
+    __ CompareRegisters(R4, SP);
+    __ b(&ok, EQ);
+    __ Stop("kNewContextOffsetFromFp mismatch");
+    __ Bind(&ok);
+  }
+#endif
 
   // We now load the pool pointer(PP) as we are about to invoke dart code and we
   // could potentially invoke some intrinsic functions which need the PP to be
@@ -824,11 +837,8 @@
   // Cache the new Context pointer into CTX while executing Dart code.
   __ LoadFromOffset(CTX, R3, VMHandles::kOffsetOfRawPtrInHandle, PP);
 
-  // Load Isolate pointer from Context structure into temporary register R5.
-  __ LoadFieldFromOffset(R5, CTX, Context::isolate_offset(), PP);
-
-  // Load the stack limit address into the C stack pointer register.
-  __ LoadFromOffset(CSP, R5, Isolate::stack_limit_offset(), PP);
+  // Load Isolate pointer into temporary register R5.
+  __ LoadImmediate(R5, Isolate::CurrentAddress(), PP);
 
   // Cache the new Context pointer into CTX while executing Dart code.
   __ LoadFromOffset(CTX, R3, VMHandles::kOffsetOfRawPtrInHandle, PP);
@@ -891,6 +901,9 @@
   __ blr(R0);  // R4 is the arguments descriptor array.
   __ Comment("InvokeDartCodeStub return");
 
+  // Restore constant pool pointer after return.
+  __ LoadPoolPointer(PP);
+
   // Read the saved new Context pointer.
   __ LoadFromOffset(CTX, FP, kNewContextOffsetFromFp, PP);
   __ LoadFromOffset(CTX, CTX, VMHandles::kOffsetOfRawPtrInHandle, PP);
@@ -898,8 +911,8 @@
   // Get rid of arguments pushed on the stack.
   __ AddImmediate(SP, FP, kSavedContextSlotFromEntryFp * kWordSize, PP);
 
-  // Load Isolate pointer from Context structure into CTX. Drop Context.
-  __ LoadFieldFromOffset(CTX, CTX, Context::isolate_offset(), PP);
+  // Load Isolate pointer into CTX. Drop Context.
+  __ LoadImmediate(CTX, Isolate::CurrentAddress(), PP);
 
   // Restore the current VMTag from the stack.
   __ ldr(R4, Address(SP, 2 * kWordSize));
@@ -947,7 +960,6 @@
 //   R0: new allocated RawContext object.
 void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
   if (FLAG_inline_alloc) {
-    const Class& context_class = Class::ZoneHandle(Object::context_class());
     Label slow_case;
     Heap* heap = Isolate::Current()->heap();
     // First compute the rounded instance size.
@@ -961,7 +973,9 @@
     // Now allocate the object.
     // R1: number of context variables.
     // R2: object size.
-    __ LoadImmediate(R5, heap->TopAddress(), kNoPP);
+    const intptr_t cid = kContextCid;
+    Heap::Space space = heap->SpaceForAllocation(cid);
+    __ LoadImmediate(R5, heap->TopAddress(space), kNoPP);
     __ ldr(R0, Address(R5));
     __ add(R3, R2, Operand(R0));
     // Check if the allocation fits into the remaining space.
@@ -969,7 +983,7 @@
     // R1: number of context variables.
     // R2: object size.
     // R3: potential next object start.
-    __ LoadImmediate(TMP, heap->EndAddress(), kNoPP);
+    __ LoadImmediate(TMP, heap->EndAddress(space), kNoPP);
     __ ldr(TMP, Address(TMP));
     __ CompareRegisters(R3, TMP);
     if (FLAG_use_slow_path) {
@@ -986,7 +1000,7 @@
     // R3: next object start.
     __ str(R3, Address(R5));
     __ add(R0, R0, Operand(kHeapObjectTag));
-    __ UpdateAllocationStatsWithSize(context_class.id(), R2, kNoPP);
+    __ UpdateAllocationStatsWithSize(cid, R2, kNoPP, space);
 
     // Calculate the size tag.
     // R0: new object.
@@ -995,14 +1009,14 @@
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
     __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag, kNoPP);
     // If no size tag overflow, shift R2 left, else set R2 to zero.
-    __ Lsl(TMP, R2, shift);
+    __ LslImmediate(TMP, R2, shift);
     __ csel(R2, TMP, R2, LS);
     __ csel(R2, ZR, R2, HI);
 
     // Get the class index and insert it into the tags.
     // R2: size and bit tags.
     __ LoadImmediate(
-        TMP, RawObject::ClassIdTag::encode(context_class.id()), kNoPP);
+        TMP, RawObject::ClassIdTag::encode(cid), kNoPP);
     __ orr(R2, R2, Operand(TMP));
     __ StoreFieldToOffset(R2, R0, Context::tags_offset(), kNoPP);
 
@@ -1012,10 +1026,10 @@
     __ StoreFieldToOffset(R1, R0, Context::num_variables_offset(), kNoPP);
 
     // Setup isolate field.
-    // Load Isolate pointer from Context structure into R2.
+    // Load Isolate pointer into R2.
     // R0: new object.
     // R1: number of context variables.
-    __ LoadFieldFromOffset(R2, CTX, Context::isolate_offset(), kNoPP);
+    __ LoadImmediate(R2, Isolate::CurrentAddress(), kNoPP);
     // R2: isolate, not an object.
     __ StoreFieldToOffset(R2, R0, Context::isolate_offset(), kNoPP);
 
@@ -1085,10 +1099,10 @@
   __ orri(R2, TMP, 1 << RawObject::kRememberedBit);
   __ StoreFieldToOffset(R2, R0, Object::tags_offset(), kNoPP);
 
-  // Load the isolate out of the context.
+  // Load the isolate.
   // Spilled: R1, R2, R3.
   // R0: address being stored.
-  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadImmediate(R1, Isolate::CurrentAddress(), kNoPP);
 
   // Load the StoreBuffer block out of the isolate. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
@@ -1119,7 +1133,7 @@
   // Setup frame, push callee-saved registers.
 
   __ EnterCallRuntimeFrame(0 * kWordSize);
-  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadImmediate(R0, Isolate::CurrentAddress(), kNoPP);
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   // Restore callee-saved registers, tear down frame.
   __ LeaveCallRuntimeFrame();
@@ -1131,8 +1145,10 @@
 // Input parameters:
 //   LR : return address.
 //   SP + 0 : type arguments object (only if class is parameterized).
-uword StubCode::GenerateAllocationStubForClass(Assembler* assembler,
-                                               const Class& cls) {
+void StubCode::GenerateAllocationStubForClass(
+    Assembler* assembler, const Class& cls,
+    uword* entry_patch_offset, uword* patch_code_pc_offset) {
+  *entry_patch_offset = assembler->CodeSize();
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized = cls.NumTypeArguments() > 0;
   ASSERT(!is_cls_parameterized ||
@@ -1153,13 +1169,14 @@
     // next object start and initialize the allocated object.
     // R1: instantiated type arguments (if is_cls_parameterized).
     Heap* heap = Isolate::Current()->heap();
-    __ LoadImmediate(R5, heap->TopAddress(), kNoPP);
+    Heap::Space space = heap->SpaceForAllocation(cls.id());
+    __ LoadImmediate(R5, heap->TopAddress(space), kNoPP);
     __ ldr(R2, Address(R5));
     __ AddImmediate(R3, R2, instance_size, kNoPP);
     // Check if the allocation fits into the remaining space.
     // R2: potential new object start.
     // R3: potential next object start.
-    __ LoadImmediate(TMP, heap->EndAddress(), kNoPP);
+    __ LoadImmediate(TMP, heap->EndAddress(space), kNoPP);
     __ ldr(TMP, Address(TMP));
     __ CompareRegisters(R3, TMP);
     if (FLAG_use_slow_path) {
@@ -1168,7 +1185,7 @@
       __ b(&slow_case, CS);  // Unsigned higher or equal.
     }
     __ str(R3, Address(R5));
-    __ UpdateAllocationStats(cls.id(), kNoPP);
+    __ UpdateAllocationStats(cls.id(), kNoPP, space);
 
     // R2: new object start.
     // R3: next object start.
@@ -1250,10 +1267,9 @@
   // Restore the frame pointer.
   __ LeaveStubFrame();
   __ ret();
-  uword patch_code_pc_offset = assembler->CodeSize();
+  *patch_code_pc_offset = assembler->CodeSize();
   StubCode* stub_code = Isolate::Current()->stub_code();
   __ BranchPatchable(&stub_code->FixAllocationStubTargetLabel());
-  return patch_code_pc_offset;
 }
 
 
@@ -1431,9 +1447,9 @@
   }
 #endif  // DEBUG
 
-  Label stepping, done_stepping;
   // Check single stepping.
-  __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP);
+  Label stepping, done_stepping;
+  __ LoadImmediate(R6, Isolate::CurrentAddress(), kNoPP);
   __ LoadFromOffset(
       R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
   __ CompareRegisters(R6, ZR);
@@ -1665,7 +1681,7 @@
 
   // Check single stepping.
   Label stepping, done_stepping;
-  __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadImmediate(R6, Isolate::CurrentAddress(), kNoPP);
   __ LoadFromOffset(
       R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
   __ CompareImmediate(R6, 0, kNoPP);
@@ -2041,7 +2057,7 @@
 // Return Zero condition flag set if equal.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-    // Check single stepping.
+  // Check single stepping.
   Label stepping, done_stepping;
   __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
   __ LoadFromOffset(
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 4b6e726..321e746 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -645,8 +645,9 @@
 
   Isolate* isolate = Isolate::Current();
   Heap* heap = isolate->heap();
-
-  __ movl(EAX, Address::Absolute(heap->TopAddress()));
+  const intptr_t cid = kArrayCid;
+  Heap::Space space = heap->SpaceForAllocation(cid);
+  __ movl(EAX, Address::Absolute(heap->TopAddress(space)));
   __ movl(EBX, EAX);
 
   // EDI: allocation size.
@@ -659,14 +660,14 @@
   // EDI: allocation size.
   // ECX: array element type.
   // EDX: array length as Smi).
-  __ cmpl(EBX, Address::Absolute(heap->EndAddress()));
+  __ cmpl(EBX, Address::Absolute(heap->EndAddress(space)));
   __ j(ABOVE_EQUAL, &slow_case);
 
   // Successfully allocated the object(s), now update top to point to
   // next object start and initialize the object.
-  __ movl(Address::Absolute(heap->TopAddress()), EBX);
+  __ movl(Address::Absolute(heap->TopAddress(space)), EBX);
   __ addl(EAX, Immediate(kHeapObjectTag));
-  __ UpdateAllocationStatsWithSize(kArrayCid, EDI, kNoRegister);
+  __ UpdateAllocationStatsWithSize(cid, EDI, kNoRegister, space);
 
   // Initialize the tags.
   // EAX: new object start as a tagged pointer.
@@ -686,8 +687,7 @@
     __ Bind(&done);
 
     // Get the class index and insert it into the tags.
-    const Class& cls = Class::Handle(isolate->object_store()->array_class());
-    __ orl(EDI, Immediate(RawObject::ClassIdTag::encode(cls.id())));
+    __ orl(EDI, Immediate(RawObject::ClassIdTag::encode(cid)));
     __ movl(FieldAddress(EAX, Array::tags_offset()), EDI);  // Tags.
   }
   // EAX: new object start as a tagged pointer.
@@ -773,8 +773,7 @@
   __ movl(CTX, Address(EBP, kNewContextOffset));
   __ movl(CTX, Address(CTX, VMHandles::kOffsetOfRawPtrInHandle));
 
-  // Load Isolate pointer from Context structure into EDI.
-  __ movl(EDI, FieldAddress(CTX, Context::isolate_offset()));
+  __ movl(EDI, Immediate(Isolate::CurrentAddress()));
 
   // Save the current VMTag on the stack.
   ASSERT(kSavedVMTagSlotFromEntryFp == -4);
@@ -860,22 +859,17 @@
   // Get rid of arguments pushed on the stack.
   __ leal(ESP, Address(ESP, EDX, TIMES_2, 0));  // EDX is a Smi.
 
-  // Load Isolate pointer from Context structure into CTX. Drop Context.
-  __ movl(CTX, FieldAddress(CTX, Context::isolate_offset()));
+  // Load Isolate pointer into CTX. Drop Context.
+  __ movl(CTX, Immediate(Isolate::CurrentAddress()));
 
   // Restore the saved Context pointer into the Isolate structure.
-  // Uses ECX as a temporary register for this.
-  __ popl(ECX);
-  __ movl(Address(CTX, Isolate::top_context_offset()), ECX);
+  __ popl(Address(CTX, Isolate::top_context_offset()));
 
   // Restore the saved top exit frame info back into the Isolate structure.
-  // Uses EDX as a temporary register for this.
-  __ popl(EDX);
-  __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), EDX);
+  __ popl(Address(CTX, Isolate::top_exit_frame_info_offset()));
 
   // Restore the current VMTag from the stack.
-  __ popl(ECX);
-  __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX);
+  __ popl(Address(CTX, Isolate::vm_tag_offset()));
 
   // Restore C++ ABI callee-saved registers.
   __ popl(EDI);
@@ -899,9 +893,9 @@
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   if (FLAG_inline_alloc) {
-    const Class& context_class = Class::ZoneHandle(Object::context_class());
     Label slow_case;
-    Heap* heap = Isolate::Current()->heap();
+    Isolate* isolate = Isolate::Current();
+    Heap* heap = isolate->heap();
     // First compute the rounded instance size.
     // EDX: number of context variables.
     intptr_t fixed_size = (sizeof(RawContext) + kObjectAlignment - 1);
@@ -910,13 +904,15 @@
 
     // Now allocate the object.
     // EDX: number of context variables.
-    __ movl(EAX, Address::Absolute(heap->TopAddress()));
+    const intptr_t cid = kContextCid;
+    Heap::Space space = heap->SpaceForAllocation(cid);
+    __ movl(EAX, Address::Absolute(heap->TopAddress(space)));
     __ addl(EBX, EAX);
     // Check if the allocation fits into the remaining space.
     // EAX: potential new object.
     // EBX: potential next object start.
     // EDX: number of context variables.
-    __ cmpl(EBX, Address::Absolute(heap->EndAddress()));
+    __ cmpl(EBX, Address::Absolute(heap->EndAddress(space)));
     if (FLAG_use_slow_path) {
       __ jmp(&slow_case);
     } else {
@@ -928,11 +924,11 @@
     // EAX: new object.
     // EBX: next object start.
     // EDX: number of context variables.
-    __ movl(Address::Absolute(heap->TopAddress()), EBX);
+    __ movl(Address::Absolute(heap->TopAddress(space)), EBX);
     __ addl(EAX, Immediate(kHeapObjectTag));
     // EBX: Size of allocation in bytes.
     __ subl(EBX, EAX);
-    __ UpdateAllocationStatsWithSize(context_class.id(), EBX, kNoRegister);
+    __ UpdateAllocationStatsWithSize(cid, EBX, kNoRegister, space);
 
     // Calculate the size tag.
     // EAX: new object.
@@ -955,7 +951,7 @@
       // EDX: number of context variables.
       // EBX: size and bit tags.
       __ orl(EBX,
-             Immediate(RawObject::ClassIdTag::encode(context_class.id())));
+             Immediate(RawObject::ClassIdTag::encode(cid)));
       __ movl(FieldAddress(EAX, Context::tags_offset()), EBX);  // Tags.
     }
 
@@ -968,9 +964,8 @@
     // Load Isolate pointer from Context structure into EBX.
     // EAX: new object.
     // EDX: number of context variables.
-    __ movl(EBX, FieldAddress(CTX, Context::isolate_offset()));
-    // EBX: Isolate, not an object.
-    __ movl(FieldAddress(EAX, Context::isolate_offset()), EBX);
+    __ movl(FieldAddress(EAX, Context::isolate_offset()),
+            Immediate(reinterpret_cast<int32_t>(isolate)));
 
     const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
@@ -1045,10 +1040,10 @@
   __ orl(ECX, Immediate(1 << RawObject::kRememberedBit));
   __ movl(FieldAddress(EAX, Object::tags_offset()), ECX);
 
-  // Load the isolate out of the context.
+  // Load the isolate.
   // Spilled: EDX, ECX
   // EAX: Address being stored
-  __ movl(EDX, FieldAddress(CTX, Context::isolate_offset()));
+  __ movl(EDX, Immediate(Isolate::CurrentAddress()));
 
   // Load the StoreBuffer block out of the isolate. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
@@ -1079,7 +1074,7 @@
   // Setup frame, push callee-saved registers.
 
   __ EnterCallRuntimeFrame(1 * kWordSize);
-  __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ movl(EAX, Immediate(Isolate::CurrentAddress()));
   __ movl(Address(ESP, 0), EAX);  // Push the isolate as the only argument.
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   // Restore callee-saved registers, tear down frame.
@@ -1095,8 +1090,10 @@
 // Uses EAX, EBX, ECX, EDX, EDI as temporary registers.
 // Returns patch_code_pc offset where patching code for disabling the stub
 // has been generated (similar to regularly generated Dart code).
-uword StubCode::GenerateAllocationStubForClass(Assembler* assembler,
-                                               const Class& cls) {
+void StubCode::GenerateAllocationStubForClass(
+    Assembler* assembler, const Class& cls,
+    uword* entry_patch_offset, uword* patch_code_pc_offset) {
+  *entry_patch_offset = assembler->CodeSize();
   const intptr_t kObjectTypeArgumentsOffset = 1 * kWordSize;
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
@@ -1120,19 +1117,20 @@
     // next object start and initialize the allocated object.
     // EDX: instantiated type arguments (if is_cls_parameterized).
     Heap* heap = Isolate::Current()->heap();
-    __ movl(EAX, Address::Absolute(heap->TopAddress()));
+    Heap::Space space = heap->SpaceForAllocation(cls.id());
+    __ movl(EAX, Address::Absolute(heap->TopAddress(space)));
     __ leal(EBX, Address(EAX, instance_size));
     // Check if the allocation fits into the remaining space.
     // EAX: potential new object start.
     // EBX: potential next object start.
-    __ cmpl(EBX, Address::Absolute(heap->EndAddress()));
+    __ cmpl(EBX, Address::Absolute(heap->EndAddress(space)));
     if (FLAG_use_slow_path) {
       __ jmp(&slow_case);
     } else {
       __ j(ABOVE_EQUAL, &slow_case);
     }
-    __ movl(Address::Absolute(heap->TopAddress()), EBX);
-    __ UpdateAllocationStats(cls.id(), ECX);
+    __ movl(Address::Absolute(heap->TopAddress(space)), EBX);
+    __ UpdateAllocationStats(cls.id(), ECX, space);
 
     // EAX: new object start.
     // EBX: next object start.
@@ -1211,10 +1209,9 @@
   __ ret();
   // Emit function patching code. This will be swapped with the first 5 bytes
   // at entry point.
-  uword patch_code_pc_offset = assembler->CodeSize();
+  *patch_code_pc_offset = assembler->CodeSize();
   StubCode* stub_code = Isolate::Current()->stub_code();
   __ jmp(&stub_code->FixAllocationStubTargetLabel());
-  return patch_code_pc_offset;
 }
 
 
@@ -1382,10 +1379,11 @@
   }
 #endif  // DEBUG
 
-  Label stepping, done_stepping;
   // Check single stepping.
-  __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
-  __ cmpb(Address(EAX, Isolate::single_step_offset()), Immediate(0));
+  Label stepping, done_stepping;
+  uword single_step_address =
+      Isolate::CurrentAddress() + Isolate::single_step_offset();
+  __ cmpb(Address::Absolute(single_step_address), Immediate(0));
   __ j(NOT_EQUAL, &stepping);
   __ Bind(&done_stepping);
 
@@ -1621,9 +1619,9 @@
 #endif  // DEBUG
   // Check single stepping.
   Label stepping, done_stepping;
-  __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
-  __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
-  __ cmpl(EAX, Immediate(0));
+  uword single_step_address =
+      Isolate::CurrentAddress() + Isolate::single_step_offset();
+  __ cmpb(Address::Absolute(single_step_address), Immediate(0));
   __ j(NOT_EQUAL, &stepping, Assembler::kNearJump);
   __ Bind(&done_stepping);
 
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 065367d..0f3d74d 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -718,8 +718,9 @@
 
   Isolate* isolate = Isolate::Current();
   Heap* heap = isolate->heap();
-
-  __ LoadImmediate(T3, heap->TopAddress());
+  const intptr_t cid = kArrayCid;
+  Heap::Space space = heap->SpaceForAllocation(cid);
+  __ LoadImmediate(T3, heap->TopAddress(space));
   __ lw(T0, Address(T3, 0));  // Potential new object start.
 
   __ AdduDetectOverflow(T1, T0, T2, CMPRES1);  // Potential next object start.
@@ -729,7 +730,7 @@
   // T0: potential new object start.
   // T1: potential next object start.
   // T2: allocation size.
-  __ LoadImmediate(T4, heap->EndAddress());
+  __ LoadImmediate(T4, heap->EndAddress(space));
   __ lw(T4, Address(T4, 0));
   __ BranchUnsignedGreaterEqual(T1, T4, &slow_case);
 
@@ -737,7 +738,7 @@
   // next object start and initialize the object.
   __ sw(T1, Address(T3, 0));
   __ addiu(T0, T0, Immediate(kHeapObjectTag));
-  __ UpdateAllocationStatsWithSize(kArrayCid, T2, T4);
+  __ UpdateAllocationStatsWithSize(cid, T2, T4, space);
 
   // Initialize the tags.
   // T0: new object start as a tagged pointer.
@@ -746,7 +747,6 @@
   {
     Label overflow, done;
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
-    const Class& cls = Class::Handle(isolate->object_store()->array_class());
 
     __ BranchUnsignedGreater(T2, RawObject::SizeTag::kMaxSizeTag, &overflow);
     __ b(&done);
@@ -757,7 +757,7 @@
 
     // Get the class index and insert it into the tags.
     // T2: size and bit tags.
-    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cls.id()));
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid));
     __ or_(T2, T2, TMP);
     __ sw(T2, FieldAddress(T0, Array::tags_offset()));  // Store tags.
   }
@@ -874,8 +874,7 @@
   // Cache the new Context pointer into CTX while executing Dart code.
   __ lw(CTX, Address(A3, VMHandles::kOffsetOfRawPtrInHandle));
 
-  // Load Isolate pointer from Context structure into temporary register R8.
-  __ lw(T2, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadImmediate(T2, Isolate::CurrentAddress());
 
   // Save the current VMTag on the stack.
   ASSERT(kSavedVMTagSlotFromEntryFp == -22);
@@ -947,8 +946,8 @@
   // Get rid of arguments pushed on the stack.
   __ AddImmediate(SP, FP, kSavedContextSlotFromEntryFp * kWordSize);
 
-  // Load Isolate pointer from Context structure into CTX. Drop Context.
-  __ lw(CTX, FieldAddress(CTX, Context::isolate_offset()));
+  // Load Isolate pointer into CTX. Drop Context.
+  __ LoadImmediate(CTX, Isolate::CurrentAddress());
 
   // Restore the current VMTag from the stack.
   __ lw(T1, Address(SP, 2 * kWordSize));
@@ -995,7 +994,6 @@
 void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
   __ TraceSimMsg("AllocateContext");
   if (FLAG_inline_alloc) {
-    const Class& context_class = Class::ZoneHandle(Object::context_class());
     Label slow_case;
     Heap* heap = Isolate::Current()->heap();
     // First compute the rounded instance size.
@@ -1011,7 +1009,9 @@
     // Now allocate the object.
     // T1: number of context variables.
     // T2: object size.
-    __ LoadImmediate(T5, heap->TopAddress());
+    const intptr_t cid = kContextCid;
+    Heap::Space space = heap->SpaceForAllocation(cid);
+    __ LoadImmediate(T5, heap->TopAddress(space));
     __ lw(V0, Address(T5, 0));
     __ addu(T3, T2, V0);
 
@@ -1020,7 +1020,7 @@
     // T1: number of context variables.
     // T2: object size.
     // T3: potential next object start.
-    __ LoadImmediate(TMP, heap->EndAddress());
+    __ LoadImmediate(TMP, heap->EndAddress(space));
     __ lw(CMPRES1, Address(TMP, 0));
     if (FLAG_use_slow_path) {
       __ b(&slow_case);
@@ -1036,7 +1036,7 @@
     // T3: next object start.
     __ sw(T3, Address(T5, 0));
     __ addiu(V0, V0, Immediate(kHeapObjectTag));
-    __ UpdateAllocationStatsWithSize(context_class.id(), T2, T5);
+    __ UpdateAllocationStatsWithSize(cid, T2, T5, space);
 
     // Calculate the size tag.
     // V0: new object.
@@ -1051,7 +1051,7 @@
 
     // Get the class index and insert it into the tags.
     // T2: size and bit tags.
-    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(context_class.id()));
+    __ LoadImmediate(TMP, RawObject::ClassIdTag::encode(cid));
     __ or_(T2, T2, TMP);
     __ sw(T2, FieldAddress(V0, Context::tags_offset()));
 
@@ -1061,11 +1061,10 @@
     __ sw(T1, FieldAddress(V0, Context::num_variables_offset()));
 
     // Setup isolate field.
-    // Load Isolate pointer from Context structure into R2.
     // V0: new object.
     // T1: number of context variables.
-    __ lw(T2, FieldAddress(CTX, Context::isolate_offset()));
     // T2: isolate, not an object.
+    __ LoadImmediate(T2, Isolate::CurrentAddress());
     __ sw(T2, FieldAddress(V0, Context::isolate_offset()));
 
     __ LoadImmediate(T7, reinterpret_cast<intptr_t>(Object::null()));
@@ -1143,10 +1142,10 @@
   __ ori(T2, T2, Immediate(1 << RawObject::kRememberedBit));
   __ sw(T2, FieldAddress(T0, Object::tags_offset()));
 
-  // Load the isolate out of the context.
+  // Load the isolate.
   // Spilled: T1, T2, T3.
   // T0: Address being stored.
-  __ lw(T1, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadImmediate(T1, Isolate::CurrentAddress());
 
   // Load the StoreBuffer block out of the isolate. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
@@ -1177,7 +1176,7 @@
   // Setup frame, push callee-saved registers.
 
   __ EnterCallRuntimeFrame(1 * kWordSize);
-  __ lw(A0, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadImmediate(A0, Isolate::CurrentAddress());
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   __ TraceSimMsg("UpdateStoreBufferStub return");
   // Restore callee-saved registers, tear down frame.
@@ -1192,9 +1191,11 @@
 //   SP + 0 : type arguments object (only if class is parameterized).
 // Returns patch_code_pc offset where patching code for disabling the stub
 // has been generated (similar to regularly generated Dart code).
-uword StubCode::GenerateAllocationStubForClass(Assembler* assembler,
-                                              const Class& cls) {
+void StubCode::GenerateAllocationStubForClass(
+    Assembler* assembler, const Class& cls,
+    uword* entry_patch_offset, uword* patch_code_pc_offset) {
   __ TraceSimMsg("AllocationStubForClass");
+  *entry_patch_offset = assembler->CodeSize();
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized = cls.NumTypeArguments() > 0;
   ASSERT(!is_cls_parameterized ||
@@ -1215,14 +1216,15 @@
     // next object start and initialize the allocated object.
     // T1: instantiated type arguments (if is_cls_parameterized).
     Heap* heap = Isolate::Current()->heap();
-    __ LoadImmediate(T5, heap->TopAddress());
+    Heap::Space space = heap->SpaceForAllocation(cls.id());
+    __ LoadImmediate(T5, heap->TopAddress(space));
     __ lw(T2, Address(T5));
     __ LoadImmediate(T4, instance_size);
     __ addu(T3, T2, T4);
     // Check if the allocation fits into the remaining space.
     // T2: potential new object start.
     // T3: potential next object start.
-    __ LoadImmediate(TMP, heap->EndAddress());
+    __ LoadImmediate(TMP, heap->EndAddress(space));
     __ lw(CMPRES1, Address(TMP));
     if (FLAG_use_slow_path) {
       __ b(&slow_case);
@@ -1232,7 +1234,7 @@
     // Successfully allocated the object(s), now update top to point to
     // next object start and initialize the object.
     __ sw(T3, Address(T5));
-    __ UpdateAllocationStats(cls.id(), T5);
+    __ UpdateAllocationStats(cls.id(), T5, space);
 
     // T2: new object start.
     // T3: next object start.
@@ -1315,10 +1317,9 @@
   // V0: new object
   // Restore the frame pointer and return.
   __ LeaveStubFrameAndReturn(RA);
-  uword patch_code_pc_offset = assembler->CodeSize();
+  *patch_code_pc_offset = assembler->CodeSize();
   StubCode* stub_code = Isolate::Current()->stub_code();
   __ BranchPatchable(&stub_code->FixAllocationStubTargetLabel());
-  return patch_code_pc_offset;
 }
 
 
@@ -1496,9 +1497,9 @@
 #endif  // DEBUG
 
 
-  Label stepping, done_stepping;
   // Check single stepping.
-  __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
+  Label stepping, done_stepping;
+  __ LoadImmediate(T0, Isolate::CurrentAddress());
   __ lbu(T0, Address(T0, Isolate::single_step_offset()));
   __ BranchNotEqual(T0, 0, &stepping);
   __ Bind(&done_stepping);
@@ -1754,7 +1755,7 @@
 
   // Check single stepping.
   Label stepping, done_stepping;
-  __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadImmediate(T0, Isolate::CurrentAddress());
   __ lbu(T0, Address(T0, Isolate::single_step_offset()));
   __ BranchNotEqual(T0, 0, &stepping);
   __ Bind(&done_stepping);
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index f320556..50bbf0c 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -603,8 +603,9 @@
 
   Isolate* isolate = Isolate::Current();
   Heap* heap = isolate->heap();
-
-  __ movq(RAX, Immediate(heap->TopAddress()));
+  const intptr_t cid = kArrayCid;
+  Heap::Space space = heap->SpaceForAllocation(cid);
+  __ movq(RAX, Immediate(heap->TopAddress(space)));
   __ movq(RAX, Address(RAX, 0));
 
   // RDI: allocation size.
@@ -616,16 +617,16 @@
   // RAX: potential new object start.
   // RCX: potential next object start.
   // RDI: allocation size.
-  __ movq(R13, Immediate(heap->EndAddress()));
+  __ movq(R13, Immediate(heap->EndAddress(space)));
   __ cmpq(RCX, Address(R13, 0));
   __ j(ABOVE_EQUAL, &slow_case);
 
   // Successfully allocated the object(s), now update top to point to
   // next object start and initialize the object.
-  __ movq(R13, Immediate(heap->TopAddress()));
+  __ movq(R13, Immediate(heap->TopAddress(space)));
   __ movq(Address(R13, 0), RCX);
   __ addq(RAX, Immediate(kHeapObjectTag));
-  __ UpdateAllocationStatsWithSize(kArrayCid, RDI);
+  __ UpdateAllocationStatsWithSize(cid, RDI, space);
   // Initialize the tags.
   // RAX: new object start as a tagged pointer.
   // RDI: allocation size.
@@ -641,8 +642,7 @@
     __ Bind(&done);
 
     // Get the class index and insert it into the tags.
-    const Class& cls = Class::Handle(isolate->object_store()->array_class());
-    __ orq(RDI, Immediate(RawObject::ClassIdTag::encode(cls.id())));
+    __ orq(RDI, Immediate(RawObject::ClassIdTag::encode(cid)));
     __ movq(FieldAddress(RAX, Array::tags_offset()), RDI);  // Tags.
   }
 
@@ -745,8 +745,8 @@
 
   const Register kIsolateReg = RBX;
 
-  // Load Isolate pointer from Context structure into R8.
-  __ movq(kIsolateReg, FieldAddress(CTX, Context::isolate_offset()));
+  // Load Isolate pointer into kIsolateReg.
+  __ movq(kIsolateReg, Immediate(Isolate::CurrentAddress()));
 
   // Save the current VMTag on the stack.
   __ movq(RAX, Address(kIsolateReg, Isolate::vm_tag_offset()));
@@ -848,20 +848,15 @@
   // Get rid of arguments pushed on the stack.
   __ leaq(RSP, Address(RSP, RDX, TIMES_4, 0));  // RDX is a Smi.
 
-  // Load Isolate pointer from Context structure into CTX. Drop Context.
-  __ movq(kIsolateReg, FieldAddress(CTX, Context::isolate_offset()));
-
+  __ movq(kIsolateReg, Immediate(Isolate::CurrentAddress()));
   // Restore the saved Context pointer into the Isolate structure.
-  __ popq(RDX);
-  __ movq(Address(kIsolateReg, Isolate::top_context_offset()), RDX);
+  __ popq(Address(kIsolateReg, Isolate::top_context_offset()));
 
   // Restore the saved top exit frame info back into the Isolate structure.
-  __ popq(RDX);
-  __ movq(Address(kIsolateReg, Isolate::top_exit_frame_info_offset()), RDX);
+  __ popq(Address(kIsolateReg, Isolate::top_exit_frame_info_offset()));
 
   // Restore the current VMTag from the stack.
-  __ popq(RDX);
-  __ movq(Address(kIsolateReg, Isolate::vm_tag_offset()), RDX);
+  __ popq(Address(kIsolateReg, Isolate::vm_tag_offset()));
 
   // Restore C++ ABI callee-saved registers.
   __ PopRegisters(CallingConventions::kCalleeSaveCpuRegisters,
@@ -882,9 +877,9 @@
 void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
   __ LoadObject(R12, Object::null_object(), PP);
   if (FLAG_inline_alloc) {
-    const Class& context_class = Class::ZoneHandle(Object::context_class());
     Label slow_case;
-    Heap* heap = Isolate::Current()->heap();
+    Isolate* isolate = Isolate::Current();
+    Heap* heap = isolate->heap();
     // First compute the rounded instance size.
     // R10: number of context variables.
     intptr_t fixed_size = (sizeof(RawContext) + kObjectAlignment - 1);
@@ -893,14 +888,16 @@
 
     // Now allocate the object.
     // R10: number of context variables.
-    __ movq(RAX, Immediate(heap->TopAddress()));
+    const intptr_t cid = kContextCid;
+    Heap::Space space = heap->SpaceForAllocation(cid);
+    __ movq(RAX, Immediate(heap->TopAddress(space)));
     __ movq(RAX, Address(RAX, 0));
     __ addq(R13, RAX);
     // Check if the allocation fits into the remaining space.
     // RAX: potential new object.
     // R13: potential next object start.
     // R10: number of context variables.
-    __ movq(RDI, Immediate(heap->EndAddress()));
+    __ movq(RDI, Immediate(heap->EndAddress(space)));
     __ cmpq(R13, Address(RDI, 0));
     if (FLAG_use_slow_path) {
       __ jmp(&slow_case);
@@ -913,12 +910,12 @@
     // RAX: new object.
     // R13: next object start.
     // R10: number of context variables.
-    __ movq(RDI, Immediate(heap->TopAddress()));
+    __ movq(RDI, Immediate(heap->TopAddress(space)));
     __ movq(Address(RDI, 0), R13);
     __ addq(RAX, Immediate(kHeapObjectTag));
     // R13: Size of allocation in bytes.
     __ subq(R13, RAX);
-    __ UpdateAllocationStatsWithSize(context_class.id(), R13);
+    __ UpdateAllocationStatsWithSize(cid, R13, space);
 
     // Calculate the size tag.
     // RAX: new object.
@@ -941,7 +938,7 @@
       // R10: number of context variables.
       // R13: size and bit tags.
       __ orq(R13,
-             Immediate(RawObject::ClassIdTag::encode(context_class.id())));
+             Immediate(RawObject::ClassIdTag::encode(cid)));
       __ movq(FieldAddress(RAX, Context::tags_offset()), R13);  // Tags.
     }
 
@@ -951,12 +948,11 @@
     __ movq(FieldAddress(RAX, Context::num_variables_offset()), R10);
 
     // Setup isolate field.
-    // Load Isolate pointer from Context structure into R13.
     // RAX: new object.
     // R10: number of context variables.
-    __ movq(R13, FieldAddress(CTX, Context::isolate_offset()));
     // R13: Isolate, not an object.
-    __ movq(FieldAddress(RAX, Context::isolate_offset()), R13);
+    __ movq(FieldAddress(RAX, Context::isolate_offset()),
+            Immediate(Isolate::CurrentAddress()));
 
     // Setup the parent field.
     // RAX: new object.
@@ -1026,9 +1022,9 @@
   __ orq(RCX, Immediate(1 << RawObject::kRememberedBit));
   __ movq(FieldAddress(RAX, Object::tags_offset()), RCX);
 
-  // Load the isolate out of the context.
+  // Load the isolate.
   // RAX: Address being stored
-  __ movq(RDX, FieldAddress(CTX, Context::isolate_offset()));
+  __ movq(RDX, Immediate(Isolate::CurrentAddress()));
 
   // Load the StoreBuffer block out of the isolate. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
@@ -1055,8 +1051,7 @@
   __ Bind(&L);
   // Setup frame, push callee-saved registers.
   __ EnterCallRuntimeFrame(0);
-  __ movq(CallingConventions::kArg1Reg,
-          FieldAddress(CTX, Context::isolate_offset()));
+  __ movq(CallingConventions::kArg1Reg, Immediate(Isolate::CurrentAddress()));
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   __ LeaveCallRuntimeFrame();
   __ ret();
@@ -1067,8 +1062,14 @@
 // Input parameters:
 //   RSP + 8 : type arguments object (only if class is parameterized).
 //   RSP : points to return address.
-uword StubCode::GenerateAllocationStubForClass(Assembler* assembler,
-                                              const Class& cls) {
+void StubCode::GenerateAllocationStubForClass(
+    Assembler* assembler, const Class& cls,
+    uword* entry_patch_offset, uword* patch_code_pc_offset) {
+  // Must load pool pointer before being able to patch.
+  Register new_pp = R13;
+  __ LoadPoolPointer(new_pp);
+  *entry_patch_offset = assembler->CodeSize();
+
   const intptr_t kObjectTypeArgumentsOffset = 1 * kWordSize;
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized = cls.NumTypeArguments() > 0;
@@ -1091,14 +1092,15 @@
     // next object start and initialize the allocated object.
     // RDX: instantiated type arguments (if is_cls_parameterized).
     Heap* heap = Isolate::Current()->heap();
-    __ movq(RCX, Immediate(heap->TopAddress()));
+    Heap::Space space = heap->SpaceForAllocation(cls.id());
+    __ movq(RCX, Immediate(heap->TopAddress(space)));
     __ movq(RAX, Address(RCX, 0));
     __ leaq(RBX, Address(RAX, instance_size));
     // Check if the allocation fits into the remaining space.
     // RAX: potential new object start.
     // RBX: potential next object start.
     // RCX: heap top address.
-    __ movq(R13, Immediate(heap->EndAddress()));
+    __ movq(R13, Immediate(heap->EndAddress(space)));
     __ cmpq(RBX, Address(R13, 0));
     if (FLAG_use_slow_path) {
       __ jmp(&slow_case);
@@ -1106,7 +1108,7 @@
       __ j(ABOVE_EQUAL, &slow_case);
     }
     __ movq(Address(RCX, 0), RBX);
-    __ UpdateAllocationStats(cls.id());
+    __ UpdateAllocationStats(cls.id(), space);
 
     // RAX: new object start.
     // RBX: next object start.
@@ -1180,10 +1182,9 @@
   // Restore the frame pointer.
   __ LeaveStubFrame();
   __ ret();
-  uword patch_code_pc_offset = assembler->CodeSize();
+  *patch_code_pc_offset = assembler->CodeSize();
   StubCode* stub_code = Isolate::Current()->stub_code();
-  __ JmpPatchable(&stub_code->FixAllocationStubTargetLabel(), R13);
-  return patch_code_pc_offset;
+  __ JmpPatchable(&stub_code->FixAllocationStubTargetLabel(), new_pp);
 }
 
 
@@ -1354,9 +1355,9 @@
   }
 #endif  // DEBUG
 
-  Label stepping, done_stepping;
   // Check single stepping.
-  __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
+  Label stepping, done_stepping;
+  __ movq(RAX, Immediate(Isolate::CurrentAddress()));
   __ cmpb(Address(RAX, Isolate::single_step_offset()), Immediate(0));
   __ j(NOT_EQUAL, &stepping);
   __ Bind(&done_stepping);
@@ -1587,7 +1588,7 @@
 
   // Check single stepping.
   Label stepping, done_stepping;
-  __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ movq(RAX, Immediate(Isolate::CurrentAddress()));
   __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
   __ cmpq(RAX, Immediate(0));
   __ j(NOT_EQUAL, &stepping, Assembler::kNearJump);
diff --git a/runtime/vm/thread_interrupter.h b/runtime/vm/thread_interrupter.h
index aaa9da4..8731b9d 100644
--- a/runtime/vm/thread_interrupter.h
+++ b/runtime/vm/thread_interrupter.h
@@ -15,7 +15,8 @@
 struct InterruptedThreadState {
   ThreadId tid;
   uintptr_t pc;
-  uintptr_t sp;
+  uintptr_t csp;
+  uintptr_t dsp;
   uintptr_t fp;
 };
 
diff --git a/runtime/vm/thread_interrupter_android.cc b/runtime/vm/thread_interrupter_android.cc
index 043d148..8fc8e33 100644
--- a/runtime/vm/thread_interrupter_android.cc
+++ b/runtime/vm/thread_interrupter_android.cc
@@ -37,7 +37,8 @@
     its.tid = state->id;
     its.pc = SignalHandler::GetProgramCounter(mcontext);
     its.fp = SignalHandler::GetFramePointer(mcontext);
-    its.sp = SignalHandler::GetStackPointer(mcontext);
+    its.csp = SignalHandler::GetCStackPointer(mcontext);
+    its.dsp = SignalHandler::GetDartStackPointer(mcontext);
     state->callback(its, state->data);
   }
 };
@@ -57,7 +58,6 @@
       ThreadInterrupterAndroid::ThreadInterruptSignalHandler);
 }
 
-
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_ANDROID)
diff --git a/runtime/vm/thread_interrupter_linux.cc b/runtime/vm/thread_interrupter_linux.cc
index a937094..b86b85e 100644
--- a/runtime/vm/thread_interrupter_linux.cc
+++ b/runtime/vm/thread_interrupter_linux.cc
@@ -35,7 +35,8 @@
     its.tid = state->id;
     its.pc = SignalHandler::GetProgramCounter(mcontext);
     its.fp = SignalHandler::GetFramePointer(mcontext);
-    its.sp = SignalHandler::GetStackPointer(mcontext);
+    its.csp = SignalHandler::GetCStackPointer(mcontext);
+    its.dsp = SignalHandler::GetDartStackPointer(mcontext);
     state->callback(its, state->data);
   }
 };
@@ -54,7 +55,6 @@
   SignalHandler::Install(ThreadInterrupterLinux::ThreadInterruptSignalHandler);
 }
 
-
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_LINUX)
diff --git a/runtime/vm/thread_interrupter_macos.cc b/runtime/vm/thread_interrupter_macos.cc
index 70be46e..341f7c7 100644
--- a/runtime/vm/thread_interrupter_macos.cc
+++ b/runtime/vm/thread_interrupter_macos.cc
@@ -35,7 +35,8 @@
     its.tid = state->id;
     its.pc = SignalHandler::GetProgramCounter(mcontext);
     its.fp = SignalHandler::GetFramePointer(mcontext);
-    its.sp = SignalHandler::GetStackPointer(mcontext);
+    its.csp = SignalHandler::GetCStackPointer(mcontext);
+    its.dsp = SignalHandler::GetDartStackPointer(mcontext);
     state->callback(its, state->data);
   }
 };
@@ -53,7 +54,6 @@
   SignalHandler::Install(ThreadInterrupterMacOS::ThreadInterruptSignalHandler);
 }
 
-
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_MACOS)
diff --git a/runtime/vm/thread_interrupter_win.cc b/runtime/vm/thread_interrupter_win.cc
index fba34d5..69e3481 100644
--- a/runtime/vm/thread_interrupter_win.cc
+++ b/runtime/vm/thread_interrupter_win.cc
@@ -35,11 +35,13 @@
 #if defined(TARGET_ARCH_IA32)
       state->pc = static_cast<uintptr_t>(context.Eip);
       state->fp = static_cast<uintptr_t>(context.Ebp);
-      state->sp = static_cast<uintptr_t>(context.Esp);
+      state->csp = static_cast<uintptr_t>(context.Esp);
+      state->dsp = static_cast<uintptr_t>(context.Esp);
 #elif defined(TARGET_ARCH_X64)
       state->pc = static_cast<uintptr_t>(context.Rip);
       state->fp = static_cast<uintptr_t>(context.Rbp);
-      state->sp = static_cast<uintptr_t>(context.Rsp);
+      state->csp = static_cast<uintptr_t>(context.Rsp);
+      state->dsp = static_cast<uintptr_t>(context.Rsp);
 #else
       UNIMPLEMENTED();
 #endif
@@ -108,7 +110,6 @@
   // Nothing to do on Windows.
 }
 
-
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_WINDOWS)
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index a3b2276..30915cd 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -447,6 +447,8 @@
     'visitor.h',
     'vtune.cc',
     'vtune.h',
+    'weak_code.cc',
+    'weak_code.h',
     'weak_table.cc',
     'weak_table.h',
     'zone.cc',
diff --git a/runtime/vm/weak_code.cc b/runtime/vm/weak_code.cc
new file mode 100644
index 0000000..978eb90
--- /dev/null
+++ b/runtime/vm/weak_code.cc
@@ -0,0 +1,132 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/weak_code.h"
+
+#include "platform/assert.h"
+
+#include "vm/code_generator.h"
+#include "vm/code_patcher.h"
+#include "vm/object.h"
+#include "vm/stack_frame.h"
+
+namespace dart {
+
+void WeakCodeReferences::Register(const Code& value) {
+  if (!array_.IsNull()) {
+    // Try to find and reuse cleared WeakProperty to avoid allocating new one.
+    WeakProperty& weak_property = WeakProperty::Handle();
+    for (intptr_t i = 0; i < array_.Length(); i++) {
+      weak_property ^= array_.At(i);
+      if (weak_property.key() == Code::null()) {
+        // Empty property found. Reuse it.
+        weak_property.set_key(value);
+        return;
+      }
+    }
+  }
+
+  const WeakProperty& weak_property = WeakProperty::Handle(
+      WeakProperty::New(Heap::kOld));
+  weak_property.set_key(value);
+
+  intptr_t length = array_.IsNull() ? 0 : array_.Length();
+  const Array& new_array = Array::Handle(
+      Array::Grow(array_, length + 1, Heap::kOld));
+  new_array.SetAt(length, weak_property);
+  UpdateArrayTo(new_array);
+}
+
+
+bool WeakCodeReferences::IsOptimizedCode(const Array& dependent_code,
+                                         const Code& code) {
+  if (!code.is_optimized()) {
+    return false;
+  }
+  WeakProperty& weak_property = WeakProperty::Handle();
+  for (intptr_t i = 0; i < dependent_code.Length(); i++) {
+    weak_property ^= dependent_code.At(i);
+    if (code.raw() == weak_property.key()) {
+      return true;
+    }
+  }
+  return false;
+}
+
+
+void WeakCodeReferences::DisableCode() {
+  const Array& code_objects = Array::Handle(array_.raw());
+  if (code_objects.IsNull()) {
+    return;
+  }
+  UpdateArrayTo(Object::null_array());
+  // Disable all code on stack.
+  Code& code = Code::Handle();
+  {
+    DartFrameIterator iterator;
+    StackFrame* frame = iterator.NextFrame();
+    while (frame != NULL) {
+      code = frame->LookupDartCode();
+      if (IsOptimizedCode(code_objects, code)) {
+        ReportDeoptimization(code);
+        DeoptimizeAt(code, frame->pc());
+      }
+      frame = iterator.NextFrame();
+    }
+  }
+
+  // Switch functions that use dependent code to unoptimized code.
+  WeakProperty& weak_property = WeakProperty::Handle();
+  Object& owner = Object::Handle();
+  Function& function = Function::Handle();
+  for (intptr_t i = 0; i < code_objects.Length(); i++) {
+    weak_property ^= code_objects.At(i);
+    code ^= weak_property.key();
+    if (code.IsNull()) {
+      // Code was garbage collected already.
+      continue;
+    }
+    owner = code.owner();
+    if (owner.IsFunction()) {
+      function ^= owner.raw();
+    } else if (owner.IsClass()) {
+      Class& cls = Class::Handle();
+      cls ^= owner.raw();
+      OS::Print("Skipping code owned by class %s\n", cls.ToCString());
+      cls.SwitchAllocationStub();
+      continue;
+    } else if (owner.IsNull()) {
+      OS::Print("Skipping code owned by null: ");
+      code.Print();
+      continue;
+    }
+
+    // If function uses dependent code switch it to unoptimized.
+    if (code.is_optimized() && (function.CurrentCode() == code.raw())) {
+      ReportSwitchingCode(code);
+      function.SwitchToUnoptimizedCode();
+    } else if (function.unoptimized_code() == code.raw()) {
+      ReportSwitchingCode(code);
+      function.ClearICData();
+      // Remove the code object from the function. The next time the
+      // function is invoked, it will be compiled again.
+      function.ClearCode();
+      // Invalidate the old code object so existing references to it
+      // (from optimized code) will fail when invoked.
+      if (!CodePatcher::IsEntryPatched(code)) {
+        CodePatcher::PatchEntry(code);
+      }
+    } else {
+      // Make non-OSR code non-entrant.
+      if (code.GetEntryPatchPc() != 0) {
+        if (!CodePatcher::IsEntryPatched(code)) {
+          ReportSwitchingCode(code);
+          CodePatcher::PatchEntry(code);
+        }
+      }
+    }
+  }
+}
+
+}  // namespace dart
diff --git a/runtime/vm/weak_code.h b/runtime/vm/weak_code.h
new file mode 100644
index 0000000..809d3f8
--- /dev/null
+++ b/runtime/vm/weak_code.h
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_WEAK_CODE_H_
+#define VM_WEAK_CODE_H_
+
+#include "vm/allocation.h"
+#include "vm/globals.h"
+
+namespace dart {
+
+class Array;
+class Code;
+
+// Helper class to handle an array of code weak properties. Implements
+// registration and disabling of stored code objects.
+class WeakCodeReferences : public ValueObject {
+ public:
+  explicit WeakCodeReferences(const Array& value) : array_(value) {}
+  virtual ~WeakCodeReferences() {}
+
+  void Register(const Code& value);
+
+  virtual void UpdateArrayTo(const Array& array) = 0;
+  virtual void ReportDeoptimization(const Code& code) = 0;
+  virtual void ReportSwitchingCode(const Code& code) = 0;
+
+  static bool IsOptimizedCode(const Array& dependent_code, const Code& code);
+
+  void DisableCode();
+
+ private:
+  const Array& array_;
+  DISALLOW_COPY_AND_ASSIGN(WeakCodeReferences);
+};
+
+}  // namespace dart
+
+#endif  // VM_WEAK_CODE_H_
diff --git a/sdk/bin/pub.bat b/sdk/bin/pub.bat
index b102021..8207746 100644
--- a/sdk/bin/pub.bat
+++ b/sdk/bin/pub.bat
Binary files differ
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index c278a58..646fefe 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -1988,6 +1988,9 @@
     return libraryUri;
   }
 
+  void diagnoseCrashInUserCode(String message, exception, stackTrace) {
+    // Overridden by Compiler in apiimpl.dart.
+  }
 }
 
 class CompilerTask {
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
index 20d24c3..9c6d99f 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
@@ -57,21 +57,7 @@
             IrBuilderVisitor builder =
                 new IrBuilderVisitor(elementsMapping, compiler, sourceFile);
             ir.FunctionDefinition function;
-            ElementKind kind = element.kind;
-            if (kind == ElementKind.GENERATIVE_CONSTRUCTOR) {
-              // TODO(lry): build ir for constructors.
-            } else if (element.isDeferredLoaderGetter) {
-              // TODO(sigurdm): Build ir for deferred loader functions.
-            } else if (kind == ElementKind.GENERATIVE_CONSTRUCTOR_BODY ||
-                kind == ElementKind.FUNCTION ||
-                kind == ElementKind.GETTER ||
-                kind == ElementKind.SETTER) {
-              function = builder.buildFunction(element);
-            } else if (kind == ElementKind.FIELD) {
-              // TODO(lry): build ir for lazy initializers of static fields.
-            } else {
-              compiler.internalError(element, 'Unexpected element kind $kind.');
-            }
+            function = builder.buildFunction(element);
 
             if (function != null) {
               nodes[element] = function;
@@ -85,7 +71,7 @@
   }
 
   bool irEnabled({bool useNewBackend: false}) {
-    // TODO(lry): support checked-mode checks.
+    // TODO(sigurdm,kmillikin): Support checked-mode checks.
     return (useNewBackend || const bool.fromEnvironment('USE_NEW_BACKEND')) &&
         compiler.backend is DartBackend &&
         !compiler.enableTypeAssertions &&
@@ -93,28 +79,16 @@
   }
 
   bool canBuild(Element element) {
-    // TODO(lry): support lazy initializers.
     FunctionElement function = element.asFunctionElement();
+    // TODO(kmillikin,sigurdm): support lazy field initializers.
     if (function == null) return false;
 
     if (!compiler.backend.shouldOutput(function)) return false;
 
-    // TODO(kmillikin): support getters and setters and static class members.
-    // With the current Dart Tree emitter they just require recognizing them
-    // and generating the correct syntax.
-    if (element.isGetter || element.isSetter) return false;
+    assert(invariant(element, !function.isNative));
 
-    // TODO(lry): support native functions (also in [visitReturn]).
-    if (function.isNative) return false;
-
-    // TODO(kmillikin,sigurdm): support syntax for redirecting factory
-    if (function is ConstructorElement && function.isRedirectingFactory) {
-      return false;
-    }
-    // TODO(kmillikin,sigurdm): support syntax for factory constructors
-    if (function is ConstructorElement && function.isFactoryConstructor) {
-      return false;
-    }
+    // TODO(kmillikin,sigurdm): Support constructors.
+    if (function is ConstructorElement) return false;
 
     return true;
   }
@@ -1043,6 +1017,122 @@
     return null;
   }
 
+  ir.Primitive visitForIn(ast.ForIn node) {
+    // The for-in loop
+    //
+    // for (a in e) s;
+    //
+    // Is compiled analogously to:
+    //
+    // a = e.iterator;
+    // while (a.moveNext()) {
+    //   var n0 = a.current;
+    //   s;
+    // }
+
+    // The condition and body are delimited.
+    IrBuilderVisitor condBuilder = new IrBuilderVisitor.recursive(this);
+
+    ir.Primitive expressionReceiver = visit(node.expression);
+    List<ir.Primitive> emptyArguments = new List<ir.Primitive>();
+
+    ir.Parameter iterator = new ir.Parameter(null);
+    ir.Continuation iteratorInvoked = new ir.Continuation([iterator]);
+    add(new ir.LetCont(iteratorInvoked,
+        new ir.InvokeMethod(expressionReceiver,
+            new Selector.getter("iterator", null), iteratorInvoked,
+            emptyArguments)));
+
+    ir.Parameter condition = new ir.Parameter(null);
+    ir.Continuation moveNextInvoked = new ir.Continuation([condition]);
+    condBuilder.add(new ir.LetCont(moveNextInvoked,
+        new ir.InvokeMethod(iterator,
+            new Selector.call("moveNext", null, 0),
+            moveNextInvoked, emptyArguments)));
+
+    JumpTarget target = elements.getTargetDefinition(node);
+    JumpCollector breakCollector = new JumpCollector(target);
+    JumpCollector continueCollector = new JumpCollector(target);
+    breakCollectors.add(breakCollector);
+    continueCollectors.add(continueCollector);
+
+    IrBuilderVisitor bodyBuilder = new IrBuilderVisitor.delimited(condBuilder);
+    ast.Node identifier = node.declaredIdentifier;
+    Element variableElement = elements.getForInVariable(node);
+    Selector selector = elements.getSelector(identifier);
+
+    // node.declaredIdentifier can be either an ast.VariableDefinitions
+    // (defining a new local variable) or a send designating some existing
+    // variable.
+    ast.Node declaredIdentifier = node.declaredIdentifier;
+
+    if (declaredIdentifier is ast.VariableDefinitions) {
+      bodyBuilder.visit(declaredIdentifier);
+    }
+
+    ir.Parameter currentValue = new ir.Parameter(null);
+    ir.Continuation currentInvoked = new ir.Continuation([currentValue]);
+    bodyBuilder.add(new ir.LetCont(currentInvoked,
+        new ir.InvokeMethod(iterator, new Selector.getter("current", null),
+            currentInvoked, emptyArguments)));
+    if (Elements.isLocal(variableElement)) {
+      bodyBuilder.setLocal(variableElement, currentValue);
+    } else if (Elements.isStaticOrTopLevel(variableElement)) {
+      bodyBuilder.setStatic(variableElement, selector, currentValue);
+    } else {
+      ir.Primitive receiver = bodyBuilder.lookupThis();
+      bodyBuilder.setDynamic(null, receiver, selector, currentValue);
+    }
+
+    bodyBuilder.visit(node.body);
+    assert(breakCollectors.last == breakCollector);
+    assert(continueCollectors.last == continueCollector);
+    breakCollectors.removeLast();
+    continueCollectors.removeLast();
+
+    // Create body entry and loop exit continuations and a branch to them.
+    ir.Continuation bodyContinuation = new ir.Continuation([]);
+    ir.Continuation exitContinuation = new ir.Continuation([]);
+    ir.LetCont branch =
+        new ir.LetCont(exitContinuation,
+            new ir.LetCont(bodyContinuation,
+                new ir.Branch(new ir.IsTrue(condition),
+                              bodyContinuation,
+                              exitContinuation)));
+    // If there are breaks in the body, then there must be a join-point
+    // continuation for the normal exit and the breaks.
+    bool hasBreaks = !breakCollector.isEmpty;
+    ir.LetCont letJoin;
+    if (hasBreaks) {
+      letJoin = new ir.LetCont(null, branch);
+      condBuilder.add(letJoin);
+      condBuilder._current = branch;
+    } else {
+      condBuilder.add(branch);
+    }
+    ir.Continuation loopContinuation =
+        new ir.Continuation(condBuilder._parameters);
+    if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
+    invokeFullJoin(loopContinuation, continueCollector, recursive: true);
+    bodyContinuation.body = bodyBuilder._root;
+
+    loopContinuation.body = condBuilder._root;
+    add(new ir.LetCont(loopContinuation,
+            new ir.InvokeContinuation(loopContinuation,
+                                      environment.index2value)));
+    if (hasBreaks) {
+      _current = branch;
+      environment = condBuilder.environment;
+      breakCollector.addJump(this);
+      letJoin.continuation = createJoin(environment.length, breakCollector);
+      _current = letJoin;
+    } else {
+      _current = condBuilder._current;
+      environment = condBuilder.environment;
+    }
+    return null;
+  }
+
   ir.Primitive visitVariableDefinitions(ast.VariableDefinitions node) {
     assert(isOpen);
     if (node.modifiers.isConst) {
@@ -1090,8 +1180,8 @@
   //
   // Return without a subexpression is translated as if it were return null.
   ir.Primitive visitReturn(ast.Return node) {
-    // TODO(lry): support native returns.
-    if (node.beginToken.value == 'native') return giveup(node, 'Native return');
+    assert(isOpen);
+    assert(invariant(node, node.beginToken.value != 'native'));
     if (node.expression == null) {
       buildReturn();
     } else {
@@ -1311,7 +1401,7 @@
                              ir.Definition receiver,
                              ir.Continuation k,
                              List<ir.Definition> arguments) {
-    return node.receiver != null && node.receiver.isSuper()
+    return node != null && node.receiver != null && node.receiver.isSuper()
         ? new ir.InvokeSuperMethod(selector, k, arguments)
         : new ir.InvokeMethod(receiver, selector, k, arguments);
   }
@@ -1599,6 +1689,42 @@
     return closureLocals.isClosureVariable(element);
   }
 
+  void setLocal(Element element, ir.Primitive valueToStore) {
+    if (isClosureVariable(element)) {
+      LocalElement local = element;
+      add(new ir.SetClosureVariable(local, valueToStore));
+    } else {
+      valueToStore.useElementAsHint(element);
+      environment.update(element, valueToStore);
+    }
+  }
+
+  void setStatic(Element element,
+                 Selector selector,
+                 ir.Primitive valueToStore) {
+    assert(element.isErroneous || element.isField || element.isSetter);
+    continueWithExpression(
+        (k) => new ir.InvokeStatic(element, selector, k, [valueToStore]));
+  }
+
+  void setDynamic(ast.Node node,
+                  ir.Primitive receiver, Selector selector,
+                  ir.Primitive valueToStore) {
+    List<ir.Definition> arguments = [valueToStore];
+    continueWithExpression(
+        (k) => createDynamicInvoke(node, selector, receiver, k, arguments));
+  }
+
+  void setIndex(ast.Node node,
+                ir.Primitive receiver,
+                Selector selector,
+                ir.Primitive index,
+                ir.Primitive valueToStore) {
+    List<ir.Definition> arguments = [index, valueToStore];
+    continueWithExpression(
+        (k) => createDynamicInvoke(node, selector, receiver, k, arguments));
+  }
+
   ir.Primitive visitSendSet(ast.SendSet node) {
     assert(isOpen);
     Element element = elements[node];
@@ -1663,29 +1789,21 @@
       add(new ir.LetCont(k, invoke));
     }
 
-    // Set the value
-    if (isClosureVariable(element)) {
-      LocalElement local = element;
-      add(new ir.SetClosureVariable(local, valueToStore));
-    } else if (Elements.isLocal(element)) {
-      valueToStore.useElementAsHint(element);
-      environment.update(element, valueToStore);
+    if (Elements.isLocal(element)) {
+      setLocal(element, valueToStore);
     } else if ((!node.isSuperCall && Elements.isErroneousElement(element)) ||
                 Elements.isStaticOrTopLevel(element)) {
-      assert(element.isErroneous || element.isField || element.isSetter);
-      Selector selector = elements.getSelector(node);
-      continueWithExpression(
-          (k) => new ir.InvokeStatic(element, selector, k, [valueToStore]));
+      setStatic(element, elements.getSelector(node), valueToStore);
     } else {
       // Setter or index-setter invocation
       Selector selector = elements.getSelector(node);
       assert(selector.kind == SelectorKind.SETTER ||
           selector.kind == SelectorKind.INDEX);
-      List<ir.Definition> arguments = selector.isIndexSet
-          ? [index, valueToStore]
-          : [valueToStore];
-      continueWithExpression(
-          (k) => createDynamicInvoke(node, selector, receiver, k, arguments));
+      if (selector.isIndexSet) {
+        setIndex(node, receiver, selector, index, valueToStore);
+      } else {
+        setDynamic(node, receiver, selector, valueToStore);
+      }
     }
 
     if (node.isPostfix) {
@@ -1855,9 +1973,10 @@
 
   ConstExp visitNewExpression(ast.NewExpression node) {
     FunctionElement element = elements[node.send];
-    if (Elements.isUnresolved(element)) {
-      throw parent.giveup(node, 'const NewExpression: unresolved constructor');
-    }
+    // The resolver will already have thrown an error if the constructor was
+    // unresolved.
+    assert(invariant(node, !Elements.isUnresolved(element)));
+
     Selector selector = elements.getSelector(node.send);
     ast.Node selectorNode = node.send.selector;
     GenericType type = elements.getType(node);
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index e030603..ef6e8fa 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -113,6 +113,8 @@
   bool stripArgumentSet = false;
   bool analyzeOnly = false;
   bool analyzeAll = false;
+  bool trustTypeAnnotations = false;
+  bool checkedMode = false;
   // List of provided options that imply that output is expected.
   List<String> optionsImplyCompilation = <String>[];
   bool hasDisallowUnsafeEval = false;
@@ -196,6 +198,16 @@
     passThrough(argument);
   }
 
+  setTrustTypeAnnotations(String argument) {
+    trustTypeAnnotations = true;
+    implyCompilation(argument);
+  }
+
+  setCheckedMode(String argument) {
+    checkedMode = true;
+    passThrough(argument);
+  }
+
   addInEnvironment(String argument) {
     int eqIndex = argument.indexOf('=');
     String name = argument.substring(2, eqIndex);
@@ -246,7 +258,7 @@
           wantHelp = true;
           break;
         case 'c':
-          passThrough('--enable-checked-mode');
+          setCheckedMode('--enable-checked-mode');
           break;
         case 'm':
           implyCompilation('--minify');
@@ -282,12 +294,13 @@
     new OptionHandler('--enable-diagnostic-colors',
                       (_) => diagnosticHandler.enableColors = true),
     new OptionHandler('--enable[_-]checked[_-]mode|--checked',
-                      (_) => passThrough('--enable-checked-mode')),
+                      (_) => setCheckedMode('--enable-checked-mode')),
     new OptionHandler('--enable-concrete-type-inference',
                       (_) => implyCompilation(
                           '--enable-concrete-type-inference')),
     new OptionHandler('--trust-type-annotations',
-                      (_) => implyCompilation('--trust-type-annotations')),
+                      (_) => setTrustTypeAnnotations(
+                          '--trust-type-annotations')),
     new OptionHandler(r'--help|/\?|/h', (_) => wantHelp = true),
     new OptionHandler('--package-root=.+|-p.+', setPackageRoot),
     new OptionHandler('--analyze-all', setAnalyzeAll),
@@ -340,6 +353,11 @@
     helpAndFail('Extra arguments: ${extra.join(" ")}');
   }
 
+  if (checkedMode && trustTypeAnnotations) {
+    helpAndFail("Option '--trust-type-annotations' may not be used in "
+                "checked mode.");
+  }
+
   Uri uri = currentDirectory.resolve(arguments[0]);
   if (packageRoot == null) {
     packageRoot = uri.resolve('./packages/');
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 0c060b7..99c2441 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -181,6 +181,18 @@
 
   }
 
+  /**
+   * Tells whether we should output given element. Corelib classes like
+   * Object should not be in the resulting code.
+   */
+  @override
+  bool shouldOutput(Element element) {
+    return (!element.library.isPlatformLibrary &&
+            !element.isSynthesized &&
+            element is! AbstractFieldElement)
+        || mirrorRenamer.isMirrorHelperLibrary(element.library);
+  }
+
   void assembleProgram() {
 
     ElementAst computeElementAst(AstElement element) {
@@ -207,17 +219,6 @@
       collector.collect();
     }
 
-    /**
-     * Tells whether we should output given element. Corelib classes like
-     * Object should not be in the resulting code.
-     */
-    bool shouldOutput(Element element) {
-      return (!element.library.isPlatformLibrary &&
-              !element.isSynthesized &&
-              element is! AbstractFieldElement)
-          || mirrorRenamer.isMirrorHelperLibrary(element.library);
-    }
-
     String assembledCode = outputter.assembleProgram(
         libraries: compiler.libraryLoader.libraries,
         instantiatedClasses: compiler.resolverWorld.instantiatedClasses,
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
index 8cf19cc..c17eba4 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
@@ -128,7 +128,9 @@
         parameters,
         body,
         name: functionElement.name,
-        returnType: emitOptionalType(functionType.returnType))
+        returnType: emitOptionalType(functionType.returnType),
+        isGetter: functionElement.isGetter,
+        isSetter: functionElement.isSetter)
         ..element = functionElement;
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_nodes.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_nodes.dart
index 73f985b..82839d5 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_nodes.dart
@@ -301,13 +301,17 @@
   String name;
   final Parameters parameters;
   final Statement body;
+  final bool isGetter;
+  final bool isSetter;
 
   elements.FunctionElement element;
 
   FunctionExpression(this.parameters,
                      this.body,
                      { this.name,
-                       this.returnType }) {
+                       this.returnType,
+                       this.isGetter: false,
+                       this.isSetter: false }) {
     // Function must have a name if it has a return type
     assert(returnType == null || name != null);
   }
@@ -762,6 +766,7 @@
     if (e is SuperReceiver) {
       write('super');
     } else if (e is FunctionExpression) {
+      assert(!e.isGetter && !e.isSetter);
       Statement stmt = unfoldBlocks(e.body);
       int precedence = stmt is Return ? EXPRESSION : PRIMARY;
       withPrecedence(precedence, () {
@@ -1185,6 +1190,7 @@
       writeVariableDefinitions(stmt);
       write(';');
     } else if (stmt is FunctionDeclaration) {
+      assert(!stmt.function.isGetter && !stmt.function.isSetter);
       if (stmt.returnType != null) {
         writeType(stmt.returnType);
         write(' ');
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart
index 9db5ef2..133f2b7 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart
@@ -104,6 +104,8 @@
   final Token catchToken = makeIdToken('catch');
   final Token onToken = makeIdToken('on');
   final Token finallyToken = makeIdToken('finally');
+  final Token getToken = makeIdToken('get');
+  final Token setToken = makeIdToken('set');
 
   static tree.Identifier makeIdentifier(String name) {
     return new tree.Identifier(
@@ -393,18 +395,25 @@
       if (beginStmt && exp.name != null) {
         needParen = true; // Do not mistake for function declaration.
       }
-
+      Token getOrSet = exp.isGetter
+          ? getToken
+          : exp.isSetter
+              ? setToken
+              : null;
+      tree.NodeList parameters = exp.isGetter
+          ? makeList("", [])
+          : makeParameters(exp.parameters);
       tree.Node body = makeFunctionBody(exp.body);
       result = new tree.FunctionExpression(
           functionName(exp),
-          makeParameters(exp.parameters),
+          parameters,
           body,
           exp.returnType == null || exp.element.isConstructor
             ? null
             : makeType(exp.returnType),
           makeFunctionModifiers(exp),
           null,  // initializers
-          null); // get/set
+          getOrSet);
       setElement(result, exp.element, exp);
     } else if (exp is Identifier) {
       precedence = CALLEE;
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/copy_propagator.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/copy_propagator.dart
index 179cbda..7115796 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/copy_propagator.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/copy_propagator.dart
@@ -179,9 +179,10 @@
   }
 
   Statement visitFunctionDeclaration(FunctionDeclaration node) {
+    // Unlike var declarations, function declarations are not hoisted, so we
+    // can't do copy propagation of the variable.
     new CopyPropagator().rewrite(node.definition);
     node.next = visitStatement(node.next);
-    node.variable = copyPropagateVariable(node.variable);
     return node;
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index e7e7ca7..1cc7c94 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -165,7 +165,9 @@
 
   Set<Element> _mainElements = new Set<Element>();
 
-  DeferredLoadTask(Compiler compiler) : super(compiler);
+  DeferredLoadTask(Compiler compiler) : super(compiler) {
+    mainOutputUnit.imports.add(_fakeMainImport);
+  }
 
   Backend get backend => compiler.backend;
 
@@ -175,11 +177,11 @@
 
     element = element.implementation;
     while (!_elementToOutputUnit.containsKey(element)) {
-      // Hack: it looks like we output annotation constants for classes that we
-      // don't include in the output. This seems to happen when we have
-      // reflection but can see that some classes are not needed. We still add
-      // the annotation but don't run through it below (where we assign every
-      // element to its output unit).
+      // TODO(21051): workaround: it looks like we output annotation constants
+      // for classes that we don't include in the output. This seems to happen
+      // when we have reflection but can see that some classes are not needed.
+      // We still add the annotation but don't run through it below (where we
+      // assign every element to its output unit).
       if (element.enclosingElement == null) {
         _elementToOutputUnit[element] = mainOutputUnit;
         break;
@@ -212,32 +214,6 @@
     _constantToOutputUnit[constant] = outputUnit;
   }
 
-  /// Mark that [import] is part of the [OutputputUnit] for [element].
-  ///
-  /// [element] can be either a [Constant] or an [Element].
-  void _addImportToOutputUnitOfElement(Element element, Import import) {
-    // Only one file should be loaded when the program starts, so make
-    // sure that only one OutputUnit is created for [fakeMainImport].
-    if (import == _fakeMainImport) {
-      _elementToOutputUnit[element] = mainOutputUnit;
-    }
-    _elementToOutputUnit.putIfAbsent(element, () => new OutputUnit())
-        .imports.add(import);
-  }
-
-  /// Mark that [import] is part of the [OutputputUnit] for [constant].
-  ///
-  /// [constant] can be either a [Constant] or an [Element].
-  void _addImportToOutputUnitOfConstant(Constant constant, Import import) {
-    // Only one file should be loaded when the program starts, so make
-    // sure that only one OutputUnit is created for [fakeMainImport].
-    if (import == _fakeMainImport) {
-      _constantToOutputUnit[constant] = mainOutputUnit;
-    }
-    _constantToOutputUnit.putIfAbsent(constant, () => new OutputUnit())
-        .imports.add(import);
-  }
-
   /// Answers whether [element] is explicitly deferred when referred to from
   /// [library].
   bool _isExplicitlyDeferred(Element element, LibraryElement library) {
@@ -588,16 +564,36 @@
         _addMirrorElements();
       }
 
-      Set<Constant> allConstants = new Set<Constant>();
-      // Reverse the mapping. For each element record an OutputUnit collecting
-      // all deferred imports using this element. Same for constants.
+      // Build the OutputUnits using these two maps.
+      Map<Element, OutputUnit> elementToOutputUnitBuilder =
+          new Map<Element, OutputUnit>();
+      Map<Constant, OutputUnit> constantToOutputUnitBuilder =
+          new Map<Constant, OutputUnit>();
+
+      // Reverse the mappings. For each element record an OutputUnit collecting
+      // all deferred imports mapped to this element. Same for constants.
       for (Import import in _importedDeferredBy.keys) {
         for (Element element in _importedDeferredBy[import]) {
-          _addImportToOutputUnitOfElement(element, import);
+          // Only one file should be loaded when the program starts, so make
+          // sure that only one OutputUnit is created for [fakeMainImport].
+          if (import == _fakeMainImport) {
+            elementToOutputUnitBuilder[element] = mainOutputUnit;
+          } else {
+            elementToOutputUnitBuilder
+                .putIfAbsent(element, () => new OutputUnit())
+                .imports.add(import);
+          }
         }
         for (Constant constant in _constantsDeferredBy[import]) {
-          allConstants.add(constant);
-          _addImportToOutputUnitOfConstant(constant, import);
+          // Only one file should be loaded when the program starts, so make
+          // sure that only one OutputUnit is created for [fakeMainImport].
+          if (import == _fakeMainImport) {
+            constantToOutputUnitBuilder[constant] = mainOutputUnit;
+          } else {
+            constantToOutputUnitBuilder
+                .putIfAbsent(constant, () => new OutputUnit())
+                .imports.add(import);
+          }
         }
       }
 
@@ -605,15 +601,28 @@
       _importedDeferredBy = null;
       _constantsDeferredBy = null;
 
-      // Find all the output units we have used.
-      // Also generate a unique name for each OutputUnit.
-      for (OutputUnit outputUnit in _elementToOutputUnit.values) {
-        allOutputUnits.add(outputUnit);
-      }
-      for (OutputUnit outputUnit in _constantToOutputUnit.values) {
-        allOutputUnits.add(outputUnit);
-      }
+      // Find all the output units elements/constants have been mapped to, and
+      // canonicalize them.
+      elementToOutputUnitBuilder.forEach(
+          (Element element, OutputUnit outputUnit) {
+        OutputUnit representative = allOutputUnits.lookup(outputUnit);
+        if (representative == null) {
+          representative = outputUnit;
+          allOutputUnits.add(representative);
+        }
+        _elementToOutputUnit[element] = representative;
+      });
+      constantToOutputUnitBuilder.forEach(
+          (Constant constant, OutputUnit outputUnit) {
+        OutputUnit representative = allOutputUnits.lookup(outputUnit);
+        if (representative == null) {
+          representative = outputUnit;
+          allOutputUnits.add(representative);
+        }
+        _constantToOutputUnit[constant] = representative;
+      });
 
+      // Generate a unique name for each OutputUnit.
       _assignNamesToOutputUnits(allOutputUnits);
     });
   }
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index 366d8a9..c59ea59 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -95,7 +95,7 @@
     Backend backend = compiler.backend;
     if (backend is JavaScriptBackend) {
       // Add up the sizes of all output-buffers.
-      programSize = backend.emitter.outputBuffers.values.fold(0,
+      programSize = backend.emitter.oldEmitter.outputBuffers.values.fold(0,
           (a, b) => a + b.length);
     } else {
       programSize = compiler.assembledCode.length;
@@ -630,7 +630,7 @@
       outputUnits.add(<String, dynamic> {
         'id': id,
         'name': outputUnit.name,
-        'size': backend.emitter.outputBuffers[outputUnit].length,
+        'size': backend.emitter.oldEmitter.outputBuffers[outputUnit].length,
       });
     }
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 48cdc49..7cca062 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -38,6 +38,9 @@
 
 import 'visitor.dart' show ElementVisitor;
 
+abstract class DeclarationSite {
+}
+
 abstract class ElementX extends Element {
   static int elementHashCode = 0;
 
@@ -261,6 +264,8 @@
     if (element.isAbstractField || element.isPrefix) return element.library;
     return element;
   }
+
+  DeclarationSite get declarationSite => null;
 }
 
 class ErroneousElementX extends ElementX implements ErroneousElement {
@@ -1080,7 +1085,7 @@
 // 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 {
+class VariableList implements DeclarationSite {
   VariableDefinitions definitions;
   DartType type;
   final Modifiers modifiers;
@@ -1209,6 +1214,8 @@
   Token get position => token;
 
   accept(ElementVisitor visitor) => visitor.visitVariableElement(this);
+
+  DeclarationSite get declarationSite => variables;
 }
 
 class LocalVariableElementX extends VariableElementX
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
index 7d882cd..9ac5813 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
@@ -13,13 +13,6 @@
       : super(tracedType, inferrer);
 
   void run() {
-    for (FunctionElement e in tracedElements) {
-      e.functionSignature.forEachParameter((Element parameter) {
-        ElementTypeInformation info =
-            inferrer.types.getInferredTypeOf(parameter);
-        info.maybeResume();
-      });
-    }
     analyze();
     if (!continueAnalyzing) return;
     callsToAnalyze.forEach(analyzeCall);
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 f7b6761..279afbd 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -5,7 +5,8 @@
 library type_graph_inferrer;
 
 import 'dart:collection' show Queue, IterableBase;
-import '../dart_types.dart' show DartType, InterfaceType, TypeKind;
+import '../dart_types.dart' show DartType, FunctionType, InterfaceType,
+    TypeKind;
 import '../elements/elements.dart';
 import '../tree/tree.dart' as ast show DartString, Node;
 import '../cps_ir/cps_ir_nodes.dart' as cps_ir show Node;
@@ -619,6 +620,8 @@
       analyzeMapAndEnqueue(info);
     });
 
+    Set<FunctionElement> bailedOutOn = new Set<FunctionElement>();
+
     // Trace closures to potentially infer argument types.
     types.allocatedClosures.forEach((info) {
       void trace(Iterable<FunctionElement> elements,
@@ -628,12 +631,22 @@
           elements.forEach((FunctionElement e) {
             compiler.world.registerMightBePassedToApply(e);
             if (_VERBOSE) print("traced closure $e as ${true} (bail)");
+            e.functionSignature.forEachParameter((parameter) {
+              types.getInferredTypeOf(parameter).giveUp(
+                  this,
+                  clearAssignments: false);
+            });
           });
+          bailedOutOn.addAll(elements);
           return;
         }
-        elements.forEach((FunctionElement e) {
+        elements
+            .where((e) => !bailedOutOn.contains(e))
+            .forEach((FunctionElement e) {
           e.functionSignature.forEachParameter((parameter) {
-            workQueue.add(types.getInferredTypeOf(parameter));
+            var info = types.getInferredTypeOf(parameter);
+            info.maybeResume();
+            workQueue.add(info);
           });
           if (tracer.tracedType.mightBePassedToFunctionApply) {
             compiler.world.registerMightBePassedToApply(e);
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
index e740ee1..a8fb5e8 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
@@ -325,12 +325,15 @@
  * - Functions
  * - Constructors
  * - Fields (also synthetic ones due to closures)
+ * - Local functions (closures)
  *
  * These should never be created directly but instead are constructed by
  * the [ElementTypeInformation] factory.
  */
 class MemberTypeInformation extends ElementTypeInformation
     with ApplyableTypeInformation {
+  TypedElement get element => super.element;
+
   /**
    * If [element] is a function, [closurizedCount] is the number of
    * times it is closurized. The value gets updated while infering.
@@ -433,14 +436,19 @@
     if (!compiler.trustTypeAnnotations && !compiler.enableTypeAssertions) {
       return mask;
     }
-    if (element.isGenerativeConstructor || element.isSetter) return mask;
-    var type = element.computeType(compiler);
-    if (element.isFunction ||
-        element.isGetter ||
-        element.isFactoryConstructor) {
-      type = type.returnType;
+    if (element.isGenerativeConstructor ||
+        element.isSetter) {
+      return mask;
     }
-    return new TypeMaskSystem(compiler).narrowType(mask, type);
+    if (element.isField) {
+      return new TypeMaskSystem(compiler).narrowType(mask, element.type);
+    }
+    assert(element.isFunction ||
+           element.isGetter ||
+           element.isFactoryConstructor);
+
+    FunctionType type = element.type;
+    return new TypeMaskSystem(compiler).narrowType(mask, type.returnType);
   }
 
   TypeMask computeType(TypeGraphInferrerEngine inferrer) {
@@ -450,6 +458,10 @@
         inferrer.types.computeTypeMask(assignments), inferrer);
   }
 
+  TypeMask safeType(TypeGraphInferrerEngine inferrer) {
+    return potentiallyNarrowType(super.safeType(inferrer), inferrer);
+  }
+
   String toString() => 'MemberElement $element $type';
 
   accept(TypeInformationVisitor visitor) {
@@ -550,10 +562,28 @@
     return null;
   }
 
+  TypeMask potentiallyNarrowType(TypeMask mask,
+                                 TypeGraphInferrerEngine inferrer) {
+    Compiler compiler = inferrer.compiler;
+    if (!compiler.trustTypeAnnotations) {
+      return mask;
+    }
+    // When type assertions are enabled (aka checked mode), we have to always
+    // ignore type annotations to ensure that the checks are actually inserted
+    // into the function body and retained until runtime.
+    assert(!compiler.enableTypeAssertions);
+    return new TypeMaskSystem(compiler).narrowType(mask, element.type);
+  }
+
   TypeMask computeType(TypeGraphInferrerEngine inferrer) {
     TypeMask special = handleSpecialCases(inferrer);
     if (special != null) return special;
-    return inferrer.types.computeTypeMask(assignments);
+    return potentiallyNarrowType(inferrer.types.computeTypeMask(assignments),
+                                 inferrer);
+  }
+
+  TypeMask safeType(TypeGraphInferrerEngine inferrer) {
+    return potentiallyNarrowType(super.safeType(inferrer), inferrer);
   }
 
   bool hasStableType(TypeGraphInferrerEngine inferrer) {
@@ -568,6 +598,8 @@
   accept(TypeInformationVisitor visitor) {
     return visitor.visitParameterTypeInformation(this);
   }
+
+  String toString() => 'ParameterElement $element $type';
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 09dcfef..3713592 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -1942,9 +1942,12 @@
           for (ClassElement subcls in compiler.world.subtypesOf(cls)) {
             subcls.forEachClassMember((Member member) {
               if (memberNames.contains(member.name)) {
-                assert(invariant(member.element,
-                    resolution.isLive(member.element)));
-                reflectableMembers.add(member.element);
+                // TODO(20993): find out why this assertion fails.
+                // assert(invariant(member.element,
+                //    resolution.isLive(member.element)));
+                if (resolution.isLive(member.element)) {
+                  reflectableMembers.add(member.element);
+                }
               }
             });
           }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index 18eb57f..81caab4 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -8,7 +8,7 @@
 
   final Map<Element, ClassBuilder> cachedBuilders;
 
-  final CodeEmitterTask emitter;
+  final CodeEmitterTask emitterTask;
   CodeBuffer nativeBuffer;
 
   // Native classes found in the application.
@@ -28,20 +28,20 @@
   // it finds any native class that needs noSuchMethod handling.
   bool handleNoSuchMethod = false;
 
-  NativeEmitter(CodeEmitterTask emitter)
-      : this.emitter = emitter,
+  NativeEmitter(CodeEmitterTask emitterTask)
+      : this.emitterTask = emitterTask,
         subtypes = new Map<ClassElement, List<ClassElement>>(),
         directSubtypes = new Map<ClassElement, List<ClassElement>>(),
         nativeMethods = new Set<FunctionElement>(),
         nativeBuffer = new CodeBuffer(),
-        cachedBuilders = emitter.compiler.cacheStrategy.newMap();
+        cachedBuilders = emitterTask.compiler.cacheStrategy.newMap();
 
-  Compiler get compiler => emitter.compiler;
+  Compiler get compiler => emitterTask.compiler;
   JavaScriptBackend get backend => compiler.backend;
 
-  String get _ => emitter.space;
-  String get n => emitter.n;
-  String get N => emitter.N;
+  String get _ => emitterTask.oldEmitter.space;
+  String get n => emitterTask.oldEmitter.n;
+  String get N => emitterTask.oldEmitter.N;
 
   jsAst.Expression get defPropFunction {
     Element element = backend.findHelper('defineProperty');
@@ -114,9 +114,9 @@
     neededClasses.add(compiler.objectClass);
 
     Set<ClassElement> neededByConstant =
-        emitter.interceptorEmitter.interceptorsReferencedFromConstants();
+        emitterTask.interceptorEmitter.interceptorsReferencedFromConstants();
     Set<ClassElement> modifiedClasses =
-        emitter.typeTestEmitter.classesModifiedByEmitRuntimeTypeSupport();
+        emitterTask.typeTestEmitter.classesModifiedByEmitRuntimeTypeSupport();
 
     for (ClassElement classElement in preOrder.reversed) {
       // Post-order traversal ensures we visit the subclasses before their
@@ -241,11 +241,11 @@
       if (!classElement.isNative) continue;
       if (neededClasses.contains(classElement)) {
         // Define interceptor class for [classElement].
-        emitter.classEmitter.emitClassBuilderWithReflectionData(
+        emitterTask.oldEmitter.classEmitter.emitClassBuilderWithReflectionData(
             backend.namer.getNameOfClass(classElement),
             classElement, builders[classElement],
-            emitter.getElementDescriptor(classElement));
-        emitter.needsDefineClass = true;
+            emitterTask.oldEmitter.getElementDescriptor(classElement));
+        emitterTask.oldEmitter.needsDefineClass = true;
       }
     }
   }
@@ -308,13 +308,16 @@
 
     String superName = backend.namer.getNameOfClass(superclass);
 
-    emitter.classEmitter.emitClassConstructor(classElement, builder);
-    bool hasFields = emitter.classEmitter.emitFields(
+    emitterTask.oldEmitter.classEmitter.emitClassConstructor(
+        classElement, builder);
+    bool hasFields = emitterTask.oldEmitter.classEmitter.emitFields(
         classElement, builder, superName, classIsNative: true);
     int propertyCount = builder.properties.length;
-    emitter.classEmitter.emitClassGettersSetters(classElement, builder);
-    emitter.classEmitter.emitInstanceMembers(classElement, builder);
-    emitter.typeTestEmitter.emitIsTests(classElement, builder);
+    emitterTask.oldEmitter.classEmitter.emitClassGettersSetters(
+        classElement, builder);
+    emitterTask.oldEmitter.classEmitter.emitInstanceMembers(
+        classElement, builder);
+    emitterTask.typeTestEmitter.emitIsTests(classElement, builder);
 
     if (!hasFields &&
         builder.properties.length == propertyCount &&
@@ -454,7 +457,7 @@
       // If the native emitter has been asked to take care of the
       // noSuchMethod handlers, we do that now.
       if (handleNoSuchMethod) {
-        emitter.nsmEmitter.emitNoSuchMethodHandlers(addProperty);
+        emitterTask.oldEmitter.nsmEmitter.emitNoSuchMethodHandlers(addProperty);
       }
     }
 
@@ -469,7 +472,7 @@
           [ defPropFunction,
             new jsAst.ObjectInitializer(objectProperties)]);
 
-      if (emitter.compiler.enableMinification) targetBuffer.add(';');
+      if (emitterTask.compiler.enableMinification) targetBuffer.add(';');
       targetBuffer.add(jsAst.prettyPrint(
           new jsAst.ExpressionStatement(init), compiler));
       targetBuffer.add('\n');
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
index a336f32..e07cfd1 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
@@ -36,7 +36,7 @@
 
   ClassElement get typeVariableClass => backend.typeVariableClass;
   CodeEmitterTask get task => backend.emitter;
-  MetadataEmitter get emitter => task.metadataEmitter;
+  MetadataEmitter get emitter => task.oldEmitter.metadataEmitter;
   Compiler get compiler => backend.compiler;
 
   void registerClassWithTypeVariables(ClassElement cls) {
@@ -122,8 +122,8 @@
    * there, otherwise a new entry for [c] is created.
    */
   int reifyTypeVariableConstant(Constant c, TypeVariableElement variable) {
-    String name =
-        jsAst.prettyPrint(task.constantReference(c), compiler).getText();
+    String name = jsAst.prettyPrint(task.oldEmitter.constantReference(c),
+                                    compiler).getText();
     int index;
     if (typeVariableConstants.containsKey(variable)) {
       index = typeVariableConstants[variable];
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
index ca0a1e4..1f564f9 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
@@ -14,12 +14,12 @@
                      ClassBuilder properties,
                      Map<String, jsAst.Expression> additionalProperties) {
     final onlyForRti =
-        task.typeTestEmitter.rtiNeededClasses.contains(classElement);
+        emitter.typeTestEmitter.rtiNeededClasses.contains(classElement);
 
     assert(invariant(classElement, classElement.isDeclaration));
     assert(invariant(classElement, !classElement.isNative || onlyForRti));
 
-    task.needsDefineClass = true;
+    emitter.needsDefineClass = true;
     String className = namer.getNameOfClass(classElement);
 
     ClassElement superclass = classElement.superclass;
@@ -31,7 +31,7 @@
     if (classElement.isMixinApplication) {
       String mixinName = namer.getNameOfClass(computeMixinClass(classElement));
       superName = '$superName+$mixinName';
-      task.needsMixinSupport = true;
+      emitter.needsMixinSupport = true;
     }
 
     ClassBuilder builder = new ClassBuilder(classElement, namer);
@@ -39,7 +39,7 @@
     emitFields(classElement, builder, superName, onlyForRti: onlyForRti);
     emitClassGettersSetters(classElement, builder, onlyForRti: onlyForRti);
     emitInstanceMembers(classElement, builder, onlyForRti: onlyForRti);
-    task.typeTestEmitter.emitIsTests(classElement, builder);
+    emitter.typeTestEmitter.emitIsTests(classElement, builder);
     if (additionalProperties != null) {
       additionalProperties.forEach(builder.addProperty);
     }
@@ -83,7 +83,10 @@
     jsAst.Expression constructorAst = js('function(#) { #; }',
         [fields,
          fields.map((name) => js('this.# = #', [name, name]))]);
-    task.emitPrecompiledConstructor(constructorName, constructorAst);
+    OutputUnit outputUnit =
+        compiler.deferredLoadTask.outputUnitForElement(classElement);
+    emitter.emitPrecompiledConstructor(
+        outputUnit, constructorName, constructorAst);
   }
 
   /// Returns `true` if fields added.
@@ -125,7 +128,7 @@
         // constructors, so we don't need the fields unless we are generating
         // accessors at runtime.
         if (!classIsNative || needsAccessor) {
-          var metadata = task.metadataEmitter.buildMetadataFunction(field);
+          var metadata = emitter.metadataEmitter.buildMetadataFunction(field);
           if (metadata != null) {
             hasMetadata = true;
           } else {
@@ -149,11 +152,11 @@
 
             int getterCode = 0;
             if (needsAccessor && backend.fieldHasInterceptedGetter(field)) {
-              task.interceptorEmitter.interceptorInvocationNames.add(
+              emitter.interceptorEmitter.interceptorInvocationNames.add(
                   namer.getterName(field));
             }
             if (needsAccessor && backend.fieldHasInterceptedGetter(field)) {
-              task.interceptorEmitter.interceptorInvocationNames.add(
+              emitter.interceptorEmitter.interceptorInvocationNames.add(
                   namer.setterName(field));
             }
             if (needsGetter) {
@@ -169,7 +172,7 @@
                 // the method's class was elsewhere mixed-in to an interceptor.
                 assert(!field.isInstanceMember || getterCode != 0);
                 if (isIntercepted) {
-                  task.interceptorEmitter.interceptorInvocationNames.add(
+                  emitter.interceptorEmitter.interceptorInvocationNames.add(
                       namer.getterName(field));
                 }
               } else {
@@ -187,7 +190,7 @@
                 setterCode += backend.isInterceptorClass(element) ? 0 : 1;
                 assert(!field.isInstanceMember || setterCode != 0);
                 if (isIntercepted) {
-                  task.interceptorEmitter.interceptorInvocationNames.add(
+                  emitter.interceptorEmitter.interceptorInvocationNames.add(
                       namer.setterName(field));
                 }
               } else {
@@ -204,7 +207,7 @@
           }
           if (backend.isAccessibleByReflection(field)) {
             DartType type = field.type;
-            reflectionMarker = '-${task.metadataEmitter.reifyType(type)}';
+            reflectionMarker = '-${emitter.metadataEmitter.reifyType(type)}';
           }
           String builtFieldname = '$fieldName$fieldCode$reflectionMarker';
           builder.addField(builtFieldname);
@@ -264,7 +267,7 @@
     void visitMember(ClassElement enclosing, Element member) {
       assert(invariant(classElement, member.isDeclaration));
       if (member.isInstanceMember) {
-        task.containerBuilder.addMember(member, builder);
+        emitter.containerBuilder.addMember(member, builder);
       }
     }
 
@@ -278,8 +281,8 @@
       // so that the code in the dynamicFunction helper can find
       // them. Note that this helper is invoked before analyzing the
       // full JS script.
-      if (!task.nativeEmitter.handleNoSuchMethod) {
-        task.nsmEmitter.emitNoSuchMethodHandlers(builder.addProperty);
+      if (!emitter.nativeEmitter.handleNoSuchMethod) {
+        emitter.nsmEmitter.emitNoSuchMethodHandlers(builder.addProperty);
       }
     }
   }
@@ -288,14 +291,14 @@
                                           ClassElement classElement,
                                           ClassBuilder classBuilder,
                                           ClassBuilder enclosingBuilder) {
-    var metadata = task.metadataEmitter.buildMetadataFunction(classElement);
+    var metadata = emitter.metadataEmitter.buildMetadataFunction(classElement);
     if (metadata != null) {
       classBuilder.addProperty("@", metadata);
     }
 
     if (backend.isAccessibleByReflection(classElement)) {
       List<DartType> typeVars = classElement.typeVariables;
-      Iterable typeVariableProperties = task.typeVariableHandler
+      Iterable typeVariableProperties = emitter.typeVariableHandler
           .typeVariablesOf(classElement).map(js.number);
 
       ClassElement superclass = classElement.superclass;
@@ -320,7 +323,7 @@
     }
 
     Map<OutputUnit, ClassBuilder> classPropertyLists =
-        task.elementDescriptors.remove(classElement);
+        emitter.elementDescriptors.remove(classElement);
     if (classPropertyLists != null) {
       for (ClassBuilder classProperties in classPropertyLists.values) {
         // TODO(sigurdm): What about deferred?
@@ -339,17 +342,17 @@
     compiler.dumpInfoTask.registerElementAst(classBuilder.element, propertyValue);
     enclosingBuilder.addProperty(className, propertyValue);
 
-    String reflectionName = task.getReflectionName(classElement, className);
+    String reflectionName = emitter.getReflectionName(classElement, className);
     if (reflectionName != null) {
       if (!backend.isAccessibleByReflection(classElement)) {
         enclosingBuilder.addProperty("+$reflectionName", js.number(0));
       } else {
         List<int> types = <int>[];
         if (classElement.supertype != null) {
-          types.add(task.metadataEmitter.reifyType(classElement.supertype));
+          types.add(emitter.metadataEmitter.reifyType(classElement.supertype));
         }
         for (DartType interface in classElement.interfaces) {
-          types.add(task.metadataEmitter.reifyType(interface));
+          types.add(emitter.metadataEmitter.reifyType(interface));
         }
         enclosingBuilder.addProperty("+$reflectionName",
             new jsAst.ArrayInitializer.from(types.map(js.number)));
@@ -461,11 +464,11 @@
     if (!backend.shouldRetainGetter(member)) return;
     String previousName;
     if (member.isInstanceMember) {
-      previousName = task.mangledFieldNames.putIfAbsent(
+      previousName = emitter.mangledFieldNames.putIfAbsent(
           '${namer.getterPrefix}$accessorName',
           () => memberName);
     } else {
-      previousName = task.mangledGlobalFieldNames.putIfAbsent(
+      previousName = emitter.mangledGlobalFieldNames.putIfAbsent(
           accessorName,
           () => memberName);
     }
@@ -522,11 +525,13 @@
     String className = namer.getNameOfClass(cls);
     String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this';
     List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : [];
-    task.precompiledFunction.add(
+    OutputUnit outputUnit =
+        compiler.deferredLoadTask.outputUnitForElement(member);
+    emitter.cspPrecompiledFunctionFor(outputUnit).add(
         js('#.prototype.# = function(#) { return #.# }',
            [className, getterName, args, receiver, fieldName]));
     if (backend.isAccessibleByReflection(member)) {
-      task.precompiledFunction.add(
+      emitter.cspPrecompiledFunctionFor(outputUnit).add(
           js('#.prototype.#.${namer.reflectableField} = 1',
               [className, getterName]));
     }
@@ -539,12 +544,14 @@
     String className = namer.getNameOfClass(cls);
     String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this';
     List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : [];
-    task.precompiledFunction.add(
+    OutputUnit outputUnit =
+        compiler.deferredLoadTask.outputUnitForElement(member);
+    emitter.cspPrecompiledFunctionFor(outputUnit).add(
         // TODO: remove 'return'?
         js('#.prototype.# = function(#, v) { return #.# = v; }',
             [className, setterName, args, receiver, fieldName]));
     if (backend.isAccessibleByReflection(member)) {
-      task.precompiledFunction.add(
+      emitter.cspPrecompiledFunctionFor(outputUnit).add(
           js('#.prototype.#.${namer.reflectableField} = 1',
               [className, setterName]));
     }
@@ -557,7 +564,7 @@
     Selector selector = isGetter
         ? new Selector.getter(member.name, member.library)
         : new Selector.setter(member.name, member.library);
-    String reflectionName = task.getReflectionName(selector, name);
+    String reflectionName = emitter.getReflectionName(selector, name);
     if (reflectionName != null) {
       var reflectable =
           js(backend.isAccessibleByReflection(member) ? '1' : '0');
@@ -570,7 +577,7 @@
     ClassElement superclass = cls;
     while (superclass != null) {
       for (TypeVariableType parameter in superclass.typeVariables) {
-        if (task.readTypeVariables.contains(parameter.element)) {
+        if (backend.emitter.readTypeVariables.contains(parameter.element)) {
           emitTypeVariableReader(cls, builder, parameter.element);
         }
       }
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_helper.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_helper.dart
index 1adfce4..31ee925 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_helper.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_helper.dart
@@ -5,17 +5,17 @@
 part of dart2js.js_emitter;
 
 class CodeEmitterHelper {
-  CodeEmitterTask task;
+  OldEmitter emitter;
 
-  Namer get namer => task.namer;
+  Namer get namer => emitter.namer;
 
-  JavaScriptBackend get backend => task.backend;
+  JavaScriptBackend get backend => emitter.backend;
 
-  Compiler get compiler => task.compiler;
+  Compiler get compiler => emitter.compiler;
 
-  String get n => task.n;
+  String get n => emitter.n;
 
-  String get _ => task._;
+  String get _ => emitter._;
 
-  String get N => task.N;
+  String get N => emitter.N;
 }
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 0861141..32844bf 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
@@ -13,11 +13,275 @@
  * The code for the containing (used) methods must exist in the [:universe:].
  */
 class CodeEmitterTask extends CompilerTask {
+  // TODO(floitsch): the code-emitter task should not need a namer.
+  final Namer namer;
+  final TypeTestEmitter typeTestEmitter = new TypeTestEmitter();
+  final InterceptorEmitter interceptorEmitter = new InterceptorEmitter();
+  NativeEmitter nativeEmitter;
+  OldEmitter oldEmitter;
+  Emitter emitter;
+
+  final Set<ClassElement> neededClasses = new Set<ClassElement>();
+  final Map<OutputUnit, List<ClassElement>> outputClassLists =
+      new Map<OutputUnit, List<ClassElement>>();
+  final Map<OutputUnit, List<Constant>> outputConstantLists =
+      new Map<OutputUnit, List<Constant>>();
+  final List<ClassElement> nativeClasses = <ClassElement>[];
+
+  /// Records if a type variable is read dynamically for type tests.
+  final Set<TypeVariableElement> readTypeVariables =
+      new Set<TypeVariableElement>();
+
+  // TODO(ngeoffray): remove this field.
+  Set<ClassElement> instantiatedClasses;
+  List<TypedefElement> typedefsNeededForReflection;
+
+  JavaScriptBackend get backend => compiler.backend;
+
+  CodeEmitterTask(Compiler compiler, Namer namer, bool generateSourceMap)
+      : super(compiler),
+        this.namer = namer {
+    oldEmitter = new OldEmitter(compiler, namer, generateSourceMap, this);
+    emitter = USE_NEW_EMITTER
+        ? new new_js_emitter.Emitter(compiler, namer, generateSourceMap, this)
+        : oldEmitter;
+    nativeEmitter = new NativeEmitter(this);
+    typeTestEmitter.emitter = this.oldEmitter;
+    interceptorEmitter.emitter = this.oldEmitter;
+    // TODO(18886): Remove this call (and the show in the import) once the
+    // memory-leak in the VM is fixed.
+    templateManager.clear();
+  }
+
+
+  jsAst.Expression generateEmbeddedGlobalAccess(String global) {
+    return emitter.generateEmbeddedGlobalAccess(global);
+  }
+
+  jsAst.Expression constantReference(Constant value) {
+    return emitter.constantReference(value);
+  }
+
+  /**
+   * Return a function that returns true if its argument is a class
+   * that needs to be emitted.
+   */
+  Function computeClassFilter() {
+    if (backend.isTreeShakingDisabled) return (ClassElement cls) => true;
+
+    Set<ClassElement> unneededClasses = new Set<ClassElement>();
+    // The [Bool] class is not marked as abstract, but has a factory
+    // constructor that always throws. We never need to emit it.
+    unneededClasses.add(compiler.boolClass);
+
+    // Go over specialized interceptors and then constants to know which
+    // interceptors are needed.
+    Set<ClassElement> needed = new Set<ClassElement>();
+    backend.specializedGetInterceptors.forEach(
+        (_, Iterable<ClassElement> elements) {
+          needed.addAll(elements);
+        }
+    );
+
+    // Add interceptors referenced by constants.
+    needed.addAll(interceptorEmitter.interceptorsReferencedFromConstants());
+
+    // Add unneeded interceptors to the [unneededClasses] set.
+    for (ClassElement interceptor in backend.interceptedClasses) {
+      if (!needed.contains(interceptor)
+          && interceptor != compiler.objectClass) {
+        unneededClasses.add(interceptor);
+      }
+    }
+
+    // These classes are just helpers for the backend's type system.
+    unneededClasses.add(backend.jsMutableArrayClass);
+    unneededClasses.add(backend.jsFixedArrayClass);
+    unneededClasses.add(backend.jsExtendableArrayClass);
+    unneededClasses.add(backend.jsUInt32Class);
+    unneededClasses.add(backend.jsUInt31Class);
+    unneededClasses.add(backend.jsPositiveIntClass);
+
+    return (ClassElement cls) => !unneededClasses.contains(cls);
+  }
+
+  /**
+   * Compute all the constants that must be emitted.
+   */
+  void computeNeededConstants() {
+    JavaScriptConstantCompiler handler = backend.constants;
+    List<Constant> constants = handler.getConstantsForEmission(
+        compiler.hasIncrementalSupport ? null : emitter.compareConstants);
+    for (Constant constant in constants) {
+      if (emitter.isConstantInlinedOrAlreadyEmitted(constant)) continue;
+      OutputUnit constantUnit =
+          compiler.deferredLoadTask.outputUnitForConstant(constant);
+      if (constantUnit == null) {
+        // The back-end introduces some constants, like "InterceptorConstant" or
+        // some list constants. They are emitted in the main output-unit.
+        // TODO(sigurdm): We should track those constants.
+        constantUnit = compiler.deferredLoadTask.mainOutputUnit;
+      }
+      outputConstantLists.putIfAbsent(constantUnit, () => new List<Constant>())
+          .add(constant);
+    }
+  }
+
+  /// Compute all the classes and typedefs that must be emitted.
+  void computeNeededDeclarations() {
+    // Compute needed typedefs.
+    typedefsNeededForReflection = Elements.sortedByPosition(
+        compiler.world.allTypedefs
+            .where(backend.isAccessibleByReflection)
+            .toList());
+
+    // Compute needed classes.
+    instantiatedClasses =
+        compiler.codegenWorld.instantiatedClasses.where(computeClassFilter())
+            .toSet();
+
+    void addClassWithSuperclasses(ClassElement cls) {
+      neededClasses.add(cls);
+      for (ClassElement superclass = cls.superclass;
+          superclass != null;
+          superclass = superclass.superclass) {
+        neededClasses.add(superclass);
+      }
+    }
+
+    void addClassesWithSuperclasses(Iterable<ClassElement> classes) {
+      for (ClassElement cls in classes) {
+        addClassWithSuperclasses(cls);
+      }
+    }
+
+    // 1. We need to generate all classes that are instantiated.
+    addClassesWithSuperclasses(instantiatedClasses);
+
+    // 2. Add all classes used as mixins.
+    Set<ClassElement> mixinClasses = neededClasses
+        .where((ClassElement element) => element.isMixinApplication)
+        .map(computeMixinClass)
+        .toSet();
+    neededClasses.addAll(mixinClasses);
+
+    // 3. If we need noSuchMethod support, we run through all needed
+    // classes to figure out if we need the support on any native
+    // class. If so, we let the native emitter deal with it.
+    if (compiler.enabledNoSuchMethod) {
+      String noSuchMethodName = Compiler.NO_SUCH_METHOD;
+      Selector noSuchMethodSelector = compiler.noSuchMethodSelector;
+      for (ClassElement element in neededClasses) {
+        if (!element.isNative) continue;
+        Element member = element.lookupLocalMember(noSuchMethodName);
+        if (member == null) continue;
+        if (noSuchMethodSelector.applies(member, compiler.world)) {
+          nativeEmitter.handleNoSuchMethod = true;
+          break;
+        }
+      }
+    }
+
+    // 4. Find all classes needed for rti.
+    // It is important that this is the penultimate step, at this point,
+    // neededClasses must only contain classes that have been resolved and
+    // codegen'd. The rtiNeededClasses may contain additional classes, but
+    // these are thought to not have been instantiated, so we neeed to be able
+    // to identify them later and make sure we only emit "empty shells" without
+    // fields, etc.
+    typeTestEmitter.computeRtiNeededClasses();
+    typeTestEmitter.rtiNeededClasses.removeAll(neededClasses);
+    // rtiNeededClasses now contains only the "empty shells".
+    neededClasses.addAll(typeTestEmitter.rtiNeededClasses);
+
+    // TODO(18175, floitsch): remove once issue 18175 is fixed.
+    if (neededClasses.contains(backend.jsIntClass)) {
+      neededClasses.add(compiler.intClass);
+    }
+    if (neededClasses.contains(backend.jsDoubleClass)) {
+      neededClasses.add(compiler.doubleClass);
+    }
+    if (neededClasses.contains(backend.jsNumberClass)) {
+      neededClasses.add(compiler.numClass);
+    }
+    if (neededClasses.contains(backend.jsStringClass)) {
+      neededClasses.add(compiler.stringClass);
+    }
+    if (neededClasses.contains(backend.jsBoolClass)) {
+      neededClasses.add(compiler.boolClass);
+    }
+    if (neededClasses.contains(backend.jsArrayClass)) {
+      neededClasses.add(compiler.listClass);
+    }
+
+    // 5. Finally, sort the classes.
+    List<ClassElement> sortedClasses = Elements.sortedByPosition(neededClasses);
+
+    for (ClassElement element in sortedClasses) {
+      if (typeTestEmitter.rtiNeededClasses.contains(element)) {
+        // TODO(sigurdm): We might be able to defer some of these.
+        outputClassLists.putIfAbsent(compiler.deferredLoadTask.mainOutputUnit,
+            () => new List<ClassElement>()).add(element);
+      } else if (Elements.isNativeOrExtendsNative(element)) {
+        // For now, native classes and related classes cannot be deferred.
+        nativeClasses.add(element);
+        if (!element.isNative) {
+          assert(invariant(element,
+                           !compiler.deferredLoadTask.isDeferred(element)));
+          outputClassLists.putIfAbsent(compiler.deferredLoadTask.mainOutputUnit,
+              () => new List<ClassElement>()).add(element);
+        }
+      } else {
+        outputClassLists.putIfAbsent(
+            compiler.deferredLoadTask.outputUnitForElement(element),
+            () => new List<ClassElement>())
+            .add(element);
+      }
+    }
+  }
+
+  void assembleProgram() {
+    measure(() {
+      emitter.invalidateCaches();
+
+      // Compute the required type checks to know which classes need a
+      // 'is$' method.
+      typeTestEmitter.computeRequiredTypeChecks();
+
+      computeNeededDeclarations();
+      // TODO(floitsch): we want to call computeNeededConstants here, but
+      // the oldEmitter creates new constants during emission... :(
+
+      emitter.emitProgram();
+    });
+  }
+
+  void registerReadTypeVariable(TypeVariableElement element) {
+    readTypeVariables.add(element);
+  }
+}
+
+abstract class Emitter {
+  void emitProgram();
+
+  jsAst.Expression generateEmbeddedGlobalAccess(String global);
+  jsAst.Expression constantReference(Constant value);
+
+  int compareConstants(Constant a, Constant b);
+  bool isConstantInlinedOrAlreadyEmitted(Constant constant);
+
+  void invalidateCaches();
+}
+
+class OldEmitter implements Emitter {
+  final Compiler compiler;
+  final CodeEmitterTask task;
+
   final ContainerBuilder containerBuilder = new ContainerBuilder();
   final ClassEmitter classEmitter = new ClassEmitter();
   final NsmEmitter nsmEmitter = new NsmEmitter();
-  final TypeTestEmitter typeTestEmitter = new TypeTestEmitter();
-  final InterceptorEmitter interceptorEmitter = new InterceptorEmitter();
+  TypeTestEmitter get typeTestEmitter => task.typeTestEmitter;
+  InterceptorEmitter get interceptorEmitter => task.interceptorEmitter;
   final MetadataEmitter metadataEmitter = new MetadataEmitter();
 
   final Set<Constant> cachedEmittedConstants;
@@ -30,7 +294,7 @@
   bool needsLazyInitializer = false;
   final Namer namer;
   ConstantEmitter constantEmitter;
-  NativeEmitter nativeEmitter;
+  NativeEmitter get nativeEmitter => task.nativeEmitter;
 
   // The full code that is written to each hunk part-file.
   Map<OutputUnit, CodeBuffer> outputBuffers = new Map<OutputUnit, CodeBuffer>();
@@ -40,12 +304,12 @@
       well as in the generated code. */
   String isolateProperties;
   String classesCollector;
-  final Set<ClassElement> neededClasses = new Set<ClassElement>();
-  final Map<OutputUnit, List<ClassElement>> outputClassLists =
-      new Map<OutputUnit, List<ClassElement>>();
-  final Map<OutputUnit, List<Constant>> outputConstantLists =
-      new Map<OutputUnit, List<Constant>>();
-  final List<ClassElement> nativeClasses = <ClassElement>[];
+  Set<ClassElement> get neededClasses => task.neededClasses;
+  Map<OutputUnit, List<ClassElement>> get outputClassLists
+      => task.outputClassLists;
+  Map<OutputUnit, List<Constant>> get outputConstantLists
+      => task.outputConstantLists;
+  List<ClassElement> get nativeClasses => task.nativeClasses;
   final Map<String, String> mangledFieldNames = <String, String>{};
   final Map<String, String> mangledGlobalFieldNames = <String, String>{};
   final Set<String> recordedMangledNames = new Set<String>();
@@ -53,14 +317,10 @@
   final Map<ClassElement, Map<String, jsAst.Expression>> additionalProperties =
       new Map<ClassElement, Map<String, jsAst.Expression>>();
 
-  /// Records if a type variable is read dynamically for type tests.
-  final Set<TypeVariableElement> readTypeVariables =
-      new Set<TypeVariableElement>();
+  Set<ClassElement> get instantiatedClasses => task.instantiatedClasses;
 
-  // TODO(ngeoffray): remove this field.
-  Set<ClassElement> instantiatedClasses;
-
-  List<TypedefElement> typedefsNeededForReflection;
+  List<TypedefElement> get typedefsNeededForReflection =>
+      task.typedefsNeededForReflection;
 
   JavaScriptBackend get backend => compiler.backend;
   TypeVariableHandler get typeVariableHandler => backend.typeVariableHandler;
@@ -87,9 +347,11 @@
    * negatively. So dart2js will emit these functions to a separate file that
    * can be optionally included to support CSP mode or for faster startup.
    */
-  List<jsAst.Node> precompiledFunction = <jsAst.Node>[];
+  Map<OutputUnit, List<jsAst.Node>> _cspPrecompiledFunctions =
+      new Map<OutputUnit, List<jsAst.Node>>();
 
-  List<jsAst.Expression> precompiledConstructorNames = <jsAst.Expression>[];
+  Map<OutputUnit, List<jsAst.Expression>> _cspPrecompiledConstructorNames =
+      new Map<OutputUnit, List<jsAst.Expression>>();
 
   // True if Isolate.makeConstantList is needed.
   bool hasMakeConstantList = false;
@@ -110,23 +372,38 @@
 
   final bool generateSourceMap;
 
-  CodeEmitterTask(Compiler compiler, Namer namer, this.generateSourceMap)
-      : this.namer = namer,
+  OldEmitter(Compiler compiler, Namer namer, this.generateSourceMap, this.task)
+      : this.compiler = compiler,
+        this.namer = namer,
         constantEmitter = new ConstantEmitter(compiler, namer),
         cachedEmittedConstants = compiler.cacheStrategy.newSet(),
         cachedClassBuilders = compiler.cacheStrategy.newMap(),
-        cachedElements = compiler.cacheStrategy.newSet(),
-        super(compiler) {
-    nativeEmitter = new NativeEmitter(this);
-    containerBuilder.task = this;
-    classEmitter.task = this;
-    nsmEmitter.task = this;
-    typeTestEmitter.task = this;
-    interceptorEmitter.task = this;
-    metadataEmitter.task = this;
-    // TODO(18886): Remove this call (and the show in the import) once the
-    // memory-leak in the VM is fixed.
-    templateManager.clear();
+        cachedElements = compiler.cacheStrategy.newSet() {
+    containerBuilder.emitter = this;
+    classEmitter.emitter = this;
+    nsmEmitter.emitter = this;
+    interceptorEmitter.emitter = this;
+    metadataEmitter.emitter = this;
+  }
+
+  List<jsAst.Node> cspPrecompiledFunctionFor(OutputUnit outputUnit) {
+    return _cspPrecompiledFunctions.putIfAbsent(
+        outputUnit,
+        () => new List<jsAst.Node>());
+  }
+
+  List<jsAst.Expression> cspPrecompiledConstructorNamesFor(
+      OutputUnit outputUnit) {
+    return _cspPrecompiledConstructorNames.putIfAbsent(
+        outputUnit,
+        () => new List<jsAst.Expression>());
+  }
+
+  /// Erases the precompiled information for csp mode for all output units.
+  /// Used by the incremental compiler.
+  void clearCspPrecompiledNodes() {
+    _cspPrecompiledFunctions.clear();
+    _cspPrecompiledConstructorNames.clear();
   }
 
   void addComment(String comment, CodeBuffer buffer) {
@@ -823,16 +1100,18 @@
     return ':$names';
   }
 
-  jsAst.FunctionDeclaration buildPrecompiledFunction() {
+  jsAst.FunctionDeclaration buildCspPrecompiledFunctionFor(
+      OutputUnit outputUnit) {
     // TODO(ahe): Compute a hash code.
     return js.statement('''
       function dart_precompiled(\$collectedClasses) {
         var \$desc;
         #;
         return #;
-      }''', [
-          precompiledFunction,
-          new jsAst.ArrayInitializer.from(precompiledConstructorNames)]);
+      }''',
+        [cspPrecompiledFunctionFor(outputUnit),
+         new jsAst.ArrayInitializer.from(
+             cspPrecompiledConstructorNamesFor(outputUnit))]);
   }
 
   void generateClass(ClassElement classElement, ClassBuilder properties) {
@@ -857,49 +1136,6 @@
     });
   }
 
-  /**
-   * Return a function that returns true if its argument is a class
-   * that needs to be emitted.
-   */
-  Function computeClassFilter() {
-    if (backend.isTreeShakingDisabled) return (ClassElement cls) => true;
-
-    Set<ClassElement> unneededClasses = new Set<ClassElement>();
-    // The [Bool] class is not marked as abstract, but has a factory
-    // constructor that always throws. We never need to emit it.
-    unneededClasses.add(compiler.boolClass);
-
-    // Go over specialized interceptors and then constants to know which
-    // interceptors are needed.
-    Set<ClassElement> needed = new Set<ClassElement>();
-    backend.specializedGetInterceptors.forEach(
-        (_, Iterable<ClassElement> elements) {
-          needed.addAll(elements);
-        }
-    );
-
-    // Add interceptors referenced by constants.
-    needed.addAll(interceptorEmitter.interceptorsReferencedFromConstants());
-
-    // Add unneeded interceptors to the [unneededClasses] set.
-    for (ClassElement interceptor in backend.interceptedClasses) {
-      if (!needed.contains(interceptor)
-          && interceptor != compiler.objectClass) {
-        unneededClasses.add(interceptor);
-      }
-    }
-
-    // These classes are just helpers for the backend's type system.
-    unneededClasses.add(backend.jsMutableArrayClass);
-    unneededClasses.add(backend.jsFixedArrayClass);
-    unneededClasses.add(backend.jsExtendableArrayClass);
-    unneededClasses.add(backend.jsUInt32Class);
-    unneededClasses.add(backend.jsUInt31Class);
-    unneededClasses.add(backend.jsPositiveIntClass);
-
-    return (ClassElement cls) => !unneededClasses.contains(cls);
-  }
-
   void emitFinishClassesInvocationIfNecessary(CodeBuffer buffer) {
     if (needsDefineClass) {
       buffer.write('$finishClassesName($classesCollector,'
@@ -985,31 +1221,6 @@
     return null;
   }
 
-  void emitCompileTimeConstants(CodeBuffer buffer, OutputUnit outputUnit) {
-    List<Constant> constants = outputConstantLists[outputUnit];
-    if (constants == null) return;
-    bool isMainBuffer = buffer == mainBuffer;
-    if (compiler.hasIncrementalSupport && isMainBuffer) {
-      buffer = cachedEmittedConstantsBuffer;
-    }
-    for (Constant constant in constants) {
-      if (compiler.hasIncrementalSupport && isMainBuffer) {
-        if (cachedEmittedConstants.contains(constant)) continue;
-        cachedEmittedConstants.add(constant);
-      }
-      String name = namer.constantName(constant);
-      if (constant.isList) emitMakeConstantListIfNotEmitted(buffer);
-      jsAst.Expression init = js('#.# = #',
-          [namer.globalObjectForConstant(constant), name,
-           constantInitializerExpression(constant)]);
-      buffer.write(jsAst.prettyPrint(init, compiler, monitor: compiler.dumpInfoTask));
-      buffer.write('$N');
-    }
-    if (compiler.hasIncrementalSupport && isMainBuffer) {
-      mainBuffer.add(cachedEmittedConstantsBuffer);
-    }
-  }
-
   bool isConstantInlinedOrAlreadyEmitted(Constant constant) {
     if (constant.isFunction) return true;    // Already emitted.
     if (constant.isPrimitive) return true;   // Inlined.
@@ -1043,6 +1254,32 @@
     return namer.constantName(a).compareTo(namer.constantName(b));
   }
 
+  void emitCompileTimeConstants(CodeBuffer buffer, OutputUnit outputUnit) {
+    List<Constant> constants = outputConstantLists[outputUnit];
+    if (constants == null) return;
+    bool isMainBuffer = buffer == mainBuffer;
+    if (compiler.hasIncrementalSupport && isMainBuffer) {
+      buffer = cachedEmittedConstantsBuffer;
+    }
+    for (Constant constant in constants) {
+      if (compiler.hasIncrementalSupport && isMainBuffer) {
+        if (cachedEmittedConstants.contains(constant)) continue;
+        cachedEmittedConstants.add(constant);
+      }
+      String name = namer.constantName(constant);
+      if (constant.isList) emitMakeConstantListIfNotEmitted(buffer);
+      jsAst.Expression init = js('#.# = #',
+          [namer.globalObjectForConstant(constant), name,
+           constantInitializerExpression(constant)]);
+      buffer.write(jsAst.prettyPrint(init, compiler,
+                                     monitor: compiler.dumpInfoTask));
+      buffer.write('$N');
+    }
+    if (compiler.hasIncrementalSupport && isMainBuffer) {
+      mainBuffer.add(cachedEmittedConstantsBuffer);
+    }
+  }
+
   void emitMakeConstantListIfNotEmitted(CodeBuffer buffer) {
     if (hasMakeConstantList) return;
     hasMakeConstantList = true;
@@ -1204,141 +1441,6 @@
     addComment('END invoke [main].', buffer);
   }
 
-  /**
-   * Compute all the constants that must be emitted.
-   */
-  void computeNeededConstants() {
-    JavaScriptConstantCompiler handler = backend.constants;
-    List<Constant> constants = handler.getConstantsForEmission(
-        compiler.hasIncrementalSupport ? null : compareConstants);
-    for (Constant constant in constants) {
-      if (isConstantInlinedOrAlreadyEmitted(constant)) continue;
-      OutputUnit constantUnit =
-          compiler.deferredLoadTask.outputUnitForConstant(constant);
-      if (constantUnit == null) {
-        // The back-end introduces some constants, like "InterceptorConstant" or
-        // some list constants. They are emitted in the main output-unit.
-        // TODO(sigurdm): We should track those constants.
-        constantUnit = compiler.deferredLoadTask.mainOutputUnit;
-      }
-      outputConstantLists.putIfAbsent(constantUnit, () => new List<Constant>())
-          .add(constant);
-    }
-  }
-
-  /// Compute all the classes and typedefs that must be emitted.
-  void computeNeededDeclarations() {
-    // Compute needed typedefs.
-    typedefsNeededForReflection = Elements.sortedByPosition(
-        compiler.world.allTypedefs
-            .where(backend.isAccessibleByReflection)
-            .toList());
-
-    // Compute needed classes.
-    instantiatedClasses =
-        compiler.codegenWorld.instantiatedClasses.where(computeClassFilter())
-            .toSet();
-
-    void addClassWithSuperclasses(ClassElement cls) {
-      neededClasses.add(cls);
-      for (ClassElement superclass = cls.superclass;
-          superclass != null;
-          superclass = superclass.superclass) {
-        neededClasses.add(superclass);
-      }
-    }
-
-    void addClassesWithSuperclasses(Iterable<ClassElement> classes) {
-      for (ClassElement cls in classes) {
-        addClassWithSuperclasses(cls);
-      }
-    }
-
-    // 1. We need to generate all classes that are instantiated.
-    addClassesWithSuperclasses(instantiatedClasses);
-
-    // 2. Add all classes used as mixins.
-    Set<ClassElement> mixinClasses = neededClasses
-        .where((ClassElement element) => element.isMixinApplication)
-        .map(computeMixinClass)
-        .toSet();
-    neededClasses.addAll(mixinClasses);
-
-    // 3. If we need noSuchMethod support, we run through all needed
-    // classes to figure out if we need the support on any native
-    // class. If so, we let the native emitter deal with it.
-    if (compiler.enabledNoSuchMethod) {
-      String noSuchMethodName = Compiler.NO_SUCH_METHOD;
-      Selector noSuchMethodSelector = compiler.noSuchMethodSelector;
-      for (ClassElement element in neededClasses) {
-        if (!element.isNative) continue;
-        Element member = element.lookupLocalMember(noSuchMethodName);
-        if (member == null) continue;
-        if (noSuchMethodSelector.applies(member, compiler.world)) {
-          nativeEmitter.handleNoSuchMethod = true;
-          break;
-        }
-      }
-    }
-
-    // 4. Find all classes needed for rti.
-    // It is important that this is the penultimate step, at this point,
-    // neededClasses must only contain classes that have been resolved and
-    // codegen'd. The rtiNeededClasses may contain additional classes, but
-    // these are thought to not have been instantiated, so we neeed to be able
-    // to identify them later and make sure we only emit "empty shells" without
-    // fields, etc.
-    typeTestEmitter.computeRtiNeededClasses();
-    typeTestEmitter.rtiNeededClasses.removeAll(neededClasses);
-    // rtiNeededClasses now contains only the "empty shells".
-    neededClasses.addAll(typeTestEmitter.rtiNeededClasses);
-
-    // TODO(18175, floitsch): remove once issue 18175 is fixed.
-    if (neededClasses.contains(backend.jsIntClass)) {
-      neededClasses.add(compiler.intClass);
-    }
-    if (neededClasses.contains(backend.jsDoubleClass)) {
-      neededClasses.add(compiler.doubleClass);
-    }
-    if (neededClasses.contains(backend.jsNumberClass)) {
-      neededClasses.add(compiler.numClass);
-    }
-    if (neededClasses.contains(backend.jsStringClass)) {
-      neededClasses.add(compiler.stringClass);
-    }
-    if (neededClasses.contains(backend.jsBoolClass)) {
-      neededClasses.add(compiler.boolClass);
-    }
-    if (neededClasses.contains(backend.jsArrayClass)) {
-      neededClasses.add(compiler.listClass);
-    }
-
-    // 5. Finally, sort the classes.
-    List<ClassElement> sortedClasses = Elements.sortedByPosition(neededClasses);
-
-    for (ClassElement element in sortedClasses) {
-      if (typeTestEmitter.rtiNeededClasses.contains(element)) {
-        // TODO(sigurdm): We might be able to defer some of these.
-        outputClassLists.putIfAbsent(compiler.deferredLoadTask.mainOutputUnit,
-            () => new List<ClassElement>()).add(element);
-      } else if (Elements.isNativeOrExtendsNative(element)) {
-        // For now, native classes and related classes cannot be deferred.
-        nativeClasses.add(element);
-        if (!element.isNative) {
-          assert(invariant(element,
-                           !compiler.deferredLoadTask.isDeferred(element)));
-          outputClassLists.putIfAbsent(compiler.deferredLoadTask.mainOutputUnit,
-              () => new List<ClassElement>()).add(element);
-        }
-      } else {
-        outputClassLists.putIfAbsent(
-            compiler.deferredLoadTask.outputUnitForElement(element),
-            () => new List<ClassElement>())
-            .add(element);
-      }
-    }
-  }
-
   void emitInitFunction(CodeBuffer buffer) {
     jsAst.FunctionDeclaration decl = js.statement('''
       function init() {
@@ -1433,13 +1535,14 @@
     }
   }
 
-  void emitPrecompiledConstructor(String constructorName,
+  void emitPrecompiledConstructor(OutputUnit outputUnit,
+                                  String constructorName,
                                   jsAst.Expression constructorAst) {
-    precompiledFunction.add(
+    cspPrecompiledFunctionFor(outputUnit).add(
         new jsAst.FunctionDeclaration(
             new jsAst.VariableDeclaration(constructorName), constructorAst));
-    precompiledFunction.add(
-   js.statement(r'''{
+    cspPrecompiledFunctionFor(outputUnit).add(
+    js.statement(r'''{
           #.builtin$cls = #;
           if (!"name" in #)
               #.name = #;
@@ -1454,303 +1557,291 @@
             constructorName
          ]));
 
-    precompiledConstructorNames.add(js('#', constructorName));
+    cspPrecompiledConstructorNamesFor(outputUnit).add(js('#', constructorName));
   }
 
-  void assembleProgram() {
-    measure(() {
-      invalidateCaches();
+  void emitProgram() {
+    // Maps each output unit to a codebuffers with the library descriptors of
+    // the output unit emitted to it.
+    Map<OutputUnit, CodeBuffer> libraryDescriptorBuffers =
+        new Map<OutputUnit, CodeBuffer>();
 
-      // Compute the required type checks to know which classes need a
-      // 'is$' method.
-      typeTestEmitter.computeRequiredTypeChecks();
+    OutputUnit mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
 
-      computeNeededDeclarations();
+    mainBuffer.add(buildGeneratedBy());
+    addComment(HOOKS_API_USAGE, mainBuffer);
 
-      if (USE_NEW_EMITTER) {
-        new new_js_emitter.Emitter(compiler, this).emitProgram();
-        return;
+    /// For deferred loading we communicate the initializers via this global
+    /// variable. The deferred hunks will add their initialization to this.
+    /// The semicolon is important in minified mode, without it the
+    /// following parenthesis looks like a call to the object literal.
+    mainBuffer..add(
+        'if$_(typeof(${deferredInitializers})$_===$_"undefined")$_'
+        '${deferredInitializers} = Object.create(null);$n');
+
+    // Using a named function here produces easier to read stack traces in
+    // Chrome/V8.
+    mainBuffer.add('(function(${namer.currentIsolate})$_{\n');
+    if (compiler.deferredLoadTask.isProgramSplit) {
+      /// We collect all the global state of the, so it can be passed to the
+      /// initializer of deferred files.
+      mainBuffer.add('var ${globalsHolder}$_=${_}Object.create(null)$N');
+    }
+    mainBuffer.add('function dart()$_{$n'
+        '${_}${_}this.x$_=${_}0$N'
+        '${_}${_}delete this.x$N'
+        '}$n');
+    for (String globalObject in Namer.reservedGlobalObjectNames) {
+      // The global objects start as so-called "slow objects". For V8, this
+      // means that it won't try to make map transitions as we add properties
+      // to these objects. Later on, we attempt to turn these objects into
+      // fast objects by calling "convertToFastObject" (see
+      // [emitConvertToFastObjectFunction]).
+      mainBuffer.write('var ${globalObject}$_=${_}');
+      if(compiler.deferredLoadTask.isProgramSplit) {
+        mainBuffer.add('${globalsHolder}.$globalObject$_=${_}');
+      }
+      mainBuffer.write('new dart$N');
+    }
+
+    mainBuffer.add('function ${namer.isolateName}()$_{}\n');
+    if (compiler.deferredLoadTask.isProgramSplit) {
+      mainBuffer
+        .write('${globalsHolder}.${namer.isolateName}$_=$_'
+               '${namer.isolateName}$N'
+               '${globalsHolder}.$initName$_=${_}$initName$N');
+    }
+    mainBuffer.add('init()$N$n');
+    // Shorten the code by using [namer.currentIsolate] as temporary.
+    isolateProperties = namer.currentIsolate;
+    mainBuffer.add(
+        '$isolateProperties$_=$_$isolatePropertiesName$N');
+
+    emitStaticFunctions();
+
+    // Only output the classesCollector if we actually have any classes.
+    if (!(nativeClasses.isEmpty &&
+          compiler.codegenWorld.staticFunctionsNeedingGetter.isEmpty &&
+        outputClassLists.values.every((classList) => classList.isEmpty) &&
+        typedefsNeededForReflection.isEmpty)) {
+      // Shorten the code by using "$$" as temporary.
+      classesCollector = r"$$";
+      mainBuffer.add('var $classesCollector$_=${_}Object.create(null)$N$n');
+    }
+
+    // Emit native classes on [nativeBuffer].
+    // Might create methodClosures.
+    final CodeBuffer nativeBuffer = new CodeBuffer();
+    if (!nativeClasses.isEmpty) {
+      addComment('Native classes', nativeBuffer);
+      addComment('Native classes', mainBuffer);
+      nativeEmitter.generateNativeClasses(nativeClasses, mainBuffer,
+          additionalProperties);
+    }
+
+    // As a side-effect, emitting classes will produce "bound closures" in
+    // [methodClosures].  The bound closures are JS AST nodes that add
+    // properties to $$ [classesCollector].  The bound closures are not
+    // emitted until we have emitted all other classes (native or not).
+
+    // Might create methodClosures.
+    for (List<ClassElement> outputClassList in outputClassLists.values) {
+      for (ClassElement element in outputClassList) {
+        generateClass(element, getElementDescriptor(element));
+      }
+    }
+
+    nativeEmitter.finishGenerateNativeClasses();
+    nativeEmitter.assembleCode(nativeBuffer);
+
+
+    // After this assignment we will produce invalid JavaScript code if we use
+    // the classesCollector variable.
+    classesCollector = 'classesCollector should not be used from now on';
+
+    // TODO(sigurdm): Need to check this for each outputUnit.
+    if (!elementDescriptors.isEmpty) {
+      var oldClassesCollector = classesCollector;
+      classesCollector = r"$$";
+      if (compiler.enableMinification) {
+        mainBuffer.write(';');
       }
 
-      // Maps each output unit to a codebuffers with the library descriptors of
-      // the output unit emitted to it.
-      Map<OutputUnit, CodeBuffer> libraryDescriptorBuffers =
-          new Map<OutputUnit, CodeBuffer>();
-
-      OutputUnit mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
-
-      mainBuffer.add(buildGeneratedBy());
-      addComment(HOOKS_API_USAGE, mainBuffer);
-
-      /// For deferred loading we communicate the initializers via this global
-      /// variable. The deferred hunks will add their initialization to this.
-      /// The semicolon is important in minified mode, without it the
-      /// following parenthesis looks like a call to the object literal.
-      mainBuffer..add(
-          'if$_(typeof(${deferredInitializers})$_===$_"undefined")$_'
-          '${deferredInitializers} = Object.create(null);$n');
-
-      // Using a named function here produces easier to read stack traces in
-      // Chrome/V8.
-      mainBuffer.add('(function(${namer.currentIsolate})$_{\n');
-      if (compiler.deferredLoadTask.isProgramSplit) {
-        /// We collect all the global state of the, so it can be passed to the
-        /// initializer of deferred files.
-        mainBuffer.add('var ${globalsHolder}$_=${_}Object.create(null)$N');
-      }
-      mainBuffer.add('function dart()$_{$n'
-          '${_}${_}this.x$_=${_}0$N'
-          '${_}${_}delete this.x$N'
-          '}$n');
-      for (String globalObject in Namer.reservedGlobalObjectNames) {
-        // The global objects start as so-called "slow objects". For V8, this
-        // means that it won't try to make map transitions as we add properties
-        // to these objects. Later on, we attempt to turn these objects into
-        // fast objects by calling "convertToFastObject" (see
-        // [emitConvertToFastObjectFunction]).
-        mainBuffer.write('var ${globalObject}$_=${_}');
-        if(compiler.deferredLoadTask.isProgramSplit) {
-          mainBuffer.add('${globalsHolder}.$globalObject$_=${_}');
-        }
-        mainBuffer.write('new dart$N');
-      }
-
-      mainBuffer.add('function ${namer.isolateName}()$_{}\n');
-      if (compiler.deferredLoadTask.isProgramSplit) {
-        mainBuffer
-          .write('${globalsHolder}.${namer.isolateName}$_=$_'
-                 '${namer.isolateName}$N'
-                 '${globalsHolder}.$initName$_=${_}$initName$N');
-      }
-      mainBuffer.add('init()$N$n');
-      // Shorten the code by using [namer.currentIsolate] as temporary.
-      isolateProperties = namer.currentIsolate;
-      mainBuffer.add(
-          '$isolateProperties$_=$_$isolatePropertiesName$N');
-
-      emitStaticFunctions();
-
-      // Only output the classesCollector if we actually have any classes.
-      if (!(nativeClasses.isEmpty &&
-            compiler.codegenWorld.staticFunctionsNeedingGetter.isEmpty &&
-          outputClassLists.values.every((classList) => classList.isEmpty) &&
-          typedefsNeededForReflection.isEmpty)) {
-        // Shorten the code by using "$$" as temporary.
-        classesCollector = r"$$";
-        mainBuffer.add('var $classesCollector$_=${_}Object.create(null)$N$n');
-      }
-
-      // Emit native classes on [nativeBuffer].
-      // Might create methodClosures.
-      final CodeBuffer nativeBuffer = new CodeBuffer();
-      if (!nativeClasses.isEmpty) {
-        addComment('Native classes', nativeBuffer);
-        addComment('Native classes', mainBuffer);
-        nativeEmitter.generateNativeClasses(nativeClasses, mainBuffer,
-            additionalProperties);
-      }
-
-      // As a side-effect, emitting classes will produce "bound closures" in
-      // [methodClosures].  The bound closures are JS AST nodes that add
-      // properties to $$ [classesCollector].  The bound closures are not
-      // emitted until we have emitted all other classes (native or not).
-
-      // Might create methodClosures.
-      for (List<ClassElement> outputClassList in outputClassLists.values) {
-        for (ClassElement element in outputClassList) {
-          generateClass(element, getElementDescriptor(element));
+      // TODO(karlklose): document what kinds of fields this loop adds to the
+      // library class builder.
+      for (Element element in elementDescriptors.keys) {
+        // TODO(ahe): Should iterate over all libraries.  Otherwise, we will
+        // not see libraries that only have fields.
+        if (element.isLibrary) {
+          LibraryElement library = element;
+          ClassBuilder builder = new ClassBuilder(library, namer);
+          if (classEmitter.emitFields(
+                  library, builder, null, emitStatics: true)) {
+            jsAst.ObjectInitializer initializer =
+              builder.toObjectInitializer();
+            compiler.dumpInfoTask.registerElementAst(builder.element,
+                                                     initializer);
+            getElementDescriptorForOutputUnit(library, mainOutputUnit)
+                .properties.addAll(initializer.properties);
+          }
         }
       }
 
-      nativeEmitter.finishGenerateNativeClasses();
-      nativeEmitter.assembleCode(nativeBuffer);
+      // Emit all required typedef declarations into the main output unit.
+      // TODO(karlklose): unify required classes and typedefs to declarations
+      // and have builders for each kind.
+      for (TypedefElement typedef in typedefsNeededForReflection) {
+        OutputUnit mainUnit = compiler.deferredLoadTask.mainOutputUnit;
+        LibraryElement library = typedef.library;
+        // TODO(karlklose): add a TypedefBuilder and move this code there.
+        DartType type = typedef.alias;
+        int typeIndex = metadataEmitter.reifyType(type);
+        String typeReference =
+            encoding.encodeTypedefFieldDescriptor(typeIndex);
+        jsAst.Property descriptor = new jsAst.Property(
+            js.string(namer.classDescriptorProperty),
+            js.string(typeReference));
+        jsAst.Node declaration = new jsAst.ObjectInitializer([descriptor]);
+        String mangledName = namer.getNameX(typedef);
+        String reflectionName = getReflectionName(typedef, mangledName);
+        getElementDescriptorForOutputUnit(library, mainUnit)
+            ..addProperty(mangledName, declaration)
+            ..addProperty("+$reflectionName", js.string(''));
+        // Also emit a trivial constructor for CSP mode.
+        String constructorName = mangledName;
+        jsAst.Expression constructorAst = js('function() {}');
+        emitPrecompiledConstructor(mainOutputUnit,
+                                   constructorName,
+                                   constructorAst);
+      }
 
+      if (!mangledFieldNames.isEmpty) {
+        var keys = mangledFieldNames.keys.toList();
+        keys.sort();
+        var properties = [];
+        for (String key in keys) {
+          var value = js.string('${mangledFieldNames[key]}');
+          properties.add(new jsAst.Property(js.string(key), value));
+        }
 
-      // After this assignment we will produce invalid JavaScript code if we use
-      // the classesCollector variable.
-      classesCollector = 'classesCollector should not be used from now on';
-
-      // TODO(sigurdm): Need to check this for each outputUnit.
-      if (!elementDescriptors.isEmpty) {
-        var oldClassesCollector = classesCollector;
-        classesCollector = r"$$";
+        jsAst.Expression mangledNamesAccess =
+            generateEmbeddedGlobalAccess(embeddedNames.MANGLED_NAMES);
+        var map = new jsAst.ObjectInitializer(properties);
+        mainBuffer.write(
+            jsAst.prettyPrint(
+                js.statement('# = #', [mangledNamesAccess, map]),
+                compiler,
+                monitor: compiler.dumpInfoTask));
         if (compiler.enableMinification) {
           mainBuffer.write(';');
         }
-
-        // TODO(karlklose): document what kinds of fields this loop adds to the
-        // library class builder.
-        for (Element element in elementDescriptors.keys) {
-          // TODO(ahe): Should iterate over all libraries.  Otherwise, we will
-          // not see libraries that only have fields.
-          if (element.isLibrary) {
-            LibraryElement library = element;
-            ClassBuilder builder = new ClassBuilder(library, namer);
-            if (classEmitter.emitFields(
-                    library, builder, null, emitStatics: true)) {
-              jsAst.ObjectInitializer initializer =
-                builder.toObjectInitializer();
-              compiler.dumpInfoTask.registerElementAst(builder.element,
-                                                       initializer);
-              getElementDescriptorForOutputUnit(library, mainOutputUnit)
-                  .properties.addAll(initializer.properties);
-            }
-          }
+      }
+      if (!mangledGlobalFieldNames.isEmpty) {
+        var keys = mangledGlobalFieldNames.keys.toList();
+        keys.sort();
+        var properties = [];
+        for (String key in keys) {
+          var value = js.string('${mangledGlobalFieldNames[key]}');
+          properties.add(new jsAst.Property(js.string(key), value));
         }
-
-        // Emit all required typedef declarations into the main output unit.
-        // TODO(karlklose): unify required classes and typedefs to declarations
-        // and have builders for each kind.
-        for (TypedefElement typedef in typedefsNeededForReflection) {
-          OutputUnit mainUnit = compiler.deferredLoadTask.mainOutputUnit;
-          LibraryElement library = typedef.library;
-          // TODO(karlklose): add a TypedefBuilder and move this code there.
-          DartType type = typedef.alias;
-          int typeIndex = metadataEmitter.reifyType(type);
-          String typeReference =
-              encoding.encodeTypedefFieldDescriptor(typeIndex);
-          jsAst.Property descriptor = new jsAst.Property(
-              js.string(namer.classDescriptorProperty),
-              js.string(typeReference));
-          jsAst.Node declaration = new jsAst.ObjectInitializer([descriptor]);
-          String mangledName = namer.getNameX(typedef);
-          String reflectionName = getReflectionName(typedef, mangledName);
-          getElementDescriptorForOutputUnit(library, mainUnit)
-              ..addProperty(mangledName, declaration)
-              ..addProperty("+$reflectionName", js.string(''));
-          // Also emit a trivial constructor for CSP mode.
-          String constructorName = mangledName;
-          jsAst.Expression constructorAst = js('function() {}');
-          emitPrecompiledConstructor(constructorName, constructorAst);
+        jsAst.Expression mangledGlobalNamesAccess =
+            generateEmbeddedGlobalAccess(embeddedNames.MANGLED_GLOBAL_NAMES);
+        var map = new jsAst.ObjectInitializer(properties);
+        mainBuffer.write(
+            jsAst.prettyPrint(
+                js.statement('# = #', [mangledGlobalNamesAccess, map]),
+                compiler,
+                monitor: compiler.dumpInfoTask));
+        if (compiler.enableMinification) {
+          mainBuffer.write(';');
         }
+      }
 
-        if (!mangledFieldNames.isEmpty) {
-          var keys = mangledFieldNames.keys.toList();
-          keys.sort();
-          var properties = [];
-          for (String key in keys) {
-            var value = js.string('${mangledFieldNames[key]}');
-            properties.add(new jsAst.Property(js.string(key), value));
-          }
+      List<Element> sortedElements =
+          Elements.sortedByPosition(elementDescriptors.keys);
 
-          jsAst.Expression mangledNamesAccess =
-              generateEmbeddedGlobalAccess(embeddedNames.MANGLED_NAMES);
-          var map = new jsAst.ObjectInitializer(properties);
-          mainBuffer.write(
+      Iterable<Element> pendingStatics;
+      if (!compiler.hasIncrementalSupport) {
+        pendingStatics = sortedElements.where((element) {
+            return !element.isLibrary &&
+                elementDescriptors[element].values.any((descriptor) =>
+                    descriptor != null);
+        });
+
+        pendingStatics.forEach((element) =>
+            compiler.reportInfo(
+                element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
+      }
+
+      for (LibraryElement library in sortedElements.where((element) =>
+          element.isLibrary)) {
+        writeLibraryDescriptors(library, libraryDescriptorBuffers);
+        elementDescriptors[library] = const {};
+      }
+      if (pendingStatics != null && !pendingStatics.isEmpty) {
+        compiler.internalError(pendingStatics.first,
+            'Pending statics (see above).');
+      }
+      mainBuffer
+          ..write('(')
+          ..write(
               jsAst.prettyPrint(
-                  js.statement('# = #', [mangledNamesAccess, map]),
-                  compiler,
-                  monitor: compiler.dumpInfoTask));
-          if (compiler.enableMinification) {
-            mainBuffer.write(';');
-          }
-        }
-        if (!mangledGlobalFieldNames.isEmpty) {
-          var keys = mangledGlobalFieldNames.keys.toList();
-          keys.sort();
-          var properties = [];
-          for (String key in keys) {
-            var value = js.string('${mangledGlobalFieldNames[key]}');
-            properties.add(new jsAst.Property(js.string(key), value));
-          }
-          jsAst.Expression mangledGlobalNamesAccess =
-              generateEmbeddedGlobalAccess(embeddedNames.MANGLED_GLOBAL_NAMES);
-          var map = new jsAst.ObjectInitializer(properties);
-          mainBuffer.write(
-              jsAst.prettyPrint(
-                  js.statement('# = #', [mangledGlobalNamesAccess, map]),
-                  compiler,
-                  monitor: compiler.dumpInfoTask));
-          if (compiler.enableMinification) {
-            mainBuffer.write(';');
-          }
-        }
+                  getReflectionDataParser(classesCollector, backend),
+                  compiler))
+          ..write(')')
+          ..write('([$n')
+          ..add(libraryDescriptorBuffers[mainOutputUnit])
+          ..write('])$N');
 
-        List<Element> sortedElements =
-            Elements.sortedByPosition(elementDescriptors.keys);
+      emitFinishClassesInvocationIfNecessary(mainBuffer);
+      classesCollector = oldClassesCollector;
+    }
+    typeTestEmitter.emitRuntimeTypeSupport(mainBuffer, mainOutputUnit);
+    interceptorEmitter.emitGetInterceptorMethods(mainBuffer);
+    interceptorEmitter.emitOneShotInterceptors(mainBuffer);
+    // Constants in checked mode call into RTI code to set type information
+    // which may need getInterceptor (and one-shot interceptor) methods, so
+    // we have to make sure that [emitGetInterceptorMethods] and
+    // [emitOneShotInterceptors] have been called.
+    task.computeNeededConstants();
+    emitCompileTimeConstants(mainBuffer, mainOutputUnit);
 
-        Iterable<Element> pendingStatics;
-        if (!compiler.hasIncrementalSupport) {
-          pendingStatics = sortedElements.where((element) {
-              return !element.isLibrary &&
-                  elementDescriptors[element].values.any((descriptor) =>
-                      descriptor != null);
-          });
+    if (compiler.deferredLoadTask.isProgramSplit) {
+      /// Map from OutputUnit to a hash of its content. The hash uniquely
+      /// identifies the code of the output-unit. It does not include
+      /// boilerplate JS code, like the sourcemap directives or the hash
+      /// itself.
+      Map<OutputUnit, String> deferredLoadHashes =
+          emitDeferredCode(libraryDescriptorBuffers);
+      emitDeferredBoilerPlate(mainBuffer, deferredLoadHashes);
+    }
 
-          pendingStatics.forEach((element) =>
-              compiler.reportInfo(
-                  element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
-        }
+    // Static field initializations require the classes and compile-time
+    // constants to be set up.
+    emitStaticNonFinalFieldInitializations(mainBuffer);
+    interceptorEmitter.emitInterceptedNames(mainBuffer);
+    interceptorEmitter.emitMapTypeToInterceptor(mainBuffer);
+    emitLazilyInitializedStaticFields(mainBuffer);
 
-        for (LibraryElement library in sortedElements.where((element) =>
-            element.isLibrary)) {
-          writeLibraryDescriptors(library, libraryDescriptorBuffers);
-          elementDescriptors[library] = const {};
-        }
-        if (pendingStatics != null && !pendingStatics.isEmpty) {
-          compiler.internalError(pendingStatics.first,
-              'Pending statics (see above).');
-        }
-        mainBuffer
-            ..write('(')
-            ..write(
-                jsAst.prettyPrint(
-                    getReflectionDataParser(classesCollector, backend),
-                    compiler))
-            ..write(')')
-            ..write('([$n')
-            ..add(libraryDescriptorBuffers[mainOutputUnit])
-            ..write('])$N');
+    mainBuffer.add(nativeBuffer);
 
-        emitFinishClassesInvocationIfNecessary(mainBuffer);
-        classesCollector = oldClassesCollector;
-      }
-      typeTestEmitter.emitRuntimeTypeSupport(mainBuffer, mainOutputUnit);
-      interceptorEmitter.emitGetInterceptorMethods(mainBuffer);
-      interceptorEmitter.emitOneShotInterceptors(mainBuffer);
-      // Constants in checked mode call into RTI code to set type information
-      // which may need getInterceptor (and one-shot interceptor) methods, so
-      // we have to make sure that [emitGetInterceptorMethods] and
-      // [emitOneShotInterceptors] have been called.
-      computeNeededConstants();
-      emitCompileTimeConstants(mainBuffer, mainOutputUnit);
+    metadataEmitter.emitMetadata(mainBuffer);
 
-      if (compiler.deferredLoadTask.isProgramSplit) {
-        /// Map from OutputUnit to a hash of its content. The hash uniquely
-        /// identifies the code of the output-unit. It does not include
-        /// boilerplate JS code, like the sourcemap directives or the hash
-        /// itself.
-        Map<OutputUnit, String> deferredLoadHashes =
-            emitDeferredCode(libraryDescriptorBuffers);
-        emitDeferredBoilerPlate(mainBuffer, deferredLoadHashes);
-      }
+    isolateProperties = isolatePropertiesName;
+    // The following code should not use the short-hand for the
+    // initialStatics.
+    mainBuffer.add('${namer.currentIsolate}$_=${_}null$N');
 
-      // Static field initializations require the classes and compile-time
-      // constants to be set up.
-      emitStaticNonFinalFieldInitializations(mainBuffer);
-      interceptorEmitter.emitInterceptedNames(mainBuffer);
-      interceptorEmitter.emitMapTypeToInterceptor(mainBuffer);
-      emitLazilyInitializedStaticFields(mainBuffer);
+    emitFinishIsolateConstructorInvocation(mainBuffer);
+    mainBuffer.add(
+        '${namer.currentIsolate}$_=${_}new ${namer.isolateName}()$N');
 
-      mainBuffer.add(nativeBuffer);
-
-      metadataEmitter.emitMetadata(mainBuffer);
-
-      isolateProperties = isolatePropertiesName;
-      // The following code should not use the short-hand for the
-      // initialStatics.
-      mainBuffer.add('${namer.currentIsolate}$_=${_}null$N');
-
-      emitFinishIsolateConstructorInvocation(mainBuffer);
-      mainBuffer.add(
-          '${namer.currentIsolate}$_=${_}new ${namer.isolateName}()$N');
-
-      emitConvertToFastObjectFunction();
-      for (String globalObject in Namer.reservedGlobalObjectNames) {
-        mainBuffer.add('$globalObject = convertToFastObject($globalObject)$N');
-      }
-      if (DEBUG_FAST_OBJECTS) {
-        mainBuffer.add(r'''
+    emitConvertToFastObjectFunction();
+    for (String globalObject in Namer.reservedGlobalObjectNames) {
+      mainBuffer.add('$globalObject = convertToFastObject($globalObject)$N');
+    }
+    if (DEBUG_FAST_OBJECTS) {
+      mainBuffer.add(r'''
           // The following only works on V8 when run with option
           // "--allow-natives-syntax".  We use'new Function' because the
           // miniparser does not understand V8 native syntax.
@@ -1778,50 +1869,51 @@
            }
          }
 ''');
-        for (String object in Namer.userGlobalObjects) {
-        mainBuffer.add('''
-          if (typeof print === "function") {
-             print("Size of $object: "
-                   + String(Object.getOwnPropertyNames($object).length)
-                   + ", fast properties " + HasFastProperties($object));
+      for (String object in Namer.userGlobalObjects) {
+      mainBuffer.add('''
+        if (typeof print === "function") {
+           print("Size of $object: "
+                 + String(Object.getOwnPropertyNames($object).length)
+                 + ", fast properties " + HasFastProperties($object));
 }
 ''');
-        }
       }
+    }
 
-      jsAst.FunctionDeclaration precompiledFunctionAst =
-          buildPrecompiledFunction();
-      emitInitFunction(mainBuffer);
-      emitMain(mainBuffer);
-      mainBuffer.add('})()\n');
+    jsAst.FunctionDeclaration precompiledFunctionAst =
+        buildCspPrecompiledFunctionFor(mainOutputUnit);
+    emitInitFunction(mainBuffer);
+    emitMain(mainBuffer);
+    mainBuffer.add('})()\n');
 
-      if (compiler.useContentSecurityPolicy) {
-        mainBuffer.write(
-            jsAst.prettyPrint(
-                precompiledFunctionAst, compiler,
-                monitor: compiler.dumpInfoTask,
-                allowVariableMinification: false).getText());
-      }
+    if (compiler.useContentSecurityPolicy) {
+      mainBuffer.write(
+          jsAst.prettyPrint(
+              precompiledFunctionAst,
+              compiler,
+              monitor: compiler.dumpInfoTask,
+              allowVariableMinification: false).getText());
+    }
 
-      String assembledCode = mainBuffer.getText();
-      String sourceMapTags = "";
-      if (generateSourceMap) {
-        outputSourceMap(assembledCode, mainBuffer, '',
-            compiler.sourceMapUri, compiler.outputUri);
-        sourceMapTags =
-            generateSourceMapTag(compiler.sourceMapUri, compiler.outputUri);
-      }
-      mainBuffer.add(sourceMapTags);
-      assembledCode = mainBuffer.getText();
-      compiler.outputProvider('', 'js')
-          ..add(assembledCode)
-          ..close();
-      compiler.assembledCode = assembledCode;
+    String assembledCode = mainBuffer.getText();
+    String sourceMapTags = "";
+    if (generateSourceMap) {
+      outputSourceMap(assembledCode, mainBuffer, '',
+          compiler.sourceMapUri, compiler.outputUri);
+      sourceMapTags =
+          generateSourceMapTag(compiler.sourceMapUri, compiler.outputUri);
+    }
+    mainBuffer.add(sourceMapTags);
+    assembledCode = mainBuffer.getText();
+    compiler.outputProvider('', 'js')
+        ..add(assembledCode)
+        ..close();
+    compiler.assembledCode = assembledCode;
 
-      if (!compiler.useContentSecurityPolicy) {
-        CodeBuffer cspBuffer = new CodeBuffer();
-        cspBuffer.add(mainBuffer);
-        cspBuffer.write("""
+    if (!compiler.useContentSecurityPolicy) {
+      CodeBuffer cspBuffer = new CodeBuffer();
+      cspBuffer.add(mainBuffer);
+      cspBuffer.write("""
 {
   var message =
       'Deprecation: Automatic generation of output for Content Security\\n' +
@@ -1836,21 +1928,20 @@
   }
 }\n""");
 
-        cspBuffer.write(
-            jsAst.prettyPrint(
-                precompiledFunctionAst, compiler,
-                allowVariableMinification: false).getText());
+      cspBuffer.write(
+          jsAst.prettyPrint(
+              precompiledFunctionAst, compiler,
+              allowVariableMinification: false).getText());
 
-        compiler.outputProvider('', 'precompiled.js')
-            ..add(cspBuffer.getText())
-            ..close();
-      }
+      compiler.outputProvider('', 'precompiled.js')
+          ..add(cspBuffer.getText())
+          ..close();
+    }
 
-      if (backend.requiresPreamble &&
-          !backend.htmlLibraryIsLoaded) {
-        compiler.reportHint(NO_LOCATION_SPANNABLE, MessageKind.PREAMBLE);
-      }
-    });
+    if (backend.requiresPreamble &&
+        !backend.htmlLibraryIsLoaded) {
+      compiler.reportHint(NO_LOCATION_SPANNABLE, MessageKind.PREAMBLE);
+    }
   }
 
   String generateSourceMapTag(Uri sourceMapUri, Uri fileUri) {
@@ -2020,6 +2111,18 @@
 
       emitCompileTimeConstants(outputBuffer, outputUnit);
       outputBuffer.write('}$N');
+
+      if (compiler.useContentSecurityPolicy) {
+        jsAst.FunctionDeclaration precompiledFunctionAst =
+            buildCspPrecompiledFunctionFor(outputUnit);
+
+        outputBuffer.write(
+            jsAst.prettyPrint(
+                precompiledFunctionAst, compiler,
+                monitor: compiler.dumpInfoTask,
+                allowVariableMinification: false).getText());
+      }
+
       String code = outputBuffer.getText();
 
       // Make a unique hash of the code (before the sourcemaps are added)
@@ -2031,7 +2134,7 @@
       compiler.outputProvider(outputUnit.partFileName(compiler), 'part.js')
         ..add(code)
         ..add('${deferredInitializers}["$hash"]$_=$_'
-                '${deferredInitializers}.current')
+                '${deferredInitializers}.current$N')
         ..close();
 
       hunkHashes[outputUnit] = hash;
@@ -2061,10 +2164,6 @@
         ..close();
   }
 
-  void registerReadTypeVariable(TypeVariableElement element) {
-    readTypeVariables.add(element);
-  }
-
   void invalidateCaches() {
     if (!compiler.hasIncrementalSupport) return;
     if (cachedElements.isEmpty) return;
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index c256b0d..725de96 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -72,7 +72,7 @@
       count++;
       parametersBuffer[0] = new jsAst.Parameter(receiverArgumentName);
       argumentsBuffer[0] = js('#', receiverArgumentName);
-      task.interceptorEmitter.interceptorInvocationNames.add(invocationName);
+      emitter.interceptorEmitter.interceptorInvocationNames.add(invocationName);
     }
 
     int optionalParameterStart = positionalArgumentCount + extraArgumentCount;
@@ -98,14 +98,15 @@
         } else {
           Constant value = handler.getConstantForVariable(element);
           if (value == null) {
-            argumentsBuffer[count] = task.constantReference(new NullConstant());
+            argumentsBuffer[count] =
+                emitter.constantReference(new NullConstant());
           } else {
             if (!value.isNull) {
               // If the value is the null constant, we should not pass it
               // down to the native method.
               indexOfLastOptionalArgumentInParameters = count;
             }
-            argumentsBuffer[count] = task.constantReference(value);
+            argumentsBuffer[count] = emitter.constantReference(value);
           }
         }
       }
@@ -114,7 +115,7 @@
 
     var body;  // List or jsAst.Statement.
     if (member.hasFixedBackendName) {
-      body = task.nativeEmitter.generateParameterStubStatements(
+      body = emitter.nativeEmitter.generateParameterStubStatements(
           member, isInterceptedMethod, invocationName,
           parametersBuffer, argumentsBuffer,
           indexOfLastOptionalArgumentInParameters);
@@ -348,7 +349,7 @@
     jsAst.Expression code = backend.generatedCode[member];
     if (code == null) return;
     String name = namer.getNameOfMember(member);
-    task.interceptorEmitter.recordMangledNameOfMemberMethod(member, name);
+    emitter.interceptorEmitter.recordMangledNameOfMemberMethod(member, name);
     FunctionSignature parameters = member.functionSignature;
     bool needsStubs = !parameters.optionalParameters.isEmpty;
     bool canTearOff = false;
@@ -492,7 +493,7 @@
             backend.rti.getSignatureEncoding(memberType, thisAccess);
       } else {
         memberTypeExpression =
-            js.number(task.metadataEmitter.reifyType(memberType));
+            js.number(emitter.metadataEmitter.reifyType(memberType));
       }
     } else {
       memberTypeExpression = js('null');
@@ -505,20 +506,20 @@
         ..add(js.number(requiredParameterCount))
         ..add(js.number(optionalParameterCount))
         ..add(memberTypeExpression)
-        ..addAll(
-            task.metadataEmitter.reifyDefaultArguments(member).map(js.number));
+        ..addAll(emitter.metadataEmitter
+            .reifyDefaultArguments(member).map(js.number));
 
     if (canBeReflected || canBeApplied) {
       parameters.forEachParameter((Element parameter) {
         expressions.add(
-            js.number(task.metadataEmitter.reifyName(parameter.name)));
+            js.number(emitter.metadataEmitter.reifyName(parameter.name)));
         if (backend.mustRetainMetadata) {
           Iterable<int> metadataIndices =
               parameter.metadata.map((MetadataAnnotation annotation) {
             Constant constant =
                 backend.constants.getConstantForMetadata(annotation);
             backend.constants.addCompileTimeConstantForEmission(constant);
-            return task.metadataEmitter.reifyMetadata(annotation);
+            return emitter.metadataEmitter.reifyMetadata(annotation);
           });
           expressions.add(
               new jsAst.ArrayInitializer.from(metadataIndices.map(js.number)));
@@ -528,7 +529,7 @@
     if (canBeReflected) {
       jsAst.LiteralString reflectionName;
       if (member.isConstructor) {
-        String reflectionNameString = task.getReflectionName(member, name);
+        String reflectionNameString = emitter.getReflectionName(member, name);
         reflectionName =
             new jsAst.LiteralString(
                 '"new ${Elements.reconstructConstructorName(member)}"');
@@ -538,7 +539,8 @@
       }
       expressions
           ..add(reflectionName)
-          ..addAll(task.metadataEmitter.computeMetadata(member).map(js.number));
+          ..addAll(emitter.metadataEmitter
+              .computeMetadata(member).map(js.number));
     } else if (isClosure && canBeApplied) {
       expressions.add(js.string(namer.privateName(member.library,
                                                   member.name)));
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
index f51a7b9be..603e93b 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
@@ -186,7 +186,7 @@
    * Emit all versions of the [:getInterceptor:] method.
    */
   void emitGetInterceptorMethods(CodeBuffer buffer) {
-    task.addComment('getInterceptor methods', buffer);
+    emitter.addComment('getInterceptor methods', buffer);
     Map<String, Set<ClassElement>> specializedGetInterceptors =
         backend.specializedGetInterceptors;
     for (String name in specializedGetInterceptors.keys.toList()..sort()) {
@@ -386,7 +386,7 @@
         new jsAst.ArrayInitializer(invocationNames.length, elements);
 
     jsAst.Expression assignment =
-        js('${task.isolateProperties}.# = #', [name, array]);
+        js('${emitter.isolateProperties}.# = #', [name, array]);
 
     buffer.write(jsAst.prettyPrint(assignment, compiler));
     buffer.write(N);
@@ -405,7 +405,7 @@
     List<jsAst.Expression> elements = <jsAst.Expression>[];
     JavaScriptConstantCompiler handler = backend.constants;
     List<Constant> constants =
-        handler.getConstantsForEmission(task.compareConstants);
+        handler.getConstantsForEmission(emitter.compareConstants);
     for (Constant constant in constants) {
       if (constant is TypeConstant) {
         TypeConstant typeConstant = constant;
@@ -414,7 +414,7 @@
           ClassElement classElement = element;
           if (!analysis.needsClass(classElement)) continue;
 
-          elements.add(backend.emitter.constantReference(constant));
+          elements.add(emitter.constantReference(constant));
           elements.add(namer.elementAccess(classElement));
 
           // Create JavaScript Object map for by-name lookup of generative
@@ -450,7 +450,7 @@
     String name =
         backend.namer.getNameOfGlobalField(backend.mapTypeToInterceptor);
     jsAst.Expression assignment =
-        js('${task.isolateProperties}.# = #', [name, array]);
+        js('${emitter.isolateProperties}.# = #', [name, array]);
 
     buffer.write(jsAst.prettyPrint(assignment, compiler));
     buffer.write(N);
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
index 1c8cfa4..a3be71b 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
@@ -32,7 +32,7 @@
           if (value == null) {
             compiler.internalError(annotation, 'Annotation value is null.');
           } else {
-            metadata.add(task.constantReference(value));
+            metadata.add(emitter.constantReference(value));
           }
         }
       }
@@ -50,7 +50,7 @@
       Constant value = backend.constants.getConstantForVariable(element);
       String stringRepresentation = (value == null)
           ? "null"
-          : jsAst.prettyPrint(task.constantReference(value), compiler)
+          : jsAst.prettyPrint(emitter.constantReference(value), compiler)
               .getText();
       defaultValues.add(addGlobalMetadata(stringRepresentation));
     }
@@ -64,7 +64,7 @@
       return -1;
     }
     return addGlobalMetadata(
-        jsAst.prettyPrint(task.constantReference(value), compiler).getText());
+        jsAst.prettyPrint(emitter.constantReference(value), compiler).getText());
   }
 
   int reifyType(DartType type) {
@@ -73,7 +73,7 @@
             type,
             (variable) {
               return js.number(
-                  task.typeVariableHandler.reifyTypeVariable(variable.element));
+                  emitter.typeVariableHandler.reifyTypeVariable(variable.element));
             },
             (TypedefType typedef) {
               return backend.isAccessibleByReflection(typedef.element);
@@ -95,8 +95,7 @@
   }
 
   void emitMetadata(CodeBuffer buffer) {
-    JavaScriptBackend backend = compiler.backend;
-    String metadataAccess = backend.emitter.generateEmbeddedGlobalAccessString(
+    String metadataAccess = emitter.generateEmbeddedGlobalAccessString(
           embeddedNames.METADATA);
     buffer.write('$metadataAccess$_=$_[');
     for (String metadata in globalMetadata) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/nsm_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/nsm_emitter.dart
index eaa84c7..06647e8 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/nsm_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/nsm_emitter.dart
@@ -43,9 +43,9 @@
         if (!mask.needsNoSuchMethodHandling(selector, compiler.world)) continue;
         String jsName = namer.invocationMirrorInternalName(selector);
         addedJsNames[jsName] = selector;
-        String reflectionName = task.getReflectionName(selector, jsName);
+        String reflectionName = emitter.getReflectionName(selector, jsName);
         if (reflectionName != null) {
-          task.mangledFieldNames[jsName] = reflectionName;
+          emitter.mangledFieldNames[jsName] = reflectionName;
         }
       }
     }
@@ -72,7 +72,7 @@
 
       String methodName = selector.invocationMirrorMemberName;
       String internalName = namer.invocationMirrorInternalName(selector);
-      String reflectionName = task.getReflectionName(selector, internalName);
+      String reflectionName = emitter.getReflectionName(selector, internalName);
       if (!haveVeryFewNoSuchMemberHandlers &&
           isTrivialNsmHandler(type, argNames, selector, internalName) &&
           reflectionName == null) {
@@ -104,7 +104,7 @@
       jsAst.Expression method = generateMethod(jsName, selector);
       if (method != null) {
         addProperty(jsName, method);
-        String reflectionName = task.getReflectionName(selector, jsName);
+        String reflectionName = emitter.getReflectionName(selector, jsName);
         if (reflectionName != null) {
           bool accessible = compiler.world.allFunctions.filter(selector).any(
               (Element e) => backend.isAccessibleByReflection(e));
@@ -337,7 +337,7 @@
     }
 
     // TODO(9631): This is no longer valid for native methods.
-    String whatToPatch = task.nativeEmitter.handleNoSuchMethod ?
+    String whatToPatch = emitter.nativeEmitter.handleNoSuchMethod ?
                          "Object.prototype" :
                          "objectClassObject";
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
index f900462..5fc4d0c 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
@@ -71,7 +71,7 @@
       jsAst.Expression encoding = rti.getSignatureEncoding(type, thisAccess);
       String operatorSignature = namer.operatorSignature();
       if (!type.containsTypeVariables) {
-        builder.functionType = '${task.metadataEmitter.reifyType(type)}';
+        builder.functionType = '${emitter.metadataEmitter.reifyType(type)}';
       } else {
         builder.addProperty(operatorSignature, encoding);
       }
@@ -81,7 +81,7 @@
       if (cls.typeVariables.isEmpty) return;
       RuntimeTypes rti = backend.rti;
       jsAst.Expression expression;
-      bool needsNativeCheck = task.nativeEmitter.requiresNativeIsCheck(cls);
+      bool needsNativeCheck = emitter.nativeEmitter.requiresNativeIsCheck(cls);
       expression = rti.getSupertypeSubstitution(
           classElement, cls, alwaysGenerateFunction: true);
       if (expression == null && (emitNull || needsNativeCheck)) {
@@ -273,7 +273,7 @@
   }
 
   void emitRuntimeTypeSupport(CodeBuffer buffer, OutputUnit outputUnit) {
-    task.addComment('Runtime type support', buffer);
+    emitter.addComment('Runtime type support', buffer);
     RuntimeTypes rti = backend.rti;
     TypeChecks typeChecks = rti.requiredChecks;
 
diff --git a/sdk/lib/_internal/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
index be7978a..c6c7e11 100644
--- a/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -143,6 +143,9 @@
   ///
   /// This method is used for incremental compilation.
   void reset({bool reuseLibrary(LibraryElement library)});
+
+  /// Asynchronous version of [reset].
+  Future resetAsync(Future<bool> reuseLibrary(LibraryElement library));
 }
 
 /// Handle for creating synthesized/patch libraries during library loading.
@@ -266,17 +269,54 @@
   void reset({bool reuseLibrary(LibraryElement library)}) {
     measure(() {
       assert(currentHandler == null);
-      Iterable<LibraryElement> libraries =
-          new List.from(libraryCanonicalUriMap.values);
 
+      Iterable<LibraryElement> reusedLibraries = null;
+      if (reuseLibrary != null) {
+        reusedLibraries = compiler.reuseLibraryTask.measure(() {
+          // Call [toList] to force eager calls to [reuseLibrary].
+          return libraryCanonicalUriMap.values.where(reuseLibrary).toList();
+        });
+      }
+
+      resetImplementation(reusedLibraries);
+    });
+  }
+
+  void resetImplementation(Iterable<LibraryElement> reusedLibraries) {
+    measure(() {
       libraryCanonicalUriMap.clear();
       libraryResourceUriMap.clear();
       libraryNames.clear();
 
-      if (reuseLibrary == null) return;
+      if (reusedLibraries != null) {
+        reusedLibraries.forEach(mapLibrary);
+      }
+    });
+  }
 
-      compiler.reuseLibraryTask.measure(
-          () => libraries.where(reuseLibrary).toList()).forEach(mapLibrary);
+  Future resetAsync(Future<bool> reuseLibrary(LibraryElement library)) {
+    return measure(() {
+      assert(currentHandler == null);
+
+      Future<LibraryElement> wrapper(LibraryElement library) {
+        try {
+          return reuseLibrary(library).then(
+              (bool reuse) => reuse ? library : null);
+        } catch (exception, trace) {
+          compiler.diagnoseCrashInUserCode(
+              'Uncaught exception in reuseLibrary', exception, trace);
+          rethrow;
+        }
+      }
+
+      List<Future<LibraryElement>> reusedLibrariesFuture =
+          compiler.reuseLibraryTask.measure(
+              () => libraryCanonicalUriMap.values.map(wrapper).toList());
+
+      return Future.wait(reusedLibrariesFuture).then(
+          (List<LibraryElement> reusedLibraries) {
+            resetImplementation(reusedLibraries.where((e) => e != null));
+          });
     });
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index 74d3ccf..f6a89b7 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -373,7 +373,9 @@
   }
 
   processClass(ClassElementX classElement, cause) {
-    assert(!registeredClasses.contains(classElement));
+    // TODO(ahe): Fix this assertion to work in incremental compilation.
+    assert(compiler.hasIncrementalSupport ||
+           !registeredClasses.contains(classElement));
 
     bool firstTime = registeredClasses.isEmpty;
     pendingClasses.remove(classElement);
diff --git a/sdk/lib/_internal/compiler/implementation/new_js_emitter/emitter.dart b/sdk/lib/_internal/compiler/implementation/new_js_emitter/emitter.dart
index 68ff581..479ff35 100644
--- a/sdk/lib/_internal/compiler/implementation/new_js_emitter/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/new_js_emitter/emitter.dart
@@ -9,24 +9,30 @@
 import '../js/js.dart' as js;
 
 import '../js_backend/js_backend.dart' show Namer, JavaScriptBackend;
-import '../js_emitter/js_emitter.dart' show CodeEmitterTask;
+import '../js_emitter/js_emitter.dart' as emitterTask show
+    CodeEmitterTask,
+    Emitter;
+
 import '../universe/universe.dart' show Universe;
 import '../deferred_load.dart' show DeferredLoadTask, OutputUnit;
 
 part 'registry.dart';
 
-class Emitter {
+class Emitter implements emitterTask.Emitter {
   final Compiler _compiler;
-  final CodeEmitterTask _oldEmitter;
+  final Namer namer;
+  final emitterTask.CodeEmitterTask _oldEmitter;
 
   final Registry _registry;
 
-  Emitter(Compiler compiler, this._oldEmitter)
+  Emitter(Compiler compiler,
+          this.namer,
+          bool generateSourceMap,
+          this._oldEmitter)
       : this._compiler = compiler,
-        this._registry = new Registry(compiler.deferredLoadTask);
+        this._registry = new Registry(compiler);
 
   JavaScriptBackend get backend => _compiler.backend;
-  Namer get namer => _oldEmitter.namer;
   Universe get universe => _compiler.codegenWorld;
 
   /// Mapping from [ClassElement] to constructed [Class]. We need this to
@@ -52,7 +58,6 @@
 
     MainOutput mainOutput = _buildMainOutput(_registry.mainFragment);
     Iterable<Output> deferredOutputs = _registry.deferredFragments
-        .skip(1) // Skip the main library elements.
         .map((fragment) => _buildDeferredOutput(mainOutput, fragment));
 
     List<Output> outputs = new List<Output>(_registry.fragmentCount);
@@ -148,7 +153,51 @@
     String name = namer.getStaticClosureName(element);
     String holder = namer.globalObjectFor(element);
     // TODO(kasperl): This clearly doesn't work yet.
-    js.Expression code = js.js.string("<<unimplemented>>");
+    js.Expression code = js.string("<<unimplemented>>");
     return new StaticMethod(name, _registry.registerHolder(holder), code);
   }
+
+  // TODO(floitsch): copied from OldEmitter. Adjust or share.
+  bool isConstantInlinedOrAlreadyEmitted(Constant constant) {
+    if (constant.isFunction) return true;    // Already emitted.
+    if (constant.isPrimitive) return true;   // Inlined.
+    if (constant.isDummy) return true;       // Inlined.
+    // The name is null when the constant is already a JS constant.
+    // TODO(floitsch): every constant should be registered, so that we can
+    // share the ones that take up too much space (like some strings).
+    if (namer.constantName(constant) == null) return true;
+    return false;
+  }
+
+  // TODO(floitsch): copied from OldEmitter. Adjust or share.
+  int compareConstants(Constant a, Constant b) {
+    // Inlined constants don't affect the order and sometimes don't even have
+    // names.
+    int cmp1 = isConstantInlinedOrAlreadyEmitted(a) ? 0 : 1;
+    int cmp2 = isConstantInlinedOrAlreadyEmitted(b) ? 0 : 1;
+    if (cmp1 + cmp2 < 2) return cmp1 - cmp2;
+
+    // Emit constant interceptors first. Constant interceptors for primitives
+    // might be used by code that builds other constants.  See Issue 18173.
+    if (a.isInterceptor != b.isInterceptor) {
+      return a.isInterceptor ? -1 : 1;
+    }
+
+    // Sorting by the long name clusters constants with the same constructor
+    // which compresses a tiny bit better.
+    int r = namer.constantLongName(a).compareTo(namer.constantLongName(b));
+    if (r != 0) return r;
+    // Resolve collisions in the long name by using the constant name (i.e. JS
+    // name) which is unique.
+    return namer.constantName(a).compareTo(namer.constantName(b));
+  }
+
+  js.Expression generateEmbeddedGlobalAccess(String global) {
+    return js.string("<<unimplemented>>");
+  }
+  js.Expression constantReference(Constant value) {
+    return js.string("<<unimplemented>>");
+  }
+
+  void invalidateCaches() {}
 }
diff --git a/sdk/lib/_internal/compiler/implementation/new_js_emitter/registry.dart b/sdk/lib/_internal/compiler/implementation/new_js_emitter/registry.dart
index cc8b230..500c5fd 100644
--- a/sdk/lib/_internal/compiler/implementation/new_js_emitter/registry.dart
+++ b/sdk/lib/_internal/compiler/implementation/new_js_emitter/registry.dart
@@ -32,20 +32,21 @@
 }
 
 class Registry {
-  final DeferredLoadTask _deferredLoadTask;
+  final Compiler _compiler;
   final Map<String, Holder> _holdersMap = <String, Holder>{};
-  final Map<OutputUnit, Fragment> _fragmentsMap = <OutputUnit, Fragment>{};
+  final Map<OutputUnit, Fragment> _deferredFragmentsMap =
+      <OutputUnit, Fragment>{};
 
+  DeferredLoadTask get _deferredLoadTask => _compiler.deferredLoadTask;
   Iterable<Holder> get holders => _holdersMap.values;
-  Iterable<Fragment> get deferredFragments => _fragmentsMap.values.skip(1);
-  int get fragmentCount => _fragmentsMap.length;
+  Iterable<Fragment> get deferredFragments => _deferredFragmentsMap.values;
+  // Add one for the main fragment.
+  int get fragmentCount => _deferredFragmentsMap.length + 1;
 
   /// A fastpath for `_libraryElements[_mainOutputUnit]`.
   final Fragment mainFragment = new Fragment();
 
-  Registry(this._deferredLoadTask) {
-    _fragmentsMap[_mainOutputUnit] = mainFragment;
-  }
+  Registry(this._compiler);
 
   bool get _isProgramSplit => _deferredLoadTask.isProgramSplit;
   OutputUnit get _mainOutputUnit => _deferredLoadTask.mainOutputUnit;
@@ -55,7 +56,7 @@
     OutputUnit targetUnit = _deferredLoadTask.outputUnitForElement(element);
     return (targetUnit == _mainOutputUnit)
         ? mainFragment
-        : _fragmentsMap.putIfAbsent(targetUnit, () => new Fragment());
+        : _deferredFragmentsMap.putIfAbsent(targetUnit, () => new Fragment());
   }
 
   /// Adds the element to the list of elements of the library in the right
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 6fa7cc2..865fbdc 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -2170,13 +2170,15 @@
   }
 }
 
-abstract class PartialElement {
+abstract class PartialElement implements DeclarationSite {
   Token beginToken;
   Token endToken;
 
   bool hasParseError = false;
 
   bool get isErroneous => hasParseError;
+
+  DeclarationSite get declarationSite => this;
 }
 
 abstract class PartialFunctionMixin implements FunctionElement {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart b/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
index 88d7eba..366c709 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart
@@ -8,17 +8,20 @@
 
 import '../dart_types.dart' show DynamicType;
 import '../elements/elements.dart';
-import '../elements/modelx.dart'
-    show ElementX,
-         ConstructorElementX,
-         FunctionElementX,
-         TypedefElementX,
-         VariableElementX,
-         FieldElementX,
-         VariableList,
-         ClassElementX,
-         MetadataAnnotationX,
-         MixinApplicationElementX;
+
+import '../elements/modelx.dart' show
+    ClassElementX,
+    ConstructorElementX,
+    DeclarationSite,
+    ElementX,
+    FieldElementX,
+    FunctionElementX,
+    MetadataAnnotationX,
+    MixinApplicationElementX,
+    TypedefElementX,
+    VariableElementX,
+    VariableList;
+
 import '../elements/visitor.dart'
     show ElementVisitor;
 import '../dart2jslib.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index b2c7094..7e52e83 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -2295,6 +2295,15 @@
     }
   }
 
+  HInstruction potentiallyBuildTypeHint(HInstruction original, DartType type) {
+    if (!compiler.trustTypeAnnotations || type == null) return original;
+    type = localsHandler.substInContext(type);
+    if (!type.isInterfaceType) return original;
+    TypeMask mask = new TypeMask.subtype(type.element, compiler.world);
+    var result = new HTypeKnown.pinned(mask, original);
+    return result;
+  }
+
   HInstruction potentiallyCheckType(HInstruction original, DartType type,
       { int kind: HTypeConversion.CHECKED_MODE_CHECK }) {
     if (!compiler.enableTypeAssertions) return original;
@@ -3200,7 +3209,14 @@
         pop();
         stack.add(checked);
       }
-      localsHandler.updateLocal(local, checked);
+      HInstruction trusted =
+          potentiallyBuildTypeHint(checked, local.type);
+      if (!identical(trusted, checked)) {
+        pop();
+        push(trusted);
+      }
+
+      localsHandler.updateLocal(local, trusted);
     }
   }
 
@@ -6163,7 +6179,11 @@
     if (!registerNode()) return;
     // For now, we don't want to handle throw after a return even if
     // it is in an "if".
-    if (seenReturn) tooDifficult = true;
+    if (seenReturn) {
+      tooDifficult = true;
+    } else {
+      node.visitChildren(this);
+    }
   }
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index 4d31f05..be2a5f1 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -46,6 +46,8 @@
 
 import 'cps_ir/cps_ir_builder.dart' as ir_builder;
 
+import 'js_emitter/js_emitter.dart' as js_emitter;
+
 class ElementVisitor extends elements_visitor.ElementVisitor {
   visitElement(e) {}
 }
@@ -72,6 +74,7 @@
   useIr(null, null, null);
   useCompiler(null);
   useTypes();
+  useCodeEmitterTask(null);
 }
 
 useApi() {
@@ -249,10 +252,16 @@
 }
 
 useCompiler(dart2jslib.Compiler compiler) {
-  compiler.libraryLoader.reset();
-  compiler.libraryLoader.lookupLibrary(null);
+  compiler.libraryLoader
+      ..reset()
+      ..resetAsync(null)
+      ..lookupLibrary(null);
 }
 
 useTypes() {
   new dart_types.ResolvedTypedefType(null, null, null).unalias(null);
 }
+
+useCodeEmitterTask(js_emitter.CodeEmitterTask codeEmitterTask) {
+  codeEmitterTask.oldEmitter.clearCspPrecompiledNodes();
+}
diff --git a/sdk/lib/_internal/compiler/js_lib/isolate_helper.dart b/sdk/lib/_internal/compiler/js_lib/isolate_helper.dart
index dabbb2e..90620fa 100644
--- a/sdk/lib/_internal/compiler/js_lib/isolate_helper.dart
+++ b/sdk/lib/_internal/compiler/js_lib/isolate_helper.dart
@@ -1368,6 +1368,15 @@
   visitWorkerSendPort(_WorkerSendPort port) {
     return ['sendport', port._workerId, port._isolateId, port._receivePortId];
   }
+
+  visitFunction(Function topLevelFunction) {
+    final name = IsolateNatives._getJSFunctionName(topLevelFunction);
+    if (name == null) {
+      throw new UnsupportedError(
+          "only top-level functions can be sent.");
+    }
+    return ['function', name];
+  }
 }
 
 
@@ -1396,6 +1405,16 @@
     return new _WorkerSendPort(
         port._workerId, port._isolateId, port._receivePortId);
   }
+
+  Function visitFunction(Function topLevelFunction) {
+    final name = IsolateNatives._getJSFunctionName(topLevelFunction);
+    if (name == null) {
+      throw new UnsupportedError(
+          "only top-level functions can be sent.");
+    }
+    // Is this getting it from the correct isolate? Is it just topLevelFunction?
+    return IsolateNatives._getJSFunctionFromName(name);
+  }
 }
 
 class _JsDeserializer extends _Deserializer {
@@ -1420,6 +1439,10 @@
   Capability deserializeCapability(List list) {
     return new CapabilityImpl._internal(list[1]);
   }
+
+  Function deserializeFunction(List list) {
+    return IsolateNatives._getJSFunctionFromName(list[1]);
+  }
 }
 
 class _JsVisitedMap implements _MessageTraverserVisitedMap {
@@ -1519,6 +1542,7 @@
     if (x is Map) return visitMap(x);
     if (x is SendPort) return visitSendPort(x);
     if (x is Capability) return visitCapability(x);
+    if (x is Function) return visitFunction(x);
 
     // Overridable fallback.
     return visitObject(x);
@@ -1529,6 +1553,7 @@
   visitMap(Map x);
   visitSendPort(SendPort x);
   visitCapability(Capability x);
+  visitFunction(Function f);
 
   visitObject(Object x) {
     // TODO(floitsch): make this a real exception. (which one)?
@@ -1574,6 +1599,8 @@
     return copy;
   }
 
+  visitFunction(Function f) => throw new UnimplementedError();
+
   visitSendPort(SendPort x) => throw new UnimplementedError();
 
   visitCapability(Capability x) => throw new UnimplementedError();
@@ -1622,6 +1649,8 @@
   visitSendPort(SendPort x) => throw new UnimplementedError();
 
   visitCapability(Capability x) => throw new UnimplementedError();
+
+  visitFunction(Function f) => throw new UnimplementedError();
 }
 
 /** Deserializes arrays created with [_Serializer]. */
@@ -1650,6 +1679,7 @@
       case 'map': return _deserializeMap(x);
       case 'sendport': return deserializeSendPort(x);
       case 'capability': return deserializeCapability(x);
+      case 'function' : return deserializeFunction(x);
       default: return deserializeObject(x);
     }
   }
@@ -1689,6 +1719,8 @@
     return result;
   }
 
+  deserializeFunction(List x);
+
   deserializeSendPort(List x);
 
   deserializeCapability(List x);
diff --git a/sdk/lib/_internal/compiler/js_lib/js_mirrors.dart b/sdk/lib/_internal/compiler/js_lib/js_mirrors.dart
index 03fc44a..af3226e 100644
--- a/sdk/lib/_internal/compiler/js_lib/js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/js_lib/js_mirrors.dart
@@ -591,8 +591,13 @@
   disableTreeShaking();
   int typeArgIndex = mangledName.indexOf("<");
   if (typeArgIndex != -1) {
-    mirror = new JsTypeBoundClassMirror(reflectClassByMangledName(
-        mangledName.substring(0, typeArgIndex)).originalDeclaration,
+    TypeMirror originalDeclaration =
+        reflectClassByMangledName(mangledName.substring(0, typeArgIndex))
+        .originalDeclaration;
+    if (originalDeclaration is JsTypedefMirror) {
+      throw new UnimplementedError();
+    }
+    mirror = new JsTypeBoundClassMirror(originalDeclaration,
         // Remove the angle brackets enclosing the type arguments.
         mangledName.substring(typeArgIndex + 1, mangledName.length - 1));
     JsCache.update(classMirrors, mangledName, mirror);
@@ -2518,21 +2523,19 @@
 
   bool get hasReflectedType => throw new UnimplementedError();
 
-  Type get reflectedType => throw new UnimplementedError();
+  Type get reflectedType => createRuntimeType(_mangledName);
 
-  // TODO(ahe): Implement this method.
+  // TODO(floitsch): Implement this method.
   List<TypeVariableMirror> get typeVariables => throw new UnimplementedError();
 
-  // TODO(ahe): Implement this method.
+  // TODO(floitsch): Implement this method.
   List<TypeMirror> get typeArguments => throw new UnimplementedError();
 
-  // TODO(ahe): Implement this method.
-  bool get isOriginalDeclaration => throw new UnimplementedError();
+  bool get isOriginalDeclaration => true;
 
-  // TODO(ahe): Implement this method.
-  TypeMirror get originalDeclaration => throw new UnimplementedError();
+  TypeMirror get originalDeclaration => this;
 
-  // TODO(ahe): Implement this method.
+  // TODO(floitsch): Implement this method.
   DeclarationMirror get owner => throw new UnimplementedError();
 
   // TODO(ahe): Implement this method.
diff --git a/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
index a3d6a71..50bb97b 100644
--- a/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
+++ b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
@@ -12,6 +12,11 @@
 
 import 'serialize.dart';
 
+/// The mirror system.
+///
+/// Cached to avoid re-instantiating each time a transformer is initialized.
+final _mirrors = currentMirrorSystem();
+
 /// Sets up the initial communication with the host isolate.
 void loadTransformers(SendPort replyTo) {
   var port = new ReceivePort();
@@ -20,10 +25,9 @@
     // TODO(nweiz): When issue 19228 is fixed, spin up a separate isolate for
     // libraries loaded beyond the first so they can run in parallel.
     respond(wrappedMessage, (message) {
-      var library = Uri.parse(message['library']);
       var configuration = JSON.decode(message['configuration']);
       var mode = new BarbackMode(message['mode']);
-      return _initialize(library, configuration, mode).
+      return _initialize(message['library'], configuration, mode).
           map(serializeTransformerLike).toList();
     });
   });
@@ -33,8 +37,7 @@
 ///
 /// Loads the library, finds any [Transformer] or [TransformerGroup] subclasses
 /// in it, instantiates them with [configuration] and [mode], and returns them.
-List _initialize(Uri uri, Map configuration, BarbackMode mode) {
-  var mirrors = currentMirrorSystem();
+List _initialize(String uri, Map configuration, BarbackMode mode) {
   var transformerClass = reflectClass(Transformer);
   var aggregateClass = _aggregateTransformerClass;
   var groupClass = reflectClass(TransformerGroup);
@@ -79,7 +82,13 @@
     }).where((classMirror) => classMirror != null));
   }
 
-  loadFromLibrary(mirrors.libraries[uri]);
+  var library = _mirrors.libraries[Uri.parse(uri)];
+
+  // This should only happen if something's wrong with the logic in pub itself.
+  // If it were user error, the entire isolate would fail to load.
+  if (library == null) throw "Couldn't find library at $uri.";
+
+  loadFromLibrary(library);
   return transformers;
 }
 
diff --git a/sdk/lib/_internal/pub/bin/async_compile.dart b/sdk/lib/_internal/pub/bin/async_compile.dart
index 3230302..1cc386f 100644
--- a/sdk/lib/_internal/pub/bin/async_compile.dart
+++ b/sdk/lib/_internal/pub/bin/async_compile.dart
@@ -71,14 +71,7 @@
   // See what version (i.e. Git commit) of the async-await compiler we
   // currently have. If this is different from the version that was used to
   // compile the sources, recompile everything.
-  var result = Process.runSync("git", ["rev-parse", "HEAD"], workingDirectory:
-      p.join(sourceDir, "../../../../third_party/pkg/async_await"));
-  if (result.exitCode != 0) {
-    stderr.writeln("Could not get Git revision of async_await compiler.");
-    exit(1);
-  }
-
-  var currentCommit = result.stdout.trim();
+  var currentCommit = _getCurrentCommit();
 
   var readmePath = p.join(generatedDir, "README.md");
   var lastCommit;
@@ -142,6 +135,27 @@
   if (hadFailure) exit(1);
 }
 
+String _getCurrentCommit() {
+  var command = "git";
+  var args = ["rev-parse", "HEAD"];
+
+  // Spawning a process on Windows will not look for the executable in the
+  // system path so spawn git through a shell to find it.
+  if (Platform.operatingSystem == "windows") {
+    command = "cmd";
+    args = ["/c", "git"]..addAll(args);
+  }
+
+  var result = Process.runSync(command, args, workingDirectory:
+      p.join(sourceDir, "../../../../third_party/pkg/async_await"));
+  if (result.exitCode != 0) {
+    stderr.writeln("Could not get Git revision of async_await compiler.");
+    exit(1);
+  }
+
+  return result.stdout.trim();
+}
+
 void _compile(String sourcePath, String source, String destPath) {
   var destDir = new Directory(p.dirname(destPath));
   destDir.createSync(recursive: true);
diff --git a/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart b/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart
index c6fd86f..057a588 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart
@@ -10,7 +10,6 @@
 import 'package:http_parser/http_parser.dart';
 import 'package:shelf/shelf.dart' as shelf;
 import 'package:shelf_web_socket/shelf_web_socket.dart';
-import 'package:stack_trace/stack_trace.dart';
 
 import '../io.dart';
 import '../log.dart' as log;
@@ -30,7 +29,7 @@
   /// Creates a new server and binds it to [port] of [host].
   static Future<AdminServer> bind(AssetEnvironment environment,
       String host, int port) {
-    return Chain.track(bindServer(host, port)).then((server) {
+    return bindServer(host, port).then((server) {
       log.fine('Bound admin server to $host:$port.');
       return new AdminServer._(environment, server);
     });
diff --git a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
index 613d94e..4343536 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
@@ -11,6 +11,7 @@
 import 'package:path/path.dart' as path;
 import 'package:watcher/watcher.dart';
 
+import '../cached_package.dart';
 import '../entrypoint.dart';
 import '../exceptions.dart';
 import '../io.dart';
@@ -52,31 +53,54 @@
   /// If [watcherType] is not [WatcherType.NONE] (the default), watches source
   /// assets for modification.
   ///
-  /// If [packages] is passed, only those packages' assets will be loaded and
+  /// If [packages] is passed, only those packages' assets are loaded and
   /// served.
   ///
+  /// If [entrypoints] is passed, only transformers necessary to run those
+  /// entrypoints are loaded. Each entrypoint is expected to refer to a Dart
+  /// library.
+  ///
   /// Returns a [Future] that completes to the environment once the inputs,
   /// transformers, and server are loaded and ready.
   static Future<AssetEnvironment> create(Entrypoint entrypoint,
       BarbackMode mode, {WatcherType watcherType, String hostname, int basePort,
-      Iterable<String> packages, bool useDart2JS: true}) {
+      Iterable<String> packages, Iterable<AssetId> entrypoints,
+      bool useDart2JS: true}) {
     if (watcherType == null) watcherType = WatcherType.NONE;
     if (hostname == null) hostname = "localhost";
     if (basePort == null) basePort = 0;
 
     return entrypoint.loadPackageGraph().then((graph) {
       log.fine("Loaded package graph.");
-      var barback = new Barback(new PubPackageProvider(graph, packages));
+      graph = _adjustPackageGraph(graph, mode, packages);
+      var barback = new Barback(new PubPackageProvider(graph));
       barback.log.listen(_log);
 
       var environment = new AssetEnvironment._(graph, barback, mode,
-          watcherType, hostname, basePort, packages);
+          watcherType, hostname, basePort);
 
-      return environment._load(useDart2JS: useDart2JS)
+      return environment._load(entrypoints: entrypoints, useDart2JS: useDart2JS)
           .then((_) => environment);
     });
   }
 
+  /// Return a version of [graph] that's restricted to [packages] (if passed)
+  /// and loads cached packages (if [mode] is [BarbackMode.DEBUG]).
+  static PackageGraph _adjustPackageGraph(PackageGraph graph,
+      BarbackMode mode, Iterable<String> packages) {
+    if (mode != BarbackMode.DEBUG && packages == null) return graph;
+    packages = (packages == null ? graph.packages.keys : packages).toSet();
+
+    return new PackageGraph(graph.entrypoint, graph.lockFile,
+        new Map.fromIterable(packages, value: (packageName) {
+      var package = graph.packages[packageName];
+      if (mode != BarbackMode.DEBUG) return package;
+      var cache = path.join('.pub/deps/debug', packageName);
+      if (!dirExists(cache)) return package;
+      return new CachedPackage(package, cache);
+    }));
+  }
+
   /// The server for the Web Socket API and admin interface.
   AdminServer _adminServer;
 
@@ -90,7 +114,12 @@
   /// The root package being built.
   Package get rootPackage => graph.entrypoint.root;
 
-  /// The underlying [PackageGraph] being built.
+  /// The graph of packages whose assets and transformers are loaded in this
+  /// environment.
+  ///
+  /// This isn't necessarily identical to the graph that's passed in to the
+  /// environment. It may expose fewer packages if some packages' assets don't
+  /// need to be loaded, and it may expose some [CachedPackage]s.
   final PackageGraph graph;
 
   /// The mode to run the transformers in.
@@ -113,12 +142,6 @@
   /// numbers will be selected for each server.
   final int _basePort;
 
-  /// The set of all packages that are visible for this environment.
-  ///
-  /// By default, this is all transitive dependencies of the entrypoint, but it
-  /// may be a narrower set if fewer packages are needed.
-  final Set<String> packages;
-
   /// The modified source assets that have not been sent to barback yet.
   ///
   /// The build environment can be paused (by calling [pauseUpdates]) and
@@ -134,12 +157,8 @@
   /// go to barback immediately.
   Set<AssetId> _modifiedSources;
 
-  AssetEnvironment._(PackageGraph graph, this.barback, this.mode,
-        this._watcherType, this._hostname, this._basePort,
-        Iterable<String> packages)
-      : graph = graph,
-        packages = packages == null ? graph.packages.keys.toSet() :
-            packages.toSet();
+  AssetEnvironment._(this.graph, this.barback, this.mode,
+        this._watcherType, this._hostname, this._basePort);
 
   /// Gets the built-in [Transformer]s that should be added to [package].
   ///
@@ -237,38 +256,45 @@
   /// [directory].
   ///
   /// If [executableIds] is passed, only those executables are precompiled.
-  Future precompileExecutables(String packageName, String directory,
-      {Iterable<AssetId> executableIds}) {
+  ///
+  /// Returns a map from executable name to path for the snapshots that were
+  /// successfully precompiled.
+  Future<Map<String, String>> precompileExecutables(String packageName,
+      String directory, {Iterable<AssetId> executableIds}) async {
     if (executableIds == null) {
       executableIds = graph.packages[packageName].executableIds;
     }
-    log.fine("executables for $packageName: $executableIds");
-    if (executableIds.isEmpty) return null;
+
+    log.fine("Executables for $packageName: $executableIds");
+    if (executableIds.isEmpty) return [];
 
     var package = graph.packages[packageName];
-    return servePackageBinDirectory(packageName).then((server) {
-      return waitAndPrintErrors(executableIds.map((id) {
+    var server = await servePackageBinDirectory(packageName);
+    try {
+      var precompiled = {};
+      await waitAndPrintErrors(executableIds.map((id) async {
         var basename = path.url.basename(id.path);
         var snapshotPath = path.join(directory, "$basename.snapshot");
-        return runProcess(Platform.executable, [
+        var result = await runProcess(Platform.executable, [
           '--snapshot=$snapshotPath',
           server.url.resolve(basename).toString()
-        ]).then((result) {
-          if (result.success) {
-            log.message("Precompiled ${_formatExecutable(id)}.");
-          } else {
-            throw new ApplicationException(
-                log.yellow("Failed to precompile "
-                    "${_formatExecutable(id)}:\n") +
-                result.stderr.join('\n'));
-          }
-        });
-      })).whenComplete(() {
-        // Don't return this future, since we have no need to wait for the
-        // server to fully shut down.
-        server.close();
-      });
-    });
+        ]);
+        if (result.success) {
+          log.message("Precompiled ${_formatExecutable(id)}.");
+          precompiled[path.withoutExtension(basename)] = snapshotPath;
+        } else {
+          throw new ApplicationException(
+              log.yellow("Failed to precompile ${_formatExecutable(id)}:\n") +
+              result.stderr.join('\n'));
+        }
+      }));
+
+      return precompiled;
+    } finally {
+      // Don't await this future, since we have no need to wait for the server
+      // to fully shut down.
+      server.close();
+    }
   }
 
   /// Returns the executable name for [id].
@@ -337,7 +363,7 @@
   Future<List<Uri>> _lookUpPathInPackagesDirectory(String assetPath) {
     var components = path.split(path.relative(assetPath));
     if (components.first != "packages") return new Future.value([]);
-    if (!packages.contains(components[1])) return new Future.value([]);
+    if (!graph.packages.containsKey(components[1])) return new Future.value([]);
     return Future.wait(_directories.values.map((dir) {
       return dir.server.then((server) =>
           server.url.resolveUri(path.toUri(assetPath)));
@@ -347,10 +373,10 @@
   /// Look up [assetPath] in the "lib" or "asset" directory of a dependency
   /// package.
   Future<List<Uri>> _lookUpPathInDependency(String assetPath) {
-    for (var packageName in packages) {
+    for (var packageName in graph.packages.keys) {
       var package = graph.packages[packageName];
-      var libDir = path.join(package.dir, 'lib');
-      var assetDir = path.join(package.dir, 'asset');
+      var libDir = package.path('lib');
+      var assetDir = package.path('asset');
 
       var uri;
       if (path.isWithin(libDir, assetPath)) {
@@ -424,10 +450,13 @@
   /// If [useDart2JS] is `true`, then the [Dart2JSTransformer] is implicitly
   /// added to end of the root package's transformer phases.
   ///
+  /// If [entrypoints] is passed, only transformers necessary to run those
+  /// entrypoints will be loaded.
+  ///
   /// Returns a [Future] that completes once all inputs and transformers are
   /// loaded.
-  Future _load({bool useDart2JS}) {
-    return log.progress("Initializing barback", () {
+  Future _load({Iterable<AssetId> entrypoints, bool useDart2JS}) {
+    return log.progress("Initializing barback", () async {
       // If the entrypoint package manually configures the dart2js
       // transformer, don't include it in the built-in transformer list.
       //
@@ -444,90 +473,60 @@
         ]);
       }
 
-      // "$pub" is a psuedo-package that allows pub's transformer-loading
-      // infrastructure to share code with pub proper. We provide it only during
-      // the initial transformer loading process.
-      var dartPath = assetPath('dart');
-      var pubSources = listDir(dartPath, recursive: true)
-          // Don't include directories.
-          .where((file) => path.extension(file) == ".dart")
-          .map((library) {
-        var idPath = path.join('lib', path.relative(library, from: dartPath));
-        return new AssetId('\$pub', path.toUri(idPath).toString());
-      });
-
-      // "$sdk" is a pseudo-package that allows the dart2js transformer to find
-      // the Dart core libraries without hitting the file system directly. This
-      // ensures they work with source maps.
-      var libPath = path.join(sdk.rootDirectory, "lib");
-      var sdkSources = listDir(libPath, recursive: true)
-          .where((file) => path.extension(file) == ".dart")
-          .map((file) {
-        var idPath = path.join("lib",
-            path.relative(file, from: sdk.rootDirectory));
-        return new AssetId('\$sdk', path.toUri(idPath).toString());
-      });
-
       // Bind a server that we can use to load the transformers.
-      var transformerServer;
-      return BarbackServer.bind(this, _hostname, 0).then((server) {
-        transformerServer = server;
+      var transformerServer = await BarbackServer.bind(this, _hostname, 0);
 
-        var errorStream = barback.errors.map((error) {
-          // Even most normally non-fatal barback errors should take down pub if
-          // they happen during the initial load process.
-          if (error is! AssetLoadException) throw error;
+      var errorStream = barback.errors.map((error) {
+        // Even most normally non-fatal barback errors should take down pub if
+        // they happen during the initial load process.
+        if (error is! AssetLoadException) throw error;
 
-          log.error(log.red(error.message));
-          log.fine(error.stackTrace.terse);
-        });
+        log.error(log.red(error.message));
+        log.fine(error.stackTrace.terse);
+      });
 
-        return _withStreamErrors(() {
-          return log.progress("Loading source assets", () {
-            barback.updateSources(pubSources);
-            barback.updateSources(sdkSources);
-            return _provideSources();
-          });
-        }, [errorStream, barback.results]);
-      }).then((_) {
-        log.fine("Provided sources.");
-        var completer = new Completer();
+      await _withStreamErrors(() {
+        return log.progress("Loading source assets", _provideSources);
+      }, [errorStream, barback.results]);
 
-        var errorStream = barback.errors.map((error) {
-          // Now that we're loading transformers, errors they log shouldn't be
-          // fatal, since we're starting to run them on real user assets which
-          // may have e.g. syntax errors. If an error would cause a transformer
-          // to fail to load, the load failure will cause us to exit.
-          if (error is! TransformerException) throw error;
+      log.fine("Provided sources.");
 
-          var message = error.error.toString();
-          if (error.stackTrace != null) {
-            message += "\n" + error.stackTrace.terse.toString();
-          }
+      errorStream = barback.errors.map((error) {
+        // Now that we're loading transformers, errors they log shouldn't be
+        // fatal, since we're starting to run them on real user assets which
+        // may have e.g. syntax errors. If an error would cause a transformer
+        // to fail to load, the load failure will cause us to exit.
+        if (error is! TransformerException) throw error;
 
-          _log(new LogEntry(error.transform, error.transform.primaryId,
-                  LogLevel.ERROR, message, null));
-        });
+        var message = error.error.toString();
+        if (error.stackTrace != null) {
+          message += "\n" + error.stackTrace.terse.toString();
+        }
 
-        return _withStreamErrors(() {
-          return log.progress("Loading transformers", () {
-            return loadAllTransformers(this, transformerServer)
-                .then((_) => transformerServer.close());
-          }, fine: true);
-        }, [errorStream, barback.results, transformerServer.results]);
-      }).then((_) => barback.removeSources(pubSources));
+        _log(new LogEntry(error.transform, error.transform.primaryId,
+                LogLevel.ERROR, message, null));
+      });
+
+      await _withStreamErrors(() async {
+        return log.progress("Loading transformers", () async {
+          await loadAllTransformers(this, transformerServer,
+              entrypoints: entrypoints);
+          transformerServer.close();
+        }, fine: true);
+      }, [errorStream, barback.results, transformerServer.results]);
     }, fine: true);
   }
 
   /// Provides the public source assets in the environment to barback.
   ///
   /// If [watcherType] is not [WatcherType.NONE], enables watching on them.
-  Future _provideSources() {
+  Future _provideSources() async {
     // Just include the "lib" directory from each package. We'll add the
     // other build directories in the root package by calling
     // [serveDirectory].
-    return Future.wait(packages.map((package) {
-      return _provideDirectorySources(graph.packages[package], "lib");
+    await Future.wait(graph.packages.values.map((package) async {
+      if (graph.isPackageStatic(package.name)) return;
+      await _provideDirectorySources(package, "lib");
     }));
   }
 
@@ -583,18 +582,15 @@
   /// this is optimized for our needs in here instead of using the more general
   /// but slower [listDir].
   Iterable<AssetId> _listDirectorySources(Package package, String dir) {
-    var subdirectory = path.join(package.dir, dir);
-    if (!dirExists(subdirectory)) return [];
-
     // This is used in some performance-sensitive paths and can list many, many
     // files. As such, it leans more havily towards optimization as opposed to
     // readability than most code in pub. In particular, it avoids using the
     // path package, since re-parsing a path is very expensive relative to
     // string operations.
-    return package.listFiles(beneath: subdirectory).map((file) {
+    return package.listFiles(beneath: dir).map((file) {
       // From profiling, path.relative here is just as fast as a raw substring
       // and is correct in the case where package.dir has a trailing slash.
-      var relative = path.relative(file, from: package.dir);
+      var relative = package.relative(file);
 
       if (Platform.operatingSystem == 'windows') {
         relative = relative.replaceAll("\\", "/");
@@ -618,7 +614,7 @@
       return new Future.value();
     }
 
-    var subdirectory = path.join(package.dir, dir);
+    var subdirectory = package.path(dir);
     if (!dirExists(subdirectory)) return new Future.value();
 
     // TODO(nweiz): close this watcher when [barback] is closed.
@@ -642,7 +638,7 @@
       if (event.path.endsWith(".dart.js.map")) return;
       if (event.path.endsWith(".dart.precompiled.js")) return;
 
-      var idPath = path.relative(event.path, from: package.dir);
+      var idPath = package.relative(event.path);
       var id = new AssetId(package.name, path.toUri(idPath).toString());
       if (event.type == ChangeType.REMOVE) {
         if (_modifiedSources != null) {
@@ -670,9 +666,9 @@
   Future _withStreamErrors(Future futureCallback(), List<Stream> streams) {
     var completer = new Completer.sync();
     var subscriptions = streams.map((stream) =>
-        stream.listen((_) {}, onError: completer.complete)).toList();
+        stream.listen((_) {}, onError: completer.completeError)).toList();
 
-    syncFuture(futureCallback).then((_) {
+    new Future.sync(futureCallback).then((_) {
       if (!completer.isCompleted) completer.complete();
     }).catchError((error, stackTrace) {
       if (!completer.isCompleted) completer.completeError(error, stackTrace);
diff --git a/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart b/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
index 7d9125a..2f1b4f8 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
@@ -54,7 +54,7 @@
   static Future<BarbackServer> bind(AssetEnvironment environment,
       String host, int port, {String package, String rootDirectory}) {
     if (package == null) package = environment.rootPackage.name;
-    return Chain.track(bindServer(host, port)).then((server) {
+    return bindServer(host, port).then((server) {
       if (rootDirectory == null) {
         log.fine('Serving packages on $host:$port.');
       } else {
diff --git a/sdk/lib/_internal/pub/lib/src/barback/base_server.dart b/sdk/lib/_internal/pub/lib/src/barback/base_server.dart
index 95dc355..a47b362 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/base_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/base_server.dart
@@ -11,7 +11,6 @@
 import 'package:barback/barback.dart';
 import 'package:shelf/shelf.dart' as shelf;
 import 'package:shelf/shelf_io.dart' as shelf_io;
-import 'package:stack_trace/stack_trace.dart';
 
 import '../log.dart' as log;
 import '../utils.dart';
@@ -43,9 +42,8 @@
   final _resultsController = new StreamController<T>.broadcast();
 
   BaseServer(this.environment, this._server) {
-    shelf_io.serveRequests(Chain.track(_server), const shelf.Pipeline()
+    shelf_io.serveRequests(_server, const shelf.Pipeline()
         .addMiddleware(shelf.createMiddleware(errorHandler: _handleError))
-        .addMiddleware(shelf.createMiddleware(responseHandler: _disableGzip))
         .addHandler(handleRequest));
   }
 
@@ -122,20 +120,4 @@
     close();
     return new shelf.Response.internalServerError();
   }
-
-  /// Disable GZIP responses.
-  ///
-  /// This is primarily to optimize pub's startup. Since the transformer
-  /// plug-ins are loaded over HTTP, we pay the hit to GZIP encode and decode
-  /// them. Disabling this improves startup time by about 5% on my test.
-  ///
-  // TODO(rnystrom): Remove this when #5187 is fixed and we don't have to use
-  // HTTP for isolates.
-  _disableGzip(shelf.Response response) {
-    if (!response.headers.containsKey('Content-Encoding')) {
-      return response.change(headers: {'Content-Encoding': ''});
-    }
-
-    return response;
-  }
 }
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 1b22647..5fd7fc1 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
@@ -11,7 +11,6 @@
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
 import 'package:pool/pool.dart';
-import 'package:stack_trace/stack_trace.dart';
 
 import '../../../../compiler/compiler.dart' as compiler;
 import '../../../../compiler/implementation/dart2js.dart'
@@ -125,14 +124,13 @@
     // against.
     var id = transform.primaryInput.id;
 
-    var entrypoint = path.join(_environment.graph.packages[id.package].dir,
-        id.path);
+    var entrypoint = _environment.graph.packages[id.package].path(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(
+    return dart.compile(
         entrypoint, provider,
         commandLineOptions: _configCommandLineOptions,
         csp: _configBool('csp'),
@@ -141,14 +139,14 @@
             'minify', defaultsTo: _settings.mode == BarbackMode.RELEASE),
         verbose: _configBool('verbose'),
         environment: _configEnvironment,
-        packageRoot: path.join(_environment.rootPackage.dir, "packages"),
+        packageRoot: _environment.rootPackage.path("packages"),
         analyzeAll: _configBool('analyzeAll'),
         suppressWarnings: _configBool('suppressWarnings'),
         suppressHints: _configBool('suppressHints'),
         suppressPackageWarnings: _configBool(
             'suppressPackageWarnings', defaultsTo: true),
         terse: _configBool('terse'),
-        includeSourceMapUrls: _settings.mode != BarbackMode.RELEASE));
+        includeSourceMapUrls: _settings.mode != BarbackMode.RELEASE);
   }
 
   /// Parses and returns the "commandLineOptions" configuration option.
@@ -260,7 +258,7 @@
     // TODO(rnystrom): Fix this if #17751 is fixed.
     var buildDir = _environment.getSourceDirectoryContaining(
         _transform.primaryInput.id.path);
-    _libraryRootPath = path.join(_environment.rootPackage.dir,
+    _libraryRootPath = _environment.rootPackage.path(
         buildDir, "packages", r"$sdk");
   }
 
@@ -373,7 +371,7 @@
   }
 
   Future<String> _readResource(Uri url) {
-    return syncFuture(() {
+    return new Future.sync(() {
       // Find the corresponding asset in barback.
       var id = _sourceUrlToId(url);
       if (id != null) return _transform.readInputAsString(id);
@@ -395,8 +393,8 @@
     // should be loaded directly from disk.
     var sourcePath = path.fromUri(url);
     if (_environment.containsPath(sourcePath)) {
-      var relative = path.toUri(path.relative(sourcePath,
-          from: _environment.rootPackage.dir)).toString();
+      var relative = path.toUri(_environment.rootPackage.relative(sourcePath))
+          .toString();
 
       return new AssetId(_environment.rootPackage.name, relative);
     }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformers_needed_by_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/dependency_computer.dart
similarity index 76%
rename from sdk/lib/_internal/pub/lib/src/barback/transformers_needed_by_transformers.dart
rename to sdk/lib/_internal/pub/lib/src/barback/dependency_computer.dart
index c9cfdaf..bac5ab5 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/transformers_needed_by_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dependency_computer.dart
@@ -2,8 +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.
 
-library pub.barback.transformers_needed_by_transformers;
+library pub.barback.dependency_computer;
 
+import 'package:barback/barback.dart';
 import 'package:path/path.dart' as p;
 
 import '../dart.dart';
@@ -11,50 +12,13 @@
 import '../package.dart';
 import '../package_graph.dart';
 import '../utils.dart';
-import 'asset_environment.dart';
 import 'cycle_exception.dart';
 import 'transformer_config.dart';
 import 'transformer_id.dart';
 
-/// Returns a dependency graph for transformers in [graph].
-///
-/// This graph is represented by a map whose keys are the vertices and whose
-/// values are sets representing edges from the given vertex. Each vertex is a
-/// [TransformerId]. If there's an edge from `T1` to `T2`, then `T2` must be
-/// loaded before `T1` can be loaded.
-///
-/// The returned graph is transitively closed. That is, if there's an edge from
-/// `T1` to `T2` and an edge from `T2` to `T3`, there's also an edge from `T1`
-/// to `T2`.
-///
-/// If [packages] is passed, only transformers in those packages will be
-/// inspected.
-Map<TransformerId, Set<TransformerId>> computeTransformersNeededByTransformers(
-    PackageGraph graph, {Iterable<String> packages}) {
-  if (packages == null) packages = graph.packages.keys;
-
-  var result = {};
-  var computer = new _DependencyComputer(graph);
-  for (var packageName in ordered(packages)) {
-    var package = graph.packages[packageName];
-    for (var phase in package.pubspec.transformers) {
-      for (var config in phase) {
-        var id = config.id;
-        if (id.isBuiltInTransformer) continue;
-        if (id.package != graph.entrypoint.root.name &&
-            !config.canTransformPublicFiles) {
-          continue;
-        }
-        result[id] = computer.transformersNeededByTransformer(id);
-      }
-    }
-  }
-  return result;
-}
-
-/// A helper class for [computeTransformersNeededByTransformers] that keeps
-/// package-graph-wide state and caches over the course of the computation.
-class _DependencyComputer {
+/// A class for determining dependencies between transformers and from Dart
+/// libraries onto transformers.
+class DependencyComputer {
   /// The package graph being analyzed.
   final PackageGraph _graph;
 
@@ -72,29 +36,85 @@
   /// A cache of the results of [transformersNeededByPackage].
   final _transformersNeededByPackages = new Map<String, Set<TransformerId>>();
 
-  _DependencyComputer(this._graph) {
+  /// The set of all packages that neither use transformers themselves nor
+  /// import packages that use transformers.
+  ///
+  /// This is precomputed before any package computers are loaded.
+  final _untransformedPackages = new Set<String>();
+
+  DependencyComputer(this._graph) {
+    for (var package in ordered(_graph.packages.keys)) {
+      if (_graph.transitiveDependencies(package).every((dependency) =>
+            dependency.pubspec.transformers.isEmpty)) {
+        _untransformedPackages.add(package);
+      }
+    }
+
     ordered(_graph.packages.keys).forEach(_loadPackageComputer);
   }
 
+  /// Returns a dependency graph for [transformers], or for all transformers if
+  /// [transformers] is `null`.
+  ///
+  /// This graph is represented by a map whose keys are the vertices and whose
+  /// values are sets representing edges from the given vertex. Each vertex is a
+  /// [TransformerId]. If there's an edge from `T1` to `T2`, then `T2` must be
+  /// loaded before `T1` can be loaded.
+  ///
+  /// The returned graph is transitively closed. That is, if there's an edge
+  /// from `T1` to `T2` and an edge from `T2` to `T3`, there's also an edge from
+  /// `T1` to `T2`.
+  Map<TransformerId, Set<TransformerId>> transformersNeededByTransformers(
+      [Iterable<TransformerId> transformers]) {
+    var result = {};
+
+    if (transformers == null) {
+      transformers = ordered(_graph.packages.keys).expand((packageName) {
+        var package = _graph.packages[packageName];
+        return package.pubspec.transformers.expand((phase) {
+          return phase.expand((config) {
+            var id = config.id;
+            if (id.isBuiltInTransformer) return [];
+            if (id.package != _graph.entrypoint.root.name &&
+                !config.canTransformPublicFiles) {
+              return [];
+            }
+            return [id];
+          });
+        });
+      });
+    }
+
+    for (var id in transformers) {
+      result[id] = _transformersNeededByTransformer(id);
+    }
+    return result;
+  }
+
+  /// Returns the set of all transformers needed to load the library identified
+  /// by [id].
+  Set<TransformerId> transformersNeededByLibrary(AssetId id) {
+    var library = _graph.packages[id.package].path(p.fromUri(id.path));
+    _loadPackageComputer(id.package);
+    return _packageComputers[id.package].transformersNeededByLibrary(library);
+  }
+
   /// Returns the set of all transformers that need to be loaded before [id] is
   /// loaded.
-  Set<TransformerId> transformersNeededByTransformer(TransformerId id) {
+  Set<TransformerId> _transformersNeededByTransformer(TransformerId id) {
     if (id.isBuiltInTransformer) return new Set();
     _loadPackageComputer(id.package);
-    return _packageComputers[id.package].transformersNeededByTransformer(id);
+    return _packageComputers[id.package]._transformersNeededByTransformer(id);
   }
 
   /// Returns the set of all transformers that need to be loaded before
   /// [packageUri] (a "package:" URI) can be safely imported from an external
   /// package.
-  Set<TransformerId> transformersNeededByPackageUri(Uri packageUri) {
-    // TODO(nweiz): We can do some pre-processing on the package graph (akin to
-    // the old ordering dependency computation) to figure out which packages are
-    // guaranteed not to require any transformers. That'll let us avoid extra
-    // work here and in [transformersNeededByPackage].
-
+  Set<TransformerId> _transformersNeededByPackageUri(Uri packageUri) {
     var components = p.split(p.fromUri(packageUri.path));
     var packageName = components.first;
+    if (_untransformedPackages.contains(packageName)) return new Set();
+
     var package = _graph.packages[packageName];
     if (package == null) {
       // TODO(nweiz): include source range information here.
@@ -102,7 +122,7 @@
           '"$packageUri").');
     }
 
-    var library = p.join(package.dir, 'lib', p.joinAll(components.skip(1)));
+    var library = package.path('lib', p.joinAll(components.skip(1)));
 
     _loadPackageComputer(packageName);
     return _packageComputers[packageName].transformersNeededByLibrary(library);
@@ -120,7 +140,9 @@
   /// (transitively) imports a transformed library. The result of the
   /// transformation may import any dependency or hit any transformer, so we
   /// have to assume that it will.
-  Set<TransformerId> transformersNeededByPackage(String rootPackage) {
+  Set<TransformerId> _transformersNeededByPackage(String rootPackage) {
+    if (_untransformedPackages.contains(rootPackage)) return new Set();
+
     if (_transformersNeededByPackages.containsKey(rootPackage)) {
       return _transformersNeededByPackages[rootPackage];
     }
@@ -181,8 +203,8 @@
 /// A helper class for [computeTransformersNeededByTransformers] that keeps
 /// package-specific state and caches over the course of the computation.
 class _PackageDependencyComputer {
-  /// The parent [_DependencyComputer].
-  final _DependencyComputer _dependencyComputer;
+  /// The parent [DependencyComputer].
+  final DependencyComputer _dependencyComputer;
 
   /// The package whose dependencies [this] is computing.
   final Package _package;
@@ -206,7 +228,7 @@
   /// libraries.
   final _activeLibraries = new Set<String>();
 
-  /// A cache of the results of [transformersNeededByTransformer].
+  /// A cache of the results of [_transformersNeededByTransformer].
   final _transformersNeededByTransformers =
       new Map<TransformerId, Set<TransformerId>>();
 
@@ -215,14 +237,14 @@
   /// This is invalidated whenever [_applicableTransformers] changes.
   final _transitiveExternalDirectives = new Map<String, Set<Uri>>();
 
-  _PackageDependencyComputer(_DependencyComputer dependencyComputer,
+  _PackageDependencyComputer(DependencyComputer dependencyComputer,
           String packageName)
       : _dependencyComputer = dependencyComputer,
         _package = dependencyComputer._graph.packages[packageName] {
     // If [_package] uses its own transformers, there will be fewer transformers
     // running on [_package] while its own transformers are loading than there
     // will be once all its transformers are finished loading. To handle this,
-    // we run [transformersNeededByTransformer] to pre-populate
+    // we run [_transformersNeededByTransformer] to pre-populate
     // [_transformersNeededByLibraries] while [_applicableTransformers] is
     // smaller.
     for (var phase in _package.pubspec.transformers) {
@@ -232,7 +254,7 @@
           if (id.package != _package.name) {
             // Probe [id]'s transformer dependencies to ensure that it doesn't
             // depend on this package. If it does, a CycleError will be thrown.
-            _dependencyComputer.transformersNeededByTransformer(id);
+            _dependencyComputer._transformersNeededByTransformer(id);
           } else {
             // Store the transformers needed specifically with the current set
             // of [_applicableTransformers]. When reporting this transformer's
@@ -241,7 +263,7 @@
             // set that would be recomputed if [transformersNeededByLibrary]
             // were called anew.
             _transformersNeededByTransformers[id] =
-                transformersNeededByLibrary(id.getFullPath(_package.dir));
+                transformersNeededByLibrary(_package.transformerPath(id));
           }
         } on CycleException catch (error) {
           throw error.prependStep("$packageName is transformed by $id");
@@ -260,14 +282,14 @@
   /// loaded.
   ///
   /// [id] must refer to a transformer in [_package].
-  Set<TransformerId> transformersNeededByTransformer(TransformerId id) {
+  Set<TransformerId> _transformersNeededByTransformer(TransformerId id) {
     assert(id.package == _package.name);
     if (_transformersNeededByTransformers.containsKey(id)) {
       return _transformersNeededByTransformers[id];
     }
 
     _transformersNeededByTransformers[id] =
-        transformersNeededByLibrary(id.getFullPath(_package.dir));
+        transformersNeededByLibrary(_package.transformerPath(id));
     return _transformersNeededByTransformers[id];
   }
 
@@ -277,7 +299,7 @@
   /// If [library] or anything it imports/exports within this package is
   /// transformed by [_applicableTransformers], this will return a conservative
   /// set of transformers (see also
-  /// [_DependencyComputer.transformersNeededByPackage]).
+  /// [DependencyComputer._transformersNeededByPackage]).
   Set<TransformerId> transformersNeededByLibrary(String library) {
     library = p.normalize(library);
     if (_activeLibraries.contains(library)) return new Set();
@@ -297,7 +319,7 @@
         return _applicableTransformers.map((config) => config.id).toSet().union(
             unionAll(dependencies.map((dep) {
           try {
-            return _dependencyComputer.transformersNeededByPackage(dep.name);
+            return _dependencyComputer._transformersNeededByPackage(dep.name);
           } on CycleException catch (error) {
             throw error.prependStep("${_package.name} depends on ${dep.name}");
           }
@@ -307,7 +329,7 @@
         // used by the external packages' libraries that we import or export.
         return unionAll(externalDirectives.map((uri) {
           try {
-            return _dependencyComputer.transformersNeededByPackageUri(uri);
+            return _dependencyComputer._transformersNeededByPackageUri(uri);
           } on CycleException catch (error) {
             var packageName = p.url.split(uri.path).first;
             throw error.prependStep("${_package.name} depends on $packageName");
@@ -353,7 +375,7 @@
             continue;
           }
 
-          path = p.join(_package.dir, 'lib', p.joinAll(components.skip(1)));
+          path = _package.path('lib', p.joinAll(components.skip(1)));
         } else if (uri.scheme == '' || uri.scheme == 'file') {
           path = p.join(p.dirname(library), p.fromUri(uri));
         } else {
@@ -377,7 +399,7 @@
   /// If [library] is modified by a transformer, this will return `null`.
   Set<Uri> _getDirectives(String library) {
     var libraryUri = p.toUri(p.normalize(library));
-    var relative = p.toUri(p.relative(library, from: _package.dir)).path;
+    var relative = p.toUri(_package.relative(library)).path;
     if (_applicableTransformers.any((config) =>
             config.canTransform(relative))) {
       _directives[libraryUri] = null;
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
index 0420af3..ca83a87 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
@@ -13,13 +13,9 @@
 import '../utils.dart';
 import 'asset_environment.dart';
 import 'barback_server.dart';
-import 'dart2js_transformer.dart';
-import 'excluding_transformer.dart';
-import 'rewrite_import_transformer.dart';
-import 'transformer_config.dart';
+import 'dependency_computer.dart';
 import 'transformer_id.dart';
-import 'transformer_isolate.dart';
-import 'transformers_needed_by_transformers.dart';
+import 'transformer_loader.dart';
 
 /// Loads all transformers depended on by packages in [environment].
 ///
@@ -29,11 +25,30 @@
 ///
 /// Any built-in transformers that are provided by the environment will
 /// automatically be added to the end of the root package's cascade.
+///
+/// If [entrypoints] is passed, only transformers necessary to run those
+/// entrypoints will be loaded.
 Future loadAllTransformers(AssetEnvironment environment,
-    BarbackServer transformerServer) {
-  var transformersNeededByTransformers =
-      computeTransformersNeededByTransformers(environment.graph,
-          packages: environment.packages);
+    BarbackServer transformerServer, {Iterable<AssetId> entrypoints}) async {
+  var dependencyComputer = new DependencyComputer(environment.graph);
+
+  // If we only need to load transformers for a specific set of entrypoints,
+  // remove any other transformers from [transformersNeededByTransformers].
+  var necessaryTransformers;
+  if (entrypoints != null) {
+    if (entrypoints.isEmpty) return;
+
+    necessaryTransformers = unionAll(entrypoints.map(
+        dependencyComputer.transformersNeededByLibrary));
+
+    if (necessaryTransformers.isEmpty) {
+      log.fine("No transformers are needed for ${toSentence(entrypoints)}.");
+      return;
+    }
+  }
+
+  var transformersNeededByTransformers = dependencyComputer
+      .transformersNeededByTransformers(necessaryTransformers);
 
   var buffer = new StringBuffer();
   buffer.writeln("Transformer dependencies:");
@@ -46,91 +61,92 @@
   });
   log.fine(buffer);
 
-  var phasedTransformers = _phaseTransformers(transformersNeededByTransformers);
+  var stagedTransformers = _stageTransformers(transformersNeededByTransformers);
 
   var packagesThatUseTransformers =
       _packagesThatUseTransformers(environment.graph);
 
-  var loader = new _TransformerLoader(environment, transformerServer);
+  var loader = new TransformerLoader(environment, transformerServer);
 
-  // Add a rewrite transformer for each package, so that we can resolve
-  // "package:" imports while loading transformers.
-  var rewrite = new RewriteImportTransformer();
-  for (var package in environment.packages) {
-    environment.barback.updateTransformers(package, [[rewrite]]);
-  }
-  environment.barback.updateTransformers(r'$pub', [[rewrite]]);
+  // Only save compiled snapshots when a physical entrypoint package is being
+  // used. There's no physical entrypoint when e.g. globally activating a cached
+  // package.
+  var cache = environment.rootPackage.dir == null ? null :
+      environment.graph.loadTransformerCache();
 
-  return Future.forEach(phasedTransformers, (phase) {
-    /// Load all the transformers in [phase], then add them to the appropriate
+  var first = true;
+  for (var stage in stagedTransformers) {
+    // Only cache the first stage, since its contents aren't based on other
+    // transformers and thus is independent of the current mode.
+    var snapshotPath = cache == null || !first ? null :
+        cache.snapshotPath(stage);
+    first = false;
+
+    /// Load all the transformers in [stage], then add them to the appropriate
     /// locations in the transformer graphs of the packages that use them.
-    return loader.load(phase).then((_) {
-      // Only update packages that use transformers in [phase].
-      var packagesToUpdate = unionAll(phase.map((id) =>
-          packagesThatUseTransformers[id]));
-      return Future.wait(packagesToUpdate.map((packageName) {
-        var package = environment.graph.packages[packageName];
-        return loader.transformersForPhases(package.pubspec.transformers)
-            .then((phases) {
+    await loader.load(stage, snapshot: snapshotPath);
 
-          // Make sure [rewrite] is still the first phase so that future
-          // transformers' "package:" imports will work.
-          phases.insert(0, new Set.from([rewrite]));
-          environment.barback.updateTransformers(packageName, phases);
-        });
-      }));
-    });
-  }).then((_) {
-    /// Reset the transformers for each package to get rid of [rewrite], which
-    /// is no longer needed.
-    return Future.wait(environment.graph.packages.values.map((package) {
-      return loader.transformersForPhases(package.pubspec.transformers)
-          .then((phases) {
-        var transformers = environment.getBuiltInTransformers(package);
-        if (transformers != null) phases.add(transformers);
-
-        // TODO(nweiz): remove the [newFuture] here when issue 17305 is fixed.
-        // If no transformer in [phases] applies to a source input,
-        // [updateTransformers] may cause a [BuildResult] to be scheduled for
-        // immediate emission. Issue 17305 means that the caller will be unable
-        // to receive this result unless we delay the update to after this
-        // function returns.
-        newFuture(() =>
-            environment.barback.updateTransformers(package.name, phases));
-      });
+    // Only update packages that use transformers in [stage].
+    var packagesToUpdate = unionAll(stage.map((id) =>
+        packagesThatUseTransformers[id]));
+    await Future.wait(packagesToUpdate.map((packageName) async {
+      var package = environment.graph.packages[packageName];
+      var phases = await loader.transformersForPhases(
+          package.pubspec.transformers);
+      environment.barback.updateTransformers(packageName, phases);
     }));
-  });
+  }
+
+  if (cache != null) cache.save();
+
+  /// Add built-in transformers for the packages that need them.
+  await Future.wait(environment.graph.packages.values.map((package) async {
+    var phases = await loader.transformersForPhases(
+        package.pubspec.transformers);
+    var transformers = environment.getBuiltInTransformers(package);
+    if (transformers != null) phases.add(transformers);
+    if (phases.isEmpty) return;
+
+    // TODO(nweiz): remove the [newFuture] here when issue 17305 is fixed.
+    // If no transformer in [phases] applies to a source input,
+    // [updateTransformers] may cause a [BuildResult] to be scheduled for
+    // immediate emission. Issue 17305 means that the caller will be unable
+    // to receive this result unless we delay the update to after this
+    // function returns.
+    newFuture(() =>
+        environment.barback.updateTransformers(package.name, phases));
+  }));
 }
 
 /// Given [transformerDependencies], a directed acyclic graph, returns a list of
-/// "phases" (sets of transformers).
+/// "stages" (sets of transformers).
 ///
-/// Each phase must be fully loaded and passed to barback before the next phase
-/// can be safely loaded. However, transformers within a phase can be safely
+/// Each stage must be fully loaded and passed to barback before the next stage
+/// can be safely loaded. However, transformers within a stage can be safely
 /// loaded in parallel.
-List<Set<TransformerId>> _phaseTransformers(
+List<Set<TransformerId>> _stageTransformers(
     Map<TransformerId, Set<TransformerId>> transformerDependencies) {
-  // A map from transformer ids to the indices of the phases that those
-  // transformer ids should end up in. Populated by [phaseNumberFor].
-  var phaseNumbers = {};
-  var phases = [];
+  // A map from transformer ids to the indices of the stages that those
+  // transformer ids should end up in. Populated by [stageNumberFor].
+  var stageNumbers = {};
+  var stages = [];
 
-  phaseNumberFor(id) {
-    if (phaseNumbers.containsKey(id)) return phaseNumbers[id];
+  stageNumberFor(id) {
+    if (stageNumbers.containsKey(id)) return stageNumbers[id];
     var dependencies = transformerDependencies[id];
-    phaseNumbers[id] = dependencies.isEmpty ? 0 :
-        maxAll(dependencies.map(phaseNumberFor)) + 1;
-    return phaseNumbers[id];
+    stageNumbers[id] = dependencies.isEmpty ? 0 :
+        maxAll(dependencies.map(stageNumberFor)) + 1;
+    return stageNumbers[id];
   }
 
   for (var id in transformerDependencies.keys) {
-    var phaseNumber = phaseNumberFor(id);
-    if (phases.length <= phaseNumber) phases.length = phaseNumber + 1;
-    if (phases[phaseNumber] == null) phases[phaseNumber] = new Set();
-    phases[phaseNumber].add(id);
+    var stageNumber = stageNumberFor(id);
+    if (stages.length <= stageNumber) stages.length = stageNumber + 1;
+    if (stages[stageNumber] == null) stages[stageNumber] = new Set();
+    stages[stageNumber].add(id);
   }
 
-  return phases;
+  return stages;
 }
 
 /// Returns a map from transformer ids to all packages in [graph] that use each
@@ -147,111 +163,3 @@
   }
   return results;
 }
-
-/// A class that loads transformers defined in specific files.
-class _TransformerLoader {
-  final AssetEnvironment _environment;
-
-  final BarbackServer _transformerServer;
-
-  final _isolates = new Map<TransformerId, TransformerIsolate>();
-
-  final _transformers = new Map<TransformerConfig, Set<Transformer>>();
-
-  /// The packages that use each transformer id.
-  ///
-  /// Used for error reporting.
-  final _transformerUsers = new Map<TransformerId, Set<String>>();
-
-  _TransformerLoader(this._environment, this._transformerServer) {
-    for (var package in _environment.graph.packages.values) {
-      for (var config in unionAll(package.pubspec.transformers)) {
-        _transformerUsers.putIfAbsent(config.id, () => new Set<String>())
-            .add(package.name);
-      }
-    }
-  }
-
-  /// Loads a transformer plugin isolate that imports the transformer libraries
-  /// indicated by [ids].
-  ///
-  /// Once the returned future completes, transformer instances from this
-  /// isolate can be created using [transformersFor] or [transformersForPhase].
-  ///
-  /// This will skip any ids that have already been loaded.
-  Future load(Iterable<TransformerId> ids) {
-    ids = ids.where((id) => !_isolates.containsKey(id)).toList();
-    if (ids.isEmpty) return new Future.value();
-
-    return log.progress("Loading ${toSentence(ids)} transformers", () {
-      return TransformerIsolate.spawn(_environment, _transformerServer, ids);
-    }).then((isolate) {
-      for (var id in ids) {
-        _isolates[id] = isolate;
-      }
-    });
-  }
-
-  /// Instantiates and returns all transformers in the library indicated by
-  /// [config] with the given configuration.
-  ///
-  /// If this is called before the library has been loaded into an isolate via
-  /// [load], it will return an empty set.
-  Future<Set<Transformer>> transformersFor(TransformerConfig config) {
-    if (_transformers.containsKey(config)) {
-      return new Future.value(_transformers[config]);
-    } else if (_isolates.containsKey(config.id)) {
-      return _isolates[config.id].create(config).then((transformers) {
-        if (transformers.isNotEmpty) {
-          _transformers[config] = transformers;
-          return transformers;
-        }
-
-        var message = "No transformers";
-        if (config.configuration.isNotEmpty) {
-          message += " that accept configuration";
-        }
-
-        var location;
-        if (config.id.path == null) {
-          location = 'package:${config.id.package}/transformer.dart or '
-            'package:${config.id.package}/${config.id.package}.dart';
-        } else {
-          location = 'package:$config.dart';
-        }
-
-        var users = toSentence(ordered(_transformerUsers[config.id]));
-        fail("$message were defined in $location,\n"
-            "required by $users.");
-      });
-    } else if (config.id.package != '\$dart2js') {
-      return new Future.value(new Set());
-    }
-
-    var transformer;
-    try {
-      transformer = new Dart2JSTransformer.withSettings(_environment,
-          new BarbackSettings(config.configuration, _environment.mode));
-    } on FormatException catch (error, stackTrace) {
-      fail(error.message, error, stackTrace);
-    }
-
-    // Handle any exclusions.
-    _transformers[config] = new Set.from(
-        [ExcludingTransformer.wrap(transformer, config)]);
-    return new Future.value(_transformers[config]);
-  }
-
-  /// Loads all transformers defined in each phase of [phases].
-  ///
-  /// If any library hasn't yet been loaded via [load], it will be ignored.
-  Future<List<Set<Transformer>>> transformersForPhases(
-      Iterable<Set<TransformerConfig>> phases) {
-    return Future.wait(phases.map((phase) {
-      return waitAndPrintErrors(phase.map(transformersFor)).then(unionAll);
-    })).then((phases) {
-      // Return a growable list so that callers can add phases.
-      return phases.toList();
-    });
-  }
-}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
index 36ec865..23c1a48 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
@@ -17,14 +17,17 @@
 
 /// An implementation of barback's [PackageProvider] interface so that barback
 /// can find assets within pub packages.
-class PubPackageProvider implements PackageProvider {
+class PubPackageProvider implements StaticPackageProvider {
   final PackageGraph _graph;
-  final List<String> packages;
+  final List<String> staticPackages;
 
-  PubPackageProvider(PackageGraph graph, [Iterable<String> packages])
+  Iterable<String> get packages =>
+      _graph.packages.keys.toSet().difference(staticPackages.toSet());
+
+  PubPackageProvider(PackageGraph graph)
       : _graph = graph,
-        packages = [r"$pub", r"$sdk"]
-            ..addAll(packages == null ? graph.packages.keys : packages);
+        staticPackages = [r"$pub", r"$sdk"]..addAll(
+            graph.packages.keys.where(graph.isPackageStatic));
 
   Future<Asset> getAsset(AssetId id) {
     // "$pub" is a psuedo-package that allows pub's transformer-loading
@@ -67,7 +70,42 @@
     }
 
     var nativePath = path.fromUri(id.path);
-    var file = path.join(_graph.packages[id.package].dir, nativePath);
+    var file = _graph.packages[id.package].path(nativePath);
     return new Future.value(new Asset.fromPath(id, file));
   }
+
+  Stream<AssetId> getAllAssetIds(String packageName) {
+    if (packageName == r'$pub') {
+      // "$pub" is a pseudo-package that allows pub's transformer-loading
+      // infrastructure to share code with pub proper. We provide it only during
+      // the initial transformer loading process.
+      var dartPath = assetPath('dart');
+      return new Stream.fromIterable(listDir(dartPath, recursive: true)
+          // Don't include directories.
+          .where((file) => path.extension(file) == ".dart")
+          .map((library) {
+        var idPath = path.join('lib', path.relative(library, from: dartPath));
+        return new AssetId('\$pub', path.toUri(idPath).toString());
+      }));
+    } else if (packageName == r'$sdk') {
+      // "$sdk" is a pseudo-package that allows the dart2js transformer to find
+      // the Dart core libraries without hitting the file system directly. This
+      // ensures they work with source maps.
+      var libPath = path.join(sdk.rootDirectory, "lib");
+      return new Stream.fromIterable(listDir(libPath, recursive: true)
+          .where((file) => path.extension(file) == ".dart")
+          .map((file) {
+        var idPath = path.join("lib",
+            path.relative(file, from: sdk.rootDirectory));
+        return new AssetId('\$sdk', path.toUri(idPath).toString());
+      }));
+    } else {
+      var package = _graph.packages[packageName];
+      return new Stream.fromIterable(
+          package.listFiles(beneath: 'lib').map((file) {
+        return new AssetId(packageName,
+            path.toUri(package.relative(file)).toString());
+      }));
+    }
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/rewrite_import_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/rewrite_import_transformer.dart
deleted file mode 100644
index 7482d62..0000000
--- a/sdk/lib/_internal/pub/lib/src/barback/rewrite_import_transformer.dart
+++ /dev/null
@@ -1,40 +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 pub.rewrite_import_transformer;
-
-import 'dart:async';
-
-import 'package:barback/barback.dart';
-
-import '../dart.dart';
-
-/// A transformer used internally to rewrite "package:" imports so they point to
-/// the barback server rather than to pub's package root.
-class RewriteImportTransformer extends Transformer {
-  String get allowedExtensions => '.dart';
-
-  Future apply(Transform transform) {
-    return transform.primaryInput.readAsString().then((contents) {
-      var directives = parseImportsAndExports(contents,
-          name: transform.primaryInput.id.toString());
-
-      var buffer = new StringBuffer();
-      var index = 0;
-      for (var directive in directives) {
-        var uri = Uri.parse(directive.uri.stringValue);
-        if (uri.scheme != 'package') continue;
-
-        buffer
-          ..write(contents.substring(index, directive.uri.literal.offset))
-          ..write('"/packages/${uri.path}"');
-        index = directive.uri.literal.end;
-      }
-      buffer.write(contents.substring(index, contents.length));
-
-      transform.addOutput(
-          new Asset.fromString(transform.primaryInput.id, buffer.toString()));
-    });
-  }
-}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_cache.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_cache.dart
new file mode 100644
index 0000000..5433ce1
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_cache.dart
@@ -0,0 +1,140 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.barback.transformer_cache;
+
+import 'package:path/path.dart' as p;
+
+import '../io.dart';
+import '../log.dart' as log;
+import '../package_graph.dart';
+import '../sdk.dart' as sdk;
+import '../utils.dart';
+import 'transformer_id.dart';
+
+/// A cache for managing a snapshot of the first "stage" of transformers to
+/// load.
+///
+/// This uses the [_stageTransformers] notion of a stage. Transformers are
+/// divided into stages for loading based on which transformers are needed to
+/// load one another. For example, if a transformer T1 produces a file that's
+/// imported by another transformer T2, T2 must be put in a stage after T1.
+///
+/// We only cache the first stage because it's the only stage whose contents are
+/// independent of any configuration. Since most transformers don't import the
+/// output of other transformers, many packages will only have one stage.
+class TransformerCache {
+  final PackageGraph _graph;
+
+  /// The set of transformer ids that were previously cached.
+  ///
+  /// If there was no previous cache, this will be empty.
+  Set<TransformerId> _oldTransformers;
+
+  /// The set of transformer ids that are newly cached or re-used from the
+  /// previous cache.
+  Set<TransformerId> _newTransformers;
+
+  /// The directory in which transformers are cached.
+  ///
+  /// This may be `null` if there's no physical entrypoint directory.
+  String _dir;
+
+  /// The directory of the manifest listing which transformers were cached.
+  String get _manifestPath => p.join(_dir, "manifest.txt");
+
+  /// Loads the transformer cache for [environment].
+  ///
+  /// This may modify the cache.
+  TransformerCache.load(PackageGraph graph)
+      : _graph = graph,
+        _dir = graph.entrypoint.root.path(".pub/transformers") {
+    _oldTransformers = _parseManifest();
+  }
+
+  /// Clear the cache if it depends on any package in [changedPackages].
+  void clearIfOutdated(Set<String> changedPackages) {
+    var snapshotDependencies = unionAll(_oldTransformers.map((id) {
+      return _graph.transitiveDependencies(id.package)
+          .map((package) => package.name).toSet();
+    }));
+
+    // If none of the snapshot's dependencies have changed, then we can reuse
+    // it.
+    if (!overlaps(changedPackages, snapshotDependencies)) return;
+
+    // Otherwise, delete it.
+    deleteEntry(_dir);
+    _oldTransformers = new Set();
+  }
+
+  /// Returns the path for the transformer snapshot for [transformers], or
+  /// `null` if the transformers shouldn't be cached.
+  ///
+  /// There may or may not exist a file at the returned path. If one does exist,
+  /// it can safely be used to load the stage. Otherwise, a snapshot of the
+  /// stage should be written there.
+  String snapshotPath(Set<TransformerId> transformers) {
+    var path = p.join(_dir, "transformers.snapshot");
+    if (_newTransformers != null) return path;
+
+    if (transformers.any((id) => _graph.isPackageMutable(id.package))) {
+      log.fine("Not caching mutable transformers.");
+      deleteEntry(_dir);
+      return null;
+    }
+
+    if (!_oldTransformers.containsAll(transformers)) {
+      log.fine("Cached transformer snapshot is out-of-date, deleting.");
+      deleteEntry(path);
+    } else {
+      log.fine("Using cached transformer snapshot.");
+    }
+
+    _newTransformers = transformers;
+    return path;
+  }
+
+  /// Saves the manifest to the transformer cache.
+  void save() {
+    // If we didn't write any snapshots, there's no need to write a manifest.
+    if (_newTransformers == null) {
+      if (_dir != null) deleteEntry(_dir);
+      return;
+    }
+
+    // We only need to rewrite the manifest if we created a new snapshot.
+    if (_oldTransformers.containsAll(_newTransformers)) return;
+
+    ensureDir(_dir);
+    writeTextFile(_manifestPath,
+        "${sdk.version}\n" +
+        ordered(_newTransformers.map((id) => id.serialize())).join(","));
+  }
+
+  /// Parses the cache manifest and returns the set of previously-cached
+  /// transformers.
+  ///
+  /// If the manifest indicates that the SDK version is out-of-date, this
+  /// deletes the existing cache. Otherwise, 
+  Set<TransformerId> _parseManifest() {
+    if (!fileExists(_manifestPath)) return new Set();
+
+    var manifest = readTextFile(_manifestPath).split("\n");
+
+    // The first line of the manifest is the SDK version. We want to clear out
+    // the snapshots even if they're VM-compatible, since pub's transformer
+    // isolate scaffolding may have changed.
+    if (manifest.removeAt(0) != sdk.version.toString()) {
+      deleteEntry(_dir);
+      return new Set();
+    }
+
+    /// The second line of the manifest is a list of transformer ids used to
+    /// create the existing snapshot.
+    return manifest.single.split(",")
+        .map((id) => new TransformerId.parse(id, null))
+        .toSet();
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_id.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_id.dart
index 5d111ab..c36d4ae 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/transformer_id.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_id.dart
@@ -7,10 +7,8 @@
 import 'dart:async';
 
 import 'package:barback/barback.dart';
-import 'package:path/path.dart' as p;
 import 'package:source_span/source_span.dart';
 
-import '../io.dart';
 import '../utils.dart';
 
 /// A list of the names of all built-in transformers that pub exposes.
@@ -72,7 +70,11 @@
 
   int get hashCode => package.hashCode ^ path.hashCode;
 
-  String toString() => path == null ? package : '$package/$path';
+  /// Returns a serialized form of [this] that can be passed to
+  /// [new TransformerId.parse].
+  String serialize() => path == null ? package : '$package/$path';
+
+  String toString() => serialize();
 
   /// Returns the asset id for the library identified by this transformer id.
   ///
@@ -90,16 +92,4 @@
         .catchError((e) => new AssetId(package, 'lib/$package.dart'),
             test: (e) => e is AssetNotFoundException);
   }
-
-  /// Returns the path to the library identified by this transformer within
-  /// [packageDir], which should be the directory of [package].
-  ///
-  /// If `path` is null, this will determine which library to load.
-  String getFullPath(String packageDir) {
-    if (path != null) return p.join(packageDir, 'lib', p.fromUri('$path.dart'));
-
-    var transformerPath = p.join(packageDir, 'lib', 'transformer.dart');
-    if (fileExists(transformerPath)) return transformerPath;
-    return p.join(packageDir, 'lib', '$package.dart');
-  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_isolate.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_isolate.dart
index 3b665fc..bfd9f66 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/transformer_isolate.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_isolate.dart
@@ -45,16 +45,20 @@
   /// This doesn't actually instantiate any transformers, since a
   /// [TransformerId] doesn't define the transformers' configuration. The
   /// transformers can be constructed using [create].
+  ///
+  /// If [snapshot] is passed, the isolate will be loaded from that path if it
+  /// exists. Otherwise, a snapshot of the isolate's code will be saved to that
+  /// path once the isolate is loaded.
   static Future<TransformerIsolate> spawn(AssetEnvironment environment,
-      BarbackServer transformerServer, List<TransformerId> ids) {
+      BarbackServer transformerServer, List<TransformerId> ids,
+      {String snapshot}) {
     return mapFromIterableAsync(ids, value: (id) {
       return id.getAssetId(environment.barback);
     }).then((idsToAssetIds) {
       var baseUrl = transformerServer.url;
       var idsToUrls = mapMap(idsToAssetIds, value: (id, assetId) {
         var path = assetId.path.replaceFirst('lib/', '');
-        // TODO(nweiz): load from a "package:" URI when issue 12474 is fixed.
-        return baseUrl.resolve('packages/${id.package}/$path');
+        return Uri.parse('package:${id.package}/$path');
       });
 
       var code = new StringBuffer();
@@ -64,15 +68,16 @@
         code.writeln("import '$url';");
       }
 
-      code.writeln("import "
-          "r'$baseUrl/packages/\$pub/transformer_isolate.dart';");
+      code.writeln("import r'package:\$pub/transformer_isolate.dart';");
       code.writeln(
           "void main(_, SendPort replyTo) => loadTransformers(replyTo);");
 
       log.fine("Loading transformers from $ids");
 
       var port = new ReceivePort();
-      return dart.runInIsolate(code.toString(), port.sendPort)
+      return dart.runInIsolate(code.toString(), port.sendPort,
+              packageRoot: baseUrl.resolve('packages'),
+              snapshot: snapshot)
           .then((_) => port.first)
           .then((sendPort) {
         return new TransformerIsolate._(sendPort, environment.mode, idsToUrls);
@@ -83,9 +88,13 @@
         // TODO(nweiz): don't parse this as a string once issues 12617 and 12689
         // are fixed.
         var firstErrorLine = error.message.split('\n')[1];
-        var missingTransformer = idsToUrls.keys.firstWhere(
-            (id) => firstErrorLine.startsWith(
-                "Uncaught Error: Failure getting ${idsToUrls[id]}:"),
+
+        // The isolate error message contains the fully expanded path, not the
+        // "package:" URI, so we have to be liberal in what we look for in the
+        // error message.
+        var missingTransformer = idsToUrls.keys.firstWhere((id) =>
+            firstErrorLine.startsWith("Uncaught Error: Failure getting ") &&
+              firstErrorLine.contains(idsToUrls[id].path),
             orElse: () => throw error);
         var packageUri = idToPackageUri(idsToAssetIds[missingTransformer]);
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_loader.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_loader.dart
new file mode 100644
index 0000000..2d9f333
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_loader.dart
@@ -0,0 +1,131 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.barback.transformer_loader;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import '../log.dart' as log;
+import '../utils.dart';
+import 'asset_environment.dart';
+import 'barback_server.dart';
+import 'dart2js_transformer.dart';
+import 'excluding_transformer.dart';
+import 'transformer_config.dart';
+import 'transformer_id.dart';
+import 'transformer_isolate.dart';
+
+/// A class that loads transformers defined in specific files.
+class TransformerLoader {
+  final AssetEnvironment _environment;
+
+  final BarbackServer _transformerServer;
+
+  final _isolates = new Map<TransformerId, TransformerIsolate>();
+
+  final _transformers = new Map<TransformerConfig, Set<Transformer>>();
+
+  /// The packages that use each transformer id.
+  ///
+  /// Used for error reporting.
+  final _transformerUsers = new Map<TransformerId, Set<String>>();
+
+  TransformerLoader(this._environment, this._transformerServer) {
+    for (var package in _environment.graph.packages.values) {
+      for (var config in unionAll(package.pubspec.transformers)) {
+        _transformerUsers.putIfAbsent(config.id, () => new Set<String>())
+            .add(package.name);
+      }
+    }
+  }
+
+  /// Loads a transformer plugin isolate that imports the transformer libraries
+  /// indicated by [ids].
+  ///
+  /// Once the returned future completes, transformer instances from this
+  /// isolate can be created using [transformersFor] or [transformersForPhase].
+  ///
+  /// This skips any ids that have already been loaded.
+  Future load(Iterable<TransformerId> ids, {String snapshot}) async {
+    ids = ids.where((id) => !_isolates.containsKey(id)).toList();
+    if (ids.isEmpty) return;
+
+    var isolate = await log.progress("Loading ${toSentence(ids)} transformers",
+        () => TransformerIsolate.spawn(_environment, _transformerServer, ids,
+                  snapshot: snapshot));
+
+    for (var id in ids) {
+      _isolates[id] = isolate;
+    }
+  }
+
+  /// Instantiates and returns all transformers in the library indicated by
+  /// [config] with the given configuration.
+  ///
+  /// If this is called before the library has been loaded into an isolate via
+  /// [load], it will return an empty set.
+  Future<Set<Transformer>> transformersFor(TransformerConfig config) async {
+    if (_transformers.containsKey(config)) return _transformers[config];
+
+    if (_isolates.containsKey(config.id)) {
+      var transformers = await _isolates[config.id].create(config);
+      if (transformers.isNotEmpty) {
+        _transformers[config] = transformers;
+        return transformers;
+      }
+
+      var message = "No transformers";
+      if (config.configuration.isNotEmpty) {
+        message += " that accept configuration";
+      }
+
+      var location;
+      if (config.id.path == null) {
+        location = 'package:${config.id.package}/transformer.dart or '
+          'package:${config.id.package}/${config.id.package}.dart';
+      } else {
+        location = 'package:$config.dart';
+      }
+
+      var users = toSentence(ordered(_transformerUsers[config.id]));
+      fail("$message were defined in $location,\n"
+          "required by $users.");
+    } else if (config.id.package != '\$dart2js') {
+      return new Future.value(new Set());
+    }
+
+    // TODO(nweiz): This is currently wrapped in a non-async closure to work
+    // around https://github.com/dart-lang/async_await/issues/51. When that
+    // issue is fixed, make this inline.
+    var transformer = () {
+      try {
+        return new Dart2JSTransformer.withSettings(_environment,
+            new BarbackSettings(config.configuration, _environment.mode));
+      } on FormatException catch (error, stackTrace) {
+        fail(error.message, error, stackTrace);
+      }
+    }();
+
+    // Handle any exclusions.
+    _transformers[config] = new Set.from(
+        [ExcludingTransformer.wrap(transformer, config)]);
+    return _transformers[config];
+  }
+
+  /// Loads all transformers defined in each phase of [phases].
+  ///
+  /// If any library hasn't yet been loaded via [load], it will be ignored.
+  Future<List<Set<Transformer>>> transformersForPhases(
+      Iterable<Set<TransformerConfig>> phases) async {
+    var result = await Future.wait(phases.map((phase) async {
+      var transformers = await waitAndPrintErrors(phase.map(transformersFor));
+      return unionAll(transformers);
+    }));
+
+    // Return a growable list so that callers can add phases.
+    return result.toList();
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/cached_package.dart b/sdk/lib/_internal/pub/lib/src/cached_package.dart
new file mode 100644
index 0000000..6fac594
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/cached_package.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.cached_package;
+
+import 'package:path/path.dart' as p;
+import 'package:yaml/yaml.dart';
+
+import 'barback/transformer_config.dart';
+import 'io.dart';
+import 'package.dart';
+import 'pubspec.dart';
+import 'version.dart';
+
+/// A [Package] whose `lib` directory has been precompiled and cached.
+///
+/// When users of this class request path information about files that are
+/// cached, this returns the cached information. It also wraps the package's
+/// pubspec to report no transformers, since the transformations have all been
+/// applied already.
+class CachedPackage extends Package {
+  /// The directory contianing the cached assets from this package.
+  ///
+  /// Although only `lib` is cached, this directory corresponds to the root of
+  /// the package. The actual cached assets exist in `$_cacheDir/lib`.
+  final String _cacheDir;
+
+  /// Creates a new cached package wrapping [inner] with the cache at
+  /// [_cacheDir].
+  CachedPackage(Package inner, this._cacheDir)
+      : super(new _CachedPubspec(inner.pubspec), inner.dir);
+
+  String path(String part1, [String part2, String part3, String part4,
+      String part5, String part6, String part7]) {
+    if (_pathInCache(part1)) {
+      return p.join(_cacheDir, part1, part2, part3, part4, part5, part6, part7);
+    } else {
+      return super.path(part1, part2, part3, part4, part5, part6, part7);
+    }
+  }
+
+  String relative(String path) {
+    if (p.isWithin(path, _cacheDir)) return p.relative(path, from: _cacheDir);
+    return super.relative(path);
+  }
+
+  /// This will include the cached, transformed versions of files if [beneath]
+  /// is within a cached directory, but not otherwise.
+  List<String> listFiles({String beneath, recursive: true,
+      bool useGitIgnore: false}) {
+    if (beneath == null) {
+      return super.listFiles(recursive: recursive, useGitIgnore: useGitIgnore);
+    }
+
+    if (_pathInCache(beneath)) return listDir(p.join(_cacheDir, beneath));
+    return super.listFiles(beneath: beneath, recursive: recursive,
+        useGitIgnore: useGitIgnore);
+  }
+
+  /// Returns whether [relativePath], a path relative to the package's root,
+  /// is in a cached directory.
+  bool _pathInCache(String relativePath) => p.isWithin('lib', relativePath);
+}
+
+/// A pubspec wrapper that reports no transformers.
+class _CachedPubspec implements Pubspec {
+  final Pubspec _inner;
+
+  YamlMap get fields => _inner.fields;
+  String get name => _inner.name;
+  Version get version => _inner.version;
+  List<PackageDep> get dependencies => _inner.dependencies;
+  List<PackageDep> get devDependencies => _inner.devDependencies;
+  List<PackageDep> get dependencyOverrides => _inner.dependencyOverrides;
+  PubspecEnvironment get environment => _inner.environment;
+  String get publishTo => _inner.publishTo;
+  Map<String, String> get executables => _inner.executables;
+  bool get isPrivate => _inner.isPrivate;
+  bool get isEmpty => _inner.isEmpty;
+  List<PubspecException> get allErrors => _inner.allErrors;
+
+  List<Set<TransformerConfig>> get transformers => const [];
+
+  _CachedPubspec(this._inner);
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index d70bf17..0c92abd 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -197,7 +197,7 @@
     _cache = new SystemCache.withSources(cacheDir, isOffline: isOffline);
     _globals = new GlobalPackages(_cache);
 
-    return syncFuture(onRun);
+    return new Future.sync(onRun);
   }
 
   /// Override this to perform the specific command.
diff --git a/sdk/lib/_internal/pub/lib/src/command/barback.dart b/sdk/lib/_internal/pub/lib/src/command/barback.dart
index bfae53b..6f67c39 100644
--- a/sdk/lib/_internal/pub/lib/src/command/barback.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/barback.dart
@@ -107,7 +107,7 @@
 
     // Make sure all of the source directories exist.
     var missing = sourceDirectories.where(
-        (dir) => !dirExists(path.join(entrypoint.root.dir, dir)));
+        (dir) => !dirExists(entrypoint.root.path(dir)));
 
     if (missing.isNotEmpty) {
       dataError(_directorySentence(missing, "does", "do", "not exist"));
@@ -142,7 +142,7 @@
 
     // Include every build directory that exists in the package.
     var dirs = _allSourceDirectories.where(
-        (dir) => dirExists(path.join(entrypoint.root.dir, dir)));
+        (dir) => dirExists(entrypoint.root.path(dir)));
 
     if (dirs.isEmpty) {
       var defaultDirs = toSentence(_allSourceDirectories.map(
@@ -158,7 +158,7 @@
   /// on the command line.
   void _addDefaultSources() {
     sourceDirectories.addAll(defaultSourceDirectories.where(
-        (dir) => dirExists(path.join(entrypoint.root.dir, dir))));
+        (dir) => dirExists(entrypoint.root.path(dir))));
 
     // TODO(rnystrom): Hackish. Assumes there will only be one or two
     // default sources. That's true for pub build and serve, but isn't as
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index 0f1dc24..f1f6625 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -221,7 +221,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(entrypoint.root.dir,
+    var jsPath = entrypoint.root.path(
         outputDirectory, directory, 'packages', 'browser', '$name.js');
     ensureDir(path.dirname(jsPath));
 
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_activate.dart b/sdk/lib/_internal/pub/lib/src/command/global_activate.dart
index 8448af5..e78641b 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global_activate.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global_activate.dart
@@ -22,9 +22,33 @@
         help: "The source used to find the package.",
         allowed: ["git", "hosted", "path"],
         defaultsTo: "hosted");
+
+    commandParser.addFlag("no-executables", negatable: false,
+        help: "Do not put executables on PATH.");
+
+    commandParser.addOption("executable", abbr: "x",
+        help: "Executable(s) to place on PATH.",
+        allowMultiple: true);
+
+    commandParser.addFlag("overwrite", negatable: false,
+        help: "Overwrite executables from other packages with the same name.");
   }
 
   Future onRun() {
+    // Default to `null`, which means all executables.
+    var executables;
+    if (commandOptions.wasParsed("executable")) {
+      if (commandOptions.wasParsed("no-executables")) {
+        usageError("Cannot pass both --no-executables and --executable.");
+      }
+
+      executables = commandOptions["executable"];
+    } else if (commandOptions["no-executables"]) {
+      // An empty list means no executables.
+      executables = [];
+    }
+
+    var overwrite = commandOptions["overwrite"];
     var args = commandOptions.rest;
 
     readArg([String error]) {
@@ -46,7 +70,8 @@
         var repo = readArg("No Git repository given.");
         // TODO(rnystrom): Allow passing in a Git ref too.
         validateNoExtraArgs();
-        return globals.activateGit(repo);
+        return globals.activateGit(repo, executables,
+            overwriteBinStubs: overwrite);
 
       case "hosted":
         var package = readArg("No package to activate given.");
@@ -62,12 +87,14 @@
         }
 
         validateNoExtraArgs();
-        return globals.activateHosted(package, constraint);
+        return globals.activateHosted(package, constraint, executables,
+            overwriteBinStubs: overwrite);
 
       case "path":
         var path = readArg("No package to activate given.");
         validateNoExtraArgs();
-        return globals.activatePath(path);
+        return globals.activatePath(path, executables,
+            overwriteBinStubs: overwrite);
     }
 
     throw "unreachable";
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_deactivate.dart b/sdk/lib/_internal/pub/lib/src/command/global_deactivate.dart
index 2148347..4e96655 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global_deactivate.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global_deactivate.dart
@@ -29,7 +29,7 @@
       usageError("Unexpected $arguments ${toSentence(unexpected)}.");
     }
 
-    if (!globals.deactivate(commandOptions.rest.first, logDeactivate: true)) {
+    if (!globals.deactivate(commandOptions.rest.first)) {
       dataError("No active package ${log.bold(commandOptions.rest.first)}.");
     }
 
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_run.dart b/sdk/lib/_internal/pub/lib/src/command/global_run.dart
index ae47a05..06783e5 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global_run.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global_run.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 
+import 'package:barback/barback.dart';
 import 'package:path/path.dart' as p;
 
 import '../command.dart';
@@ -21,6 +22,14 @@
       "NOTE: We are currently optimizing this command's startup time.";
   String get usage => "pub global run <package>:<executable> [args...]";
 
+  /// The mode for barback transformers.
+  BarbackMode get mode => new BarbackMode(commandOptions["mode"]);
+
+  GlobalRunCommand() {
+    commandParser.addOption("mode", defaultsTo: "release",
+        help: 'Mode to run transformers in.');
+  }
+
   Future onRun() async {
     if (commandOptions.rest.isEmpty) {
       usageError("Must specify an executable to run.");
@@ -45,7 +54,8 @@
           'package.');
     }
 
-    var exitCode = await globals.runExecutable(package, executable, args);
+    var exitCode = await globals.runExecutable(package, executable, args,
+        mode: mode);
     await flushThenExit(exitCode);
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/lish.dart b/sdk/lib/_internal/pub/lib/src/command/lish.dart
index 01dd0bf..2b0a506 100644
--- a/sdk/lib/_internal/pub/lib/src/command/lish.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/lish.dart
@@ -117,7 +117,7 @@
               'pubspec.');
     }
 
-    var files = entrypoint.root.listFiles();
+    var files = entrypoint.root.listFiles(useGitIgnore: true);
     log.fine('Archiving and publishing ${entrypoint.root}.');
 
     // Show the package contents so the user can verify they look OK.
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 87c3a69..ae6c9c3 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
@@ -46,7 +46,7 @@
     output["packages"] = packages;
 
     // Include the self link.
-    packages[entrypoint.root.name] = path.join(entrypoint.root.dir, "lib");
+    packages[entrypoint.root.name] = entrypoint.root.path("lib");
 
     // Include the file(s) which when modified will affect the results. For pub,
     // that's just the pubspec and lockfile.
diff --git a/sdk/lib/_internal/pub/lib/src/command/run.dart b/sdk/lib/_internal/pub/lib/src/command/run.dart
index 1e3a501..42a0d37 100644
--- a/sdk/lib/_internal/pub/lib/src/command/run.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/run.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 
+import 'package:barback/barback.dart';
 import 'package:path/path.dart' as p;
 
 import '../command.dart';
@@ -21,6 +22,13 @@
       "NOTE: We are currently optimizing this command's startup time.";
   String get usage => "pub run <executable> [args...]";
 
+  RunCommand() {
+    commandParser.addOption("mode",
+        help: 'Mode to run transformers in.\n'
+              '(defaults to "release" for dependencies, "debug" for '
+                'entrypoint)');
+  }
+
   Future onRun() async {
     if (commandOptions.rest.isEmpty) {
       usageError("Must specify an executable to run.");
@@ -45,7 +53,17 @@
       }
     }
 
-    var exitCode = await runExecutable(entrypoint, package, executable, args);
+    var mode;
+    if (commandOptions['mode'] != null) {
+      mode = new BarbackMode(commandOptions['mode']);
+    } else if (package == entrypoint.root.name) {
+      mode = BarbackMode.DEBUG;
+    } else {
+      mode = BarbackMode.RELEASE;
+    }
+
+    var exitCode = await runExecutable(entrypoint, package, executable, args,
+        mode: mode);
     await flushThenExit(exitCode);
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/uploader.dart b/sdk/lib/_internal/pub/lib/src/command/uploader.dart
index 0324dcb..f74915d 100644
--- a/sdk/lib/_internal/pub/lib/src/command/uploader.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/uploader.dart
@@ -16,7 +16,6 @@
 import '../log.dart' as log;
 import '../oauth2.dart' as oauth2;
 import '../source/hosted.dart';
-import '../utils.dart';
 
 /// Handles the `uploader` pub command.
 class UploaderCommand extends PubCommand {
@@ -58,7 +57,7 @@
       return flushThenExit(exit_codes.USAGE);
     }
 
-    return syncFuture(() {
+    return new Future.sync(() {
       var package = commandOptions['package'];
       if (package != null) return package;
       return new Entrypoint(path.current, cache).root.name;
diff --git a/sdk/lib/_internal/pub/lib/src/dart.dart b/sdk/lib/_internal/pub/lib/src/dart.dart
index 50bdd2c..0b5ab8c 100644
--- a/sdk/lib/_internal/pub/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub/lib/src/dart.dart
@@ -6,11 +6,11 @@
 library pub.dart;
 
 import 'dart:async';
+import 'dart:io';
 import 'dart:isolate';
 
 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'
@@ -18,8 +18,8 @@
 
 import '../../asset/dart/serialize.dart';
 import 'io.dart';
+import 'log.dart' as log;
 
-import 'utils.dart';
 /// Interface to communicate with dart2js.
 ///
 /// This is basically an amalgamation of dart2js's
@@ -71,7 +71,7 @@
     bool terse: false,
     bool includeSourceMapUrls: false,
     bool toDart: false}) {
-  return syncFuture(() {
+  return new Future.sync(() {
     var options = <String>['--categories=Client,Server'];
     if (checked) options.add('--enable-checked-mode');
     if (csp) options.add('--csp');
@@ -99,7 +99,7 @@
       packageRoot = path.join(path.dirname(entrypoint), 'packages');
     }
 
-    return Chain.track(compiler.compile(
+    return compiler.compile(
         path.toUri(entrypoint),
         provider.libraryRoot,
         path.toUri(appendSlash(packageRoot)),
@@ -107,7 +107,7 @@
         provider.handleDiagnostic,
         options,
         provider.provideOutput,
-        environment));
+        environment);
   });
 }
 
@@ -147,24 +147,57 @@
 /// passed to the [main] method of the code being run; the caller is responsible
 /// for using this to establish communication with the isolate.
 ///
-/// Returns a Future that will fire when the isolate has been spawned. If the
-/// isolate fails to spawn, the Future will complete with an error.
-Future runInIsolate(String code, message) {
-  return withTempDir((dir) {
+/// [packageRoot] controls the package root of the isolate. It may be either a
+/// [String] or a [Uri].
+///
+/// If [snapshot] is passed, the isolate will be loaded from that path if it
+/// exists. Otherwise, a snapshot of the isolate's code will be saved to that
+/// path once the isolate is loaded.
+Future runInIsolate(String code, message, {packageRoot, String snapshot})
+    async {
+  if (snapshot != null && fileExists(snapshot)) {
+    log.fine("Spawning isolate from $snapshot.");
+    if (packageRoot != null) packageRoot = packageRoot.toString();
+    try {
+      await Isolate.spawnUri(path.toUri(snapshot), [], message,
+          packageRoot: packageRoot);
+      return;
+    } on IsolateSpawnException catch (error) {
+      log.fine("Couldn't load existing snapshot $snapshot:\n$error");
+      // Do nothing, we will regenerate the snapshot below.
+    }
+  }
+
+  await withTempDir((dir) async {
     var dartPath = path.join(dir, 'runInIsolate.dart');
     writeTextFile(dartPath, code, dontLogContents: true);
     var port = new ReceivePort();
-    return Chain.track(Isolate.spawn(_isolateBuffer, {
+    await Isolate.spawn(_isolateBuffer, {
       'replyTo': port.sendPort,
       'uri': path.toUri(dartPath).toString(),
+      'packageRoot': packageRoot == null ? null : packageRoot.toString(),
       'message': message
-    })).then((_) => port.first).then((response) {
-      if (response['type'] == 'success') return null;
-      assert(response['type'] == 'error');
-      return new Future.error(
-          new CrossIsolateException.deserialize(response['error']),
-          new Chain.current());
     });
+
+    var response = await port.first;
+    if (response['type'] == 'error') {
+      throw new CrossIsolateException.deserialize(response['error']);
+    }
+
+    if (snapshot == null) return;
+
+    ensureDir(path.dirname(snapshot));
+    var snapshotArgs = [];
+    if (packageRoot != null) snapshotArgs.add('--package-root=$packageRoot');
+    snapshotArgs.addAll(['--snapshot=$snapshot', dartPath]);
+    var result = await runProcess(Platform.executable, snapshotArgs);
+
+    if (result.success) return;
+
+    // Don't emit a fatal error here, since we don't want to crash the
+    // otherwise successful isolate load.
+    log.warning("Failed to compile a snapshot to "
+        "${path.relative(snapshot)}:\n" + result.stderr.join("\n"));
   });
 }
 
@@ -176,8 +209,10 @@
 /// Adding an additional isolate in the middle works around this.
 void _isolateBuffer(message) {
   var replyTo = message['replyTo'];
-  Chain.track(Isolate.spawnUri(
-          Uri.parse(message['uri']), [], message['message']))
+  var packageRoot = message['packageRoot'];
+  if (packageRoot != null) packageRoot = Uri.parse(packageRoot);
+  Isolate.spawnUri(Uri.parse(message['uri']), [], message['message'],
+          packageRoot: packageRoot)
       .then((_) => replyTo.send({'type': 'success'}))
       .catchError((e, stack) {
     replyTo.send({
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index fddd024..f871747 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -73,7 +73,7 @@
       : _packageSymlinks = false;
 
   /// The path to the entrypoint's "packages" directory.
-  String get packagesDir => path.join(root.dir, 'packages');
+  String get packagesDir => root.path('packages');
 
   /// `true` if the entrypoint package currently has a lock file.
   bool get lockFileExists => _lockFile != null || entryExists(lockFilePath);
@@ -91,10 +91,10 @@
   }
 
   /// The path to the entrypoint package's pubspec.
-  String get pubspecPath => path.join(root.dir, 'pubspec.yaml');
+  String get pubspecPath => root.path('pubspec.yaml');
 
   /// The path to the entrypoint package's lockfile.
-  String get lockFilePath => path.join(root.dir, 'pubspec.lock');
+  String get lockFilePath => root.path('pubspec.lock');
 
   /// Gets all dependencies of the [root] package.
   ///
@@ -111,52 +111,126 @@
   /// the report. Otherwise, only dependencies that were changed are shown. If
   /// [dryRun] is `true`, no physical changes are made.
   Future acquireDependencies(SolveType type, {List<String> useLatest,
-      bool dryRun: false}) {
-    return syncFuture(() {
-      return resolveVersions(type, cache.sources, root, lockFile: lockFile,
-          useLatest: useLatest);
-    }).then((result) {
-      if (!result.succeeded) throw result.error;
+      bool dryRun: false}) async {
+    var result = await resolveVersions(type, cache.sources, root,
+        lockFile: lockFile, useLatest: useLatest);
+    if (!result.succeeded) throw result.error;
 
-      result.showReport(type);
+    result.showReport(type);
 
-      if (dryRun) {
-        result.summarizeChanges(type, dryRun: dryRun);
-        return null;
+    if (dryRun) {
+      result.summarizeChanges(type, dryRun: dryRun);
+      return;
+    }
+
+    // Install the packages and maybe link them into the entrypoint.
+    if (_packageSymlinks) {
+      cleanDir(packagesDir);
+    } else {
+      deleteEntry(packagesDir);
+    }
+
+    var ids = await Future.wait(result.packages.map(_get));
+    _saveLockFile(ids);
+
+    if (_packageSymlinks) _linkSelf();
+    _linkOrDeleteSecondaryPackageDirs();
+
+    result.summarizeChanges(type, dryRun: dryRun);
+
+    /// Build a package graph from the version solver results so we don't
+    /// have to reload and reparse all the pubspecs.
+    var packageGraph = await loadPackageGraph(result);
+    packageGraph.loadTransformerCache().clearIfOutdated(result.changedPackages);
+
+    // TODO(nweiz): Use await here when
+    // https://github.com/dart-lang/async_await/issues/51 is fixed.
+    return precompileDependencies(changed: result.changedPackages).then((_) {
+      return precompileExecutables(changed: result.changedPackages);
+    }).catchError((error, stackTrace) {
+      // Just log exceptions here. Since the method is just about acquiring
+      // dependencies, it shouldn't fail unless that fails.
+      log.exception(error, stackTrace);
+    });
+  }
+
+  /// Precompile any transformed dependencies of the entrypoint.
+  ///
+  /// If [changed] is passed, only dependencies whose contents might be changed
+  /// if one of the given packages changes will be recompiled.
+  Future precompileDependencies({Iterable<String> changed}) async {
+    if (changed != null) changed = changed.toSet();
+
+    var graph = await loadPackageGraph();
+
+    // Just precompile the debug version of a package. We're mostly interested
+    // in improving speed for development iteration loops, which usually use
+    // debug mode.
+    var depsDir = path.join('.pub', 'deps', 'debug');
+
+    var dependenciesToPrecompile = graph.packages.values.where((package) {
+      if (package.pubspec.transformers.isEmpty) return false;
+      if (graph.isPackageMutable(package.name)) return false;
+      if (!dirExists(path.join(depsDir, package.name))) return true;
+      if (changed == null) return true;
+
+      /// Only recompile [package] if any of its transitive dependencies have
+      /// changed. We check all transitive dependencies because it's possible
+      /// that a transformer makes decisions based on their contents.
+      return overlaps(
+          graph.transitiveDependencies(package.name)
+            .map((package) => package.name).toSet(),
+          changed);
+    }).map((package) => package.name).toSet();
+
+    if (dependenciesToPrecompile.isEmpty) return;
+
+    await log.progress("Precompiling dependencies", () async {
+      var packagesToLoad =
+          unionAll(dependenciesToPrecompile.map(graph.transitiveDependencies))
+          .map((package) => package.name).toSet();
+
+      for (var package in dependenciesToPrecompile) {
+        deleteEntry(path.join(depsDir, package));
       }
 
-      // Install the packages and maybe link them into the entrypoint.
-      if (_packageSymlinks) {
-        cleanDir(packagesDir);
-      } else {
-        deleteEntry(packagesDir);
+      var environment = await AssetEnvironment.create(this, BarbackMode.DEBUG,
+          packages: packagesToLoad, useDart2JS: false);
+
+      /// Ignore barback errors since they'll be emitted via [getAllAssets]
+      /// below.
+      environment.barback.errors.listen((_) {});
+
+      // TODO(nweiz): only get assets from [dependenciesToPrecompile] so as not
+      // to trigger unnecessary lazy transformers.
+      var assets = await environment.barback.getAllAssets();
+      await waitAndPrintErrors(assets.map((asset) async {
+        if (!dependenciesToPrecompile.contains(asset.id.package)) return;
+
+        var destPath = path.join(
+            depsDir, asset.id.package, path.fromUri(asset.id.path));
+        ensureDir(path.dirname(destPath));
+        await createFileFromStream(asset.read(), destPath);
+      }));
+
+      log.message("Precompiled " +
+          toSentence(ordered(dependenciesToPrecompile).map(log.bold)) + ".");
+    }).catchError((error) {
+      // TODO(nweiz): Do this in a catch clause when async_await supports
+      // "rethrow" (https://github.com/dart-lang/async_await/issues/46).
+      // TODO(nweiz): When barback does a better job of associating errors with
+      // assets (issue 19491), catch and handle compilation errors on a
+      // per-package basis.
+      for (var package in dependenciesToPrecompile) {
+        deleteEntry(path.join(depsDir, package));
       }
-
-      return Future.wait(result.packages.map(_get)).then((ids) {
-        _saveLockFile(ids);
-
-        if (_packageSymlinks) _linkSelf();
-        _linkOrDeleteSecondaryPackageDirs();
-
-        result.summarizeChanges(type, dryRun: dryRun);
-
-        /// Build a package graph from the version solver results so we don't
-        /// have to reload and reparse all the pubspecs.
-        return loadPackageGraph(result);
-      }).then((packageGraph) {
-        return precompileExecutables(changed: result.changedPackages)
-            .catchError((error, stackTrace) {
-          // Just log exceptions here. Since the method is just about acquiring
-          // dependencies, it shouldn't fail unless that fails.
-          log.exception(error, stackTrace);
-        });
-      });
+      throw error;
     });
   }
 
   /// Precompiles all executables from dependencies that don't transitively
   /// depend on [this] or on a path dependency.
-  Future precompileExecutables({Iterable<String> changed}) {
+  Future precompileExecutables({Iterable<String> changed}) async {
     if (changed != null) changed = changed.toSet();
 
     var binDir = path.join('.pub', 'bin');
@@ -169,44 +243,44 @@
         readTextFile(sdkVersionPath) == "${sdk.version}\n";
     if (!sdkMatches) changed = null;
 
-    return loadPackageGraph().then((graph) {
-      var executables = new Map.fromIterable(root.immediateDependencies,
-          key: (dep) => dep.name,
-          value: (dep) => _executablesForPackage(graph, dep.name, changed));
+    var graph = await loadPackageGraph();
+    var executables = new Map.fromIterable(root.immediateDependencies,
+        key: (dep) => dep.name,
+        value: (dep) => _executablesForPackage(graph, dep.name, changed));
 
-      for (var package in executables.keys.toList()) {
-        if (executables[package].isEmpty) executables.remove(package);
-      }
+    for (var package in executables.keys.toList()) {
+      if (executables[package].isEmpty) executables.remove(package);
+    }
 
-      if (!sdkMatches) deleteEntry(binDir);
-      if (executables.isEmpty) return null;
+    if (!sdkMatches) deleteEntry(binDir);
+    if (executables.isEmpty) return;
 
-      return log.progress("Precompiling executables", () {
-        ensureDir(binDir);
+    await log.progress("Precompiling executables", () async {
+      ensureDir(binDir);
 
-        // Make sure there's a trailing newline so our version file matches the
-        // SDK's.
-        writeTextFile(sdkVersionPath, "${sdk.version}\n");
+      // Make sure there's a trailing newline so our version file matches the
+      // SDK's.
+      writeTextFile(sdkVersionPath, "${sdk.version}\n");
 
-        var packagesToLoad =
-            unionAll(executables.keys.map(graph.transitiveDependencies))
-            .map((package) => package.name).toSet();
-        return AssetEnvironment.create(this, BarbackMode.RELEASE,
-            packages: packagesToLoad,
-            useDart2JS: false).then((environment) {
-          environment.barback.errors.listen((error) {
-            log.error(log.red("Build error:\n$error"));
-          });
-
-          return waitAndPrintErrors(executables.keys.map((package) {
-            var dir = path.join(binDir, package);
-            cleanDir(dir);
-            return environment.precompileExecutables(
-                package, dir,
-                executableIds: executables[package]);
-          }));
-        });
+      var packagesToLoad =
+          unionAll(executables.keys.map(graph.transitiveDependencies))
+          .map((package) => package.name).toSet();
+      var executableIds = unionAll(
+          executables.values.map((ids) => ids.toSet()));
+      var environment = await AssetEnvironment.create(this, BarbackMode.RELEASE,
+          packages: packagesToLoad,
+          entrypoints: executableIds,
+          useDart2JS: false);
+      environment.barback.errors.listen((error) {
+        log.error(log.red("Build error:\n$error"));
       });
+
+      await waitAndPrintErrors(executables.keys.map((package) async {
+        var dir = path.join(binDir, package);
+        cleanDir(dir);
+        await environment.precompileExecutables(package, dir,
+            executableIds: executables[package]);
+      }));
     });
   }
 
@@ -218,18 +292,9 @@
   List<AssetId> _executablesForPackage(PackageGraph graph, String packageName,
       Set<String> changed) {
     var package = graph.packages[packageName];
-    var binDir = path.join(package.dir, 'bin');
+    var binDir = package.path('bin');
     if (!dirExists(binDir)) return [];
-
-    // If the lockfile has a dependency on the entrypoint or on a path
-    // dependency, its executables could change at any point, so we
-    // shouldn't precompile them.
-    var deps = graph.transitiveDependencies(packageName);
-    var hasUncachedDependency = deps.any((package) {
-      var source = cache.sources[graph.lockFile.packages[package.name].source];
-      return source is! CachedSource;
-    });
-    if (hasUncachedDependency) return [];
+    if (graph.isPackageMutable(packageName)) return [];
 
     var executables = package.executableIds;
 
@@ -238,7 +303,8 @@
     if (changed == null) return executables;
 
     // If any of the package's dependencies changed, recompile the executables.
-    if (deps.any((package) => changed.contains(package.name))) {
+    if (graph.transitiveDependencies(packageName)
+        .any((package) => changed.contains(package.name))) {
       return executables;
     }
 
@@ -263,7 +329,7 @@
     if (id.isRoot) return new Future.value(id);
 
     var source = cache.sources[id.source];
-    return syncFuture(() {
+    return new Future.sync(() {
       if (!_packageSymlinks) {
         if (source is! CachedSource) return null;
         return source.downloadToSystemCache(id);
@@ -328,7 +394,7 @@
   /// Gets dependencies if the lockfile is out of date with respect to the
   /// pubspec.
   Future ensureLockFileIsUpToDate() {
-    return syncFuture(() {
+    return new Future.sync(() {
       // If we don't have a current lock file, we definitely need to install.
       if (!_isLockFileUpToDate(lockFile)) {
         if (lockFileExists) {
@@ -369,7 +435,7 @@
   Future<PackageGraph> loadPackageGraph([SolveResult result]) {
     if (_packageGraph != null) return new Future.value(_packageGraph);
 
-    return syncFuture(() {
+    return new Future.sync(() {
       if (result != null) {
         return Future.wait(result.packages.map((id) {
           return cache.sources[id.source].getDirectory(id)
@@ -400,7 +466,7 @@
   /// Saves a list of concrete package versions to the `pubspec.lock` file.
   void _saveLockFile(List<PackageId> packageIds) {
     _lockFile = new LockFile(packageIds);
-    var lockFilePath = path.join(root.dir, 'pubspec.lock');
+    var lockFilePath = root.path('pubspec.lock');
     writeTextFile(lockFilePath, _lockFile.serialize(root.dir, cache.sources));
   }
 
@@ -423,12 +489,12 @@
   void _linkOrDeleteSecondaryPackageDirs() {
     // Only the main "bin" directory gets a "packages" directory, not its
     // subdirectories.
-    var binDir = path.join(root.dir, 'bin');
+    var binDir = root.path('bin');
     if (dirExists(binDir)) _linkOrDeleteSecondaryPackageDir(binDir);
 
     // The others get "packages" directories in subdirectories too.
     for (var dir in ['benchmark', 'example', 'test', 'tool', 'web']) {
-      _linkOrDeleteSecondaryPackageDirsRecursively(path.join(root.dir, dir));
+      _linkOrDeleteSecondaryPackageDirsRecursively(root.path(dir));
     }
  }
 
diff --git a/sdk/lib/_internal/pub/lib/src/executable.dart b/sdk/lib/_internal/pub/lib/src/executable.dart
index b4d6cf5..3810592 100644
--- a/sdk/lib/_internal/pub/lib/src/executable.dart
+++ b/sdk/lib/_internal/pub/lib/src/executable.dart
@@ -21,24 +21,54 @@
 /// Runs [executable] from [package] reachable from [entrypoint].
 ///
 /// The executable string is a relative Dart file path using native path
-/// separators without a trailing ".dart" extension. It is contained within
-/// [package], which should either be the entrypoint package or an immediate
-/// dependency of it.
+/// separators with or without a trailing ".dart" extension. It is contained
+/// within [package], which should either be the entrypoint package or an
+/// immediate dependency of it.
 ///
 /// Arguments from [args] will be passed to the spawned Dart application.
 ///
+/// If [mode] is passed, it's used as the barback mode; it defaults to
+/// [BarbackMode.RELEASE].
+///
 /// Returns the exit code of the spawned app.
 Future<int> runExecutable(Entrypoint entrypoint, String package,
-    String executable, Iterable<String> args, {bool isGlobal: false}) async {
+    String executable, Iterable<String> args, {bool isGlobal: false,
+    BarbackMode mode}) async {
+  if (mode == null) mode = BarbackMode.RELEASE;
+
+  // Make sure the package is an immediate dependency of the entrypoint or the
+  // entrypoint itself.
+  if (entrypoint.root.name != package &&
+      !entrypoint.root.immediateDependencies
+          .any((dep) => dep.name == package)) {
+    var graph = await entrypoint.loadPackageGraph();
+    if (graph.packages.containsKey(package)) {
+      dataError('Package "$package" is not an immediate dependency.\n'
+          'Cannot run executables in transitive dependencies.');
+    } else {
+      dataError('Could not find package "$package". Did you forget to add a '
+          'dependency?');
+    }
+  }
+
   // Unless the user overrides the verbosity, we want to filter out the
   // normal pub output shown while loading the environment.
   if (log.verbosity == log.Verbosity.NORMAL) {
     log.verbosity = log.Verbosity.WARNING;
   }
 
+  // Ignore a trailing extension.
+  if (p.extension(executable) == ".dart") {
+    executable = p.withoutExtension(executable);
+  }
+
   var localSnapshotPath = p.join(".pub", "bin", package,
       "$executable.dart.snapshot");
-  if (!isGlobal && fileExists(localSnapshotPath)) {
+  if (!isGlobal && fileExists(localSnapshotPath) &&
+      // Dependencies are only snapshotted in release mode, since that's the
+      // default mode for them to run. We can't run them in a different mode
+      // using the snapshot.
+      mode == BarbackMode.RELEASE) {
     return _runCachedExecutable(entrypoint, localSnapshotPath, args);
   }
 
@@ -54,10 +84,13 @@
     executable = p.join("bin", executable);
   }
 
+  var assetPath = "${p.url.joinAll(p.split(executable))}.dart";
+  var id = new AssetId(package, assetPath);
+
   // TODO(nweiz): Use [packages] to only load assets from packages that the
   // executable might load.
-  var environment = await AssetEnvironment.create(entrypoint,
-      BarbackMode.RELEASE, useDart2JS: false);
+  var environment = await AssetEnvironment.create(entrypoint, mode,
+      useDart2JS: false, entrypoints: [id]);
   environment.barback.errors.listen((error) {
     log.error(log.red("Build error:\n$error"));
   });
@@ -69,27 +102,10 @@
     // will work from within some deeply nested script.
     server = await environment.serveDirectory(rootDir);
   } else {
-    // Make sure the dependency exists.
-    var dep = entrypoint.root.immediateDependencies.firstWhere(
-        (dep) => dep.name == package, orElse: () => null);
-    if (dep == null) {
-      if (environment.graph.packages.containsKey(package)) {
-        dataError('Package "$package" is not an immediate dependency.\n'
-            'Cannot run executables in transitive dependencies.');
-      } else {
-        dataError('Could not find package "$package". Did you forget to '
-            'add a dependency?');
-      }
-    }
-
     // For other packages, always use the "bin" directory.
     server = await environment.servePackageBinDirectory(package);
   }
 
-  // Try to make sure the entrypoint script exists (or is generated) before
-  // we spawn the process to run it.
-  var assetPath = "${p.url.joinAll(p.split(executable))}.dart";
-  var id = new AssetId(server.package, assetPath);
   // TODO(rnystrom): Use try/catch here when
   // https://github.com/dart-lang/async_await/issues/4 is fixed.
   return environment.barback.getAssetById(id).then((_) async {
diff --git a/sdk/lib/_internal/pub/lib/src/global_packages.dart b/sdk/lib/_internal/pub/lib/src/global_packages.dart
index 6f3da60..c51e545 100644
--- a/sdk/lib/_internal/pub/lib/src/global_packages.dart
+++ b/sdk/lib/_internal/pub/lib/src/global_packages.dart
@@ -18,14 +18,19 @@
 import 'log.dart' as log;
 import 'package.dart';
 import 'pubspec.dart';
-import 'system_cache.dart';
+import 'sdk.dart' as sdk;
 import 'solver/version_solver.dart';
 import 'source/cached.dart';
 import 'source/git.dart';
 import 'source/path.dart';
+import 'system_cache.dart';
 import 'utils.dart';
 import 'version.dart';
 
+/// Matches the package name that a binstub was created for inside the contents
+/// of the shell script.
+final _binStubPackagePattern = new RegExp(r"Package: ([a-zA-Z0-9_-]+)");
+
 /// Maintains the set of packages that have been globally activated.
 ///
 /// These have been hand-chosen by the user to make their executables in bin/
@@ -57,6 +62,9 @@
   /// The directory where the lockfiles for activated packages are stored.
   String get _directory => p.join(cache.rootDir, "global_packages");
 
+  /// The directory where binstubs for global package executables are stored.
+  String get _binStubDir => p.join(cache.rootDir, "bin");
+
   /// Creates a new global package registry backed by the given directory on
   /// the user's file system.
   ///
@@ -66,7 +74,16 @@
 
   /// Caches the package located in the Git repository [repo] and makes it the
   /// active global version.
-  Future activateGit(String repo) async {
+  ///
+  /// [executables] is the names of the executables that should have binstubs.
+  /// If `null`, all executables in the package will get binstubs. If empty, no
+  /// binstubs will be created.
+  ///
+  /// if [overwriteBinStubs] is `true`, any binstubs that collide with
+  /// existing binstubs in other packages will be overwritten by this one's.
+  /// Otherwise, the previous ones will be preserved.
+  Future activateGit(String repo, List<String> executables,
+      {bool overwriteBinStubs}) async {
     var source = cache.sources["git"] as GitSource;
     var name = await source.getPackageNameFromRepo(repo);
     // Call this just to log what the current active package is, if any.
@@ -77,18 +94,38 @@
     // be a mechanism for redoing dependency resolution if a path pubspec has
     // changed (see also issue 20499).
     await _installInCache(
-        new PackageDep(name, "git", VersionConstraint.any, repo));
+        new PackageDep(name, "git", VersionConstraint.any, repo),
+        executables, overwriteBinStubs: overwriteBinStubs);
   }
 
   /// Finds the latest version of the hosted package with [name] that matches
   /// [constraint] and makes it the active global version.
-  Future activateHosted(String name, VersionConstraint constraint) {
+  ///
+  /// [executables] is the names of the executables that should have binstubs.
+  /// If `null`, all executables in the package will get binstubs. If empty, no
+  /// binstubs will be created.
+  ///
+  /// if [overwriteBinStubs] is `true`, any binstubs that collide with
+  /// existing binstubs in other packages will be overwritten by this one's.
+  /// Otherwise, the previous ones will be preserved.
+  Future activateHosted(String name, VersionConstraint constraint,
+      List<String> executables, {bool overwriteBinStubs}) async {
     _describeActive(name);
-    return _installInCache(new PackageDep(name, "hosted", constraint, name));
+    await _installInCache(new PackageDep(name, "hosted", constraint, name),
+        executables, overwriteBinStubs: overwriteBinStubs);
   }
 
   /// Makes the local package at [path] globally active.
-  Future activatePath(String path) async {
+  ///
+  /// [executables] is the names of the executables that should have binstubs.
+  /// If `null`, all executables in the package will get binstubs. If empty, no
+  /// binstubs will be created.
+  ///
+  /// if [overwriteBinStubs] is `true`, any binstubs that collide with
+  /// existing binstubs in other packages will be overwritten by this one's.
+  /// Otherwise, the previous ones will be preserved.
+  Future activatePath(String path, List<String> executables,
+      {bool overwriteBinStubs}) async {
     var entrypoint = new Entrypoint(path, cache);
 
     // Get the package's dependencies.
@@ -109,10 +146,14 @@
 
     var binDir = p.join(_directory, name, 'bin');
     if (dirExists(binDir)) deleteEntry(binDir);
+
+    _updateBinStubs(entrypoint.root, executables,
+        overwriteBinStubs: overwriteBinStubs);
   }
 
   /// Installs the package [dep] and its dependencies into the system cache.
-  Future _installInCache(PackageDep dep) async {
+  Future _installInCache(PackageDep dep, List<String> executables,
+      {bool overwriteBinStubs}) async {
     var source = cache.sources[dep.source];
 
     // Create a dummy package with just [dep] so we can do resolution on it.
@@ -138,25 +179,34 @@
     // the pubspecs.
     var graph = await new Entrypoint.inMemory(root, lockFile, cache)
         .loadPackageGraph(result);
-    await _precompileExecutables(graph.entrypoint, dep.name);
+    var snapshots = await _precompileExecutables(graph.entrypoint, dep.name);
     _writeLockFile(dep.name, lockFile);
+
+    _updateBinStubs(graph.packages[dep.name], executables,
+        overwriteBinStubs: overwriteBinStubs, snapshots: snapshots);
   }
 
   /// Precompiles the executables for [package] and saves them in the global
   /// cache.
-  Future _precompileExecutables(Entrypoint entrypoint, String package) {
-    return log.progress("Precompiling executables", () {
+  ///
+  /// Returns a map from executable name to path for the snapshots that were
+  /// successfully precompiled.
+  Future<Map<String, String>> _precompileExecutables(Entrypoint entrypoint,
+      String package) {
+    return log.progress("Precompiling executables", () async {
       var binDir = p.join(_directory, package, 'bin');
       cleanDir(binDir);
 
-      return AssetEnvironment.create(entrypoint, BarbackMode.RELEASE,
-          useDart2JS: false).then((environment) {
-        environment.barback.errors.listen((error) {
-          log.error(log.red("Build error:\n$error"));
-        });
-
-        return environment.precompileExecutables(package, binDir);
+      var graph = await entrypoint.loadPackageGraph();
+      var environment = await AssetEnvironment.create(
+          entrypoint, BarbackMode.RELEASE,
+          entrypoints: graph.packages[package].executableIds,
+          useDart2JS: false);
+      environment.barback.errors.listen((error) {
+        log.error(log.red("Build error:\n$error"));
       });
+
+      return environment.precompileExecutables(package, binDir);
     });
   }
 
@@ -188,7 +238,6 @@
 
     var id = lockFile.packages[package];
     log.message('Activated ${_formatPackage(id)}.');
-
   }
 
   /// Shows the user the currently active package with [name], if any.
@@ -217,19 +266,16 @@
 
   /// Deactivates a previously-activated package named [name].
   ///
-  /// If [logDeactivate] is true, displays to the user when a package is
-  /// deactivated. Otherwise, deactivates silently.
-  ///
   /// Returns `false` if no package with [name] was currently active.
-  bool deactivate(String name, {bool logDeactivate: false}) {
+  bool deactivate(String name) {
     var dir = p.join(_directory, name);
     if (!dirExists(dir)) return false;
 
-    if (logDeactivate) {
-      var lockFile = new LockFile.load(_getLockFilePath(name), cache.sources);
-      var id = lockFile.packages[name];
-      log.message('Deactivated package ${_formatPackage(id)}.');
-    }
+    _deleteBinStubs(name);
+
+    var lockFile = new LockFile.load(_getLockFilePath(name), cache.sources);
+    var id = lockFile.packages[name];
+    log.message('Deactivated package ${_formatPackage(id)}.');
 
     deleteEntry(dir);
 
@@ -242,7 +288,7 @@
   Future<Entrypoint> find(String name) {
     // TODO(rnystrom): Use async/await here when on __ catch is supported.
     // See: https://github.com/dart-lang/async_await/issues/27
-    return syncFuture(() {
+    return new Future.sync(() {
       var lockFilePath = _getLockFilePath(name);
       var lockFile;
       try {
@@ -293,14 +339,20 @@
   /// recompiled if the SDK has been upgraded since it was first compiled and
   /// then run. Otherwise, it will be run from source.
   ///
+  /// If [mode] is passed, it's used as the barback mode; it defaults to
+  /// [BarbackMode.RELEASE].
+  ///
   /// Returns the exit code from the executable.
   Future<int> runExecutable(String package, String executable,
-      Iterable<String> args) {
+      Iterable<String> args, {BarbackMode mode}) {
+    if (mode == null) mode = BarbackMode.RELEASE;
+
     var binDir = p.join(_directory, package, 'bin');
-    if (!fileExists(p.join(binDir, '$executable.dart.snapshot'))) {
+    if (mode != BarbackMode.RELEASE ||
+        !fileExists(p.join(binDir, '$executable.dart.snapshot'))) {
       return find(package).then((entrypoint) {
         return exe.runExecutable(entrypoint, package, executable, args,
-            isGlobal: true);
+            mode: mode, isGlobal: true);
       });
     }
 
@@ -360,4 +412,247 @@
       return '${log.bold(id.name)} ${id.version}';
     }
   }
+
+  /// Updates the binstubs for [package].
+  ///
+  /// A binstub is a little shell script in `PUB_CACHE/bin` that runs an
+  /// executable from a globally activated package. This removes any old
+  /// binstubs from the previously activated version of the package and
+  /// (optionally) creates new ones for the executables listed in the package's
+  /// pubspec.
+  ///
+  /// [executables] is the names of the executables that should have binstubs.
+  /// If `null`, all executables in the package will get binstubs. If empty, no
+  /// binstubs will be created.
+  ///
+  /// If [overwriteBinStubs] is `true`, any binstubs that collide with
+  /// existing binstubs in other packages will be overwritten by this one's.
+  /// Otherwise, the previous ones will be preserved.
+  ///
+  /// If [snapshots] is given, it is a map of the names of executables whose
+  /// snapshots that were precompiled to their paths. Binstubs for those will
+  /// run the snapshot directly and skip pub entirely.
+  void _updateBinStubs(Package package, List<String> executables,
+      {bool overwriteBinStubs, Map<String, String> snapshots}) {
+    if (snapshots == null) snapshots = const {};
+
+    // Remove any previously activated binstubs for this package, in case the
+    // list of executables has changed.
+    _deleteBinStubs(package.name);
+
+    if ((executables != null && executables.isEmpty) ||
+        package.pubspec.executables.isEmpty) {
+      return;
+    }
+
+    ensureDir(_binStubDir);
+
+    var installed = [];
+    var collided = {};
+    var allExecutables = ordered(package.pubspec.executables.keys);
+    for (var executable in allExecutables) {
+      if (executables != null && !executables.contains(executable)) continue;
+
+      var script = package.pubspec.executables[executable];
+
+      var previousPackage = _createBinStub(package, executable, script,
+          overwrite: overwriteBinStubs, snapshot: snapshots[script]);
+      if (previousPackage != null) {
+        collided[executable] = previousPackage;
+
+        if (!overwriteBinStubs) continue;
+      }
+
+      installed.add(executable);
+    }
+
+    if (installed.isNotEmpty) {
+      var names = namedSequence("executable", installed.map(log.bold));
+      log.message("Installed $names.");
+    }
+
+    // Show errors for any collisions.
+    if (collided.isNotEmpty) {
+      for (var command in ordered(collided.keys)) {
+        if (overwriteBinStubs) {
+          log.warning("Replaced ${log.bold(command)} previously installed from "
+              "${log.bold(collided[command])}.");
+        } else {
+          log.warning("Executable ${log.bold(command)} was already installed "
+              "from ${log.bold(collided[command])}.");
+        }
+      }
+
+      if (!overwriteBinStubs) {
+        log.warning("Deactivate the other package(s) or activate "
+            "${log.bold(package.name)} using --overwrite.");
+      }
+    }
+
+    // Show errors for any unknown executables.
+    if (executables != null) {
+      var unknown = ordered(executables.where(
+          (exe) => !package.pubspec.executables.keys.contains(exe)));
+      if (unknown.isNotEmpty) {
+        dataError("Unknown ${namedSequence('executable', unknown)}.");
+      }
+    }
+
+    // Show errors for any missing scripts.
+    // TODO(rnystrom): This can print false positives since a script may be
+    // produced by a transformer. Do something better.
+    var binFiles = package.listFiles(beneath: "bin", recursive: false)
+        .map((path) => package.relative(path))
+        .toList();
+    for (var executable in installed) {
+      var script = package.pubspec.executables[executable];
+      var scriptPath = p.join("bin", "$script.dart");
+      if (!binFiles.contains(scriptPath)) {
+        log.warning('Warning: Executable "$executable" runs "$scriptPath", '
+            'which was not found in ${log.bold(package.name)}.');
+      }
+    }
+
+    if (installed.isNotEmpty) _suggestIfNotOnPath(installed);
+  }
+
+  /// Creates a binstub named [executable] that runs [script] from [package].
+  ///
+  /// If [overwrite] is `true`, this will replace an existing binstub with that
+  /// name for another package.
+  ///
+  /// If [snapshot] is non-null, it is a path to a snapshot file. The binstub
+  /// will invoke that directly. Otherwise, it will run `pub global run`.
+  ///
+  /// If a collision occurs, returns the name of the package that owns the
+  /// existing binstub. Otherwise returns `null`.
+  String _createBinStub(Package package, String executable, String script,
+      {bool overwrite, String snapshot}) {
+    var binStubPath = p.join(_binStubDir, executable);
+
+    if (Platform.operatingSystem == "windows") binStubPath += ".bat";
+
+    // See if the binstub already exists. If so, it's for another package
+    // since we already deleted all of this package's binstubs.
+    var previousPackage;
+    if (fileExists(binStubPath)) {
+      var contents = readTextFile(binStubPath);
+      var match = _binStubPackagePattern.firstMatch(contents);
+      if (match != null) {
+        previousPackage = match[1];
+        if (!overwrite) return previousPackage;
+      } else {
+        log.fine("Could not parse binstub $binStubPath:\n$contents");
+      }
+    }
+
+    // If the script was precompiled to a snapshot, just invoke that directly
+    // and skip pub global run entirely.
+    var invocation;
+    if (snapshot != null) {
+      // We expect absolute paths from the precompiler since relative ones
+      // won't be relative to the right directory when the user runs this.
+      assert(p.isAbsolute(snapshot));
+      invocation = 'dart "$snapshot"';
+    } else {
+      invocation = "pub global run ${package.name}:$script";
+    }
+
+    if (Platform.operatingSystem == "windows") {
+      var batch = """
+@echo off
+rem This file was created by pub v${sdk.version}.
+rem Package: ${package.name}
+rem Version: ${package.version}
+rem Executable: ${executable}
+rem Script: ${script}
+$invocation %*
+""";
+      writeTextFile(binStubPath, batch);
+    } else {
+      var bash = """
+#!/usr/bin/env sh
+# This file was created by pub v${sdk.version}.
+# Package: ${package.name}
+# Version: ${package.version}
+# Executable: ${executable}
+# Script: ${script}
+$invocation "\$@"
+""";
+      writeTextFile(binStubPath, bash);
+
+      // Make it executable.
+      var result = Process.runSync('chmod', ['+x', binStubPath]);
+      if (result.exitCode != 0) {
+        // Couldn't make it executable so don't leave it laying around.
+        try {
+          deleteEntry(binStubPath);
+        } on IOException catch (err) {
+          // Do nothing. We're going to fail below anyway.
+          log.fine("Could not delete binstub:\n$err");
+        }
+
+        fail('Could not make "$binStubPath" executable (exit code '
+            '${result.exitCode}):\n${result.stderr}');
+      }
+    }
+
+    return previousPackage;
+  }
+
+  /// Deletes all existing binstubs for [package].
+  void _deleteBinStubs(String package) {
+    if (!dirExists(_binStubDir)) return;
+
+    for (var file in listDir(_binStubDir, includeDirs: false)) {
+      var contents = readTextFile(file);
+      var match = _binStubPackagePattern.firstMatch(contents);
+      if (match == null) {
+        log.fine("Could not parse binstub $file:\n$contents");
+        continue;
+      }
+
+      if (match[1] == package) {
+        log.fine("Deleting old binstub $file");
+        deleteEntry(file);
+      }
+    }
+  }
+
+  /// Checks to see if the binstubs are on the user's PATH and, if not, suggests
+  /// that the user add the directory to their PATH.
+  void _suggestIfNotOnPath(List<String> installed) {
+    if (Platform.operatingSystem == "windows") {
+      // See if the shell can find one of the binstubs.
+      // "\q" means return exit code 0 if found or 1 if not.
+      var result = runProcessSync("where", [r"\q", installed.first + ".bat"]);
+      if (result.exitCode == 0) return;
+
+      log.warning(
+          "${log.yellow('Warning:')} Pub installs executables into "
+              "${log.bold(_binStubDir)}, which is not on your path.\n"
+          "You can fix that by adding that directory to your system's "
+              '"Path" environment variable.\n'
+          'A web search for "configure windows path" will show you how.');
+    } else {
+      // See if the shell can find one of the binstubs.
+      var result = runProcessSync("which", [installed.first]);
+      if (result.exitCode == 0) return;
+
+      var binDir = _binStubDir;
+      if (binDir.startsWith(Platform.environment['HOME'])) {
+        binDir = p.join("~", p.relative(binDir,
+            from: Platform.environment['HOME']));
+      }
+
+      log.warning(
+          "${log.yellow('Warning:')} Pub installs executables into "
+              "${log.bold(binDir)}, which is not on your path.\n"
+          "You can fix that by adding this to your shell's config file "
+              "(.bashrc, .bash_profile, etc.):\n"
+          "\n"
+          "  ${log.bold('export PATH="\$PATH":"$binDir"')}\n"
+          "\n");
+    }
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index f3b0f1c..c55c17b 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -195,7 +195,7 @@
   log.io("Creating $file from stream.");
 
   return _descriptorPool.withResource(() {
-    return Chain.track(stream.pipe(new File(file).openWrite())).then((_) {
+    return stream.pipe(new File(file).openWrite()).then((_) {
       log.fine("Created $file from stream.");
       return file;
     });
@@ -508,7 +508,7 @@
 
 /// A line-by-line stream of standard input.
 final Stream<String> stdinLines = streamToLines(
-    new ByteStream(Chain.track(stdin)).toStringStream());
+    new ByteStream(stdin).toStringStream());
 
 /// Displays a message and reads a yes/no confirmation from the user.
 ///
@@ -543,8 +543,8 @@
 /// after you've decided to exit.
 Future flushThenExit(int status) {
   return Future.wait([
-    Chain.track(stdout.close()),
-    Chain.track(stderr.close())
+    stdout.close(),
+    stderr.close()
   ]).then((_) => exit(status));
 }
 
@@ -703,16 +703,15 @@
 
     var pair = consumerToSink(process.stdin);
     _stdin = pair.first;
-    _stdinClosed = errorGroup.registerFuture(Chain.track(pair.last));
+    _stdinClosed = errorGroup.registerFuture(pair.last);
 
     _stdout = new ByteStream(
-        errorGroup.registerStream(Chain.track(process.stdout)));
+        errorGroup.registerStream(process.stdout));
     _stderr = new ByteStream(
-        errorGroup.registerStream(Chain.track(process.stderr)));
+        errorGroup.registerStream(process.stderr));
 
     var exitCodeCompleter = new Completer();
-    _exitCode = errorGroup.registerFuture(
-        Chain.track(exitCodeCompleter.future));
+    _exitCode = errorGroup.registerFuture(exitCodeCompleter.future);
     _process.exitCode.then((code) => exitCodeCompleter.complete(code));
   }
 
@@ -794,9 +793,9 @@
 /// Returns a future that completes to the value that the future returned from
 /// [fn] completes to.
 Future withTempDir(Future fn(String path)) {
-  return syncFuture(() {
+  return new Future.sync(() {
     var tempDir = createSystemTempDir();
-    return syncFuture(() => fn(tempDir))
+    return new Future.sync(() => fn(tempDir))
         .whenComplete(() => deleteEntry(tempDir));
   });
 }
@@ -931,7 +930,7 @@
 ///
 /// Returns a [ByteStream] that emits the contents of the archive.
 ByteStream createTarGz(List contents, {baseDir}) {
-  return new ByteStream(futureStream(syncFuture(() {
+  return new ByteStream(futureStream(new Future.sync(() {
     var buffer = new StringBuffer();
     buffer.write('Creating .tag.gz stream containing:\n');
     contents.forEach((file) => buffer.write('$file\n'));
@@ -960,7 +959,7 @@
     // Don't use [withTempDir] here because we don't want to delete the temp
     // directory until the returned stream has closed.
     var tempDir = createSystemTempDir();
-    return syncFuture(() {
+    return new Future.sync(() {
       // Create the tar file.
       var tarFile = path.join(tempDir, "intermediate.tar");
       var args = ["a", "-w$baseDir", tarFile];
diff --git a/sdk/lib/_internal/pub/lib/src/package.dart b/sdk/lib/_internal/pub/lib/src/package.dart
index 3dd84e2..af0c750 100644
--- a/sdk/lib/_internal/pub/lib/src/package.dart
+++ b/sdk/lib/_internal/pub/lib/src/package.dart
@@ -6,9 +6,10 @@
 
 import 'dart:io';
 
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 import 'package:barback/barback.dart';
 
+import 'barback/transformer_id.dart';
 import 'io.dart';
 import 'git.dart' as git;
 import 'pubspec.dart';
@@ -38,7 +39,7 @@
   /// The name of the package.
   String get name {
     if (pubspec.name != null) return pubspec.name;
-    if (dir != null) return path.basename(dir);
+    if (dir != null) return p.basename(dir);
     return null;
   }
 
@@ -79,14 +80,11 @@
   /// Returns a list of asset ids for all Dart executables in this package's bin
   /// directory.
   List<AssetId> get executableIds {
-    var binDir = path.join(dir, 'bin');
-    if (!dirExists(binDir)) return [];
-
-    return ordered(listFiles(beneath: binDir, recursive: false))
-        .where((executable) => path.extension(executable) == '.dart')
+    return ordered(listFiles(beneath: "bin", recursive: false))
+        .where((executable) => p.extension(executable) == '.dart')
         .map((executable) {
       return new AssetId(
-          name, path.toUri(path.relative(executable, from: dir)).toString());
+          name, p.toUri(p.relative(executable, from: dir)).toString());
     }).toList();
   }
 
@@ -97,11 +95,11 @@
   /// pub.dartlang.org for choosing the primary one: the README with the fewest
   /// extensions that is lexically ordered first is chosen.
   String get readmePath {
-    var readmes = listDir(dir).map(path.basename).
+    var readmes = listFiles(recursive: false).map(p.basename).
         where((entry) => entry.contains(_README_REGEXP));
     if (readmes.isEmpty) return null;
 
-    return path.join(dir, readmes.reduce((readme1, readme2) {
+    return p.join(dir, readmes.reduce((readme1, readme2) {
       var extensions1 = ".".allMatches(readme1).length;
       var extensions2 = ".".allMatches(readme2).length;
       var comparison = extensions1.compareTo(extensions2);
@@ -128,6 +126,44 @@
   /// Creates a package with [pubspec] located at [dir].
   Package(this.pubspec, this.dir);
 
+  /// Given a relative path within this package, returns its absolute path.
+  ///
+  /// This is similar to `p.join(dir, part1, ...)`, except that subclasses may
+  /// override it to report that certain paths exist elsewhere than within
+  /// [dir]. For example, a [CachedPackage]'s `lib` directory is in the
+  /// `.pub/deps` directory.
+  String path(String part1, [String part2, String part3, String part4,
+            String part5, String part6, String part7]) {
+    if (dir == null) {
+      throw new StateError("Package $name is in-memory and doesn't have paths "
+          "on disk.");
+    }
+    return p.join(dir, part1, part2, part3, part4, part5, part6, part7);
+  }
+
+  /// Given an absolute path within this package (such as that returned by
+  /// [path] or [listFiles]), returns it relative to the package root.
+  String relative(String path) {
+    if (dir == null) {
+      throw new StateError("Package $name is in-memory and doesn't have paths "
+          "on disk.");
+    }
+    return p.relative(path, from: dir);
+  }
+
+  /// Returns the path to the library identified by [id] within [this].
+  String transformerPath(TransformerId id) {
+    if (id.package != name) {
+      throw new ArgumentError("Transformer $id isn't in package $name.");
+    }
+
+    if (id.path != null) return path('lib', p.fromUri('${id.path}.dart'));
+
+    var transformerPath = path('lib/transformer.dart');
+    if (fileExists(transformerPath)) return transformerPath;
+    return path('lib/$name.dart');
+  }
+
   /// The basenames of files that are included in [list] despite being hidden.
   static final _WHITELISTED_FILES = const ['.htaccess'];
 
@@ -142,11 +178,25 @@
   /// If this is a Git repository, this will respect .gitignore; otherwise, it
   /// will return all non-hidden, non-blacklisted files.
   ///
-  /// If [beneath] is passed, this will only return files beneath that path. If
+  /// If [beneath] is passed, this will only return files beneath that path,
+  /// which is expected to be relative to the package's root directory. If
   /// [recursive] is true, this will return all files beneath that path;
   /// otherwise, it will only return files one level beneath it.
-  List<String> listFiles({String beneath, recursive: true}) {
-    if (beneath == null) beneath = dir;
+  ///
+  /// If [useGitIgnore] is passed, this will take the .gitignore rules into
+  /// account if the package's root directory is a Git repository.
+  ///
+  /// Note that the returned paths won't always be beneath [dir]. To safely
+  /// convert them to paths relative to the package root, use [relative].
+  List<String> listFiles({String beneath, bool recursive: true,
+      bool useGitIgnore: false}) {
+    if (beneath == null) {
+      beneath = dir;
+    } else {
+      beneath = p.join(dir, beneath);
+    }
+
+    if (!dirExists(beneath)) return [];
 
     // This is used in some performance-sensitive paths and can list many, many
     // files. As such, it leans more havily towards optimization as opposed to
@@ -154,10 +204,10 @@
     // path package, since re-parsing a path is very expensive relative to
     // string operations.
     var files;
-    if (git.isInstalled && dirExists(path.join(dir, '.git'))) {
+    if (useGitIgnore && git.isInstalled && dirExists(path('.git'))) {
       // Later versions of git do not allow a path for ls-files that appears to
       // be outside of the repo, so make sure we give it a relative path.
-      var relativeBeneath = path.relative(beneath, from: dir);
+      var relativeBeneath = p.relative(beneath, from: dir);
 
       // List all files that aren't gitignored, including those not checked in
       // to Git.
diff --git a/sdk/lib/_internal/pub/lib/src/package_graph.dart b/sdk/lib/_internal/pub/lib/src/package_graph.dart
index 4470e51..02ba973 100644
--- a/sdk/lib/_internal/pub/lib/src/package_graph.dart
+++ b/sdk/lib/_internal/pub/lib/src/package_graph.dart
@@ -4,9 +4,11 @@
 
 library pub.package_graph;
 
+import 'barback/transformer_cache.dart';
 import 'entrypoint.dart';
 import 'lock_file.dart';
 import 'package.dart';
+import 'source/cached.dart';
 import 'utils.dart';
 
 /// A holistic view of the entire transitive dependency graph for an entrypoint.
@@ -22,14 +24,36 @@
   /// [packages].
   final LockFile lockFile;
 
-  /// All transitive dependencies of the entrypoint (including itself).
+  /// The transitive dependencies of the entrypoint (including itself).
+  ///
+  /// This may not include all transitive dependencies of the entrypoint if the
+  /// creator of the package graph knows only a subset of the packages are
+  /// relevant in the current context.
   final Map<String, Package> packages;
 
   /// A map of transitive dependencies for each package.
   Map<String, Set<Package>> _transitiveDependencies;
 
+  /// The transformer cache, if it's been loaded.
+  TransformerCache _transformerCache;
+
   PackageGraph(this.entrypoint, this.lockFile, this.packages);
 
+  /// Loads the transformer cache for this graph.
+  ///
+  /// This may only be called if [entrypoint] represents a physical package.
+  /// This may modify the cache.
+  TransformerCache loadTransformerCache() {
+    if (_transformerCache == null) {
+      if (entrypoint.root.dir == null) {
+        throw new StateError("Can't load the transformer cache for virtual "
+            "entrypoint ${entrypoint.root.name}.");
+      }
+      _transformerCache = new TransformerCache.load(this);
+    }
+    return _transformerCache;
+  }
+
   /// Returns all transitive dependencies of [package].
   ///
   /// For the entrypoint this returns all packages in [packages], which includes
@@ -47,4 +71,46 @@
 
     return _transitiveDependencies[package];
   }
+
+  /// Returns whether [package] is mutable.
+  ///
+  /// A package is considered to be mutable if it or any of its dependencies
+  /// don't come from a cached source, since the user can change its contents
+  /// without modifying the pub cache. Information generated from mutable
+  /// packages is generally not safe to cache, since it may change frequently.
+  bool isPackageMutable(String package) {
+    var id = lockFile.packages[package];
+    if (id == null) return true;
+
+    var source = entrypoint.cache.sources[id.source];
+    if (source is! CachedSource) return true;
+
+    return transitiveDependencies(package).any((dep) {
+      var depId = lockFile.packages[dep.name];
+
+      // The entrypoint package doesn't have a lockfile entry. It's always
+      // mutable.
+      if (depId == null) return true;
+
+      return entrypoint.cache.sources[depId.source] is! CachedSource;
+    });
+  }
+
+  /// Returns whether [package] is static.
+  ///
+  /// A package is considered to be static if it's not transformed and it came
+  /// from a cached source. Static packages don't need to be fully processed by
+  /// barback.
+  ///
+  /// Note that a static package isn't the same as an immutable package (see
+  /// [isPackageMutable]).
+  bool isPackageStatic(String package) {
+    var id = lockFile.packages[package];
+    if (id == null) return false;
+
+    var source = entrypoint.cache.sources[id.source];
+    if (source is! CachedSource) return false;
+
+    return packages[package].pubspec.transformers.isEmpty;
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/pubspec.dart b/sdk/lib/_internal/pub/lib/src/pubspec.dart
index 7aa5735..fad03b2 100644
--- a/sdk/lib/_internal/pub/lib/src/pubspec.dart
+++ b/sdk/lib/_internal/pub/lib/src/pubspec.dart
@@ -239,6 +239,61 @@
   bool _parsedPublishTo = false;
   String _publishTo;
 
+  /// The executables that should be placed on the user's PATH when this
+  /// package is globally activated.
+  ///
+  /// It is a map of strings to string. Each key is the name of the command
+  /// that will be placed on the user's PATH. The value is the name of the
+  /// .dart script (without extension) in the package's `bin` directory that
+  /// should be run for that command. Both key and value must be "simple"
+  /// strings: alphanumerics, underscores and hypens only. If a value is
+  /// omitted, it is inferred to use the same name as the key.
+  Map<String, String> get executables {
+    if (_executables != null) return _executables;
+
+    _executables = {};
+    var yaml = fields['executables'];
+    if (yaml == null) return _executables;
+
+    if (yaml is! Map) {
+      _error('"executables" field must be a map.',
+          fields.nodes['executables'].span);
+    }
+
+    yaml.nodes.forEach((key, value) {
+      // Don't allow path separators or other stuff meaningful to the shell.
+      validateName(name, description) {
+      }
+
+      if (key.value is! String) {
+        _error('"executables" keys must be strings.', key.span);
+      }
+
+      final keyPattern = new RegExp(r"^[a-zA-Z0-9_-]+$");
+      if (!keyPattern.hasMatch(key.value)) {
+        _error('"executables" keys may only contain letters, '
+            'numbers, hyphens and underscores.', key.span);
+      }
+
+      if (value.value == null) {
+        value = key;
+      } else if (value.value is! String) {
+        _error('"executables" values must be strings or null.', value.span);
+      }
+
+      final valuePattern = new RegExp(r"[/\\]");
+      if (valuePattern.hasMatch(value.value)) {
+        _error('"executables" values may not contain path separators.',
+            value.span);
+      }
+
+      _executables[key.value] = value.value;
+    });
+
+    return _executables;
+  }
+  Map<String, String> _executables;
+
   /// Whether the package is private and cannot be published.
   ///
   /// This is specified in the pubspec by setting "publish_to" to "none".
diff --git a/sdk/lib/_internal/pub/lib/src/sdk.dart b/sdk/lib/_internal/pub/lib/src/sdk.dart
index 2fe1858..d47cb52 100644
--- a/sdk/lib/_internal/pub/lib/src/sdk.dart
+++ b/sdk/lib/_internal/pub/lib/src/sdk.dart
@@ -39,8 +39,36 @@
   var sdkVersion = Platform.environment["_PUB_TEST_SDK_VERSION"];
   if (sdkVersion != null) return new Version.parse(sdkVersion);
 
-  // Read the "version" file.
-  var revisionPath = path.join(_rootDirectory, "version");
-  var version = readTextFile(revisionPath).trim();
+  if (runningFromSdk) {
+    // Read the "version" file.
+    var version = readTextFile(path.join(_rootDirectory, "version")).trim();
+    return new Version.parse(version);
+  }
+
+  // When running from the repo, read the canonical VERSION file in tools/.
+  // This makes it possible to run pub without having built the SDK first.
+  var contents = readTextFile(path.join(repoRoot, "tools/VERSION"));
+
+  parseField(name) {
+    var pattern = new RegExp("^$name ([a-z0-9]+)", multiLine: true);
+    var match = pattern.firstMatch(contents);
+    return match[1];
+  }
+
+  var channel = parseField("CHANNEL");
+  var major = parseField("MAJOR");
+  var minor = parseField("MINOR");
+  var patch = parseField("PATCH");
+  var prerelease = parseField("PRERELEASE");
+  var prereleasePatch = parseField("PRERELEASE_PATCH");
+
+  var version = "$major.$minor.$patch";
+  if (channel == "be") {
+    // TODO(rnystrom): tools/utils.py includes the svn commit here. Should we?
+    version += "-edge";
+  } else if (channel == "dev") {
+    version += "-dev.$prerelease.$prereleasePatch";
+  }
+
   return new Version.parse(version);
 }
diff --git a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
index cf12722..8f19a66 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
@@ -559,7 +559,7 @@
   /// Register [dependency]'s constraints on the package it depends on and
   /// enqueues the package for processing if necessary.
   Future _registerDependency(Dependency dependency) {
-    return syncFuture(() {
+    return new Future.sync(() {
       _validateDependency(dependency);
 
       var dep = dependency.dep;
diff --git a/sdk/lib/_internal/pub/lib/src/source/git.dart b/sdk/lib/_internal/pub/lib/src/source/git.dart
index 9696f45..9d08f83 100644
--- a/sdk/lib/_internal/pub/lib/src/source/git.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/git.dart
@@ -187,7 +187,7 @@
   /// Returns a future that completes to the hash of the revision identified by
   /// [id].
   Future<String> _ensureRevision(PackageId id) {
-    return syncFuture(() {
+    return new Future.sync(() {
       var path = _repoCachePath(id);
       if (!entryExists(path)) {
         return _clone(_getUrl(id), path, mirror: true)
@@ -244,7 +244,7 @@
   /// for the repository.
   Future _clone(String from, String to, {bool mirror: false,
       bool shallow: false}) {
-    return syncFuture(() {
+    return new Future.sync(() {
       // Git on Windows does not seem to automatically create the destination
       // directory.
       ensureDir(to);
diff --git a/sdk/lib/_internal/pub/lib/src/source/hosted.dart b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
index 5dcba33..2c12dd8 100644
--- a/sdk/lib/_internal/pub/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
@@ -171,7 +171,7 @@
   /// into [destPath].
   Future<bool> _download(String server, String package, Version version,
       String destPath) {
-    return syncFuture(() {
+    return new Future.sync(() {
       var url = Uri.parse("$server/packages/$package/versions/$version.tar.gz");
       log.io("Get package from $url.");
       log.message('Downloading ${log.bold(package)} ${version}...');
diff --git a/sdk/lib/_internal/pub/lib/src/source/path.dart b/sdk/lib/_internal/pub/lib/src/source/path.dart
index fc13cc7..c1fbd52 100644
--- a/sdk/lib/_internal/pub/lib/src/source/path.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/path.dart
@@ -35,7 +35,7 @@
   final name = 'path';
 
   Future<Pubspec> doDescribe(PackageId id) {
-    return syncFuture(() {
+    return new Future.sync(() {
       var dir = _validatePath(id.name, id.description);
       return new Pubspec.load(dir, systemCache.sources,
           expectedName: id.name);
@@ -50,7 +50,7 @@
   }
 
   Future get(PackageId id, String symlink) {
-    return syncFuture(() {
+    return new Future.sync(() {
       var dir = _validatePath(id.name, id.description);
       createPackageSymlink(id.name, dir, symlink,
           relative: id.description["relative"]);
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index 7af41e5..aea0401 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -85,10 +85,6 @@
 /// under the covers.
 Future newFuture(callback()) => new Future.value().then((_) => callback());
 
-/// Like [new Future.sync], but automatically wraps the future in a
-/// [Chain.track] call.
-Future syncFuture(callback()) => Chain.track(new Future.sync(callback));
-
 /// Runs [callback] in an error zone and pipes any unhandled error to the
 /// returned [Future].
 ///
@@ -167,6 +163,18 @@
   return result.toString();
 }
 
+/// Returns a labelled sentence fragment starting with [name] listing the
+/// elements [iter].
+///
+/// If [iter] does not have one item, name will be pluralized by adding "s" or
+/// using [plural], if given.
+String namedSequence(String name, Iterable iter, [String plural]) {
+  if (iter.length == 1) return "$name ${iter.single}";
+
+  if (plural == null) plural = "${name}s";
+  return "$plural ${toSentence(iter)}";
+}
+
 /// Returns a sentence fragment listing the elements of [iter].
 ///
 /// This converts each element of [iter] to a string and separates them with
@@ -264,6 +272,14 @@
   return minuendSet;
 }
 
+/// Returns whether there's any overlap between [set1] and [set2].
+bool overlaps(Set set1, Set set2) {
+  // Iterate through the smaller set.
+  var smaller = set1.length > set2.length ? set1 : set2;
+  var larger = smaller == set1 ? set2 : set1;
+  return smaller.any(larger.contains);
+}
+
 /// Returns a list containing the sorted elements of [iter].
 List ordered(Iterable<Comparable> iter) {
   var list = iter.toList();
@@ -326,8 +342,8 @@
   var map = new Map();
   return Future.wait(iter.map((element) {
     return Future.wait([
-      syncFuture(() => key(element)),
-      syncFuture(() => value(element))
+      new Future.sync(() => key(element)),
+      new Future.sync(() => value(element))
     ]).then((results) {
       map[results[0]] = results[1];
     });
diff --git a/sdk/lib/_internal/pub/lib/src/validator.dart b/sdk/lib/_internal/pub/lib/src/validator.dart
index 32194fe..17e4645 100644
--- a/sdk/lib/_internal/pub/lib/src/validator.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator.dart
@@ -13,6 +13,7 @@
 import 'validator/dependency.dart';
 import 'validator/dependency_override.dart';
 import 'validator/directory.dart';
+import 'validator/executable.dart';
 import 'validator/license.dart';
 import 'validator/name.dart';
 import 'validator/pubspec_field.dart';
@@ -62,6 +63,7 @@
       new DependencyValidator(entrypoint),
       new DependencyOverrideValidator(entrypoint),
       new DirectoryValidator(entrypoint),
+      new ExecutableValidator(entrypoint),
       new CompiledDartdocValidator(entrypoint),
       new Utf8ReadmeValidator(entrypoint)
     ];
diff --git a/sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart b/sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart
index 6ad79ce6..10b351f 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart
@@ -10,7 +10,6 @@
 
 import '../entrypoint.dart';
 import '../io.dart';
-import '../utils.dart';
 import '../validator.dart';
 
 /// Validates that a package doesn't contain compiled Dartdoc
@@ -20,8 +19,8 @@
     : super(entrypoint);
 
   Future validate() {
-    return syncFuture(() {
-      for (var entry in entrypoint.root.listFiles()) {
+    return new Future.sync(() {
+      for (var entry in entrypoint.root.listFiles(useGitIgnore: true)) {
         if (path.basename(entry) != "nav.json") continue;
         var dir = path.dirname(entry);
 
diff --git a/sdk/lib/_internal/pub/lib/src/validator/directory.dart b/sdk/lib/_internal/pub/lib/src/validator/directory.dart
index f733e4e..6039fc5 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/directory.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/directory.dart
@@ -10,7 +10,6 @@
 
 import '../entrypoint.dart';
 import '../io.dart';
-import '../utils.dart';
 import '../validator.dart';
 
 /// A validator that validates a package's top-level directories.
@@ -23,7 +22,7 @@
   ];
 
   Future validate() {
-    return syncFuture(() {
+    return new Future.sync(() {
       for (var dir in listDir(entrypoint.root.dir)) {
         if (!dirExists(dir)) continue;
 
diff --git a/sdk/lib/_internal/pub/lib/src/validator/executable.dart b/sdk/lib/_internal/pub/lib/src/validator/executable.dart
new file mode 100644
index 0000000..939b443
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/validator/executable.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.validator.executable;
+
+import 'dart:async';
+
+import 'package:path/path.dart' as p;
+
+import '../entrypoint.dart';
+import '../validator.dart';
+
+/// Validates that a package's pubspec doesn't contain executables that
+/// reference non-existent scripts.
+class ExecutableValidator extends Validator {
+  ExecutableValidator(Entrypoint entrypoint)
+    : super(entrypoint);
+
+  Future validate() async {
+    // TODO(rnystrom): This can print false positives since a script may be
+    // produced by a transformer. Do something better.
+    var binFiles = entrypoint.root.listFiles(beneath: "bin", recursive: false)
+        .map((path) => entrypoint.root.relative(path))
+        .toList();
+
+    entrypoint.root.pubspec.executables.forEach((executable, script) {
+      var scriptPath = p.join("bin", "$script.dart");
+      if (binFiles.contains(scriptPath)) return;
+
+      warnings.add('Your pubspec.yaml lists an executable "$executable" that '
+          'points to a script "$scriptPath" that does not exist.');
+    });
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/validator/license.dart b/sdk/lib/_internal/pub/lib/src/validator/license.dart
index ffad6a7..46ca112c 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/license.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/license.dart
@@ -9,7 +9,6 @@
 import 'package:path/path.dart' as path;
 
 import '../entrypoint.dart';
-import '../io.dart';
 import '../utils.dart';
 import '../validator.dart';
 
@@ -19,10 +18,10 @@
     : super(entrypoint);
 
   Future validate() {
-    return syncFuture(() {
+    return new Future.sync(() {
       var licenseLike = new RegExp(
           r"^([a-zA-Z0-9]+[-_])?(LICENSE|COPYING)(\..*)?$");
-      if (listDir(entrypoint.root.dir)
+      if (entrypoint.root.listFiles(recursive: false)
           .map(path.basename)
           .any(licenseLike.hasMatch)) {
         return;
diff --git a/sdk/lib/_internal/pub/lib/src/validator/name.dart b/sdk/lib/_internal/pub/lib/src/validator/name.dart
index 14da912..cdee078 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/name.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/name.dart
@@ -9,7 +9,6 @@
 import 'package:path/path.dart' as path;
 
 import '../entrypoint.dart';
-import '../io.dart';
 import '../utils.dart';
 import '../validator.dart';
 
@@ -27,7 +26,7 @@
     : super(entrypoint);
 
   Future validate() {
-    return syncFuture(() {
+    return new Future.sync(() {
       _checkName(entrypoint.root.name, 'Package name "${entrypoint.root.name}"',
           isPackage: true);
 
@@ -51,9 +50,8 @@
   /// Returns a list of all libraries in the current package as paths relative
   /// to the package's root directory.
   List<String> get _libraries {
-    var libDir = path.join(entrypoint.root.dir, "lib");
-    if (!dirExists(libDir)) return [];
-    return entrypoint.root.listFiles(beneath: libDir)
+    var libDir = entrypoint.root.path("lib");
+    return entrypoint.root.listFiles(beneath: "lib")
         .map((file) => path.relative(file, from: path.dirname(libDir)))
         .where((file) => !path.split(file).contains("src") &&
                          path.extension(file) == '.dart')
diff --git a/sdk/lib/_internal/pub/lib/src/validator/utf8_readme.dart b/sdk/lib/_internal/pub/lib/src/validator/utf8_readme.dart
index da0c223..9f30d65 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/utf8_readme.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/utf8_readme.dart
@@ -9,7 +9,6 @@
 
 import '../entrypoint.dart';
 import '../io.dart';
-import '../utils.dart';
 import '../validator.dart';
 
 /// Validates that a package's README is valid utf-8.
@@ -18,7 +17,7 @@
     : super(entrypoint);
 
   Future validate() {
-    return syncFuture(() {
+    return new Future.sync(() {
       var readme = entrypoint.root.readmePath;
       if (readme == null) return;
       var bytes = readBinaryFile(readme);
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index 4f15d8a..449c482 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -16,4 +16,3 @@
 
 [ $runtime == vm && $system == windows ]
 test/run/app_can_read_from_stdin_test: Fail # Issue 19448
-test/real_version_test: RuntimeError # Issue 20882
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/conservative_dependencies_test.dart b/sdk/lib/_internal/pub/test/dependency_computer/conservative_dependencies_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub/test/transformers_needed_by_transformers/conservative_dependencies_test.dart
rename to sdk/lib/_internal/pub/test/dependency_computer/conservative_dependencies_test.dart
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/cycle_test.dart b/sdk/lib/_internal/pub/test/dependency_computer/cycle_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub/test/transformers_needed_by_transformers/cycle_test.dart
rename to sdk/lib/_internal/pub/test/dependency_computer/cycle_test.dart
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/dev_transformers_test.dart b/sdk/lib/_internal/pub/test/dependency_computer/dev_transformers_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub/test/transformers_needed_by_transformers/dev_transformers_test.dart
rename to sdk/lib/_internal/pub/test/dependency_computer/dev_transformers_test.dart
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/error_test.dart b/sdk/lib/_internal/pub/test/dependency_computer/error_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub/test/transformers_needed_by_transformers/error_test.dart
rename to sdk/lib/_internal/pub/test/dependency_computer/error_test.dart
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/import_dependencies_test.dart b/sdk/lib/_internal/pub/test/dependency_computer/import_dependencies_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub/test/transformers_needed_by_transformers/import_dependencies_test.dart
rename to sdk/lib/_internal/pub/test/dependency_computer/import_dependencies_test.dart
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/no_dependencies_test.dart b/sdk/lib/_internal/pub/test/dependency_computer/no_dependencies_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub/test/transformers_needed_by_transformers/no_dependencies_test.dart
rename to sdk/lib/_internal/pub/test/dependency_computer/no_dependencies_test.dart
diff --git a/sdk/lib/_internal/pub/test/dependency_computer/transformers_needed_by_library_test.dart b/sdk/lib/_internal/pub/test/dependency_computer/transformers_needed_by_library_test.dart
new file mode 100644
index 0000000..724307c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/dependency_computer/transformers_needed_by_library_test.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+void main() {
+  initConfig();
+
+  integration("reports a dependency if the library itself is transformed", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": [
+          {"foo": {"\$include": "bin/myapp.dart.dart"}}
+        ]
+      }),
+      d.dir("bin", [
+        d.file("myapp.dart", "import 'package:myapp/lib.dart';"),
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({"name": "foo", "version": "1.0.0"}),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    expectLibraryDependencies('myapp|bin/myapp.dart', ['foo']);
+  });
+
+  integration("reports a dependency if a transformed local file is imported",
+      () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": [
+          {"foo": {"\$include": "lib/lib.dart"}}
+        ]
+      }),
+      d.dir("lib", [
+        d.file("lib.dart", ""),
+      ]),
+      d.dir("bin", [
+        d.file("myapp.dart", "import 'package:myapp/lib.dart';"),
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({"name": "foo", "version": "1.0.0"}),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    expectLibraryDependencies('myapp|bin/myapp.dart', ['foo']);
+  });
+
+  integration("reports a dependency if a transformed foreign file is imported",
+      () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+      }),
+      d.dir("bin", [
+        d.file("myapp.dart", "import 'package:foo/foo.dart';")
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": [{"foo": {"\$include": "lib/foo.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("foo.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    expectLibraryDependencies('myapp|bin/myapp.dart', ['foo']);
+  });
+
+  integration("doesn't report a dependency if no transformed files are "
+      "imported", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": [
+          {"foo": {"\$include": "lib/lib.dart"}}
+        ]
+      }),
+      d.dir("lib", [
+        d.file("lib.dart", ""),
+        d.file("untransformed.dart", ""),
+      ]),
+      d.dir("bin", [
+        d.file("myapp.dart", "import 'package:myapp/untransformed.dart';"),
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({"name": "foo", "version": "1.0.0"}),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    expectLibraryDependencies('myapp|bin/myapp.dart', []);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart b/sdk/lib/_internal/pub/test/dependency_computer/utils.dart
similarity index 75%
rename from sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart
rename to sdk/lib/_internal/pub/test/dependency_computer/utils.dart
index 789dad5..06eb463 100644
--- a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart
+++ b/sdk/lib/_internal/pub/test/dependency_computer/utils.dart
@@ -4,11 +4,12 @@
 
 library pub_tests;
 
+import 'package:barback/barback.dart';
 import 'package:path/path.dart' as p;
 import 'package:scheduled_test/scheduled_test.dart';
 
 import '../../lib/src/barback/cycle_exception.dart';
-import '../../lib/src/barback/transformers_needed_by_transformers.dart';
+import '../../lib/src/barback/dependency_computer.dart';
 import '../../lib/src/entrypoint.dart';
 import '../../lib/src/io.dart';
 import '../../lib/src/package.dart';
@@ -18,15 +19,16 @@
 import '../../lib/src/utils.dart';
 import '../test_pub.dart';
 
-/// Expects that [computeTransformersNeededByTransformers] will return a graph
-/// matching [expected] when run on the package graph defined by packages in
-/// the sandbox.
+/// Expects that [DependencyComputer.transformersNeededByTransformers] will
+/// return a graph matching [expected] when run on the package graph defined by
+/// packages in the sandbox.
 void expectDependencies(Map<String, Iterable<String>> expected) {
   expected = mapMap(expected, value: (_, ids) => ids.toSet());
 
   schedule(() {
+    var computer = new DependencyComputer(_loadPackageGraph());
     var result = mapMap(
-        computeTransformersNeededByTransformers(_loadPackageGraph()),
+        computer.transformersNeededByTransformers(),
         key: (id, _) => id.toString(),
         value: (_, ids) => ids.map((id) => id.toString()).toSet());
     expect(result, equals(expected));
@@ -38,8 +40,10 @@
 /// packages in the sandbox.
 void expectException(matcher) {
   schedule(() {
-    expect(() => computeTransformersNeededByTransformers(_loadPackageGraph()),
-        throwsA(matcher));
+    expect(() {
+      var computer = new DependencyComputer(_loadPackageGraph());
+      computer.transformersNeededByTransformers();
+    }, throwsA(matcher));
   }, "expect an exception: $matcher");
 }
 
@@ -54,6 +58,20 @@
   }, "cycle exception:\n${steps.map((step) => "  $step").join("\n")}"));
 }
 
+/// Expects that [DependencyComputer.transformersNeededByLibrary] will return
+/// transformer ids matching [expected] when run on the library identified by
+/// [id].
+void expectLibraryDependencies(String id, Iterable<String> expected) {
+  expected = expected.toSet();
+
+  schedule(() {
+    var computer = new DependencyComputer(_loadPackageGraph());
+    var result = computer.transformersNeededByLibrary(new AssetId.parse(id))
+        .map((id) => id.toString()).toSet();
+    expect(result, equals(expected));
+  }, "expect dependencies to match $expected");
+}
+
 /// Loads a [PackageGraph] from the packages in the sandbox.
 ///
 /// This graph will also include barback and its transitive dependencies from
diff --git a/sdk/lib/_internal/pub/test/get/cache_transformed_dependency_test.dart b/sdk/lib/_internal/pub/test/get/cache_transformed_dependency_test.dart
new file mode 100644
index 0000000..f3769ee
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/get/cache_transformed_dependency_test.dart
@@ -0,0 +1,339 @@
+// 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';
+
+const MODE_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class ModeTransformer extends Transformer {
+  final BarbackSettings _settings;
+
+  ModeTransformer.asPlugin(this._settings);
+
+  String get allowedExtensions => '.dart';
+
+  void apply(Transform transform) {
+    return transform.primaryInput.readAsString().then((contents) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id,
+          contents.replaceAll("MODE", _settings.mode.name)));
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+
+  integration("caches a transformed dependency", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {'barback': 'any'},
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet(output: contains("Precompiled foo."));
+
+    d.dir(appPath, [
+      d.dir(".pub/deps/debug/foo/lib", [
+        d.file("foo.dart", "final message = 'Goodbye!';")
+      ])
+    ]).validate();
+  });
+
+  integration("caches a dependency transformed by its dependency", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {'bar': '1.2.3'},
+          pubspec: {'transformers': ['bar']},
+          contents: [
+        d.dir("lib", [
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+
+      builder.serve("bar", "1.2.3",
+          deps: {'barback': 'any'},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "Goodbye"))
+        ])
+      ]);
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet(output: contains("Precompiled foo."));
+
+    d.dir(appPath, [
+      d.dir(".pub/deps/debug/foo/lib", [
+        d.file("foo.dart", "final message = 'Goodbye!';")
+      ])
+    ]).validate();
+  });
+
+  integration("doesn't cache an untransformed dependency", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          contents: [
+        d.dir("lib", [
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet(output: isNot(contains("Precompiled foo.")));
+
+    d.dir(appPath, [d.nothing(".pub/deps")]).validate();
+  });
+
+  integration("recaches when the dependency is updated", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {'barback': 'any'},
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+
+      builder.serve("foo", "1.2.4",
+          deps: {'barback': 'any'},
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "See ya")),
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet(output: contains("Precompiled foo."));
+
+    d.dir(appPath, [
+      d.dir(".pub/deps/debug/foo/lib", [
+        d.file("foo.dart", "final message = 'Goodbye!';")
+      ])
+    ]).validate();
+
+    // Upgrade to the new version of foo.
+    d.appDir({"foo": "1.2.4"}).create();
+
+    pubGet(output: contains("Precompiled foo."));
+
+    d.dir(appPath, [
+      d.dir(".pub/deps/debug/foo/lib", [
+        d.file("foo.dart", "final message = 'See ya!';")
+      ])
+    ]).validate();
+  });
+
+  integration("recaches when a transitive dependency is updated", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {
+            'barback': 'any',
+            'bar': 'any'
+          },
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+
+      builder.serve("bar", "5.6.7");
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+    pubGet(output: contains("Precompiled foo."));
+
+    servePackages((builder) => builder.serve("bar", "6.0.0"));
+    pubUpgrade(output: contains("Precompiled foo."));
+  });
+
+  integration("doesn't recache when an unrelated dependency is updated", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {'barback': 'any'},
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+
+      builder.serve("bar", "5.6.7");
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+    pubGet(output: contains("Precompiled foo."));
+
+    servePackages((builder) => builder.serve("bar", "6.0.0"));
+    pubUpgrade(output: isNot(contains("Precompiled foo.")));
+  });
+
+  integration("caches the dependency in debug mode", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {'barback': 'any'},
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", MODE_TRANSFORMER),
+          d.file("foo.dart", "final mode = 'MODE';")
+        ])
+      ]);
+    });
+
+    d.appDir({"foo": "1.2.3"}).create();
+
+    pubGet(output: contains("Precompiled foo."));
+
+    d.dir(appPath, [
+      d.dir(".pub/deps/debug/foo/lib", [
+        d.file("foo.dart", "final mode = 'debug';")
+      ])
+    ]).validate();
+  });
+
+  integration("loads code from the cache", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {'barback': 'any'},
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+    });
+
+    d.dir(appPath, [
+      d.appPubspec({"foo": "1.2.3"}),
+      d.dir('bin', [
+        d.file('script.dart', """
+          import 'package:foo/foo.dart';
+
+          void main() => print(message);""")
+      ])
+    ]).create();
+
+    pubGet(output: contains("Precompiled foo."));
+
+    d.dir(appPath, [
+      d.dir(".pub/deps/debug/foo/lib", [
+        d.file("foo.dart", "final message = 'Modified!';")
+      ])
+    ]).create();
+
+    var pub = pubRun(args: ["script"]);
+    pub.stdout.expect("Modified!");
+    pub.shouldExit();
+  });
+
+  integration("doesn't re-transform code loaded from the cache", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {'barback': 'any'},
+          pubspec: {'transformers': ['foo']},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+          d.file("foo.dart", "final message = 'Hello!';")
+        ])
+      ]);
+    });
+
+    d.dir(appPath, [
+      d.appPubspec({"foo": "1.2.3"}),
+      d.dir('bin', [
+        d.file('script.dart', """
+          import 'package:foo/foo.dart';
+
+          void main() => print(message);""")
+      ])
+    ]).create();
+
+    pubGet(output: contains("Precompiled foo."));
+
+    // Manually reset the cache to its original state to prove that the
+    // transformer won't be run again on it.
+    d.dir(appPath, [
+      d.dir(".pub/deps/debug/foo/lib", [
+        d.file("foo.dart", "final message = 'Hello!';")
+      ])
+    ]).create();
+
+    var pub = pubRun(args: ["script"]);
+    pub.stdout.expect("Hello!");
+    pub.shouldExit();
+  });
+}
+
+String replaceTransformer(String input, String output) {
+  return """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class ReplaceTransformer extends Transformer {
+  ReplaceTransformer.asPlugin();
+
+  String get allowedExtensions => '.dart';
+
+  Future apply(Transform transform) {
+    return transform.primaryInput.readAsString().then((contents) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id,
+          contents.replaceAll("$input", "$output")));
+    });
+  }
+}
+""";
+}
diff --git a/sdk/lib/_internal/pub/test/global/activate/bad_version_test.dart b/sdk/lib/_internal/pub/test/global/activate/bad_version_test.dart
index 73cb2ae..9db057a 100644
--- a/sdk/lib/_internal/pub/test/global/activate/bad_version_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/bad_version_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.
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../test_pub.dart';
 
@@ -9,16 +11,8 @@
   initConfig();
   integration('fails if the version constraint cannot be parsed', () {
     schedulePub(args: ["global", "activate", "foo", "1.0"],
-        error: """
-            Could not parse version "1.0". Unknown text at "1.0".
-
-            Usage: pub global activate <package...>
-            -h, --help      Print usage information for this command.
-            -s, --source    The source used to find the package.
-                            [git, hosted (default), path]
-
-            Run "pub help" to see global options.
-            """,
+        error: contains(
+            'Could not parse version "1.0". Unknown text at "1.0".'),
         exitCode: exit_codes.USAGE);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/global/activate/constraint_with_path_test.dart b/sdk/lib/_internal/pub/test/global/activate/constraint_with_path_test.dart
index 2795ca4..1e5412f 100644
--- a/sdk/lib/_internal/pub/test/global/activate/constraint_with_path_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/constraint_with_path_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.
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../test_pub.dart';
 
@@ -9,16 +11,7 @@
   initConfig();
   integration('fails if a version is passed with the path source', () {
     schedulePub(args: ["global", "activate", "-spath", "foo", "1.2.3"],
-        error: """
-            Unexpected argument "1.2.3".
-
-            Usage: pub global activate <package...>
-            -h, --help      Print usage information for this command.
-            -s, --source    The source used to find the package.
-                            [git, hosted (default), path]
-
-            Run "pub help" to see global options.
-            """,
+        error: contains('Unexpected argument "1.2.3".'),
         exitCode: exit_codes.USAGE);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/global/activate/missing_package_arg_test.dart b/sdk/lib/_internal/pub/test/global/activate/missing_package_arg_test.dart
index 9469de2..72fbc97 100644
--- a/sdk/lib/_internal/pub/test/global/activate/missing_package_arg_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/missing_package_arg_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.
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../test_pub.dart';
 
@@ -9,15 +11,7 @@
   initConfig();
   integration('fails if no package was given', () {
     schedulePub(args: ["global", "activate"],
-        error: """
-            No package to activate given.
-
-            Usage: pub global activate <package...>
-            -h, --help      Print usage information for this command.
-            -s, --source    The source used to find the package.
-                            [git, hosted (default), path]
-
-            Run "pub help" to see global options.""",
+        error: contains("No package to activate given."),
         exitCode: exit_codes.USAGE);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/global/activate/unexpected_arguments_test.dart b/sdk/lib/_internal/pub/test/global/activate/unexpected_arguments_test.dart
index 5d51917..24d0e2c 100644
--- a/sdk/lib/_internal/pub/test/global/activate/unexpected_arguments_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/unexpected_arguments_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.
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../test_pub.dart';
 
@@ -9,15 +11,7 @@
   initConfig();
   integration('fails if there are extra arguments', () {
     schedulePub(args: ["global", "activate", "foo", "1.0.0", "bar", "baz"],
-        error: """
-            Unexpected arguments "bar" and "baz".
-
-            Usage: pub global activate <package...>
-            -h, --help      Print usage information for this command.
-            -s, --source    The source used to find the package.
-                            [git, hosted (default), path]
-
-            Run "pub help" to see global options.""",
+        error: contains('Unexpected arguments "bar" and "baz".'),
         exitCode: exit_codes.USAGE);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/binstub_runs_executable_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/binstub_runs_executable_test.dart
new file mode 100644
index 0000000..30167b0
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/binstub_runs_executable_test.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_process.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("the generated binstub runs a snapshotted executable", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", pubspec: {
+        "executables": {
+          "foo-script": "script"
+        }
+      }, contents: [
+        d.dir("bin", [
+          d.file("script.dart", "main(args) => print('ok \$args');")
+        ])
+      ]);
+    });
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    var process = new ScheduledProcess.start(
+        p.join(sandboxDir, cachePath, "bin", binStubName("foo-script")),
+        ["arg1", "arg2"],
+        environment: getEnvironment());
+
+    process.stdout.expect("ok [arg1, arg2]");
+    process.shouldExit();
+  });
+
+  integration("the generated binstub runs a non-snapshotted executable", () {
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "executables": {
+          "foo-script": "script"
+        }
+      }),
+      d.dir("bin", [
+          d.file("script.dart", "main(args) => print('ok \$args');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "-spath", "../foo"]);
+
+    var process = new ScheduledProcess.start(
+        p.join(sandboxDir, cachePath, "bin", binStubName("foo-script")),
+        ["arg1", "arg2"],
+        environment: getEnvironment());
+
+    process.stdout.expect("ok [arg1, arg2]");
+    process.shouldExit();
+  });
+}
+
+/// The buildbots do not have the Dart SDK (containing "dart" and "pub") on
+/// their PATH, so we need to spawn the binstub process with a PATH that
+/// explicitly includes it.
+getEnvironment() {
+  var binDir = p.dirname(Platform.executable);
+  var separator = Platform.operatingSystem == "windows" ? ";" : ":";
+  var path = "${Platform.environment["PATH"]}$separator$binDir";
+
+  var environment = getPubTestEnvironment();
+  environment["PATH"] = path;
+  return environment;
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/binstub_runs_global_run_if_no_snapshot_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/binstub_runs_global_run_if_no_snapshot_test.dart
new file mode 100644
index 0000000..e8f7d15
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/binstub_runs_global_run_if_no_snapshot_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("the binstubs runs pub global run if there is no snapshot", () {
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "executables": {
+          "foo-script": "script"
+        }
+      }),
+      d.dir("bin", [
+        d.file("script.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    // Path packages are mutable, so no snapshot is created.
+    schedulePub(args: ["global", "activate", "--source", "path", "../foo"],
+        output: contains("Installed executable foo-script."));
+
+    d.dir(cachePath, [
+      d.dir("bin", [
+        d.matcherFile(binStubName("foo-script"),
+            contains("pub global run foo:script"))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart
new file mode 100644
index 0000000..3d704e7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/binstub_runs_precompiled_snapshot_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.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("the binstubs runs a precompiled snapshot if present", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", pubspec: {
+        "executables": {
+          "foo-script": "script"
+        }
+      }, contents: [
+        d.dir("bin", [
+          d.file("script.dart", "main(args) => print('ok');")
+        ])
+      ]);
+    });
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    d.dir(cachePath, [
+      d.dir("bin", [
+        d.matcherFile(binStubName("foo-script"),
+            contains("script.dart.snapshot"))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/creates_executables_in_pubspec_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/creates_executables_in_pubspec_test.dart
new file mode 100644
index 0000000..f631748
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/creates_executables_in_pubspec_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("creates binstubs for each executable in the pubspec", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", pubspec: {
+        "executables": {
+          "one": null,
+          "two-renamed": "second"
+        }
+      }, contents: [
+        d.dir("bin", [
+          d.file("one.dart", "main(args) => print('one');"),
+          d.file("second.dart", "main(args) => print('two');"),
+          d.file("nope.dart", "main(args) => print('nope');")
+        ])
+      ]);
+    });
+
+    schedulePub(args: ["global", "activate", "foo"], output:
+        contains("Installed executables one and two-renamed."));
+
+    d.dir(cachePath, [
+      d.dir("bin", [
+        d.matcherFile(binStubName("one"), contains("one")),
+        d.matcherFile(binStubName("two-renamed"), contains("second")),
+        d.nothing(binStubName("two")),
+        d.nothing(binStubName("nope"))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/does_not_warn_if_no_executables_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/does_not_warn_if_no_executables_test.dart
new file mode 100644
index 0000000..565e23a
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/does_not_warn_if_no_executables_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("does not warn if the package has no executables", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", contents: [
+        d.dir("bin", [
+          d.file("script.dart", "main(args) => print('ok \$args');")
+        ])
+      ]);
+    });
+
+    schedulePub(args: ["global", "activate", "foo"],
+        output: isNot(contains("is not on your path")));
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/does_not_warn_if_on_path_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/does_not_warn_if_on_path_test.dart
new file mode 100644
index 0000000..124d167
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/does_not_warn_if_on_path_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("does not warn if the binstub directory is on the path", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", pubspec: {
+        "executables": {
+          "script": null
+        }
+      }, contents: [
+        d.dir("bin", [
+          d.file("script.dart", "main(args) => print('ok \$args');")
+        ])
+      ]);
+    });
+
+    // Add the test's cache bin directory to the path.
+    var binDir = p.dirname(Platform.executable);
+    var separator = Platform.operatingSystem == "windows" ? ";" : ":";
+    var path = "${Platform.environment["PATH"]}$separator$binDir";
+
+    schedulePub(args: ["global", "activate", "foo"],
+        output: isNot(contains("is not on your path")),
+        environment: {"PATH": path});
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/explicit_and_no_executables_options_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/explicit_and_no_executables_options_test.dart
new file mode 100644
index 0000000..65c67ad
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/explicit_and_no_executables_options_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+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';
+
+main() {
+  initConfig();
+  integration("errors if -x and --no-executables are both passed", () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0")
+    ]).create();
+
+    schedulePub(args: [
+      "global", "activate", "--source", "path", "../foo",
+      "-x", "anything", "--no-executables"
+    ], error: contains("Cannot pass both --no-executables and --executable."),
+        exitCode: exit_codes.USAGE);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/explicit_executables_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/explicit_executables_test.dart
new file mode 100644
index 0000000..a5b6c7a
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/explicit_executables_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("only creates binstubs for the listed executables", () {
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "executables": {
+          "one": "script",
+          "two": "script",
+          "three": "script"
+        }
+      }),
+      d.dir("bin", [
+        d.file("script.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    schedulePub(args: [
+      "global", "activate", "--source", "path", "../foo",
+      "-x", "one", "--executable", "three"
+    ], output: contains("Installed executables one and three."));
+
+    d.dir(cachePath, [
+      d.dir("bin", [
+        d.matcherFile(binStubName("one"),
+            contains("pub global run foo:script")),
+        d.nothing(binStubName("two")),
+        d.matcherFile(binStubName("three"),
+            contains("pub global run foo:script"))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/missing_script_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/missing_script_test.dart
new file mode 100644
index 0000000..bcd30b1
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/missing_script_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.
+
+import 'package:path/path.dart' as p;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("errors if an executable's script can't be found", () {
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "executables": {
+          "missing": "not_here",
+          "nope": null
+        }
+      })
+    ]).create();
+
+    var pub = startPub(args: ["global", "activate", "-spath", "../foo"]);
+
+    pub.stderr.expect('Warning: Executable "missing" runs '
+        '"${p.join('bin', 'not_here.dart')}", which was not found in foo.');
+    pub.stderr.expect('Warning: Executable "nope" runs '
+        '"${p.join('bin', 'nope.dart')}", which was not found in foo.');
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/name_collision_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/name_collision_test.dart
new file mode 100644
index 0000000..57f6a8e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/name_collision_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("does not overwrite an existing binstub", () {
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "executables": {
+          "foo": "foo",
+          "collide1": "foo",
+          "collide2": "foo"
+        }
+      }),
+      d.dir("bin", [
+        d.file("foo.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "executables": {
+          "bar": "bar",
+          "collide1": "bar",
+          "collide2": "bar"
+        }
+      }),
+      d.dir("bin", [
+        d.file("bar.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "-spath", "../foo"]);
+
+    var pub = startPub(args: ["global", "activate", "-spath", "../bar"]);
+    pub.stdout.expect(consumeThrough("Installed executable bar."));
+    pub.stderr.expect("Executable collide1 was already installed from foo.");
+    pub.stderr.expect("Executable collide2 was already installed from foo.");
+    pub.stderr.expect("Deactivate the other package(s) or activate bar using "
+        "--overwrite.");
+    pub.shouldExit();
+
+    d.dir(cachePath, [
+      d.dir("bin", [
+        d.matcherFile(binStubName("foo"), contains("foo:foo")),
+        d.matcherFile(binStubName("bar"), contains("bar:bar")),
+        d.matcherFile(binStubName("collide1"), contains("foo:foo")),
+        d.matcherFile(binStubName("collide2"), contains("foo:foo"))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/name_collision_with_overwrite_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/name_collision_with_overwrite_test.dart
new file mode 100644
index 0000000..6afa39e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/name_collision_with_overwrite_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("overwrites an existing binstub if --overwrite is passed", () {
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "executables": {
+          "foo": "foo",
+          "collide1": "foo",
+          "collide2": "foo"
+        }
+      }),
+      d.dir("bin", [
+        d.file("foo.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "executables": {
+          "bar": "bar",
+          "collide1": "bar",
+          "collide2": "bar"
+        }
+      }),
+      d.dir("bin", [
+        d.file("bar.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "-spath", "../foo"]);
+
+    var pub = startPub(args: [
+      "global", "activate", "-spath", "../bar", "--overwrite"
+    ]);
+    pub.stdout.expect(consumeThrough(
+        "Installed executables bar, collide1 and collide2."));
+    pub.stderr.expect("Replaced collide1 previously installed from foo.");
+    pub.stderr.expect("Replaced collide2 previously installed from foo.");
+    pub.shouldExit();
+
+    d.dir(cachePath, [
+      d.dir("bin", [
+        d.matcherFile(binStubName("foo"), contains("foo:foo")),
+        d.matcherFile(binStubName("bar"), contains("bar:bar")),
+        d.matcherFile(binStubName("collide1"), contains("bar:bar")),
+        d.matcherFile(binStubName("collide2"), contains("bar:bar"))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/no_executables_flag_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/no_executables_flag_test.dart
new file mode 100644
index 0000000..1eb1bb8
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/no_executables_flag_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("does not create binstubs if --no-executables is passed", () {
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "executables": {
+          "one": null
+        }
+      }),
+      d.dir("bin", [
+        d.file("one.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "--source", "path", "../foo"]);
+
+    schedulePub(args: [
+      "global", "activate", "--source", "path", "../foo", "--no-executables"
+    ]);
+
+    // Should still delete old one.
+    d.dir(cachePath, [
+      d.dir("bin", [
+        d.nothing(binStubName("one"))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/path_package_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/path_package_test.dart
new file mode 100644
index 0000000..1141131
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/path_package_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.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("creates binstubs when activating a path package", () {
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "executables": {
+          "foo": null
+        }
+      }),
+      d.dir("bin", [
+        d.file("foo.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "--source", "path", "../foo"],
+        output: contains("Installed executable foo."));
+
+    d.dir(cachePath, [
+      d.dir("bin", [
+        d.matcherFile(binStubName("foo"), contains("pub global run foo:foo"))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/reactivate_removes_old_executables_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/reactivate_removes_old_executables_test.dart
new file mode 100644
index 0000000..748ce04
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/reactivate_removes_old_executables_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("removes previous binstubs when reactivating a package", () {
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "executables": {
+          "one": null,
+          "two": null
+        }
+      }),
+      d.dir("bin", [
+        d.file("one.dart", "main() => print('ok');"),
+        d.file("two.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "--source", "path", "../foo"]);
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "executables": {
+          // Remove "one".
+          "two": null
+        }
+      }),
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "--source", "path", "../foo"]);
+
+    d.dir(cachePath, [
+      d.dir("bin", [
+        d.nothing(binStubName("one")),
+        d.matcherFile(binStubName("two"), contains("two"))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/removes_even_if_not_in_pubspec_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/removes_even_if_not_in_pubspec_test.dart
new file mode 100644
index 0000000..a37133f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/removes_even_if_not_in_pubspec_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("removes all binstubs for package", () {
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "executables": {
+          "foo": null
+        }
+      }),
+      d.dir("bin", [
+        d.file("foo.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    // Create the binstub for foo.
+    schedulePub(args: ["global", "activate", "--source", "path", "../foo"]);
+
+    // Remove it from the pubspec.
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo"
+      })
+    ]).create();
+
+    // Deactivate.
+    schedulePub(args: ["global", "deactivate", "foo"]);
+
+    // It should still be deleted.
+    d.dir(cachePath, [
+      d.dir("bin", [
+        d.nothing(binStubName("foo"))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/removes_when_deactivated_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/removes_when_deactivated_test.dart
new file mode 100644
index 0000000..5580a53
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/removes_when_deactivated_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("removes binstubs when the package is deactivated", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", pubspec: {
+        "executables": {
+          "one": null,
+          "two": null
+        }
+      }, contents: [
+        d.dir("bin", [
+          d.file("one.dart", "main(args) => print('one');"),
+          d.file("two.dart", "main(args) => print('two');")
+        ])
+      ]);
+    });
+
+    schedulePub(args: ["global", "activate", "foo"]);
+    schedulePub(args: ["global", "deactivate", "foo"]);
+
+    d.dir(cachePath, [
+      d.dir("bin", [
+        d.nothing(binStubName("one")),
+        d.nothing(binStubName("two"))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/unknown_explicit_executable_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/unknown_explicit_executable_test.dart
new file mode 100644
index 0000000..ae1e0e0
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/unknown_explicit_executable_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.
+
+import 'package:scheduled_test/scheduled_stream.dart';
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("errors on an unknown explicit executable", () {
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "executables": {
+          "one": "one"
+        }
+      }),
+      d.dir("bin", [
+        d.file("one.dart", "main() => print('ok');")
+      ])
+    ]).create();
+
+    var pub = startPub(args: [
+      "global", "activate", "--source", "path", "../foo",
+      "-x", "who", "-x", "one", "--executable", "wat"
+    ]);
+
+    pub.stdout.expect(consumeThrough("Installed executable one."));
+    pub.stderr.expect("Unknown executables wat and who.");
+    pub.shouldExit(exit_codes.DATA);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/utils.dart b/sdk/lib/_internal/pub/test/global/binstubs/utils.dart
new file mode 100644
index 0000000..e52a1eb
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/utils.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+/// Returns the name of the shell script for a binstub named [name].
+///
+/// Adds a ".bat" extension on Windows.
+binStubName(String name) {
+  if (Platform.operatingSystem == "windows") return "$name.bat";
+  return name;
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/warns_if_not_on_path_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/warns_if_not_on_path_test.dart
new file mode 100644
index 0000000..ec3fedb
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/warns_if_not_on_path_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("warns if the binstub directory is not on the path", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", pubspec: {
+        "executables": {
+          "some-dart-script": "script"
+        }
+      }, contents: [
+        d.dir("bin", [
+          d.file("script.dart", "main(args) => print('ok \$args');")
+        ])
+      ]);
+    });
+
+    schedulePub(args: ["global", "activate", "foo"],
+        error: contains("is not on your path"));
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart b/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart
index 0d16cdc..237cb15 100644
--- a/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart
@@ -26,6 +26,8 @@
 
 Usage: pub global run <package>:<executable> [args...]
 -h, --help    Print usage information for this command.
+    --mode    Mode to run transformers in.
+              (defaults to "release")
 
 Run "pub help" to see global options.
 """,
diff --git a/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart b/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart
index 3e7a075..801ad73 100644
--- a/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart
@@ -14,6 +14,8 @@
 
             Usage: pub global run <package>:<executable> [args...]
             -h, --help    Print usage information for this command.
+                --mode    Mode to run transformers in.
+                          (defaults to "release")
 
             Run "pub help" to see global options.
             """,
diff --git a/sdk/lib/_internal/pub/test/global/run/mode_test.dart b/sdk/lib/_internal/pub/test/global/run/mode_test.dart
new file mode 100644
index 0000000..9a5a838
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/run/mode_test.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class DartTransformer extends Transformer {
+  final BarbackSettings _settings;
+
+  DartTransformer.asPlugin(this._settings);
+
+  String get allowedExtensions => '.in';
+
+  void apply(Transform transform) {
+    transform.addOutput(new Asset.fromString(
+        new AssetId(transform.primaryInput.id.package, "bin/script.dart"),
+        "void main() => print('\${_settings.mode.name}');"));
+  }
+}
+""";
+
+main() {
+  initConfig();
+  integration('runs a script in an activated package with customizable modes',
+      () {
+    servePackages((builder) {
+      builder.serveRepoPackage("barback");
+
+      builder.serve("foo", "1.0.0",
+          deps: {"barback": "any"},
+          pubspec: {"transformers": ["foo/src/transformer"]},
+          contents: [
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", TRANSFORMER),
+          d.file("primary.in", "")
+        ])])
+      ]);
+    });
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    // By default it should run in release mode.
+    var pub = pubRun(global: true, args: ["foo:script"]);
+    pub.stdout.expect("release");
+    pub.shouldExit();
+
+    // A custom mode should be specifiable.
+    pub = pubRun(global: true, args: ["--mode", "custom-mode", "foo:script"]);
+    pub.stdout.expect("custom-mode");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/package_list_files_test.dart b/sdk/lib/_internal/pub/test/package_list_files_test.dart
index 9b5a06c..56d8fb8 100644
--- a/sdk/lib/_internal/pub/test/package_list_files_test.dart
+++ b/sdk/lib/_internal/pub/test/package_list_files_test.dart
@@ -13,8 +13,8 @@
 import 'descriptor.dart' as d;
 import 'test_pub.dart';
 
-var root;
-var entrypoint;
+String root;
+Entrypoint entrypoint;
 
 main() {
   initConfig();
@@ -78,7 +78,7 @@
       });
     });
 
-    integration("ignores files that are gitignored", () {
+    integration("ignores files that are gitignored if desired", () {
       d.dir(appPath, [
         d.file('.gitignore', '*.txt'),
         d.file('file1.txt', 'contents'),
@@ -90,13 +90,23 @@
       ]).create();
 
       schedule(() {
-        expect(entrypoint.root.listFiles(), unorderedEquals([
+        expect(entrypoint.root.listFiles(useGitIgnore: true), unorderedEquals([
           path.join(root, 'pubspec.yaml'),
           path.join(root, '.gitignore'),
           path.join(root, 'file2.text'),
           path.join(root, 'subdir', 'subfile2.text')
         ]));
       });
+
+      schedule(() {
+        expect(entrypoint.root.listFiles(), unorderedEquals([
+          path.join(root, 'pubspec.yaml'),
+          path.join(root, 'file1.txt'),
+          path.join(root, 'file2.text'),
+          path.join(root, 'subdir', 'subfile1.txt'),
+          path.join(root, 'subdir', 'subfile2.text')
+        ]));
+      });
     });
 
     commonTests();
diff --git a/sdk/lib/_internal/pub/test/pubspec_test.dart b/sdk/lib/_internal/pub/test/pubspec_test.dart
index e34ce43..fec3077 100644
--- a/sdk/lib/_internal/pub/test/pubspec_test.dart
+++ b/sdk/lib/_internal/pub/test/pubspec_test.dart
@@ -444,5 +444,58 @@
             (pubspec) => pubspec.publishTo);
       });
     });
+
+    group("executables", () {
+      test("defaults to an empty map if omitted", () {
+        var pubspec = new Pubspec.parse('', sources);
+        expect(pubspec.executables, isEmpty);
+      });
+
+      test("allows simple names for keys and most characters in values", () {
+        var pubspec = new Pubspec.parse('''
+executables:
+  abcDEF-123_: "abc DEF-123._"
+''', sources);
+        expect(pubspec.executables['abcDEF-123_'], equals('abc DEF-123._'));
+      });
+
+      test("throws if not a map", () {
+        expectPubspecException('executables: not map',
+            (pubspec) => pubspec.executables);
+      });
+
+      test("throws if key is not a string", () {
+        expectPubspecException('executables: {123: value}',
+            (pubspec) => pubspec.executables);
+      });
+
+      test("throws if a key isn't a simple name", () {
+        expectPubspecException('executables: {funny/name: ok}',
+            (pubspec) => pubspec.executables);
+      });
+
+      test("throws if a value is not a string", () {
+        expectPubspecException('executables: {command: 123}',
+            (pubspec) => pubspec.executables);
+      });
+
+      test("throws if a value contains a path separator", () {
+        expectPubspecException('executables: {command: funny_name/part}',
+            (pubspec) => pubspec.executables);
+      });
+
+      test("throws if a value contains a windows path separator", () {
+        expectPubspecException(r'executables: {command: funny_name\part}',
+            (pubspec) => pubspec.executables);
+      });
+
+      test("uses the key if the value is null", () {
+        var pubspec = new Pubspec.parse('''
+executables:
+  command:
+''', sources);
+        expect(pubspec.executables['command'], equals('command'));
+      });
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/run/allows_dart_extension_test.dart b/sdk/lib/_internal/pub/test/run/allows_dart_extension_test.dart
new file mode 100644
index 0000000..38bdb77
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/allows_dart_extension_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.
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+const SCRIPT = """
+import 'dart:io';
+
+main() {
+  stdout.writeln("stdout output");
+  stderr.writeln("stderr output");
+  exitCode = 123;
+}
+""";
+
+main() {
+  initConfig();
+  integration('allows a ".dart" extension on the argument', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("bin", [
+        d.file("script.dart", SCRIPT)
+      ])
+    ]).create();
+
+    var pub = pubRun(args: ["script.dart"]);
+    pub.stdout.expect("stdout output");
+    pub.stderr.expect("stderr output");
+    pub.shouldExit(123);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/doesnt_load_an_unnecessary_transformer_test.dart b/sdk/lib/_internal/pub/test/run/doesnt_load_an_unnecessary_transformer_test.dart
new file mode 100644
index 0000000..098b166
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/doesnt_load_an_unnecessary_transformer_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class BrokenTransformer extends Transformer {
+  RewriteTransformer.asPlugin() {
+    throw 'This transformer is broken!';
+  }
+
+  String get allowedExtensions => '.txt';
+
+  void apply(Transform transform) {}
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("doesn't load an unnecessary transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {"myapp/src/transformer": {r"$include": "lib/myapp.dart"}}
+          ]
+        }),
+        d.dir("lib", [
+          d.file("myapp.dart", ""),
+          d.dir("src", [d.file("transformer.dart", TRANSFORMER)])
+        ]),
+        d.dir("bin", [
+          d.file("hi.dart", "void main() => print('Hello!');")
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      // This shouldn't load the transformer, since it doesn't transform
+      // anything that the entrypoint imports. If it did load the transformer,
+      // we'd know since it would throw an exception.
+      var pub = pubRun(args: ["hi"]);
+      pub.stdout.expect("Hello!");
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart b/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart
index 88dfb3b..40bbeb1 100644
--- a/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart
+++ b/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart
@@ -19,6 +19,8 @@
 
 Usage: pub run <executable> [args...]
 -h, --help    Print usage information for this command.
+    --mode    Mode to run transformers in.
+              (defaults to "release" for dependencies, "debug" for entrypoint)
 
 Run "pub help" to see global options.
 """,
diff --git a/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart b/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
index fcb2093..7686386 100644
--- a/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
@@ -26,6 +26,8 @@
 
 Usage: pub run <executable> [args...]
 -h, --help    Print usage information for this command.
+    --mode    Mode to run transformers in.
+              (defaults to "release" for dependencies, "debug" for entrypoint)
 
 Run "pub help" to see global options.
 """,
diff --git a/sdk/lib/_internal/pub/test/run/mode_test.dart b/sdk/lib/_internal/pub/test/run/mode_test.dart
new file mode 100644
index 0000000..f6c60ff
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/mode_test.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class DartTransformer extends Transformer {
+  final BarbackSettings _settings;
+
+  DartTransformer.asPlugin(this._settings);
+
+  String get allowedExtensions => '.in';
+
+  void apply(Transform transform) {
+    transform.addOutput(new Asset.fromString(
+        new AssetId(transform.primaryInput.id.package, "bin/script.dart"),
+        "void main() => print('\${_settings.mode.name}');"));
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration('runs a local script with customizable modes', () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", TRANSFORMER),
+          d.file("primary.in", "")
+        ])])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      // By default it should run in debug mode.
+      var pub = pubRun(args: ["script"]);
+      pub.stdout.expect("debug");
+      pub.shouldExit();
+
+      // A custom mode should be specifiable.
+      pub = pubRun(args: ["--mode", "custom-mode", "script"]);
+      pub.stdout.expect("custom-mode");
+      pub.shouldExit();
+    });
+
+    integration('runs a dependency script with customizable modes', () {
+      d.dir("foo", [
+        d.pubspec({
+          "name": "foo",
+          "version": "1.2.3",
+          "transformers": ["foo/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", TRANSFORMER),
+          d.file("primary.in", "")
+        ])])
+      ]).create();
+
+      d.appDir({"foo": {"path": "../foo"}}).create();
+
+      createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
+
+      // By default it should run in release mode.
+      var pub = pubRun(args: ["foo:script"]);
+      pub.stdout.expect("release");
+      pub.shouldExit();
+
+      // A custom mode should be specifiable.
+      pub = pubRun(args: ["--mode", "custom-mode", "foo:script"]);
+      pub.stdout.expect("custom-mode");
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_in_a_path_dependency_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_in_a_path_dependency_test.dart
deleted file mode 100644
index d92eb26..0000000
--- a/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_in_a_path_dependency_test.dart
+++ /dev/null
@@ -1,38 +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 '../descriptor.dart' as d;
-import '../test_pub.dart';
-import 'utils.dart';
-
-main() {
-  initConfig();
-  integration("doesn't serve .gitignored assets in a path dependency", () {
-    ensureGit();
-
-    d.dir(appPath, [
-      d.appPubspec({"foo": {"path": "../foo"}}),
-    ]).create();
-
-    d.git("foo", [
-      d.libPubspec("foo", "1.0.0"),
-      d.dir("lib", [
-        d.file("outer.txt", "outer contents"),
-        d.file("visible.txt", "visible"),
-        d.dir("dir", [
-          d.file("inner.txt", "inner contents"),
-        ])
-      ]),
-      d.file(".gitignore", "/lib/outer.txt\n/lib/dir")
-    ]).create();
-
-    pubServe(shouldGetFirst: true);
-    requestShould404("packages/foo/outer.txt");
-    requestShould404("packages/foo/dir/inner.txt");
-    requestShouldSucceed("packages/foo/visible.txt", "visible");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_test.dart
deleted file mode 100644
index 598ecf7..0000000
--- a/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_test.dart
+++ /dev/null
@@ -1,32 +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 '../descriptor.dart' as d;
-import '../test_pub.dart';
-import 'utils.dart';
-
-main() {
-  initConfig();
-  integration("doesn't serve .gitignored assets", () {
-    ensureGit();
-
-    d.git(appPath, [
-      d.appPubspec(),
-      d.dir("web", [
-        d.file("outer.txt", "outer contents"),
-        d.dir("dir", [
-          d.file("inner.txt", "inner contents"),
-        ])
-      ]),
-      d.file(".gitignore", "/web/outer.txt\n/web/dir")
-    ]).create();
-
-    pubServe();
-    requestShould404("outer.txt");
-    requestShould404("dir/inner.txt");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/serves_hidden_assets_that_arent_gitignored_test.dart b/sdk/lib/_internal/pub/test/serve/serves_hidden_assets_that_arent_gitignored_test.dart
deleted file mode 100644
index 5ef198f..0000000
--- a/sdk/lib/_internal/pub/test/serve/serves_hidden_assets_that_arent_gitignored_test.dart
+++ /dev/null
@@ -1,31 +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 '../descriptor.dart' as d;
-import '../test_pub.dart';
-import 'utils.dart';
-
-main() {
-  initConfig();
-  integration("serves hidden assets that aren't .gitignored", () {
-    ensureGit();
-
-    d.git(appPath, [
-      d.appPubspec(),
-      d.dir("web", [
-        d.file(".outer.txt", "outer contents"),
-        d.dir(".dir", [
-          d.file("inner.txt", "inner contents"),
-        ])
-      ])
-    ]).create();
-
-    pubServe();
-    requestShouldSucceed(".outer.txt", "outer contents");
-    requestShouldSucceed(".dir/inner.txt", "inner contents");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/utils.dart b/sdk/lib/_internal/pub/test/serve/utils.dart
index f3a6fa8..9516cd2 100644
--- a/sdk/lib/_internal/pub/test/serve/utils.dart
+++ b/sdk/lib/_internal/pub/test/serve/utils.dart
@@ -456,8 +456,8 @@
   if (params != null) message["params"] = params;
   _webSocket.add(JSON.encode(message));
 
-  return Chain.track(_webSocketBroadcastStream
-      .firstWhere((response) => response["id"] == id)).then((value) {
+  return _webSocketBroadcastStream
+      .firstWhere((response) => response["id"] == id).then((value) {
     currentSchedule.addDebugInfo(
         "Web Socket request $method with params $params\n"
         "Result: $value");
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index b2b2541..c60d1bb 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -411,12 +411,15 @@
 /// If [outputJson] is given, validates that pub outputs stringified JSON
 /// matching that object, which can be a literal JSON object or any other
 /// [Matcher].
+///
+/// If [environment] is given, any keys in it will override the environment
+/// variables passed to the spawned process.
 void schedulePub({List args, output, error, outputJson,
-    Future<Uri> tokenEndpoint, int exitCode: exit_codes.SUCCESS}) {
+    int exitCode: exit_codes.SUCCESS, Map<String, String> environment}) {
   // Cannot pass both output and outputJson.
   assert(output == null || outputJson == null);
 
-  var pub = startPub(args: args, tokenEndpoint: tokenEndpoint);
+  var pub = startPub(args: args, environment: environment);
   pub.shouldExit(exitCode);
 
   var failures = [];
@@ -476,16 +479,38 @@
   pub.writeLine("y");
 }
 
+/// Gets the absolute path to [relPath], which is a relative path in the test
+/// sandbox.
+String _pathInSandbox(String relPath) {
+  return p.join(p.absolute(sandboxDir), relPath);
+}
+
+/// Gets the environment variables used to run pub in a test context.
+Map getPubTestEnvironment([String tokenEndpoint]) {
+  var environment = {};
+  environment['_PUB_TESTING'] = 'true';
+  environment['PUB_CACHE'] = _pathInSandbox(cachePath);
+
+  // Ensure a known SDK version is set for the tests that rely on that.
+  environment['_PUB_TEST_SDK_VERSION'] = "0.1.2+3";
+
+  if (tokenEndpoint != null) {
+    environment['_PUB_TEST_TOKEN_ENDPOINT'] = tokenEndpoint.toString();
+  }
+
+  return environment;
+}
+
 /// Starts a Pub process and returns a [ScheduledProcess] that supports
 /// interaction with that process.
 ///
 /// Any futures in [args] will be resolved before the process is started.
-ScheduledProcess startPub({List args, Future<Uri> tokenEndpoint}) {
-  String pathInSandbox(String relPath) {
-    return p.join(p.absolute(sandboxDir), relPath);
-  }
-
-  ensureDir(pathInSandbox(appPath));
+///
+/// If [environment] is given, any keys in it will override the environment
+/// variables passed to the spawned process.
+ScheduledProcess startPub({List args, Future<String> tokenEndpoint,
+    Map<String, String> environment}) {
+  ensureDir(_pathInSandbox(appPath));
 
   // Find a Dart executable we can use to spawn. Use the same one that was
   // used to run this script itself.
@@ -510,32 +535,25 @@
 
   if (tokenEndpoint == null) tokenEndpoint = new Future.value();
   var environmentFuture = tokenEndpoint.then((tokenEndpoint) {
-    var environment = {};
-    environment['_PUB_TESTING'] = 'true';
-    environment['PUB_CACHE'] = pathInSandbox(cachePath);
-
-    // Ensure a known SDK version is set for the tests that rely on that.
-    environment['_PUB_TEST_SDK_VERSION'] = "0.1.2+3";
-
-    if (tokenEndpoint != null) {
-      environment['_PUB_TEST_TOKEN_ENDPOINT'] =
-        tokenEndpoint.toString();
-    }
+    var pubEnvironment = getPubTestEnvironment(tokenEndpoint);
 
     // If there is a server running, tell pub what its URL is so hosted
     // dependencies will look there.
     if (_hasServer) {
       return port.then((p) {
-        environment['PUB_HOSTED_URL'] = "http://localhost:$p";
-        return environment;
+        pubEnvironment['PUB_HOSTED_URL'] = "http://localhost:$p";
+        return pubEnvironment;
       });
     }
 
-    return environment;
+    return pubEnvironment;
+  }).then((pubEnvironment) {
+    if (environment != null) pubEnvironment.addAll(environment);
+    return pubEnvironment;
   });
 
   return new PubProcess.start(dartBin, dartArgs, environment: environmentFuture,
-      workingDirectory: pathInSandbox(appPath),
+      workingDirectory: _pathInSandbox(appPath),
       description: args.isEmpty ? 'pub' : 'pub ${args.first}');
 }
 
@@ -934,7 +952,7 @@
   return schedule(() {
     var cache = new SystemCache.withSources(p.join(sandboxDir, cachePath));
 
-    return syncFuture(() {
+    return new Future.sync(() {
       var validator = fn(new Entrypoint(p.join(sandboxDir, appPath), cache));
       return validator.validate().then((_) {
         return new Pair(validator.errors, validator.warnings);
diff --git a/sdk/lib/_internal/pub/test/transformer/cache_test.dart b/sdk/lib/_internal/pub/test/transformer/cache_test.dart
new file mode 100644
index 0000000..270d307
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/cache_test.dart
@@ -0,0 +1,291 @@
+// 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';
+
+const REPLACE_FROM_LIBRARY_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:bar/bar.dart';
+
+class ReplaceTransformer extends Transformer {
+  ReplaceTransformer.asPlugin();
+
+  String get allowedExtensions => '.dart';
+
+  Future apply(Transform transform) {
+    return transform.primaryInput.readAsString().then((contents) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id,
+          contents.replaceAll("Hello", replacement)));
+    });
+  }
+}
+""";
+
+// TODO(nweiz): Currently scheduled_test.setUp doesn't play well with test_pub,
+// since it only assigns the sandbox directory once the main test body has
+// run. Fix this and move this to a real setUp call.
+void setUp() {
+  servePackages((builder) {
+    builder.serveRepoPackage('barback');
+
+    builder.serve("foo", "1.2.3",
+        deps: {'barback': 'any'},
+        contents: [
+      d.dir("lib", [
+        d.file("transformer.dart", replaceTransformer("Hello", "Goodbye"))
+      ])
+    ]);
+
+    builder.serve("bar", "1.2.3",
+        deps: {'barback': 'any'},
+        contents: [
+      d.dir("lib", [
+        d.file("transformer.dart", replaceTransformer("Goodbye", "See ya"))
+      ])
+    ]);
+  });
+
+  d.dir(appPath, [
+    d.pubspec({
+      "name": "myapp",
+      "dependencies": {
+        "foo": "1.2.3",
+        "bar": "1.2.3"
+      },
+      "transformers": ["foo"]
+    }),
+    d.dir("bin", [
+      d.file("myapp.dart", "main() => print('Hello!');")
+    ])
+  ]).create();
+
+  pubGet();
+}
+
+main() {
+  initConfig();
+
+  integration("caches a transformer snapshot", () {
+    setUp();
+
+    var process = pubRun(args: ['myapp']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+
+    d.dir(appPath, [
+      d.dir(".pub/transformers", [
+        d.file("manifest.txt", "0.1.2+3\nfoo"),
+        d.matcherFile("transformers.snapshot", isNot(isEmpty))
+      ])
+    ]).validate();
+
+    // Run the executable again to make sure loading the transformer from the
+    // cache works.
+    process = pubRun(args: ['myapp']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+  });
+
+  integration("recaches if the SDK version is out-of-date", () {
+    setUp();
+
+    d.dir(appPath, [
+      d.dir(".pub/transformers", [
+        // The version 0.0.1 is different than the test version 0.1.2+3.
+        d.file("manifest.txt", "0.0.1\nfoo"),
+        d.file("transformers.snapshot", "junk")
+      ])
+    ]).create();
+
+    var process = pubRun(args: ['myapp']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+
+    d.dir(appPath, [
+      d.dir(".pub/transformers", [
+        d.file("manifest.txt", "0.1.2+3\nfoo"),
+        d.matcherFile("transformers.snapshot", isNot(isEmpty))
+      ])
+    ]).validate();
+  });
+
+  integration("recaches if the transformers change", () {
+    setUp();
+
+    var process = pubRun(args: ['myapp']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+
+    d.dir(appPath, [
+      d.dir(".pub/transformers", [
+        d.file("manifest.txt", "0.1.2+3\nfoo"),
+        d.matcherFile("transformers.snapshot", isNot(isEmpty))
+      ])
+    ]).validate();
+
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": "1.2.3",
+          "bar": "1.2.3"
+        },
+        "transformers": ["foo", "bar"]
+      }),
+      d.dir("bin", [
+        d.file("myapp.dart", "main() => print('Hello!');")
+      ])
+    ]).create();
+
+    process = pubRun(args: ['myapp']);
+    process.stdout.expect("See ya!");
+    process.shouldExit();
+
+    d.dir(appPath, [
+      d.dir(".pub/transformers", [
+        d.file("manifest.txt", "0.1.2+3\nbar,foo"),
+        d.matcherFile("transformers.snapshot", isNot(isEmpty))
+      ])
+    ]).validate();
+  });
+
+  integration("recaches if the transformer version changes", () {
+    setUp();
+
+    var process = pubRun(args: ['myapp']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+
+    d.dir(appPath, [
+      d.dir(".pub/transformers", [
+        d.file("manifest.txt", "0.1.2+3\nfoo"),
+        d.matcherFile("transformers.snapshot", isNot(isEmpty))
+      ])
+    ]).validate();
+
+    servePackages((builder) {
+      builder.serve("foo", "2.0.0",
+          deps: {'barback': 'any'},
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", replaceTransformer("Hello", "New"))
+        ])
+      ]);
+    });
+
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": "any"},
+        "transformers": ["foo"]
+      })
+    ]).create();
+
+    pubUpgrade();
+
+    process = pubRun(args: ['myapp']);
+    process.stdout.expect("New!");
+    process.shouldExit();
+
+    d.dir(appPath, [
+      d.dir(".pub/transformers", [
+        d.file("manifest.txt", "0.1.2+3\nfoo"),
+        d.matcherFile("transformers.snapshot", isNot(isEmpty))
+      ])
+    ]).validate();
+  });
+
+  integration("recaches if a transitive dependency version changes", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+
+      builder.serve("foo", "1.2.3",
+          deps: {
+            'barback': 'any',
+            'bar': 'any'
+          },
+          contents: [
+        d.dir("lib", [
+          d.file("transformer.dart", REPLACE_FROM_LIBRARY_TRANSFORMER)
+        ])
+      ]);
+
+      builder.serve("bar", "1.2.3", contents: [
+        d.dir("lib", [
+          d.file("bar.dart", "final replacement = 'Goodbye';")
+        ])
+      ]);
+    });
+
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": "1.2.3"},
+        "transformers": ["foo"]
+      }),
+      d.dir("bin", [
+        d.file("myapp.dart", "main() => print('Hello!');")
+      ])
+    ]).create();
+
+    pubGet();
+
+    var process = pubRun(args: ['myapp']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+
+    servePackages((builder) {
+      builder.serve("bar", "2.0.0", contents: [
+        d.dir("lib", [
+          d.file("bar.dart", "final replacement = 'See ya';")
+        ])
+      ]);
+    });
+
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": "any"},
+        "transformers": ["foo"]
+      })
+    ]).create();
+
+    pubUpgrade();
+
+    process = pubRun(args: ['myapp']);
+    process.stdout.expect("See ya!");
+    process.shouldExit();
+  });
+}
+
+String replaceTransformer(String input, String output) {
+  return """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class ReplaceTransformer extends Transformer {
+  ReplaceTransformer.asPlugin();
+
+  String get allowedExtensions => '.dart';
+
+  Future apply(Transform transform) {
+    return transform.primaryInput.readAsString().then((contents) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id,
+          contents.replaceAll("$input", "$output")));
+    });
+  }
+}
+""";
+}
diff --git a/sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart b/sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart
index 38ee284..d269b06 100644
--- a/sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart
+++ b/sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart
@@ -102,4 +102,4 @@
       expectValidationWarning(compiledDartdoc);
     });
   });
-}
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/validator/executable_test.dart b/sdk/lib/_internal/pub/test/validator/executable_test.dart
new file mode 100644
index 0000000..6d1fb81
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/validator/executable_test.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.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/entrypoint.dart';
+import '../../lib/src/validator.dart';
+import '../../lib/src/validator/executable.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+Validator executable(Entrypoint entrypoint) =>
+  new ExecutableValidator(entrypoint);
+
+main() {
+  initConfig();
+
+  setUp(d.validPackage.create);
+
+  group('should consider a package valid if it', () {
+    integration('has executables that are present', () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "test_pkg",
+          "version": "1.0.0",
+          "executables": {
+            "one": "one_script",
+            "two": null
+          }
+        }),
+        d.dir("bin", [
+          d.file("one_script.dart", "main() => print('ok');"),
+          d.file("two.dart", "main() => print('ok');")
+        ])
+      ]).create();
+      expectNoValidationError(executable);
+    });
+  });
+
+  group("should consider a package invalid if it", () {
+    integration('is missing one or more listed executables', () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "test_pkg",
+          "version": "1.0.0",
+          "executables": {
+            "nope": "not_there",
+            "nada": null
+          }
+        })
+      ]).create();
+      expectValidationWarning(executable);
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/version_solver_test.dart b/sdk/lib/_internal/pub/test/version_solver_test.dart
index d98a5bf..7673fde 100644
--- a/sdk/lib/_internal/pub/test/version_solver_test.dart
+++ b/sdk/lib/_internal/pub/test/version_solver_test.dart
@@ -1378,7 +1378,7 @@
   }
 
   Future<List<Version>> getVersions(String name, String description) {
-    return syncFuture(() {
+    return new Future.sync(() {
       // Make sure the solver doesn't request the same thing twice.
       if (_requestedVersions.contains(description)) {
         throw new Exception('Version list for $description was already '
@@ -1397,7 +1397,7 @@
   }
 
   Future<Pubspec> describeUncached(PackageId id) {
-    return syncFuture(() {
+    return new Future.sync(() {
       // Make sure the solver doesn't request the same thing twice.
       if (_requestedPubspecs.containsKey(id.description) &&
           _requestedPubspecs[id.description].contains(id.version)) {
diff --git a/sdk/lib/_internal/pub_generated/asset/dart/transformer_isolate.dart b/sdk/lib/_internal/pub_generated/asset/dart/transformer_isolate.dart
index a3d6a71..50bb97b 100644
--- a/sdk/lib/_internal/pub_generated/asset/dart/transformer_isolate.dart
+++ b/sdk/lib/_internal/pub_generated/asset/dart/transformer_isolate.dart
@@ -12,6 +12,11 @@
 
 import 'serialize.dart';
 
+/// The mirror system.
+///
+/// Cached to avoid re-instantiating each time a transformer is initialized.
+final _mirrors = currentMirrorSystem();
+
 /// Sets up the initial communication with the host isolate.
 void loadTransformers(SendPort replyTo) {
   var port = new ReceivePort();
@@ -20,10 +25,9 @@
     // TODO(nweiz): When issue 19228 is fixed, spin up a separate isolate for
     // libraries loaded beyond the first so they can run in parallel.
     respond(wrappedMessage, (message) {
-      var library = Uri.parse(message['library']);
       var configuration = JSON.decode(message['configuration']);
       var mode = new BarbackMode(message['mode']);
-      return _initialize(library, configuration, mode).
+      return _initialize(message['library'], configuration, mode).
           map(serializeTransformerLike).toList();
     });
   });
@@ -33,8 +37,7 @@
 ///
 /// Loads the library, finds any [Transformer] or [TransformerGroup] subclasses
 /// in it, instantiates them with [configuration] and [mode], and returns them.
-List _initialize(Uri uri, Map configuration, BarbackMode mode) {
-  var mirrors = currentMirrorSystem();
+List _initialize(String uri, Map configuration, BarbackMode mode) {
   var transformerClass = reflectClass(Transformer);
   var aggregateClass = _aggregateTransformerClass;
   var groupClass = reflectClass(TransformerGroup);
@@ -79,7 +82,13 @@
     }).where((classMirror) => classMirror != null));
   }
 
-  loadFromLibrary(mirrors.libraries[uri]);
+  var library = _mirrors.libraries[Uri.parse(uri)];
+
+  // This should only happen if something's wrong with the logic in pub itself.
+  // If it were user error, the entire isolate would fail to load.
+  if (library == null) throw "Couldn't find library at $uri.";
+
+  loadFromLibrary(library);
   return transformers;
 }
 
diff --git a/sdk/lib/_internal/pub_generated/bin/async_compile.dart b/sdk/lib/_internal/pub_generated/bin/async_compile.dart
index 736ba80..15acba1 100644
--- a/sdk/lib/_internal/pub_generated/bin/async_compile.dart
+++ b/sdk/lib/_internal/pub_generated/bin/async_compile.dart
@@ -32,15 +32,7 @@
         "Usage: dart async_compile.dart [--verbose] [--force] <build dir>");
     exit(64);
   }
-  var result = Process.runSync(
-      "git",
-      ["rev-parse", "HEAD"],
-      workingDirectory: p.join(sourceDir, "../../../../third_party/pkg/async_await"));
-  if (result.exitCode != 0) {
-    stderr.writeln("Could not get Git revision of async_await compiler.");
-    exit(1);
-  }
-  var currentCommit = result.stdout.trim();
+  var currentCommit = _getCurrentCommit();
   var readmePath = p.join(generatedDir, "README.md");
   var lastCommit;
   var readme = new File(readmePath).readAsStringSync();
@@ -52,7 +44,7 @@
   lastCommit = match[0];
   var numFiles = 0;
   var numCompiled = 0;
-  var sources = new Set<String>();
+  var sources = new Set();
   for (var entry in new Directory(sourceDir).listSync(recursive: true)) {
     if (p.extension(entry.path) != ".dart") continue;
     numFiles++;
@@ -87,6 +79,23 @@
   if (verbose) print("Compiled $numCompiled out of $numFiles files");
   if (hadFailure) exit(1);
 }
+String _getCurrentCommit() {
+  var command = "git";
+  var args = ["rev-parse", "HEAD"];
+  if (Platform.operatingSystem == "windows") {
+    command = "cmd";
+    args = ["/c", "git"]..addAll(args);
+  }
+  var result = Process.runSync(
+      command,
+      args,
+      workingDirectory: p.join(sourceDir, "../../../../third_party/pkg/async_await"));
+  if (result.exitCode != 0) {
+    stderr.writeln("Could not get Git revision of async_await compiler.");
+    exit(1);
+  }
+  return result.stdout.trim();
+}
 void _compile(String sourcePath, String source, String destPath) {
   var destDir = new Directory(p.dirname(destPath));
   destDir.createSync(recursive: true);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/admin_server.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/admin_server.dart
index e4312fe..3d6f58d 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/admin_server.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/admin_server.dart
@@ -4,7 +4,6 @@
 import 'package:http_parser/http_parser.dart';
 import 'package:shelf/shelf.dart' as shelf;
 import 'package:shelf_web_socket/shelf_web_socket.dart';
-import 'package:stack_trace/stack_trace.dart';
 import '../io.dart';
 import '../log.dart' as log;
 import 'asset_environment.dart';
@@ -15,7 +14,7 @@
   shelf.Handler _handler;
   static Future<AdminServer> bind(AssetEnvironment environment, String host,
       int port) {
-    return Chain.track(bindServer(host, port)).then((server) {
+    return bindServer(host, port).then((server) {
       log.fine('Bound admin server to $host:$port.');
       return new AdminServer._(environment, server);
     });
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart
index aed7cd1..894a1af 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/asset_environment.dart
@@ -4,6 +4,7 @@
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
 import 'package:watcher/watcher.dart';
+import '../cached_package.dart';
 import '../entrypoint.dart';
 import '../exceptions.dart';
 import '../io.dart';
@@ -23,25 +24,38 @@
 class AssetEnvironment {
   static Future<AssetEnvironment> create(Entrypoint entrypoint,
       BarbackMode mode, {WatcherType watcherType, String hostname, int basePort,
-      Iterable<String> packages, bool useDart2JS: true}) {
+      Iterable<String> packages, Iterable<AssetId> entrypoints, bool useDart2JS:
+      true}) {
     if (watcherType == null) watcherType = WatcherType.NONE;
     if (hostname == null) hostname = "localhost";
     if (basePort == null) basePort = 0;
     return entrypoint.loadPackageGraph().then((graph) {
       log.fine("Loaded package graph.");
-      var barback = new Barback(new PubPackageProvider(graph, packages));
+      graph = _adjustPackageGraph(graph, mode, packages);
+      var barback = new Barback(new PubPackageProvider(graph));
       barback.log.listen(_log);
-      var environment = new AssetEnvironment._(
-          graph,
-          barback,
-          mode,
-          watcherType,
-          hostname,
-          basePort,
-          packages);
-      return environment._load(useDart2JS: useDart2JS).then((_) => environment);
+      var environment =
+          new AssetEnvironment._(graph, barback, mode, watcherType, hostname, basePort);
+      return environment._load(
+          entrypoints: entrypoints,
+          useDart2JS: useDart2JS).then((_) => environment);
     });
   }
+  static PackageGraph _adjustPackageGraph(PackageGraph graph, BarbackMode mode,
+      Iterable<String> packages) {
+    if (mode != BarbackMode.DEBUG && packages == null) return graph;
+    packages = (packages == null ? graph.packages.keys : packages).toSet();
+    return new PackageGraph(
+        graph.entrypoint,
+        graph.lockFile,
+        new Map.fromIterable(packages, value: (packageName) {
+      var package = graph.packages[packageName];
+      if (mode != BarbackMode.DEBUG) return package;
+      var cache = path.join('.pub/deps/debug', packageName);
+      if (!dirExists(cache)) return package;
+      return new CachedPackage(package, cache);
+    }));
+  }
   AdminServer _adminServer;
   final _directories = new Map<String, SourceDirectory>();
   final Barback barback;
@@ -52,14 +66,9 @@
   final WatcherType _watcherType;
   final String _hostname;
   final int _basePort;
-  final Set<String> packages;
   Set<AssetId> _modifiedSources;
-  AssetEnvironment._(PackageGraph graph, this.barback, this.mode,
-      this._watcherType, this._hostname, this._basePort, Iterable<String> packages)
-      : graph = graph,
-        packages = packages == null ?
-          graph.packages.keys.toSet() :
-          packages.toSet();
+  AssetEnvironment._(this.graph, this.barback, this.mode, this._watcherType,
+      this._hostname, this._basePort);
   Iterable<Transformer> getBuiltInTransformers(Package package) {
     if (package.name != rootPackage.name) return null;
     if (_builtInTransformers.isEmpty) return null;
@@ -112,35 +121,109 @@
             (_) =>
                 BarbackServer.bind(this, _hostname, 0, package: package, rootDirectory: "bin"));
   }
-  Future precompileExecutables(String packageName, String directory,
-      {Iterable<AssetId> executableIds}) {
-    if (executableIds == null) {
-      executableIds = graph.packages[packageName].executableIds;
-    }
-    log.fine("executables for $packageName: $executableIds");
-    if (executableIds.isEmpty) return null;
-    var package = graph.packages[packageName];
-    return servePackageBinDirectory(packageName).then((server) {
-      return waitAndPrintErrors(executableIds.map((id) {
-        var basename = path.url.basename(id.path);
-        var snapshotPath = path.join(directory, "$basename.snapshot");
-        return runProcess(
-            Platform.executable,
-            [
-                '--snapshot=$snapshotPath',
-                server.url.resolve(basename).toString()]).then((result) {
-          if (result.success) {
-            log.message("Precompiled ${_formatExecutable(id)}.");
-          } else {
-            throw new ApplicationException(
-                log.yellow("Failed to precompile " "${_formatExecutable(id)}:\n") +
-                    result.stderr.join('\n'));
+  Future<Map<String, String>> precompileExecutables(String packageName,
+      String directory, {Iterable<AssetId> executableIds}) {
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        join0() {
+          log.fine("Executables for ${packageName}: ${executableIds}");
+          join1() {
+            var package = graph.packages[packageName];
+            servePackageBinDirectory(packageName).then((x0) {
+              try {
+                var server = x0;
+                join2(x1) {
+                  completer0.complete(null);
+                }
+                finally0(cont0, v0) {
+                  server.close();
+                  cont0(v0);
+                }
+                catch0(e1) {
+                  finally0(join2, null);
+                }
+                try {
+                  var precompiled = {};
+                  waitAndPrintErrors(executableIds.map(((id) {
+                    final completer0 = new Completer();
+                    scheduleMicrotask(() {
+                      try {
+                        var basename = path.url.basename(id.path);
+                        var snapshotPath =
+                            path.join(directory, "${basename}.snapshot");
+                        runProcess(
+                            Platform.executable,
+                            [
+                                '--snapshot=${snapshotPath}',
+                                server.url.resolve(basename).toString()]).then((x0) {
+                          try {
+                            var result = x0;
+                            join0() {
+                              completer0.complete(null);
+                            }
+                            if (result.success) {
+                              log.message(
+                                  "Precompiled ${_formatExecutable(id)}.");
+                              precompiled[path.withoutExtension(basename)] =
+                                  snapshotPath;
+                              join0();
+                            } else {
+                              completer0.completeError(
+                                  new ApplicationException(
+                                      log.yellow("Failed to precompile ${_formatExecutable(id)}:\n") +
+                                          result.stderr.join('\n')));
+                            }
+                          } catch (e0) {
+                            completer0.completeError(e0);
+                          }
+                        }, onError: (e1) {
+                          completer0.completeError(e1);
+                        });
+                      } catch (e2) {
+                        completer0.completeError(e2);
+                      }
+                    });
+                    return completer0.future;
+                  }))).then((x2) {
+                    try {
+                      x2;
+                      finally0((v1) {
+                        completer0.complete(v1);
+                      }, precompiled);
+                    } catch (e2) {
+                      catch0(e2);
+                    }
+                  }, onError: (e3) {
+                    catch0(e3);
+                  });
+                } catch (e4) {
+                  catch0(e4);
+                }
+              } catch (e0) {
+                completer0.completeError(e0);
+              }
+            }, onError: (e5) {
+              completer0.completeError(e5);
+            });
           }
-        });
-      })).whenComplete(() {
-        server.close();
-      });
+          if (executableIds.isEmpty) {
+            completer0.complete([]);
+          } else {
+            join1();
+          }
+        }
+        if (executableIds == null) {
+          executableIds = graph.packages[packageName].executableIds;
+          join0();
+        } else {
+          join0();
+        }
+      } catch (e6) {
+        completer0.completeError(e6);
+      }
     });
+    return completer0.future;
   }
   String _formatExecutable(AssetId id) =>
       log.bold("${id.package}:${path.basenameWithoutExtension(id.path)}");
@@ -180,17 +263,17 @@
   Future<List<Uri>> _lookUpPathInPackagesDirectory(String assetPath) {
     var components = path.split(path.relative(assetPath));
     if (components.first != "packages") return new Future.value([]);
-    if (!packages.contains(components[1])) return new Future.value([]);
+    if (!graph.packages.containsKey(components[1])) return new Future.value([]);
     return Future.wait(_directories.values.map((dir) {
       return dir.server.then(
           (server) => server.url.resolveUri(path.toUri(assetPath)));
     }));
   }
   Future<List<Uri>> _lookUpPathInDependency(String assetPath) {
-    for (var packageName in packages) {
+    for (var packageName in graph.packages.keys) {
       var package = graph.packages[packageName];
-      var libDir = path.join(package.dir, 'lib');
-      var assetDir = path.join(package.dir, 'asset');
+      var libDir = package.path('lib');
+      var assetDir = package.path('asset');
       var uri;
       if (path.isWithin(libDir, assetPath)) {
         uri = path.toUri(
@@ -233,77 +316,160 @@
     barback.updateSources(_modifiedSources);
     _modifiedSources = null;
   }
-  Future _load({bool useDart2JS}) {
+  Future _load({Iterable<AssetId> entrypoints, bool useDart2JS}) {
     return log.progress("Initializing barback", () {
-      var containsDart2JS = graph.entrypoint.root.pubspec.transformers.any(
-          (transformers) =>
-              transformers.any((config) => config.id.package == '\$dart2js'));
-      if (!containsDart2JS && useDart2JS) {
-        _builtInTransformers.addAll(
-            [new Dart2JSTransformer(this, mode), new DartForwardingTransformer(mode)]);
-      }
-      var dartPath = assetPath('dart');
-      var pubSources = listDir(
-          dartPath,
-          recursive: true).where(
-              (file) => path.extension(file) == ".dart").map((library) {
-        var idPath = path.join('lib', path.relative(library, from: dartPath));
-        return new AssetId('\$pub', path.toUri(idPath).toString());
-      });
-      var libPath = path.join(sdk.rootDirectory, "lib");
-      var sdkSources = listDir(
-          libPath,
-          recursive: true).where((file) => path.extension(file) == ".dart").map((file) {
-        var idPath =
-            path.join("lib", path.relative(file, from: sdk.rootDirectory));
-        return new AssetId('\$sdk', path.toUri(idPath).toString());
-      });
-      var transformerServer;
-      return BarbackServer.bind(this, _hostname, 0).then((server) {
-        transformerServer = server;
-        var errorStream = barback.errors.map((error) {
-          if (error is! AssetLoadException) throw error;
-          log.error(log.red(error.message));
-          log.fine(error.stackTrace.terse);
-        });
-        return _withStreamErrors(() {
-          return log.progress("Loading source assets", () {
-            barback.updateSources(pubSources);
-            barback.updateSources(sdkSources);
-            return _provideSources();
-          });
-        }, [errorStream, barback.results]);
-      }).then((_) {
-        log.fine("Provided sources.");
-        var completer = new Completer();
-        var errorStream = barback.errors.map((error) {
-          if (error is! TransformerException) throw error;
-          var message = error.error.toString();
-          if (error.stackTrace != null) {
-            message += "\n" + error.stackTrace.terse.toString();
+      final completer0 = new Completer();
+      scheduleMicrotask(() {
+        try {
+          var containsDart2JS = graph.entrypoint.root.pubspec.transformers.any(
+              ((transformers) =>
+                  transformers.any((config) => config.id.package == '\$dart2js')));
+          join0() {
+            BarbackServer.bind(this, _hostname, 0).then((x0) {
+              try {
+                var transformerServer = x0;
+                var errorStream = barback.errors.map(((error) {
+                  if (error is! AssetLoadException) throw error;
+                  log.error(log.red(error.message));
+                  log.fine(error.stackTrace.terse);
+                }));
+                _withStreamErrors((() {
+                  return log.progress("Loading source assets", _provideSources);
+                }), [errorStream, barback.results]).then((x1) {
+                  try {
+                    x1;
+                    log.fine("Provided sources.");
+                    errorStream = barback.errors.map(((error) {
+                      if (error is! TransformerException) throw error;
+                      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));
+                    }));
+                    _withStreamErrors((() {
+                      final completer0 = new Completer();
+                      scheduleMicrotask(() {
+                        try {
+                          completer0.complete(
+                              log.progress("Loading transformers", (() {
+                            final completer0 = new Completer();
+                            scheduleMicrotask(() {
+                              try {
+                                loadAllTransformers(
+                                    this,
+                                    transformerServer,
+                                    entrypoints: entrypoints).then((x0) {
+                                  try {
+                                    x0;
+                                    transformerServer.close();
+                                    completer0.complete(null);
+                                  } catch (e0) {
+                                    completer0.completeError(e0);
+                                  }
+                                }, onError: (e1) {
+                                  completer0.completeError(e1);
+                                });
+                              } catch (e2) {
+                                completer0.completeError(e2);
+                              }
+                            });
+                            return completer0.future;
+                          }), fine: true));
+                        } catch (e0) {
+                          completer0.completeError(e0);
+                        }
+                      });
+                      return completer0.future;
+                    }),
+                        [errorStream, barback.results, transformerServer.results]).then((x2) {
+                      try {
+                        x2;
+                        completer0.complete(null);
+                      } catch (e2) {
+                        completer0.completeError(e2);
+                      }
+                    }, onError: (e3) {
+                      completer0.completeError(e3);
+                    });
+                  } catch (e1) {
+                    completer0.completeError(e1);
+                  }
+                }, onError: (e4) {
+                  completer0.completeError(e4);
+                });
+              } catch (e0) {
+                completer0.completeError(e0);
+              }
+            }, onError: (e5) {
+              completer0.completeError(e5);
+            });
           }
-          _log(
-              new LogEntry(
-                  error.transform,
-                  error.transform.primaryId,
-                  LogLevel.ERROR,
-                  message,
-                  null));
-        });
-        return _withStreamErrors(() {
-          return log.progress("Loading transformers", () {
-            return loadAllTransformers(
-                this,
-                transformerServer).then((_) => transformerServer.close());
-          }, fine: true);
-        }, [errorStream, barback.results, transformerServer.results]);
-      }).then((_) => barback.removeSources(pubSources));
+          if (!containsDart2JS && useDart2JS) {
+            _builtInTransformers.addAll(
+                [new Dart2JSTransformer(this, mode), new DartForwardingTransformer(mode)]);
+            join0();
+          } else {
+            join0();
+          }
+        } catch (e6) {
+          completer0.completeError(e6);
+        }
+      });
+      return completer0.future;
     }, fine: true);
   }
   Future _provideSources() {
-    return Future.wait(packages.map((package) {
-      return _provideDirectorySources(graph.packages[package], "lib");
-    }));
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        Future.wait(graph.packages.values.map(((package) {
+          final completer0 = new Completer();
+          scheduleMicrotask(() {
+            try {
+              join0() {
+                _provideDirectorySources(package, "lib").then((x0) {
+                  try {
+                    x0;
+                    completer0.complete(null);
+                  } catch (e0) {
+                    completer0.completeError(e0);
+                  }
+                }, onError: (e1) {
+                  completer0.completeError(e1);
+                });
+              }
+              if (graph.isPackageStatic(package.name)) {
+                completer0.complete(null);
+              } else {
+                join0();
+              }
+            } catch (e2) {
+              completer0.completeError(e2);
+            }
+          });
+          return completer0.future;
+        }))).then((x0) {
+          try {
+            x0;
+            completer0.complete(null);
+          } catch (e0) {
+            completer0.completeError(e0);
+          }
+        }, onError: (e1) {
+          completer0.completeError(e1);
+        });
+      } catch (e2) {
+        completer0.completeError(e2);
+      }
+    });
+    return completer0.future;
   }
   Future<StreamSubscription<WatchEvent>>
       _provideDirectorySources(Package package, String dir) {
@@ -333,10 +499,8 @@
     }
   }
   Iterable<AssetId> _listDirectorySources(Package package, String dir) {
-    var subdirectory = path.join(package.dir, dir);
-    if (!dirExists(subdirectory)) return [];
-    return package.listFiles(beneath: subdirectory).map((file) {
-      var relative = path.relative(file, from: package.dir);
+    return package.listFiles(beneath: dir).map((file) {
+      var relative = package.relative(file);
       if (Platform.operatingSystem == 'windows') {
         relative = relative.replaceAll("\\", "/");
       }
@@ -351,7 +515,7 @@
         graph.entrypoint.cache.sources[packageId.source] is CachedSource) {
       return new Future.value();
     }
-    var subdirectory = path.join(package.dir, dir);
+    var subdirectory = package.path(dir);
     if (!dirExists(subdirectory)) return new Future.value();
     var watcher = _watcherType.create(subdirectory);
     var subscription = watcher.events.listen((event) {
@@ -360,7 +524,7 @@
       if (event.path.endsWith(".dart.js")) return;
       if (event.path.endsWith(".dart.js.map")) return;
       if (event.path.endsWith(".dart.precompiled.js")) return;
-      var idPath = path.relative(event.path, from: package.dir);
+      var idPath = package.relative(event.path);
       var id = new AssetId(package.name, path.toUri(idPath).toString());
       if (event.type == ChangeType.REMOVE) {
         if (_modifiedSources != null) {
@@ -379,8 +543,8 @@
   Future _withStreamErrors(Future futureCallback(), List<Stream> streams) {
     var completer = new Completer.sync();
     var subscriptions = streams.map(
-        (stream) => stream.listen((_) {}, onError: completer.complete)).toList();
-    syncFuture(futureCallback).then((_) {
+        (stream) => stream.listen((_) {}, onError: completer.completeError)).toList();
+    new Future.sync(futureCallback).then((_) {
       if (!completer.isCompleted) completer.complete();
     }).catchError((error, stackTrace) {
       if (!completer.isCompleted) completer.completeError(error, stackTrace);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/barback_server.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/barback_server.dart
index fbf05c2..530c26f 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/barback_server.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/barback_server.dart
@@ -20,7 +20,7 @@
   static Future<BarbackServer> bind(AssetEnvironment environment, String host,
       int port, {String package, String rootDirectory}) {
     if (package == null) package = environment.rootPackage.name;
-    return Chain.track(bindServer(host, port)).then((server) {
+    return bindServer(host, port).then((server) {
       if (rootDirectory == null) {
         log.fine('Serving packages on $host:$port.');
       } else {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/base_server.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/base_server.dart
index cb1234c..6cf7ab3 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/base_server.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/base_server.dart
@@ -5,7 +5,6 @@
 import 'package:barback/barback.dart';
 import 'package:shelf/shelf.dart' as shelf;
 import 'package:shelf/shelf_io.dart' as shelf_io;
-import 'package:stack_trace/stack_trace.dart';
 import '../log.dart' as log;
 import '../utils.dart';
 import 'asset_environment.dart';
@@ -19,12 +18,9 @@
   final _resultsController = new StreamController<T>.broadcast();
   BaseServer(this.environment, this._server) {
     shelf_io.serveRequests(
-        Chain.track(_server),
+        _server,
         const shelf.Pipeline().addMiddleware(
-            shelf.createMiddleware(
-                errorHandler: _handleError)).addMiddleware(
-                    shelf.createMiddleware(
-                        responseHandler: _disableGzip)).addHandler(handleRequest));
+            shelf.createMiddleware(errorHandler: _handleError)).addHandler(handleRequest));
   }
   Future close() {
     return Future.wait([_server.close(), _resultsController.close()]);
@@ -78,12 +74,4 @@
     close();
     return new shelf.Response.internalServerError();
   }
-  _disableGzip(shelf.Response response) {
-    if (!response.headers.containsKey('Content-Encoding')) {
-      return response.change(headers: {
-        'Content-Encoding': ''
-      });
-    }
-    return response;
-  }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/dart2js_transformer.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/dart2js_transformer.dart
index 50efc65..fa51a12 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/dart2js_transformer.dart
@@ -5,7 +5,6 @@
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
 import 'package:pool/pool.dart';
-import 'package:stack_trace/stack_trace.dart';
 import '../../../../compiler/compiler.dart' as compiler;
 import '../../../../compiler/implementation/dart2js.dart' show AbortLeg;
 import '../../../../compiler/implementation/source_file.dart';
@@ -87,29 +86,27 @@
         transform,
         generateSourceMaps: _generateSourceMaps);
     var id = transform.primaryInput.id;
-    var entrypoint =
-        path.join(_environment.graph.packages[id.package].dir, id.path);
-    return Chain.track(
-        dart.compile(
-            entrypoint,
-            provider,
-            commandLineOptions: _configCommandLineOptions,
-            csp: _configBool('csp'),
-            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));
+    var entrypoint = _environment.graph.packages[id.package].path(id.path);
+    return dart.compile(
+        entrypoint,
+        provider,
+        commandLineOptions: _configCommandLineOptions,
+        csp: _configBool('csp'),
+        checked: _configBool('checked'),
+        minify: _configBool(
+            'minify',
+            defaultsTo: _settings.mode == BarbackMode.RELEASE),
+        verbose: _configBool('verbose'),
+        environment: _configEnvironment,
+        packageRoot: _environment.rootPackage.path("packages"),
+        analyzeAll: _configBool('analyzeAll'),
+        suppressWarnings: _configBool('suppressWarnings'),
+        suppressHints: _configBool('suppressHints'),
+        suppressPackageWarnings: _configBool(
+            'suppressPackageWarnings',
+            defaultsTo: true),
+        terse: _configBool('terse'),
+        includeSourceMapUrls: _settings.mode != BarbackMode.RELEASE);
   }
   List<String> get _configCommandLineOptions {
     if (!_settings.configuration.containsKey('commandLineOptions')) return null;
@@ -167,7 +164,7 @@
     var buildDir =
         _environment.getSourceDirectoryContaining(_transform.primaryInput.id.path);
     _libraryRootPath =
-        path.join(_environment.rootPackage.dir, buildDir, "packages", r"$sdk");
+        _environment.rootPackage.path(buildDir, "packages", r"$sdk");
   }
   Future<String> provideInput(Uri resourceUri) {
     assert(resourceUri.isAbsolute);
@@ -244,7 +241,7 @@
     }
   }
   Future<String> _readResource(Uri url) {
-    return syncFuture(() {
+    return new Future.sync(() {
       var id = _sourceUrlToId(url);
       if (id != null) return _transform.readInputAsString(id);
       throw new Exception(
@@ -256,8 +253,8 @@
     if (id != null) return id;
     var sourcePath = path.fromUri(url);
     if (_environment.containsPath(sourcePath)) {
-      var relative = path.toUri(
-          path.relative(sourcePath, from: _environment.rootPackage.dir)).toString();
+      var relative =
+          path.toUri(_environment.rootPackage.relative(sourcePath)).toString();
       return new AssetId(_environment.rootPackage.name, relative);
     }
     return null;
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/transformers_needed_by_transformers.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/dependency_computer.dart
similarity index 72%
rename from sdk/lib/_internal/pub_generated/lib/src/barback/transformers_needed_by_transformers.dart
rename to sdk/lib/_internal/pub_generated/lib/src/barback/dependency_computer.dart
index 071c421..0dc6d67 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/transformers_needed_by_transformers.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/dependency_computer.dart
@@ -1,62 +1,78 @@
-library pub.barback.transformers_needed_by_transformers;
+library pub.barback.dependency_computer;
+import 'package:barback/barback.dart';
 import 'package:path/path.dart' as p;
 import '../dart.dart';
 import '../io.dart';
 import '../package.dart';
 import '../package_graph.dart';
 import '../utils.dart';
-import 'asset_environment.dart';
 import 'cycle_exception.dart';
 import 'transformer_config.dart';
 import 'transformer_id.dart';
-Map<TransformerId, Set<TransformerId>>
-    computeTransformersNeededByTransformers(PackageGraph graph,
-    {Iterable<String> packages}) {
-  if (packages == null) packages = graph.packages.keys;
-  var result = {};
-  var computer = new _DependencyComputer(graph);
-  for (var packageName in ordered(packages)) {
-    var package = graph.packages[packageName];
-    for (var phase in package.pubspec.transformers) {
-      for (var config in phase) {
-        var id = config.id;
-        if (id.isBuiltInTransformer) continue;
-        if (id.package != graph.entrypoint.root.name &&
-            !config.canTransformPublicFiles) {
-          continue;
-        }
-        result[id] = computer.transformersNeededByTransformer(id);
-      }
-    }
-  }
-  return result;
-}
-class _DependencyComputer {
+class DependencyComputer {
   final PackageGraph _graph;
   final _loadingPackageComputers = new Set<String>();
   final _packageComputers = new Map<String, _PackageDependencyComputer>();
   final _transformersNeededByPackages = new Map<String, Set<TransformerId>>();
-  _DependencyComputer(this._graph) {
+  final _untransformedPackages = new Set<String>();
+  DependencyComputer(this._graph) {
+    for (var package in ordered(_graph.packages.keys)) {
+      if (_graph.transitiveDependencies(
+          package).every((dependency) => dependency.pubspec.transformers.isEmpty)) {
+        _untransformedPackages.add(package);
+      }
+    }
     ordered(_graph.packages.keys).forEach(_loadPackageComputer);
   }
-  Set<TransformerId> transformersNeededByTransformer(TransformerId id) {
+  Map<TransformerId, Set<TransformerId>>
+      transformersNeededByTransformers([Iterable<TransformerId> transformers]) {
+    var result = {};
+    if (transformers == null) {
+      transformers = ordered(_graph.packages.keys).expand((packageName) {
+        var package = _graph.packages[packageName];
+        return package.pubspec.transformers.expand((phase) {
+          return phase.expand((config) {
+            var id = config.id;
+            if (id.isBuiltInTransformer) return [];
+            if (id.package != _graph.entrypoint.root.name &&
+                !config.canTransformPublicFiles) {
+              return [];
+            }
+            return [id];
+          });
+        });
+      });
+    }
+    for (var id in transformers) {
+      result[id] = _transformersNeededByTransformer(id);
+    }
+    return result;
+  }
+  Set<TransformerId> transformersNeededByLibrary(AssetId id) {
+    var library = _graph.packages[id.package].path(p.fromUri(id.path));
+    _loadPackageComputer(id.package);
+    return _packageComputers[id.package].transformersNeededByLibrary(library);
+  }
+  Set<TransformerId> _transformersNeededByTransformer(TransformerId id) {
     if (id.isBuiltInTransformer) return new Set();
     _loadPackageComputer(id.package);
-    return _packageComputers[id.package].transformersNeededByTransformer(id);
+    return _packageComputers[id.package]._transformersNeededByTransformer(id);
   }
-  Set<TransformerId> transformersNeededByPackageUri(Uri packageUri) {
+  Set<TransformerId> _transformersNeededByPackageUri(Uri packageUri) {
     var components = p.split(p.fromUri(packageUri.path));
     var packageName = components.first;
+    if (_untransformedPackages.contains(packageName)) return new Set();
     var package = _graph.packages[packageName];
     if (package == null) {
       fail(
           'A transformer imported unknown package "$packageName" (in ' '"$packageUri").');
     }
-    var library = p.join(package.dir, 'lib', p.joinAll(components.skip(1)));
+    var library = package.path('lib', p.joinAll(components.skip(1)));
     _loadPackageComputer(packageName);
     return _packageComputers[packageName].transformersNeededByLibrary(library);
   }
-  Set<TransformerId> transformersNeededByPackage(String rootPackage) {
+  Set<TransformerId> _transformersNeededByPackage(String rootPackage) {
+    if (_untransformedPackages.contains(rootPackage)) return new Set();
     if (_transformersNeededByPackages.containsKey(rootPackage)) {
       return _transformersNeededByPackages[rootPackage];
     }
@@ -103,7 +119,7 @@
   }
 }
 class _PackageDependencyComputer {
-  final _DependencyComputer _dependencyComputer;
+  final DependencyComputer _dependencyComputer;
   final Package _package;
   final _applicableTransformers = new Set<TransformerConfig>();
   final _directives = new Map<Uri, Set<Uri>>();
@@ -111,7 +127,7 @@
   final _transformersNeededByTransformers =
       new Map<TransformerId, Set<TransformerId>>();
   final _transitiveExternalDirectives = new Map<String, Set<Uri>>();
-  _PackageDependencyComputer(_DependencyComputer dependencyComputer,
+  _PackageDependencyComputer(DependencyComputer dependencyComputer,
       String packageName)
       : _dependencyComputer = dependencyComputer,
         _package = dependencyComputer._graph.packages[packageName] {
@@ -120,10 +136,10 @@
         var id = config.id;
         try {
           if (id.package != _package.name) {
-            _dependencyComputer.transformersNeededByTransformer(id);
+            _dependencyComputer._transformersNeededByTransformer(id);
           } else {
             _transformersNeededByTransformers[id] =
-                transformersNeededByLibrary(id.getFullPath(_package.dir));
+                transformersNeededByLibrary(_package.transformerPath(id));
           }
         } on CycleException catch (error) {
           throw error.prependStep("$packageName is transformed by $id");
@@ -133,13 +149,13 @@
       _applicableTransformers.addAll(phase);
     }
   }
-  Set<TransformerId> transformersNeededByTransformer(TransformerId id) {
+  Set<TransformerId> _transformersNeededByTransformer(TransformerId id) {
     assert(id.package == _package.name);
     if (_transformersNeededByTransformers.containsKey(id)) {
       return _transformersNeededByTransformers[id];
     }
     _transformersNeededByTransformers[id] =
-        transformersNeededByLibrary(id.getFullPath(_package.dir));
+        transformersNeededByLibrary(_package.transformerPath(id));
     return _transformersNeededByTransformers[id];
   }
   Set<TransformerId> transformersNeededByLibrary(String library) {
@@ -156,7 +172,7 @@
         return _applicableTransformers.map(
             (config) => config.id).toSet().union(unionAll(dependencies.map((dep) {
           try {
-            return _dependencyComputer.transformersNeededByPackage(dep.name);
+            return _dependencyComputer._transformersNeededByPackage(dep.name);
           } on CycleException catch (error) {
             throw error.prependStep("${_package.name} depends on ${dep.name}");
           }
@@ -164,7 +180,7 @@
       } else {
         return unionAll(externalDirectives.map((uri) {
           try {
-            return _dependencyComputer.transformersNeededByPackageUri(uri);
+            return _dependencyComputer._transformersNeededByPackageUri(uri);
           } on CycleException catch (error) {
             var packageName = p.url.split(uri.path).first;
             throw error.prependStep("${_package.name} depends on $packageName");
@@ -196,7 +212,7 @@
             results.add(uri);
             continue;
           }
-          path = p.join(_package.dir, 'lib', p.joinAll(components.skip(1)));
+          path = _package.path('lib', p.joinAll(components.skip(1)));
         } else if (uri.scheme == '' || uri.scheme == 'file') {
           path = p.join(p.dirname(library), p.fromUri(uri));
         } else {
@@ -212,7 +228,7 @@
   }
   Set<Uri> _getDirectives(String library) {
     var libraryUri = p.toUri(p.normalize(library));
-    var relative = p.toUri(p.relative(library, from: _package.dir)).path;
+    var relative = p.toUri(_package.relative(library)).path;
     if (_applicableTransformers.any(
         (config) => config.canTransform(relative))) {
       _directives[libraryUri] = null;
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/load_all_transformers.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/load_all_transformers.dart
index 42ce905..8ab13b2 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/load_all_transformers.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/load_all_transformers.dart
@@ -6,81 +6,216 @@
 import '../utils.dart';
 import 'asset_environment.dart';
 import 'barback_server.dart';
-import 'dart2js_transformer.dart';
-import 'excluding_transformer.dart';
-import 'rewrite_import_transformer.dart';
-import 'transformer_config.dart';
+import 'dependency_computer.dart';
 import 'transformer_id.dart';
-import 'transformer_isolate.dart';
-import 'transformers_needed_by_transformers.dart';
+import 'transformer_loader.dart';
 Future loadAllTransformers(AssetEnvironment environment,
-    BarbackServer transformerServer) {
-  var transformersNeededByTransformers =
-      computeTransformersNeededByTransformers(
-          environment.graph,
-          packages: environment.packages);
-  var buffer = new StringBuffer();
-  buffer.writeln("Transformer dependencies:");
-  transformersNeededByTransformers.forEach((id, dependencies) {
-    if (dependencies.isEmpty) {
-      buffer.writeln("$id: -");
-    } else {
-      buffer.writeln("$id: ${toSentence(dependencies)}");
+    BarbackServer transformerServer, {Iterable<AssetId> entrypoints}) {
+  final completer0 = new Completer();
+  scheduleMicrotask(() {
+    try {
+      var dependencyComputer = new DependencyComputer(environment.graph);
+      var necessaryTransformers;
+      join0() {
+        var transformersNeededByTransformers =
+            dependencyComputer.transformersNeededByTransformers(necessaryTransformers);
+        var buffer = new StringBuffer();
+        buffer.writeln("Transformer dependencies:");
+        transformersNeededByTransformers.forEach(((id, dependencies) {
+          if (dependencies.isEmpty) {
+            buffer.writeln("$id: -");
+          } else {
+            buffer.writeln("$id: ${toSentence(dependencies)}");
+          }
+        }));
+        log.fine(buffer);
+        var stagedTransformers =
+            _stageTransformers(transformersNeededByTransformers);
+        var packagesThatUseTransformers =
+            _packagesThatUseTransformers(environment.graph);
+        var loader = new TransformerLoader(environment, transformerServer);
+        join1(x0) {
+          var cache = x0;
+          var first = true;
+          var it0 = stagedTransformers.iterator;
+          break0(x6) {
+            join2() {
+              Future.wait(environment.graph.packages.values.map(((package) {
+                final completer0 = new Completer();
+                scheduleMicrotask(() {
+                  try {
+                    loader.transformersForPhases(
+                        package.pubspec.transformers).then((x0) {
+                      try {
+                        var phases = x0;
+                        var transformers =
+                            environment.getBuiltInTransformers(package);
+                        join0() {
+                          join1() {
+                            newFuture(
+                                (() => environment.barback.updateTransformers(package.name, phases)));
+                            completer0.complete(null);
+                          }
+                          if (phases.isEmpty) {
+                            completer0.complete(null);
+                          } else {
+                            join1();
+                          }
+                        }
+                        if (transformers != null) {
+                          phases.add(transformers);
+                          join0();
+                        } else {
+                          join0();
+                        }
+                      } catch (e0) {
+                        completer0.completeError(e0);
+                      }
+                    }, onError: (e1) {
+                      completer0.completeError(e1);
+                    });
+                  } catch (e2) {
+                    completer0.completeError(e2);
+                  }
+                });
+                return completer0.future;
+              }))).then((x1) {
+                try {
+                  x1;
+                  completer0.complete(null);
+                } catch (e0) {
+                  completer0.completeError(e0);
+                }
+              }, onError: (e1) {
+                completer0.completeError(e1);
+              });
+            }
+            if (cache != null) {
+              cache.save();
+              join2();
+            } else {
+              join2();
+            }
+          }
+          continue0(x7) {
+            if (it0.moveNext()) {
+              Future.wait([]).then((x5) {
+                var stage = it0.current;
+                join3(x2) {
+                  var snapshotPath = x2;
+                  first = false;
+                  loader.load(stage, snapshot: snapshotPath).then((x3) {
+                    try {
+                      x3;
+                      var packagesToUpdate =
+                          unionAll(stage.map(((id) => packagesThatUseTransformers[id])));
+                      Future.wait(packagesToUpdate.map(((packageName) {
+                        final completer0 = new Completer();
+                        scheduleMicrotask(() {
+                          try {
+                            var package =
+                                environment.graph.packages[packageName];
+                            loader.transformersForPhases(
+                                package.pubspec.transformers).then((x0) {
+                              try {
+                                var phases = x0;
+                                environment.barback.updateTransformers(
+                                    packageName,
+                                    phases);
+                                completer0.complete(null);
+                              } catch (e0) {
+                                completer0.completeError(e0);
+                              }
+                            }, onError: (e1) {
+                              completer0.completeError(e1);
+                            });
+                          } catch (e2) {
+                            completer0.completeError(e2);
+                          }
+                        });
+                        return completer0.future;
+                      }))).then((x4) {
+                        try {
+                          x4;
+                          continue0(null);
+                        } catch (e3) {
+                          completer0.completeError(e3);
+                        }
+                      }, onError: (e4) {
+                        completer0.completeError(e4);
+                      });
+                    } catch (e2) {
+                      completer0.completeError(e2);
+                    }
+                  }, onError: (e5) {
+                    completer0.completeError(e5);
+                  });
+                }
+                if (cache == null || !first) {
+                  join3(null);
+                } else {
+                  join3(cache.snapshotPath(stage));
+                }
+              });
+            } else {
+              break0(null);
+            }
+          }
+          continue0(null);
+        }
+        if (environment.rootPackage.dir == null) {
+          join1(null);
+        } else {
+          join1(environment.graph.loadTransformerCache());
+        }
+      }
+      if (entrypoints != null) {
+        join4() {
+          necessaryTransformers =
+              unionAll(entrypoints.map(dependencyComputer.transformersNeededByLibrary));
+          join5() {
+            join0();
+          }
+          if (necessaryTransformers.isEmpty) {
+            log.fine(
+                "No transformers are needed for ${toSentence(entrypoints)}.");
+            completer0.complete(null);
+          } else {
+            join5();
+          }
+        }
+        if (entrypoints.isEmpty) {
+          completer0.complete(null);
+        } else {
+          join4();
+        }
+      } else {
+        join0();
+      }
+    } catch (e6) {
+      completer0.completeError(e6);
     }
   });
-  log.fine(buffer);
-  var phasedTransformers = _phaseTransformers(transformersNeededByTransformers);
-  var packagesThatUseTransformers =
-      _packagesThatUseTransformers(environment.graph);
-  var loader = new _TransformerLoader(environment, transformerServer);
-  var rewrite = new RewriteImportTransformer();
-  for (var package in environment.packages) {
-    environment.barback.updateTransformers(package, [[rewrite]]);
-  }
-  environment.barback.updateTransformers(r'$pub', [[rewrite]]);
-  return Future.forEach(phasedTransformers, (phase) {
-    return loader.load(phase).then((_) {
-      var packagesToUpdate =
-          unionAll(phase.map((id) => packagesThatUseTransformers[id]));
-      return Future.wait(packagesToUpdate.map((packageName) {
-        var package = environment.graph.packages[packageName];
-        return loader.transformersForPhases(
-            package.pubspec.transformers).then((phases) {
-          phases.insert(0, new Set.from([rewrite]));
-          environment.barback.updateTransformers(packageName, phases);
-        });
-      }));
-    });
-  }).then((_) {
-    return Future.wait(environment.graph.packages.values.map((package) {
-      return loader.transformersForPhases(
-          package.pubspec.transformers).then((phases) {
-        var transformers = environment.getBuiltInTransformers(package);
-        if (transformers != null) phases.add(transformers);
-        newFuture(
-            () => environment.barback.updateTransformers(package.name, phases));
-      });
-    }));
-  });
+  return completer0.future;
 }
-List<Set<TransformerId>> _phaseTransformers(Map<TransformerId,
+List<Set<TransformerId>> _stageTransformers(Map<TransformerId,
     Set<TransformerId>> transformerDependencies) {
-  var phaseNumbers = {};
-  var phases = [];
-  phaseNumberFor(id) {
-    if (phaseNumbers.containsKey(id)) return phaseNumbers[id];
+  var stageNumbers = {};
+  var stages = [];
+  stageNumberFor(id) {
+    if (stageNumbers.containsKey(id)) return stageNumbers[id];
     var dependencies = transformerDependencies[id];
-    phaseNumbers[id] =
-        dependencies.isEmpty ? 0 : maxAll(dependencies.map(phaseNumberFor)) + 1;
-    return phaseNumbers[id];
+    stageNumbers[id] =
+        dependencies.isEmpty ? 0 : maxAll(dependencies.map(stageNumberFor)) + 1;
+    return stageNumbers[id];
   }
   for (var id in transformerDependencies.keys) {
-    var phaseNumber = phaseNumberFor(id);
-    if (phases.length <= phaseNumber) phases.length = phaseNumber + 1;
-    if (phases[phaseNumber] == null) phases[phaseNumber] = new Set();
-    phases[phaseNumber].add(id);
+    var stageNumber = stageNumberFor(id);
+    if (stages.length <= stageNumber) stages.length = stageNumber + 1;
+    if (stages[stageNumber] == null) stages[stageNumber] = new Set();
+    stages[stageNumber].add(id);
   }
-  return phases;
+  return stages;
 }
 Map<TransformerId, Set<String>> _packagesThatUseTransformers(PackageGraph graph)
     {
@@ -94,77 +229,3 @@
   }
   return results;
 }
-class _TransformerLoader {
-  final AssetEnvironment _environment;
-  final BarbackServer _transformerServer;
-  final _isolates = new Map<TransformerId, TransformerIsolate>();
-  final _transformers = new Map<TransformerConfig, Set<Transformer>>();
-  final _transformerUsers = new Map<TransformerId, Set<String>>();
-  _TransformerLoader(this._environment, this._transformerServer) {
-    for (var package in _environment.graph.packages.values) {
-      for (var config in unionAll(package.pubspec.transformers)) {
-        _transformerUsers.putIfAbsent(
-            config.id,
-            () => new Set<String>()).add(package.name);
-      }
-    }
-  }
-  Future load(Iterable<TransformerId> ids) {
-    ids = ids.where((id) => !_isolates.containsKey(id)).toList();
-    if (ids.isEmpty) return new Future.value();
-    return log.progress("Loading ${toSentence(ids)} transformers", () {
-      return TransformerIsolate.spawn(_environment, _transformerServer, ids);
-    }).then((isolate) {
-      for (var id in ids) {
-        _isolates[id] = isolate;
-      }
-    });
-  }
-  Future<Set<Transformer>> transformersFor(TransformerConfig config) {
-    if (_transformers.containsKey(config)) {
-      return new Future.value(_transformers[config]);
-    } else if (_isolates.containsKey(config.id)) {
-      return _isolates[config.id].create(config).then((transformers) {
-        if (transformers.isNotEmpty) {
-          _transformers[config] = transformers;
-          return transformers;
-        }
-        var message = "No transformers";
-        if (config.configuration.isNotEmpty) {
-          message += " that accept configuration";
-        }
-        var location;
-        if (config.id.path == null) {
-          location =
-              'package:${config.id.package}/transformer.dart or '
-                  'package:${config.id.package}/${config.id.package}.dart';
-        } else {
-          location = 'package:$config.dart';
-        }
-        var users = toSentence(ordered(_transformerUsers[config.id]));
-        fail("$message were defined in $location,\n" "required by $users.");
-      });
-    } else if (config.id.package != '\$dart2js') {
-      return new Future.value(new Set());
-    }
-    var transformer;
-    try {
-      transformer = new Dart2JSTransformer.withSettings(
-          _environment,
-          new BarbackSettings(config.configuration, _environment.mode));
-    } on FormatException catch (error, stackTrace) {
-      fail(error.message, error, stackTrace);
-    }
-    _transformers[config] =
-        new Set.from([ExcludingTransformer.wrap(transformer, config)]);
-    return new Future.value(_transformers[config]);
-  }
-  Future<List<Set<Transformer>>>
-      transformersForPhases(Iterable<Set<TransformerConfig>> phases) {
-    return Future.wait(phases.map((phase) {
-      return waitAndPrintErrors(phase.map(transformersFor)).then(unionAll);
-    })).then((phases) {
-      return phases.toList();
-    });
-  }
-}
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/pub_package_provider.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/pub_package_provider.dart
index 52250d4..ee505c2 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/pub_package_provider.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/pub_package_provider.dart
@@ -7,14 +7,16 @@
 import '../preprocess.dart';
 import '../sdk.dart' as sdk;
 import '../utils.dart';
-class PubPackageProvider implements PackageProvider {
+class PubPackageProvider implements StaticPackageProvider {
   final PackageGraph _graph;
-  final List<String> packages;
-  PubPackageProvider(PackageGraph graph, [Iterable<String> packages])
+  final List<String> staticPackages;
+  Iterable<String> get packages =>
+      _graph.packages.keys.toSet().difference(staticPackages.toSet());
+  PubPackageProvider(PackageGraph graph)
       : _graph = graph,
-        packages = [
+        staticPackages = [
           r"$pub",
-          r"$sdk"]..addAll(packages == null ? graph.packages.keys : packages);
+          r"$sdk"]..addAll(graph.packages.keys.where(graph.isPackageStatic));
   Future<Asset> getAsset(AssetId id) {
     if (id.package == r'$pub') {
       var components = path.url.split(id.path);
@@ -39,7 +41,38 @@
       return new Future.value(new Asset.fromPath(id, file));
     }
     var nativePath = path.fromUri(id.path);
-    var file = path.join(_graph.packages[id.package].dir, nativePath);
+    var file = _graph.packages[id.package].path(nativePath);
     return new Future.value(new Asset.fromPath(id, file));
   }
+  Stream<AssetId> getAllAssetIds(String packageName) {
+    if (packageName == r'$pub') {
+      var dartPath = assetPath('dart');
+      return new Stream.fromIterable(
+          listDir(
+              dartPath,
+              recursive: true).where(
+                  (file) => path.extension(file) == ".dart").map((library) {
+        var idPath = path.join('lib', path.relative(library, from: dartPath));
+        return new AssetId('\$pub', path.toUri(idPath).toString());
+      }));
+    } else if (packageName == r'$sdk') {
+      var libPath = path.join(sdk.rootDirectory, "lib");
+      return new Stream.fromIterable(
+          listDir(
+              libPath,
+              recursive: true).where((file) => path.extension(file) == ".dart").map((file) {
+        var idPath =
+            path.join("lib", path.relative(file, from: sdk.rootDirectory));
+        return new AssetId('\$sdk', path.toUri(idPath).toString());
+      }));
+    } else {
+      var package = _graph.packages[packageName];
+      return new Stream.fromIterable(
+          package.listFiles(beneath: 'lib').map((file) {
+        return new AssetId(
+            packageName,
+            path.toUri(package.relative(file)).toString());
+      }));
+    }
+  }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/rewrite_import_transformer.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/rewrite_import_transformer.dart
deleted file mode 100644
index bea129e..0000000
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/rewrite_import_transformer.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-library pub.rewrite_import_transformer;
-import 'dart:async';
-import 'package:barback/barback.dart';
-import '../dart.dart';
-class RewriteImportTransformer extends Transformer {
-  String get allowedExtensions => '.dart';
-  Future apply(Transform transform) {
-    return transform.primaryInput.readAsString().then((contents) {
-      var directives =
-          parseImportsAndExports(contents, name: transform.primaryInput.id.toString());
-      var buffer = new StringBuffer();
-      var index = 0;
-      for (var directive in directives) {
-        var uri = Uri.parse(directive.uri.stringValue);
-        if (uri.scheme != 'package') continue;
-        buffer
-            ..write(contents.substring(index, directive.uri.literal.offset))
-            ..write('"/packages/${uri.path}"');
-        index = directive.uri.literal.end;
-      }
-      buffer.write(contents.substring(index, contents.length));
-      transform.addOutput(
-          new Asset.fromString(transform.primaryInput.id, buffer.toString()));
-    });
-  }
-}
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_cache.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_cache.dart
new file mode 100644
index 0000000..01cf03b
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_cache.dart
@@ -0,0 +1,68 @@
+library pub.barback.transformer_cache;
+import 'package:path/path.dart' as p;
+import '../io.dart';
+import '../log.dart' as log;
+import '../package_graph.dart';
+import '../sdk.dart' as sdk;
+import '../utils.dart';
+import 'transformer_id.dart';
+class TransformerCache {
+  final PackageGraph _graph;
+  Set<TransformerId> _oldTransformers;
+  Set<TransformerId> _newTransformers;
+  String _dir;
+  String get _manifestPath => p.join(_dir, "manifest.txt");
+  TransformerCache.load(PackageGraph graph)
+      : _graph = graph,
+        _dir = graph.entrypoint.root.path(".pub/transformers") {
+    _oldTransformers = _parseManifest();
+  }
+  void clearIfOutdated(Set<String> changedPackages) {
+    var snapshotDependencies = unionAll(_oldTransformers.map((id) {
+      return _graph.transitiveDependencies(
+          id.package).map((package) => package.name).toSet();
+    }));
+    if (!overlaps(changedPackages, snapshotDependencies)) return;
+    deleteEntry(_dir);
+    _oldTransformers = new Set();
+  }
+  String snapshotPath(Set<TransformerId> transformers) {
+    var path = p.join(_dir, "transformers.snapshot");
+    if (_newTransformers != null) return path;
+    if (transformers.any((id) => _graph.isPackageMutable(id.package))) {
+      log.fine("Not caching mutable transformers.");
+      deleteEntry(_dir);
+      return null;
+    }
+    if (!_oldTransformers.containsAll(transformers)) {
+      log.fine("Cached transformer snapshot is out-of-date, deleting.");
+      deleteEntry(path);
+    } else {
+      log.fine("Using cached transformer snapshot.");
+    }
+    _newTransformers = transformers;
+    return path;
+  }
+  void save() {
+    if (_newTransformers == null) {
+      if (_dir != null) deleteEntry(_dir);
+      return;
+    }
+    if (_oldTransformers.containsAll(_newTransformers)) return;
+    ensureDir(_dir);
+    writeTextFile(
+        _manifestPath,
+        "${sdk.version}\n" +
+            ordered(_newTransformers.map((id) => id.serialize())).join(","));
+  }
+  Set<TransformerId> _parseManifest() {
+    if (!fileExists(_manifestPath)) return new Set();
+    var manifest = readTextFile(_manifestPath).split("\n");
+    if (manifest.removeAt(0) != sdk.version.toString()) {
+      deleteEntry(_dir);
+      return new Set();
+    }
+    return manifest.single.split(
+        ",").map((id) => new TransformerId.parse(id, null)).toSet();
+  }
+}
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_id.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_id.dart
index c209c70..cf8e16f 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_id.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_id.dart
@@ -1,9 +1,7 @@
 library pub.barback.transformer_id;
 import 'dart:async';
 import 'package:barback/barback.dart';
-import 'package:path/path.dart' as p;
 import 'package:source_span/source_span.dart';
-import '../io.dart';
 import '../utils.dart';
 const _BUILT_IN_TRANSFORMERS = const ['\$dart2js'];
 class TransformerId {
@@ -31,7 +29,8 @@
   bool operator ==(other) =>
       other is TransformerId && other.package == package && other.path == path;
   int get hashCode => package.hashCode ^ path.hashCode;
-  String toString() => path == null ? package : '$package/$path';
+  String serialize() => path == null ? package : '$package/$path';
+  String toString() => serialize();
   Future<AssetId> getAssetId(Barback barback) {
     if (path != null) {
       return new Future.value(new AssetId(package, 'lib/$path.dart'));
@@ -44,10 +43,4 @@
                     (e) => new AssetId(package, 'lib/$package.dart'),
                     test: (e) => e is AssetNotFoundException);
   }
-  String getFullPath(String packageDir) {
-    if (path != null) return p.join(packageDir, 'lib', p.fromUri('$path.dart'));
-    var transformerPath = p.join(packageDir, 'lib', 'transformer.dart');
-    if (fileExists(transformerPath)) return transformerPath;
-    return p.join(packageDir, 'lib', '$package.dart');
-  }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_isolate.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_isolate.dart
index 7e7f14c..7ea22b9 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_isolate.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_isolate.dart
@@ -21,29 +21,30 @@
   final Map<TransformerId, Uri> _idsToUrls;
   final BarbackMode _mode;
   static Future<TransformerIsolate> spawn(AssetEnvironment environment,
-      BarbackServer transformerServer, List<TransformerId> ids) {
+      BarbackServer transformerServer, List<TransformerId> ids, {String snapshot}) {
     return mapFromIterableAsync(ids, value: (id) {
       return id.getAssetId(environment.barback);
     }).then((idsToAssetIds) {
       var baseUrl = transformerServer.url;
       var idsToUrls = mapMap(idsToAssetIds, value: (id, assetId) {
         var path = assetId.path.replaceFirst('lib/', '');
-        return baseUrl.resolve('packages/${id.package}/$path');
+        return Uri.parse('package:${id.package}/$path');
       });
       var code = new StringBuffer();
       code.writeln("import 'dart:isolate';");
       for (var url in idsToUrls.values) {
         code.writeln("import '$url';");
       }
-      code.writeln(
-          "import " "r'$baseUrl/packages/\$pub/transformer_isolate.dart';");
+      code.writeln("import r'package:\$pub/transformer_isolate.dart';");
       code.writeln(
           "void main(_, SendPort replyTo) => loadTransformers(replyTo);");
       log.fine("Loading transformers from $ids");
       var port = new ReceivePort();
       return dart.runInIsolate(
           code.toString(),
-          port.sendPort).then((_) => port.first).then((sendPort) {
+          port.sendPort,
+          packageRoot: baseUrl.resolve('packages'),
+          snapshot: snapshot).then((_) => port.first).then((sendPort) {
         return new TransformerIsolate._(sendPort, environment.mode, idsToUrls);
       }).catchError((error, stackTrace) {
         if (error is! CrossIsolateException) throw error;
@@ -51,7 +52,8 @@
         var firstErrorLine = error.message.split('\n')[1];
         var missingTransformer = idsToUrls.keys.firstWhere(
             (id) =>
-                firstErrorLine.startsWith("Uncaught Error: Failure getting ${idsToUrls[id]}:"),
+                firstErrorLine.startsWith("Uncaught Error: Failure getting ") &&
+                    firstErrorLine.contains(idsToUrls[id].path),
             orElse: () => throw error);
         var packageUri = idToPackageUri(idsToAssetIds[missingTransformer]);
         fail('Transformer library "$packageUri" not found.', error, stackTrace);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_loader.dart b/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_loader.dart
new file mode 100644
index 0000000..c8d69b7
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/lib/src/barback/transformer_loader.dart
@@ -0,0 +1,203 @@
+library pub.barback.transformer_loader;
+import 'dart:async';
+import 'package:barback/barback.dart';
+import '../log.dart' as log;
+import '../utils.dart';
+import 'asset_environment.dart';
+import 'barback_server.dart';
+import 'dart2js_transformer.dart';
+import 'excluding_transformer.dart';
+import 'transformer_config.dart';
+import 'transformer_id.dart';
+import 'transformer_isolate.dart';
+class TransformerLoader {
+  final AssetEnvironment _environment;
+  final BarbackServer _transformerServer;
+  final _isolates = new Map<TransformerId, TransformerIsolate>();
+  final _transformers = new Map<TransformerConfig, Set<Transformer>>();
+  final _transformerUsers = new Map<TransformerId, Set<String>>();
+  TransformerLoader(this._environment, this._transformerServer) {
+    for (var package in _environment.graph.packages.values) {
+      for (var config in unionAll(package.pubspec.transformers)) {
+        _transformerUsers.putIfAbsent(
+            config.id,
+            () => new Set<String>()).add(package.name);
+      }
+    }
+  }
+  Future load(Iterable<TransformerId> ids, {String snapshot}) {
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        ids = ids.where(((id) => !_isolates.containsKey(id))).toList();
+        join0() {
+          log.progress(
+              "Loading ${toSentence(ids)} transformers",
+              (() =>
+                  TransformerIsolate.spawn(
+                      _environment,
+                      _transformerServer,
+                      ids,
+                      snapshot: snapshot))).then((x0) {
+            try {
+              var isolate = x0;
+              var it0 = ids.iterator;
+              break0(x2) {
+                completer0.complete(null);
+              }
+              continue0(x3) {
+                if (it0.moveNext()) {
+                  Future.wait([]).then((x1) {
+                    var id = it0.current;
+                    _isolates[id] = isolate;
+                    continue0(null);
+                  });
+                } else {
+                  break0(null);
+                }
+              }
+              continue0(null);
+            } catch (e0) {
+              completer0.completeError(e0);
+            }
+          }, onError: (e1) {
+            completer0.completeError(e1);
+          });
+        }
+        if (ids.isEmpty) {
+          completer0.complete(null);
+        } else {
+          join0();
+        }
+      } catch (e2) {
+        completer0.completeError(e2);
+      }
+    });
+    return completer0.future;
+  }
+  Future<Set<Transformer>> transformersFor(TransformerConfig config) {
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        join0() {
+          join1() {
+            var transformer = (() {
+              try {
+                return new Dart2JSTransformer.withSettings(
+                    _environment,
+                    new BarbackSettings(config.configuration, _environment.mode));
+              } on FormatException catch (error, stackTrace) {
+                fail(error.message, error, stackTrace);
+              }
+            })();
+            _transformers[config] =
+                new Set.from([ExcludingTransformer.wrap(transformer, config)]);
+            completer0.complete(_transformers[config]);
+          }
+          if (_isolates.containsKey(config.id)) {
+            _isolates[config.id].create(config).then((x0) {
+              try {
+                var transformers = x0;
+                join2() {
+                  var message = "No transformers";
+                  join3() {
+                    var location;
+                    join4() {
+                      var users =
+                          toSentence(ordered(_transformerUsers[config.id]));
+                      fail(
+                          "${message} were defined in ${location},\n" "required by ${users}.");
+                      join1();
+                    }
+                    if (config.id.path == null) {
+                      location =
+                          'package:${config.id.package}/transformer.dart or '
+                              'package:${config.id.package}/${config.id.package}.dart';
+                      join4();
+                    } else {
+                      location = 'package:${config}.dart';
+                      join4();
+                    }
+                  }
+                  if (config.configuration.isNotEmpty) {
+                    message += " that accept configuration";
+                    join3();
+                  } else {
+                    join3();
+                  }
+                }
+                if (transformers.isNotEmpty) {
+                  _transformers[config] = transformers;
+                  completer0.complete(transformers);
+                } else {
+                  join2();
+                }
+              } catch (e0) {
+                completer0.completeError(e0);
+              }
+            }, onError: (e1) {
+              completer0.completeError(e1);
+            });
+          } else {
+            join5() {
+              join1();
+            }
+            if (config.id.package != '\$dart2js') {
+              completer0.complete(new Future.value(new Set()));
+            } else {
+              join5();
+            }
+          }
+        }
+        if (_transformers.containsKey(config)) {
+          completer0.complete(_transformers[config]);
+        } else {
+          join0();
+        }
+      } catch (e2) {
+        completer0.completeError(e2);
+      }
+    });
+    return completer0.future;
+  }
+  Future<List<Set<Transformer>>>
+      transformersForPhases(Iterable<Set<TransformerConfig>> phases) {
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        Future.wait(phases.map(((phase) {
+          final completer0 = new Completer();
+          scheduleMicrotask(() {
+            try {
+              waitAndPrintErrors(phase.map(transformersFor)).then((x0) {
+                try {
+                  var transformers = x0;
+                  completer0.complete(unionAll(transformers));
+                } catch (e0) {
+                  completer0.completeError(e0);
+                }
+              }, onError: (e1) {
+                completer0.completeError(e1);
+              });
+            } catch (e2) {
+              completer0.completeError(e2);
+            }
+          });
+          return completer0.future;
+        }))).then((x0) {
+          try {
+            var result = x0;
+            completer0.complete(result.toList());
+          } catch (e0) {
+            completer0.completeError(e0);
+          }
+        }, onError: (e1) {
+          completer0.completeError(e1);
+        });
+      } catch (e2) {
+        completer0.completeError(e2);
+      }
+    });
+    return completer0.future;
+  }
+}
diff --git a/sdk/lib/_internal/pub_generated/lib/src/cached_package.dart b/sdk/lib/_internal/pub_generated/lib/src/cached_package.dart
new file mode 100644
index 0000000..67a8e6a
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/lib/src/cached_package.dart
@@ -0,0 +1,54 @@
+library pub.cached_package;
+import 'package:path/path.dart' as p;
+import 'package:yaml/yaml.dart';
+import 'barback/transformer_config.dart';
+import 'io.dart';
+import 'package.dart';
+import 'pubspec.dart';
+import 'version.dart';
+class CachedPackage extends Package {
+  final String _cacheDir;
+  CachedPackage(Package inner, this._cacheDir)
+      : super(new _CachedPubspec(inner.pubspec), inner.dir);
+  String path(String part1, [String part2, String part3, String part4,
+      String part5, String part6, String part7]) {
+    if (_pathInCache(part1)) {
+      return p.join(_cacheDir, part1, part2, part3, part4, part5, part6, part7);
+    } else {
+      return super.path(part1, part2, part3, part4, part5, part6, part7);
+    }
+  }
+  String relative(String path) {
+    if (p.isWithin(path, _cacheDir)) return p.relative(path, from: _cacheDir);
+    return super.relative(path);
+  }
+  List<String> listFiles({String beneath, recursive: true, bool useGitIgnore:
+      false}) {
+    if (beneath == null) {
+      return super.listFiles(recursive: recursive, useGitIgnore: useGitIgnore);
+    }
+    if (_pathInCache(beneath)) return listDir(p.join(_cacheDir, beneath));
+    return super.listFiles(
+        beneath: beneath,
+        recursive: recursive,
+        useGitIgnore: useGitIgnore);
+  }
+  bool _pathInCache(String relativePath) => p.isWithin('lib', relativePath);
+}
+class _CachedPubspec implements Pubspec {
+  final Pubspec _inner;
+  YamlMap get fields => _inner.fields;
+  String get name => _inner.name;
+  Version get version => _inner.version;
+  List<PackageDep> get dependencies => _inner.dependencies;
+  List<PackageDep> get devDependencies => _inner.devDependencies;
+  List<PackageDep> get dependencyOverrides => _inner.dependencyOverrides;
+  PubspecEnvironment get environment => _inner.environment;
+  String get publishTo => _inner.publishTo;
+  Map<String, String> get executables => _inner.executables;
+  bool get isPrivate => _inner.isPrivate;
+  bool get isEmpty => _inner.isEmpty;
+  List<PubspecException> get allErrors => _inner.allErrors;
+  List<Set<TransformerConfig>> get transformers => const [];
+  _CachedPubspec(this._inner);
+}
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command.dart b/sdk/lib/_internal/pub_generated/lib/src/command.dart
index 5efe0f7..c000ccd 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command.dart
@@ -110,7 +110,7 @@
     _commandOptions = options;
     _cache = new SystemCache.withSources(cacheDir, isOffline: isOffline);
     _globals = new GlobalPackages(_cache);
-    return syncFuture(onRun);
+    return new Future.sync(onRun);
   }
   Future onRun() {
     assert(false);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/barback.dart b/sdk/lib/_internal/pub_generated/lib/src/command/barback.dart
index 08ffdb0..a026a4c 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/barback.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/barback.dart
@@ -55,8 +55,8 @@
       usageError(
           _directorySentence(invalid, "isn't", "aren't", "in this package"));
     }
-    var missing = sourceDirectories.where(
-        (dir) => !dirExists(path.join(entrypoint.root.dir, dir)));
+    var missing =
+        sourceDirectories.where((dir) => !dirExists(entrypoint.root.path(dir)));
     if (missing.isNotEmpty) {
       dataError(_directorySentence(missing, "does", "do", "not exist"));
     }
@@ -80,8 +80,8 @@
     if (commandOptions.rest.isNotEmpty) {
       usageError('Directory names are not allowed if "--all" is passed.');
     }
-    var dirs = _allSourceDirectories.where(
-        (dir) => dirExists(path.join(entrypoint.root.dir, dir)));
+    var dirs =
+        _allSourceDirectories.where((dir) => dirExists(entrypoint.root.path(dir)));
     if (dirs.isEmpty) {
       var defaultDirs =
           toSentence(_allSourceDirectories.map((name) => '"$name"'));
@@ -93,8 +93,7 @@
   }
   void _addDefaultSources() {
     sourceDirectories.addAll(
-        defaultSourceDirectories.where(
-            (dir) => dirExists(path.join(entrypoint.root.dir, dir))));
+        defaultSourceDirectories.where((dir) => dirExists(entrypoint.root.path(dir))));
     if (sourceDirectories.isEmpty) {
       var defaults;
       if (defaultSourceDirectories.length == 1) {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/build.dart b/sdk/lib/_internal/pub_generated/lib/src/command/build.dart
index f68194c..7173663 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/build.dart
@@ -152,8 +152,7 @@
     return entrypointDirs.length * 2;
   }
   void _addBrowserJs(String directory, String name) {
-    var jsPath = path.join(
-        entrypoint.root.dir,
+    var jsPath = entrypoint.root.path(
         outputDirectory,
         directory,
         'packages',
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/global_activate.dart b/sdk/lib/_internal/pub_generated/lib/src/command/global_activate.dart
index c6a2e22..f5c34b6 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/global_activate.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/global_activate.dart
@@ -14,8 +14,31 @@
         help: "The source used to find the package.",
         allowed: ["git", "hosted", "path"],
         defaultsTo: "hosted");
+    commandParser.addFlag(
+        "no-executables",
+        negatable: false,
+        help: "Do not put executables on PATH.");
+    commandParser.addOption(
+        "executable",
+        abbr: "x",
+        help: "Executable(s) to place on PATH.",
+        allowMultiple: true);
+    commandParser.addFlag(
+        "overwrite",
+        negatable: false,
+        help: "Overwrite executables from other packages with the same name.");
   }
   Future onRun() {
+    var executables;
+    if (commandOptions.wasParsed("executable")) {
+      if (commandOptions.wasParsed("no-executables")) {
+        usageError("Cannot pass both --no-executables and --executable.");
+      }
+      executables = commandOptions["executable"];
+    } else if (commandOptions["no-executables"]) {
+      executables = [];
+    }
+    var overwrite = commandOptions["overwrite"];
     var args = commandOptions.rest;
     readArg([String error]) {
       if (args.isEmpty) usageError(error);
@@ -33,7 +56,10 @@
       case "git":
         var repo = readArg("No Git repository given.");
         validateNoExtraArgs();
-        return globals.activateGit(repo);
+        return globals.activateGit(
+            repo,
+            executables,
+            overwriteBinStubs: overwrite);
       case "hosted":
         var package = readArg("No package to activate given.");
         var constraint = VersionConstraint.any;
@@ -45,11 +71,18 @@
           }
         }
         validateNoExtraArgs();
-        return globals.activateHosted(package, constraint);
+        return globals.activateHosted(
+            package,
+            constraint,
+            executables,
+            overwriteBinStubs: overwrite);
       case "path":
         var path = readArg("No package to activate given.");
         validateNoExtraArgs();
-        return globals.activatePath(path);
+        return globals.activatePath(
+            path,
+            executables,
+            overwriteBinStubs: overwrite);
     }
     throw "unreachable";
   }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/global_deactivate.dart b/sdk/lib/_internal/pub_generated/lib/src/command/global_deactivate.dart
index 6fd534a..a5300af 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/global_deactivate.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/global_deactivate.dart
@@ -16,7 +16,7 @@
       var arguments = pluralize("argument", unexpected.length);
       usageError("Unexpected $arguments ${toSentence(unexpected)}.");
     }
-    if (!globals.deactivate(commandOptions.rest.first, logDeactivate: true)) {
+    if (!globals.deactivate(commandOptions.rest.first)) {
       dataError("No active package ${log.bold(commandOptions.rest.first)}.");
     }
     return null;
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/global_run.dart b/sdk/lib/_internal/pub_generated/lib/src/command/global_run.dart
index 6fffe0f..61e9580 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/global_run.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/global_run.dart
@@ -1,5 +1,6 @@
 library pub.command.global_run;
 import 'dart:async';
+import 'package:barback/barback.dart';
 import 'package:path/path.dart' as p;
 import '../command.dart';
 import '../io.dart';
@@ -11,6 +12,13 @@
       "Run an executable from a globally activated package.\n"
           "NOTE: We are currently optimizing this command's startup time.";
   String get usage => "pub global run <package>:<executable> [args...]";
+  BarbackMode get mode => new BarbackMode(commandOptions["mode"]);
+  GlobalRunCommand() {
+    commandParser.addOption(
+        "mode",
+        defaultsTo: "release",
+        help: 'Mode to run transformers in.');
+  }
   Future onRun() {
     final completer0 = new Completer();
     scheduleMicrotask(() {
@@ -21,7 +29,11 @@
           join1() {
             var args = commandOptions.rest.skip(1).toList();
             join2() {
-              globals.runExecutable(package, executable, args).then((x0) {
+              globals.runExecutable(
+                  package,
+                  executable,
+                  args,
+                  mode: mode).then((x0) {
                 try {
                   var exitCode = x0;
                   flushThenExit(exitCode).then((x1) {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/lish.dart b/sdk/lib/_internal/pub_generated/lib/src/command/lish.dart
index 49deff8..9ee1192 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/lish.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/lish.dart
@@ -96,7 +96,7 @@
           'A private package cannot be published.\n'
               'You can enable this by changing the "publish_to" field in your ' 'pubspec.');
     }
-    var files = entrypoint.root.listFiles();
+    var files = entrypoint.root.listFiles(useGitIgnore: true);
     log.fine('Archiving and publishing ${entrypoint.root}.');
     var package = entrypoint.root;
     log.message(
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/list_package_dirs.dart b/sdk/lib/_internal/pub_generated/lib/src/command/list_package_dirs.dart
index 128ee92..de48749 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/list_package_dirs.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/list_package_dirs.dart
@@ -29,7 +29,7 @@
       }));
     });
     output["packages"] = packages;
-    packages[entrypoint.root.name] = path.join(entrypoint.root.dir, "lib");
+    packages[entrypoint.root.name] = entrypoint.root.path("lib");
     output["input_files"] = [entrypoint.lockFilePath, entrypoint.pubspecPath];
     return Future.wait(futures).then((_) {
       log.json.message(output);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/run.dart b/sdk/lib/_internal/pub_generated/lib/src/command/run.dart
index 0cb0064..d745386 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/run.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/run.dart
@@ -1,5 +1,6 @@
 library pub.command.run;
 import 'dart:async';
+import 'package:barback/barback.dart';
 import 'package:path/path.dart' as p;
 import '../command.dart';
 import '../executable.dart';
@@ -12,6 +13,12 @@
       "Run an executable from a package.\n"
           "NOTE: We are currently optimizing this command's startup time.";
   String get usage => "pub run <executable> [args...]";
+  RunCommand() {
+    commandParser.addOption(
+        "mode",
+        help: 'Mode to run transformers in.\n'
+            '(defaults to "release" for dependencies, "debug" for ' 'entrypoint)');
+  }
   Future onRun() {
     final completer0 = new Completer();
     scheduleMicrotask(() {
@@ -21,39 +28,62 @@
           var executable = commandOptions.rest[0];
           var args = commandOptions.rest.skip(1).toList();
           join1() {
-            runExecutable(entrypoint, package, executable, args).then((x0) {
-              try {
-                var exitCode = x0;
-                flushThenExit(exitCode).then((x1) {
-                  try {
-                    x1;
-                    completer0.complete(null);
-                  } catch (e1) {
-                    completer0.completeError(e1);
-                  }
-                }, onError: (e2) {
-                  completer0.completeError(e2);
-                });
-              } catch (e0) {
-                completer0.completeError(e0);
+            var mode;
+            join2() {
+              runExecutable(
+                  entrypoint,
+                  package,
+                  executable,
+                  args,
+                  mode: mode).then((x0) {
+                try {
+                  var exitCode = x0;
+                  flushThenExit(exitCode).then((x1) {
+                    try {
+                      x1;
+                      completer0.complete(null);
+                    } catch (e1) {
+                      completer0.completeError(e1);
+                    }
+                  }, onError: (e2) {
+                    completer0.completeError(e2);
+                  });
+                } catch (e0) {
+                  completer0.completeError(e0);
+                }
+              }, onError: (e3) {
+                completer0.completeError(e3);
+              });
+            }
+            if (commandOptions['mode'] != null) {
+              mode = new BarbackMode(commandOptions['mode']);
+              join2();
+            } else {
+              join3() {
+                join2();
               }
-            }, onError: (e3) {
-              completer0.completeError(e3);
-            });
+              if (package == entrypoint.root.name) {
+                mode = BarbackMode.DEBUG;
+                join3();
+              } else {
+                mode = BarbackMode.RELEASE;
+                join3();
+              }
+            }
           }
           if (executable.contains(":")) {
             var components = split1(executable, ":");
             package = components[0];
             executable = components[1];
-            join2() {
+            join4() {
               join1();
             }
             if (p.split(executable).length > 1) {
               usageError(
                   "Cannot run an executable in a subdirectory of a " + "dependency.");
-              join2();
+              join4();
             } else {
-              join2();
+              join4();
             }
           } else {
             join1();
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/uploader.dart b/sdk/lib/_internal/pub_generated/lib/src/command/uploader.dart
index 64f8d01..5e6e76a 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/uploader.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/uploader.dart
@@ -9,7 +9,6 @@
 import '../log.dart' as log;
 import '../oauth2.dart' as oauth2;
 import '../source/hosted.dart';
-import '../utils.dart';
 class UploaderCommand extends PubCommand {
   String get description =>
       "Manage uploaders for a package on pub.dartlang.org.";
@@ -44,7 +43,7 @@
       this.printUsage();
       return flushThenExit(exit_codes.USAGE);
     }
-    return syncFuture(() {
+    return new Future.sync(() {
       var package = commandOptions['package'];
       if (package != null) return package;
       return new Entrypoint(path.current, cache).root.name;
diff --git a/sdk/lib/_internal/pub_generated/lib/src/dart.dart b/sdk/lib/_internal/pub_generated/lib/src/dart.dart
index f5cf582..0a84847 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/dart.dart
@@ -1,14 +1,14 @@
 library pub.dart;
 import 'dart:async';
+import 'dart:io';
 import 'dart:isolate';
 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;
 import '../../asset/dart/serialize.dart';
 import 'io.dart';
-import 'utils.dart';
+import 'log.dart' as log;
 abstract class CompilerProvider {
   Uri get libraryRoot;
   Future provideInput(Uri uri);
@@ -22,7 +22,7 @@
     String packageRoot, bool analyzeAll: false, bool suppressWarnings: false,
     bool suppressHints: false, bool suppressPackageWarnings: true, bool terse:
     false, bool includeSourceMapUrls: false, bool toDart: false}) {
-  return syncFuture(() {
+  return new Future.sync(() {
     var options = <String>['--categories=Client,Server'];
     if (checked) options.add('--enable-checked-mode');
     if (csp) options.add('--csp');
@@ -44,16 +44,15 @@
     if (packageRoot == null) {
       packageRoot = path.join(path.dirname(entrypoint), 'packages');
     }
-    return Chain.track(
-        compiler.compile(
-            path.toUri(entrypoint),
-            provider.libraryRoot,
-            path.toUri(appendSlash(packageRoot)),
-            provider.provideInput,
-            provider.handleDiagnostic,
-            options,
-            provider.provideOutput,
-            environment));
+    return compiler.compile(
+        path.toUri(entrypoint),
+        provider.libraryRoot,
+        path.toUri(appendSlash(packageRoot)),
+        provider.provideInput,
+        provider.handleDiagnostic,
+        options,
+        provider.provideOutput,
+        environment);
   });
 }
 bool isEntrypoint(CompilationUnit dart) {
@@ -72,31 +71,171 @@
   final directives = <UriBasedDirective>[];
   visitUriBasedDirective(UriBasedDirective node) => directives.add(node);
 }
-Future runInIsolate(String code, message) {
-  return withTempDir((dir) {
-    var dartPath = path.join(dir, 'runInIsolate.dart');
-    writeTextFile(dartPath, code, dontLogContents: true);
-    var port = new ReceivePort();
-    return Chain.track(Isolate.spawn(_isolateBuffer, {
-      'replyTo': port.sendPort,
-      'uri': path.toUri(dartPath).toString(),
-      'message': message
-    })).then((_) => port.first).then((response) {
-      if (response['type'] == 'success') return null;
-      assert(response['type'] == 'error');
-      return new Future.error(
-          new CrossIsolateException.deserialize(response['error']),
-          new Chain.current());
-    });
+Future runInIsolate(String code, message, {packageRoot, String snapshot}) {
+  final completer0 = new Completer();
+  scheduleMicrotask(() {
+    try {
+      join0() {
+        withTempDir(((dir) {
+          final completer0 = new Completer();
+          scheduleMicrotask(() {
+            try {
+              var dartPath = path.join(dir, 'runInIsolate.dart');
+              writeTextFile(dartPath, code, dontLogContents: true);
+              var port = new ReceivePort();
+              join0(x0) {
+                Isolate.spawn(_isolateBuffer, {
+                  'replyTo': port.sendPort,
+                  'uri': path.toUri(dartPath).toString(),
+                  'packageRoot': x0,
+                  'message': message
+                }).then((x1) {
+                  try {
+                    x1;
+                    port.first.then((x2) {
+                      try {
+                        var response = x2;
+                        join1() {
+                          join2() {
+                            ensureDir(path.dirname(snapshot));
+                            var snapshotArgs = [];
+                            join3() {
+                              snapshotArgs.addAll(
+                                  ['--snapshot=${snapshot}', dartPath]);
+                              runProcess(
+                                  Platform.executable,
+                                  snapshotArgs).then((x3) {
+                                try {
+                                  var result = x3;
+                                  join4() {
+                                    log.warning(
+                                        "Failed to compile a snapshot to " "${path.relative(snapshot)}:\n" +
+                                            result.stderr.join("\n"));
+                                    completer0.complete(null);
+                                  }
+                                  if (result.success) {
+                                    completer0.complete(null);
+                                  } else {
+                                    join4();
+                                  }
+                                } catch (e2) {
+                                  completer0.completeError(e2);
+                                }
+                              }, onError: (e3) {
+                                completer0.completeError(e3);
+                              });
+                            }
+                            if (packageRoot != null) {
+                              snapshotArgs.add('--package-root=${packageRoot}');
+                              join3();
+                            } else {
+                              join3();
+                            }
+                          }
+                          if (snapshot == null) {
+                            completer0.complete(null);
+                          } else {
+                            join2();
+                          }
+                        }
+                        if (response['type'] == 'error') {
+                          completer0.completeError(
+                              new CrossIsolateException.deserialize(response['error']));
+                        } else {
+                          join1();
+                        }
+                      } catch (e1) {
+                        completer0.completeError(e1);
+                      }
+                    }, onError: (e4) {
+                      completer0.completeError(e4);
+                    });
+                  } catch (e0) {
+                    completer0.completeError(e0);
+                  }
+                }, onError: (e5) {
+                  completer0.completeError(e5);
+                });
+              }
+              if (packageRoot == null) {
+                join0(null);
+              } else {
+                join0(packageRoot.toString());
+              }
+            } catch (e6) {
+              completer0.completeError(e6);
+            }
+          });
+          return completer0.future;
+        })).then((x0) {
+          try {
+            x0;
+            completer0.complete(null);
+          } catch (e0) {
+            completer0.completeError(e0);
+          }
+        }, onError: (e1) {
+          completer0.completeError(e1);
+        });
+      }
+      if (snapshot != null && fileExists(snapshot)) {
+        log.fine("Spawning isolate from ${snapshot}.");
+        join1() {
+          join2(x1) {
+            join0();
+          }
+          finally0(cont0, v0) {
+            cont0(v0);
+          }
+          catch0(error) {
+            log.fine("Couldn't load existing snapshot ${snapshot}:\n${error}");
+            finally0(join2, null);
+          }
+          try {
+            Isolate.spawnUri(
+                path.toUri(snapshot),
+                [],
+                message,
+                packageRoot: packageRoot).then((x2) {
+              try {
+                x2;
+                finally0((v1) {
+                  completer0.complete(v1);
+                }, null);
+              } catch (e2) {
+                catch0(e2);
+              }
+            }, onError: (e3) {
+              catch0(e3);
+            });
+          } catch (e4) {
+            catch0(e4);
+          }
+        }
+        if (packageRoot != null) {
+          packageRoot = packageRoot.toString();
+          join1();
+        } else {
+          join1();
+        }
+      } else {
+        join0();
+      }
+    } catch (e5) {
+      completer0.completeError(e5);
+    }
   });
+  return completer0.future;
 }
 void _isolateBuffer(message) {
   var replyTo = message['replyTo'];
-  Chain.track(
-      Isolate.spawnUri(
-          Uri.parse(message['uri']),
-          [],
-          message['message'])).then((_) => replyTo.send({
+  var packageRoot = message['packageRoot'];
+  if (packageRoot != null) packageRoot = Uri.parse(packageRoot);
+  Isolate.spawnUri(
+      Uri.parse(message['uri']),
+      [],
+      message['message'],
+      packageRoot: packageRoot).then((_) => replyTo.send({
     'type': 'success'
   })).catchError((e, stack) {
     replyTo.send({
diff --git a/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart b/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
index b36827b..eadf9a9 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
@@ -25,7 +25,7 @@
         _packageSymlinks = packageSymlinks;
   Entrypoint.inMemory(this.root, this._lockFile, this.cache)
       : _packageSymlinks = false;
-  String get packagesDir => path.join(root.dir, 'packages');
+  String get packagesDir => root.path('packages');
   bool get lockFileExists => _lockFile != null || entryExists(lockFilePath);
   LockFile get lockFile {
     if (_lockFile != null) return _lockFile;
@@ -36,101 +36,422 @@
     }
     return _lockFile;
   }
-  String get pubspecPath => path.join(root.dir, 'pubspec.yaml');
-  String get lockFilePath => path.join(root.dir, 'pubspec.lock');
+  String get pubspecPath => root.path('pubspec.yaml');
+  String get lockFilePath => root.path('pubspec.lock');
   Future acquireDependencies(SolveType type, {List<String> useLatest,
       bool dryRun: false}) {
-    return syncFuture(() {
-      return resolveVersions(
-          type,
-          cache.sources,
-          root,
-          lockFile: lockFile,
-          useLatest: useLatest);
-    }).then((result) {
-      if (!result.succeeded) throw result.error;
-      result.showReport(type);
-      if (dryRun) {
-        result.summarizeChanges(type, dryRun: dryRun);
-        return null;
-      }
-      if (_packageSymlinks) {
-        cleanDir(packagesDir);
-      } else {
-        deleteEntry(packagesDir);
-      }
-      return Future.wait(result.packages.map(_get)).then((ids) {
-        _saveLockFile(ids);
-        if (_packageSymlinks) _linkSelf();
-        _linkOrDeleteSecondaryPackageDirs();
-        result.summarizeChanges(type, dryRun: dryRun);
-        return loadPackageGraph(result);
-      }).then((packageGraph) {
-        return precompileExecutables(
-            changed: result.changedPackages).catchError((error, stackTrace) {
-          log.exception(error, stackTrace);
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        resolveVersions(
+            type,
+            cache.sources,
+            root,
+            lockFile: lockFile,
+            useLatest: useLatest).then((x0) {
+          try {
+            var result = x0;
+            join0() {
+              result.showReport(type);
+              join1() {
+                join2() {
+                  Future.wait(result.packages.map(_get)).then((x1) {
+                    try {
+                      var ids = x1;
+                      _saveLockFile(ids);
+                      join3() {
+                        _linkOrDeleteSecondaryPackageDirs();
+                        result.summarizeChanges(type, dryRun: dryRun);
+                        loadPackageGraph(result).then((x2) {
+                          try {
+                            var packageGraph = x2;
+                            packageGraph.loadTransformerCache().clearIfOutdated(
+                                result.changedPackages);
+                            completer0.complete(
+                                precompileDependencies(changed: result.changedPackages).then(((_) {
+                              return precompileExecutables(
+                                  changed: result.changedPackages);
+                            })).catchError(((error, stackTrace) {
+                              log.exception(error, stackTrace);
+                            })));
+                          } catch (e2) {
+                            completer0.completeError(e2);
+                          }
+                        }, onError: (e3) {
+                          completer0.completeError(e3);
+                        });
+                      }
+                      if (_packageSymlinks) {
+                        _linkSelf();
+                        join3();
+                      } else {
+                        join3();
+                      }
+                    } catch (e1) {
+                      completer0.completeError(e1);
+                    }
+                  }, onError: (e4) {
+                    completer0.completeError(e4);
+                  });
+                }
+                if (_packageSymlinks) {
+                  cleanDir(packagesDir);
+                  join2();
+                } else {
+                  deleteEntry(packagesDir);
+                  join2();
+                }
+              }
+              if (dryRun) {
+                result.summarizeChanges(type, dryRun: dryRun);
+                completer0.complete(null);
+              } else {
+                join1();
+              }
+            }
+            if (!result.succeeded) {
+              completer0.completeError(result.error);
+            } else {
+              join0();
+            }
+          } catch (e0) {
+            completer0.completeError(e0);
+          }
+        }, onError: (e5) {
+          completer0.completeError(e5);
         });
-      });
+      } catch (e6) {
+        completer0.completeError(e6);
+      }
     });
+    return completer0.future;
+  }
+  Future precompileDependencies({Iterable<String> changed}) {
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        join0() {
+          loadPackageGraph().then((x0) {
+            try {
+              var graph = x0;
+              var depsDir = path.join('.pub', 'deps', 'debug');
+              var dependenciesToPrecompile =
+                  graph.packages.values.where(((package) {
+                if (package.pubspec.transformers.isEmpty) return false;
+                if (graph.isPackageMutable(package.name)) return false;
+                if (!dirExists(path.join(depsDir, package.name))) return true;
+                if (changed == null) return true;
+                return overlaps(
+                    graph.transitiveDependencies(
+                        package.name).map((package) => package.name).toSet(),
+                    changed);
+              })).map(((package) => package.name)).toSet();
+              join1() {
+                log.progress("Precompiling dependencies", (() {
+                  final completer0 = new Completer();
+                  scheduleMicrotask(() {
+                    try {
+                      var packagesToLoad = unionAll(
+                          dependenciesToPrecompile.map(
+                              graph.transitiveDependencies)).map(((package) => package.name)).toSet();
+                      var it0 = dependenciesToPrecompile.iterator;
+                      break0(x4) {
+                        AssetEnvironment.create(
+                            this,
+                            BarbackMode.DEBUG,
+                            packages: packagesToLoad,
+                            useDart2JS: false).then((x0) {
+                          try {
+                            var environment = x0;
+                            environment.barback.errors.listen(((_) {}));
+                            environment.barback.getAllAssets().then((x1) {
+                              try {
+                                var assets = x1;
+                                waitAndPrintErrors(assets.map(((asset) {
+                                  final completer0 = new Completer();
+                                  scheduleMicrotask(() {
+                                    try {
+                                      join0() {
+                                        var destPath =
+                                            path.join(depsDir, asset.id.package, path.fromUri(asset.id.path));
+                                        ensureDir(path.dirname(destPath));
+                                        createFileFromStream(
+                                            asset.read(),
+                                            destPath).then((x0) {
+                                          try {
+                                            x0;
+                                            completer0.complete(null);
+                                          } catch (e0) {
+                                            completer0.completeError(e0);
+                                          }
+                                        }, onError: (e1) {
+                                          completer0.completeError(e1);
+                                        });
+                                      }
+                                      if (!dependenciesToPrecompile.contains(
+                                          asset.id.package)) {
+                                        completer0.complete(null);
+                                      } else {
+                                        join0();
+                                      }
+                                    } catch (e2) {
+                                      completer0.completeError(e2);
+                                    }
+                                  });
+                                  return completer0.future;
+                                }))).then((x2) {
+                                  try {
+                                    x2;
+                                    log.message(
+                                        "Precompiled " +
+                                            toSentence(ordered(dependenciesToPrecompile).map(log.bold)) +
+                                            ".");
+                                    completer0.complete(null);
+                                  } catch (e2) {
+                                    completer0.completeError(e2);
+                                  }
+                                }, onError: (e3) {
+                                  completer0.completeError(e3);
+                                });
+                              } catch (e1) {
+                                completer0.completeError(e1);
+                              }
+                            }, onError: (e4) {
+                              completer0.completeError(e4);
+                            });
+                          } catch (e0) {
+                            completer0.completeError(e0);
+                          }
+                        }, onError: (e5) {
+                          completer0.completeError(e5);
+                        });
+                      }
+                      continue0(x5) {
+                        if (it0.moveNext()) {
+                          Future.wait([]).then((x3) {
+                            var package = it0.current;
+                            deleteEntry(path.join(depsDir, package));
+                            continue0(null);
+                          });
+                        } else {
+                          break0(null);
+                        }
+                      }
+                      continue0(null);
+                    } catch (e6) {
+                      completer0.completeError(e6);
+                    }
+                  });
+                  return completer0.future;
+                })).catchError(((error) {
+                  for (var package in dependenciesToPrecompile) {
+                    deleteEntry(path.join(depsDir, package));
+                  }
+                  throw error;
+                })).then((x1) {
+                  try {
+                    x1;
+                    completer0.complete(null);
+                  } catch (e1) {
+                    completer0.completeError(e1);
+                  }
+                }, onError: (e2) {
+                  completer0.completeError(e2);
+                });
+              }
+              if (dependenciesToPrecompile.isEmpty) {
+                completer0.complete(null);
+              } else {
+                join1();
+              }
+            } catch (e0) {
+              completer0.completeError(e0);
+            }
+          }, onError: (e3) {
+            completer0.completeError(e3);
+          });
+        }
+        if (changed != null) {
+          changed = changed.toSet();
+          join0();
+        } else {
+          join0();
+        }
+      } catch (e4) {
+        completer0.completeError(e4);
+      }
+    });
+    return completer0.future;
   }
   Future precompileExecutables({Iterable<String> changed}) {
-    if (changed != null) changed = changed.toSet();
-    var binDir = path.join('.pub', 'bin');
-    var sdkVersionPath = path.join(binDir, 'sdk-version');
-    var sdkMatches =
-        fileExists(sdkVersionPath) &&
-        readTextFile(sdkVersionPath) == "${sdk.version}\n";
-    if (!sdkMatches) changed = null;
-    return loadPackageGraph().then((graph) {
-      var executables = new Map.fromIterable(
-          root.immediateDependencies,
-          key: (dep) => dep.name,
-          value: (dep) => _executablesForPackage(graph, dep.name, changed));
-      for (var package in executables.keys.toList()) {
-        if (executables[package].isEmpty) executables.remove(package);
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        join0() {
+          var binDir = path.join('.pub', 'bin');
+          var sdkVersionPath = path.join(binDir, 'sdk-version');
+          var sdkMatches =
+              fileExists(sdkVersionPath) &&
+              readTextFile(sdkVersionPath) == "${sdk.version}\n";
+          join1() {
+            loadPackageGraph().then((x0) {
+              try {
+                var graph = x0;
+                var executables = new Map.fromIterable(
+                    root.immediateDependencies,
+                    key: ((dep) => dep.name),
+                    value: ((dep) => _executablesForPackage(graph, dep.name, changed)));
+                var it0 = executables.keys.toList().iterator;
+                break0(x3) {
+                  join2() {
+                    join3() {
+                      log.progress("Precompiling executables", (() {
+                        final completer0 = new Completer();
+                        scheduleMicrotask(() {
+                          try {
+                            ensureDir(binDir);
+                            writeTextFile(sdkVersionPath, "${sdk.version}\n");
+                            var packagesToLoad = unionAll(
+                                executables.keys.map(
+                                    graph.transitiveDependencies)).map(((package) => package.name)).toSet();
+                            var executableIds =
+                                unionAll(executables.values.map(((ids) => ids.toSet())));
+                            AssetEnvironment.create(
+                                this,
+                                BarbackMode.RELEASE,
+                                packages: packagesToLoad,
+                                entrypoints: executableIds,
+                                useDart2JS: false).then((x0) {
+                              try {
+                                var environment = x0;
+                                environment.barback.errors.listen(((error) {
+                                  log.error(log.red("Build error:\n$error"));
+                                }));
+                                waitAndPrintErrors(
+                                    executables.keys.map(((package) {
+                                  final completer0 = new Completer();
+                                  scheduleMicrotask(() {
+                                    try {
+                                      var dir = path.join(binDir, package);
+                                      cleanDir(dir);
+                                      environment.precompileExecutables(
+                                          package,
+                                          dir,
+                                          executableIds: executables[package]).then((x0) {
+                                        try {
+                                          x0;
+                                          completer0.complete(null);
+                                        } catch (e0) {
+                                          completer0.completeError(e0);
+                                        }
+                                      }, onError: (e1) {
+                                        completer0.completeError(e1);
+                                      });
+                                    } catch (e2) {
+                                      completer0.completeError(e2);
+                                    }
+                                  });
+                                  return completer0.future;
+                                }))).then((x1) {
+                                  try {
+                                    x1;
+                                    completer0.complete(null);
+                                  } catch (e1) {
+                                    completer0.completeError(e1);
+                                  }
+                                }, onError: (e2) {
+                                  completer0.completeError(e2);
+                                });
+                              } catch (e0) {
+                                completer0.completeError(e0);
+                              }
+                            }, onError: (e3) {
+                              completer0.completeError(e3);
+                            });
+                          } catch (e4) {
+                            completer0.completeError(e4);
+                          }
+                        });
+                        return completer0.future;
+                      })).then((x1) {
+                        try {
+                          x1;
+                          completer0.complete(null);
+                        } catch (e1) {
+                          completer0.completeError(e1);
+                        }
+                      }, onError: (e2) {
+                        completer0.completeError(e2);
+                      });
+                    }
+                    if (executables.isEmpty) {
+                      completer0.complete(null);
+                    } else {
+                      join3();
+                    }
+                  }
+                  if (!sdkMatches) {
+                    deleteEntry(binDir);
+                    join2();
+                  } else {
+                    join2();
+                  }
+                }
+                continue0(x4) {
+                  if (it0.moveNext()) {
+                    Future.wait([]).then((x2) {
+                      var package = it0.current;
+                      join4() {
+                        continue0(null);
+                      }
+                      if (executables[package].isEmpty) {
+                        executables.remove(package);
+                        join4();
+                      } else {
+                        join4();
+                      }
+                    });
+                  } else {
+                    break0(null);
+                  }
+                }
+                continue0(null);
+              } catch (e0) {
+                completer0.completeError(e0);
+              }
+            }, onError: (e3) {
+              completer0.completeError(e3);
+            });
+          }
+          if (!sdkMatches) {
+            changed = null;
+            join1();
+          } else {
+            join1();
+          }
+        }
+        if (changed != null) {
+          changed = changed.toSet();
+          join0();
+        } else {
+          join0();
+        }
+      } catch (e4) {
+        completer0.completeError(e4);
       }
-      if (!sdkMatches) deleteEntry(binDir);
-      if (executables.isEmpty) return null;
-      return log.progress("Precompiling executables", () {
-        ensureDir(binDir);
-        writeTextFile(sdkVersionPath, "${sdk.version}\n");
-        var packagesToLoad = unionAll(
-            executables.keys.map(
-                graph.transitiveDependencies)).map((package) => package.name).toSet();
-        return AssetEnvironment.create(
-            this,
-            BarbackMode.RELEASE,
-            packages: packagesToLoad,
-            useDart2JS: false).then((environment) {
-          environment.barback.errors.listen((error) {
-            log.error(log.red("Build error:\n$error"));
-          });
-          return waitAndPrintErrors(executables.keys.map((package) {
-            var dir = path.join(binDir, package);
-            cleanDir(dir);
-            return environment.precompileExecutables(
-                package,
-                dir,
-                executableIds: executables[package]);
-          }));
-        });
-      });
     });
+    return completer0.future;
   }
   List<AssetId> _executablesForPackage(PackageGraph graph, String packageName,
       Set<String> changed) {
     var package = graph.packages[packageName];
-    var binDir = path.join(package.dir, 'bin');
+    var binDir = package.path('bin');
     if (!dirExists(binDir)) return [];
-    var deps = graph.transitiveDependencies(packageName);
-    var hasUncachedDependency = deps.any((package) {
-      var source = cache.sources[graph.lockFile.packages[package.name].source];
-      return source is! CachedSource;
-    });
-    if (hasUncachedDependency) return [];
+    if (graph.isPackageMutable(packageName)) return [];
     var executables = package.executableIds;
     if (changed == null) return executables;
-    if (deps.any((package) => changed.contains(package.name))) {
+    if (graph.transitiveDependencies(
+        packageName).any((package) => changed.contains(package.name))) {
       return executables;
     }
     var executablesExist = executables.every(
@@ -147,7 +468,7 @@
   Future<PackageId> _get(PackageId id) {
     if (id.isRoot) return new Future.value(id);
     var source = cache.sources[id.source];
-    return syncFuture(() {
+    return new Future.sync(() {
       if (!_packageSymlinks) {
         if (source is! CachedSource) return null;
         return source.downloadToSystemCache(id);
@@ -181,7 +502,7 @@
     });
   }
   Future ensureLockFileIsUpToDate() {
-    return syncFuture(() {
+    return new Future.sync(() {
       if (!_isLockFileUpToDate(lockFile)) {
         if (lockFileExists) {
           log.message(
@@ -206,7 +527,7 @@
   }
   Future<PackageGraph> loadPackageGraph([SolveResult result]) {
     if (_packageGraph != null) return new Future.value(_packageGraph);
-    return syncFuture(() {
+    return new Future.sync(() {
       if (result != null) {
         return Future.wait(result.packages.map((id) {
           return cache.sources[id.source].getDirectory(
@@ -237,7 +558,7 @@
   }
   void _saveLockFile(List<PackageId> packageIds) {
     _lockFile = new LockFile(packageIds);
-    var lockFilePath = path.join(root.dir, 'pubspec.lock');
+    var lockFilePath = root.path('pubspec.lock');
     writeTextFile(lockFilePath, _lockFile.serialize(root.dir, cache.sources));
   }
   void _linkSelf() {
@@ -252,10 +573,10 @@
         relative: true);
   }
   void _linkOrDeleteSecondaryPackageDirs() {
-    var binDir = path.join(root.dir, 'bin');
+    var binDir = root.path('bin');
     if (dirExists(binDir)) _linkOrDeleteSecondaryPackageDir(binDir);
     for (var dir in ['benchmark', 'example', 'test', 'tool', 'web']) {
-      _linkOrDeleteSecondaryPackageDirsRecursively(path.join(root.dir, dir));
+      _linkOrDeleteSecondaryPackageDirsRecursively(root.path(dir));
     }
   }
   void _linkOrDeleteSecondaryPackageDirsRecursively(String dir) {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/executable.dart b/sdk/lib/_internal/pub_generated/lib/src/executable.dart
index 006ba7e..c932125 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/executable.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/executable.dart
@@ -11,147 +11,179 @@
 import 'log.dart' as log;
 import 'utils.dart';
 Future<int> runExecutable(Entrypoint entrypoint, String package,
-    String executable, Iterable<String> args, {bool isGlobal: false}) {
+    String executable, Iterable<String> args, {bool isGlobal: false,
+    BarbackMode mode}) {
   final completer0 = new Completer();
   scheduleMicrotask(() {
     try {
       join0() {
-        var localSnapshotPath =
-            p.join(".pub", "bin", package, "${executable}.dart.snapshot");
         join1() {
-          var rootDir = "bin";
-          var parts = p.split(executable);
           join2() {
-            AssetEnvironment.create(
-                entrypoint,
-                BarbackMode.RELEASE,
-                useDart2JS: false).then((x0) {
-              try {
-                var environment = x0;
-                environment.barback.errors.listen(((error) {
-                  log.error(log.red("Build error:\n$error"));
-                }));
-                var server;
-                join3() {
+            join3() {
+              var localSnapshotPath =
+                  p.join(".pub", "bin", package, "${executable}.dart.snapshot");
+              join4() {
+                var rootDir = "bin";
+                var parts = p.split(executable);
+                join5() {
                   var assetPath = "${p.url.joinAll(p.split(executable))}.dart";
-                  var id = new AssetId(server.package, assetPath);
-                  completer0.complete(
-                      environment.barback.getAssetById(id).then(((_) {
-                    final completer0 = new Completer();
-                    scheduleMicrotask(() {
-                      try {
-                        var vmArgs = [];
-                        vmArgs.add("--checked");
-                        var relativePath =
-                            p.url.relative(assetPath, from: p.url.joinAll(p.split(server.rootDirectory)));
-                        vmArgs.add(server.url.resolve(relativePath).toString());
-                        vmArgs.addAll(args);
-                        Process.start(Platform.executable, vmArgs).then((x0) {
-                          try {
-                            var process = x0;
-                            process.stderr.listen(stderr.add);
-                            process.stdout.listen(stdout.add);
-                            stdin.listen(process.stdin.add);
-                            completer0.complete(process.exitCode);
-                          } catch (e0) {
-                            completer0.completeError(e0);
-                          }
-                        }, onError: (e1) {
-                          completer0.completeError(e1);
-                        });
-                      } catch (e2) {
-                        completer0.completeError(e2);
-                      }
-                    });
-                    return completer0.future;
-                  })).catchError(((error, stackTrace) {
-                    if (error is! AssetNotFoundException) throw error;
-                    var message =
-                        "Could not find ${log.bold(executable + ".dart")}";
-                    if (package != entrypoint.root.name) {
-                      message += " in package ${log.bold(server.package)}";
-                    }
-                    log.error("$message.");
-                    log.fine(new Chain.forTrace(stackTrace));
-                    return exit_codes.NO_INPUT;
-                  })));
-                }
-                if (package == entrypoint.root.name) {
-                  environment.serveDirectory(rootDir).then((x1) {
+                  var id = new AssetId(package, assetPath);
+                  AssetEnvironment.create(
+                      entrypoint,
+                      mode,
+                      useDart2JS: false,
+                      entrypoints: [id]).then((x0) {
                     try {
-                      server = x1;
-                      join3();
-                    } catch (e1) {
-                      completer0.completeError(e1);
-                    }
-                  }, onError: (e2) {
-                    completer0.completeError(e2);
-                  });
-                } else {
-                  var dep = entrypoint.root.immediateDependencies.firstWhere(
-                      ((dep) => dep.name == package),
-                      orElse: (() => null));
-                  join4() {
-                    environment.servePackageBinDirectory(package).then((x2) {
-                      try {
-                        server = x2;
-                        join3();
-                      } catch (e3) {
-                        completer0.completeError(e3);
+                      var environment = x0;
+                      environment.barback.errors.listen(((error) {
+                        log.error(log.red("Build error:\n$error"));
+                      }));
+                      var server;
+                      join6() {
+                        completer0.complete(
+                            environment.barback.getAssetById(id).then(((_) {
+                          final completer0 = new Completer();
+                          scheduleMicrotask(() {
+                            try {
+                              var vmArgs = [];
+                              vmArgs.add("--checked");
+                              var relativePath =
+                                  p.url.relative(assetPath, from: p.url.joinAll(p.split(server.rootDirectory)));
+                              vmArgs.add(
+                                  server.url.resolve(relativePath).toString());
+                              vmArgs.addAll(args);
+                              Process.start(
+                                  Platform.executable,
+                                  vmArgs).then((x0) {
+                                try {
+                                  var process = x0;
+                                  process.stderr.listen(stderr.add);
+                                  process.stdout.listen(stdout.add);
+                                  stdin.listen(process.stdin.add);
+                                  completer0.complete(process.exitCode);
+                                } catch (e0) {
+                                  completer0.completeError(e0);
+                                }
+                              }, onError: (e1) {
+                                completer0.completeError(e1);
+                              });
+                            } catch (e2) {
+                              completer0.completeError(e2);
+                            }
+                          });
+                          return completer0.future;
+                        })).catchError(((error, stackTrace) {
+                          if (error is! AssetNotFoundException) throw error;
+                          var message =
+                              "Could not find ${log.bold(executable + ".dart")}";
+                          if (package != entrypoint.root.name) {
+                            message +=
+                                " in package ${log.bold(server.package)}";
+                          }
+                          log.error("$message.");
+                          log.fine(new Chain.forTrace(stackTrace));
+                          return exit_codes.NO_INPUT;
+                        })));
                       }
-                    }, onError: (e4) {
-                      completer0.completeError(e4);
-                    });
-                  }
-                  if (dep == null) {
-                    join5() {
-                      join4();
+                      if (package == entrypoint.root.name) {
+                        environment.serveDirectory(rootDir).then((x1) {
+                          try {
+                            server = x1;
+                            join6();
+                          } catch (e1) {
+                            completer0.completeError(e1);
+                          }
+                        }, onError: (e2) {
+                          completer0.completeError(e2);
+                        });
+                      } else {
+                        environment.servePackageBinDirectory(
+                            package).then((x2) {
+                          try {
+                            server = x2;
+                            join6();
+                          } catch (e3) {
+                            completer0.completeError(e3);
+                          }
+                        }, onError: (e4) {
+                          completer0.completeError(e4);
+                        });
+                      }
+                    } catch (e0) {
+                      completer0.completeError(e0);
                     }
-                    if (environment.graph.packages.containsKey(package)) {
-                      dataError(
-                          'Package "${package}" is not an immediate dependency.\n'
-                              'Cannot run executables in transitive dependencies.');
-                      join5();
-                    } else {
-                      dataError(
-                          'Could not find package "${package}". Did you forget to ' 'add a dependency?');
-                      join5();
-                    }
-                  } else {
-                    join4();
-                  }
+                  }, onError: (e5) {
+                    completer0.completeError(e5);
+                  });
                 }
-              } catch (e0) {
-                completer0.completeError(e0);
+                if (parts.length > 1) {
+                  assert(!isGlobal && package == entrypoint.root.name);
+                  rootDir = parts.first;
+                  join5();
+                } else {
+                  executable = p.join("bin", executable);
+                  join5();
+                }
               }
-            }, onError: (e5) {
-              completer0.completeError(e5);
-            });
+              if (!isGlobal &&
+                  fileExists(localSnapshotPath) &&
+                  mode == BarbackMode.RELEASE) {
+                completer0.complete(
+                    _runCachedExecutable(entrypoint, localSnapshotPath, args));
+              } else {
+                join4();
+              }
+            }
+            if (p.extension(executable) == ".dart") {
+              executable = p.withoutExtension(executable);
+              join3();
+            } else {
+              join3();
+            }
           }
-          if (parts.length > 1) {
-            assert(!isGlobal && package == entrypoint.root.name);
-            rootDir = parts.first;
+          if (log.verbosity == log.Verbosity.NORMAL) {
+            log.verbosity = log.Verbosity.WARNING;
             join2();
           } else {
-            executable = p.join("bin", executable);
             join2();
           }
         }
-        if (!isGlobal && fileExists(localSnapshotPath)) {
-          completer0.complete(
-              _runCachedExecutable(entrypoint, localSnapshotPath, args));
+        if (entrypoint.root.name != package &&
+            !entrypoint.root.immediateDependencies.any(((dep) => dep.name == package))) {
+          entrypoint.loadPackageGraph().then((x3) {
+            try {
+              var graph = x3;
+              join7() {
+                join1();
+              }
+              if (graph.packages.containsKey(package)) {
+                dataError(
+                    'Package "${package}" is not an immediate dependency.\n'
+                        'Cannot run executables in transitive dependencies.');
+                join7();
+              } else {
+                dataError(
+                    'Could not find package "${package}". Did you forget to add a ' 'dependency?');
+                join7();
+              }
+            } catch (e6) {
+              completer0.completeError(e6);
+            }
+          }, onError: (e7) {
+            completer0.completeError(e7);
+          });
         } else {
           join1();
         }
       }
-      if (log.verbosity == log.Verbosity.NORMAL) {
-        log.verbosity = log.Verbosity.WARNING;
+      if (mode == null) {
+        mode = BarbackMode.RELEASE;
         join0();
       } else {
         join0();
       }
-    } catch (e6) {
-      completer0.completeError(e6);
+    } catch (e8) {
+      completer0.completeError(e8);
     }
   });
   return completer0.future;
diff --git a/sdk/lib/_internal/pub_generated/lib/src/global_packages.dart b/sdk/lib/_internal/pub_generated/lib/src/global_packages.dart
index c122234..5203965 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/global_packages.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/global_packages.dart
@@ -11,18 +11,22 @@
 import 'log.dart' as log;
 import 'package.dart';
 import 'pubspec.dart';
-import 'system_cache.dart';
+import 'sdk.dart' as sdk;
 import 'solver/version_solver.dart';
 import 'source/cached.dart';
 import 'source/git.dart';
 import 'source/path.dart';
+import 'system_cache.dart';
 import 'utils.dart';
 import 'version.dart';
+final _binStubPackagePattern = new RegExp(r"Package: ([a-zA-Z0-9_-]+)");
 class GlobalPackages {
   final SystemCache cache;
   String get _directory => p.join(cache.rootDir, "global_packages");
+  String get _binStubDir => p.join(cache.rootDir, "bin");
   GlobalPackages(this.cache);
-  Future activateGit(String repo) {
+  Future activateGit(String repo, List<String> executables,
+      {bool overwriteBinStubs}) {
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
@@ -32,7 +36,9 @@
             var name = x0;
             _describeActive(name);
             _installInCache(
-                new PackageDep(name, "git", VersionConstraint.any, repo)).then((x1) {
+                new PackageDep(name, "git", VersionConstraint.any, repo),
+                executables,
+                overwriteBinStubs: overwriteBinStubs).then((x1) {
               try {
                 x1;
                 completer0.complete(null);
@@ -54,11 +60,33 @@
     });
     return completer0.future;
   }
-  Future activateHosted(String name, VersionConstraint constraint) {
-    _describeActive(name);
-    return _installInCache(new PackageDep(name, "hosted", constraint, name));
+  Future activateHosted(String name, VersionConstraint constraint,
+      List<String> executables, {bool overwriteBinStubs}) {
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        _describeActive(name);
+        _installInCache(
+            new PackageDep(name, "hosted", constraint, name),
+            executables,
+            overwriteBinStubs: overwriteBinStubs).then((x0) {
+          try {
+            x0;
+            completer0.complete(null);
+          } catch (e0) {
+            completer0.completeError(e0);
+          }
+        }, onError: (e1) {
+          completer0.completeError(e1);
+        });
+      } catch (e2) {
+        completer0.completeError(e2);
+      }
+    });
+    return completer0.future;
   }
-  Future activatePath(String path) {
+  Future activatePath(String path, List<String> executables,
+      {bool overwriteBinStubs}) {
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
@@ -77,6 +105,10 @@
             _writeLockFile(name, new LockFile([id]));
             var binDir = p.join(_directory, name, 'bin');
             join0() {
+              _updateBinStubs(
+                  entrypoint.root,
+                  executables,
+                  overwriteBinStubs: overwriteBinStubs);
               completer0.complete(null);
             }
             if (dirExists(binDir)) {
@@ -97,7 +129,8 @@
     });
     return completer0.future;
   }
-  Future _installInCache(PackageDep dep) {
+  Future _installInCache(PackageDep dep, List<String> executables,
+      {bool overwriteBinStubs}) {
     final completer0 = new Completer();
     scheduleMicrotask(() {
       try {
@@ -126,8 +159,13 @@
                           graph.entrypoint,
                           dep.name).then((x3) {
                         try {
-                          x3;
+                          var snapshots = x3;
                           _writeLockFile(dep.name, lockFile);
+                          _updateBinStubs(
+                              graph.packages[dep.name],
+                              executables,
+                              overwriteBinStubs: overwriteBinStubs,
+                              snapshots: snapshots);
                           completer0.complete(null);
                         } catch (e3) {
                           completer0.completeError(e3);
@@ -180,19 +218,46 @@
     });
     return completer0.future;
   }
-  Future _precompileExecutables(Entrypoint entrypoint, String package) {
+  Future<Map<String, String>> _precompileExecutables(Entrypoint entrypoint,
+      String package) {
     return log.progress("Precompiling executables", () {
-      var binDir = p.join(_directory, package, 'bin');
-      cleanDir(binDir);
-      return AssetEnvironment.create(
-          entrypoint,
-          BarbackMode.RELEASE,
-          useDart2JS: false).then((environment) {
-        environment.barback.errors.listen((error) {
-          log.error(log.red("Build error:\n$error"));
-        });
-        return environment.precompileExecutables(package, binDir);
+      final completer0 = new Completer();
+      scheduleMicrotask(() {
+        try {
+          var binDir = p.join(_directory, package, 'bin');
+          cleanDir(binDir);
+          entrypoint.loadPackageGraph().then((x0) {
+            try {
+              var graph = x0;
+              AssetEnvironment.create(
+                  entrypoint,
+                  BarbackMode.RELEASE,
+                  entrypoints: graph.packages[package].executableIds,
+                  useDart2JS: false).then((x1) {
+                try {
+                  var environment = x1;
+                  environment.barback.errors.listen(((error) {
+                    log.error(log.red("Build error:\n$error"));
+                  }));
+                  completer0.complete(
+                      environment.precompileExecutables(package, binDir));
+                } catch (e1) {
+                  completer0.completeError(e1);
+                }
+              }, onError: (e2) {
+                completer0.completeError(e2);
+              });
+            } catch (e0) {
+              completer0.completeError(e0);
+            }
+          }, onError: (e3) {
+            completer0.completeError(e3);
+          });
+        } catch (e4) {
+          completer0.completeError(e4);
+        }
       });
+      return completer0.future;
     });
   }
   Future<PackageId> _cacheDependency(PackageId id) {
@@ -255,19 +320,18 @@
       return null;
     }
   }
-  bool deactivate(String name, {bool logDeactivate: false}) {
+  bool deactivate(String name) {
     var dir = p.join(_directory, name);
     if (!dirExists(dir)) return false;
-    if (logDeactivate) {
-      var lockFile = new LockFile.load(_getLockFilePath(name), cache.sources);
-      var id = lockFile.packages[name];
-      log.message('Deactivated package ${_formatPackage(id)}.');
-    }
+    _deleteBinStubs(name);
+    var lockFile = new LockFile.load(_getLockFilePath(name), cache.sources);
+    var id = lockFile.packages[name];
+    log.message('Deactivated package ${_formatPackage(id)}.');
     deleteEntry(dir);
     return true;
   }
   Future<Entrypoint> find(String name) {
-    return syncFuture(() {
+    return new Future.sync(() {
       var lockFilePath = _getLockFilePath(name);
       var lockFile;
       try {
@@ -298,15 +362,18 @@
     });
   }
   Future<int> runExecutable(String package, String executable,
-      Iterable<String> args) {
+      Iterable<String> args, {BarbackMode mode}) {
+    if (mode == null) mode = BarbackMode.RELEASE;
     var binDir = p.join(_directory, package, 'bin');
-    if (!fileExists(p.join(binDir, '$executable.dart.snapshot'))) {
+    if (mode != BarbackMode.RELEASE ||
+        !fileExists(p.join(binDir, '$executable.dart.snapshot'))) {
       return find(package).then((entrypoint) {
         return exe.runExecutable(
             entrypoint,
             package,
             executable,
             args,
+            mode: mode,
             isGlobal: true);
       });
     }
@@ -354,4 +421,173 @@
       return '${log.bold(id.name)} ${id.version}';
     }
   }
+  void _updateBinStubs(Package package, List<String> executables,
+      {bool overwriteBinStubs, Map<String, String> snapshots}) {
+    if (snapshots == null) snapshots = const {};
+    _deleteBinStubs(package.name);
+    if ((executables != null && executables.isEmpty) ||
+        package.pubspec.executables.isEmpty) {
+      return;
+    }
+    ensureDir(_binStubDir);
+    var installed = [];
+    var collided = {};
+    var allExecutables = ordered(package.pubspec.executables.keys);
+    for (var executable in allExecutables) {
+      if (executables != null && !executables.contains(executable)) continue;
+      var script = package.pubspec.executables[executable];
+      var previousPackage = _createBinStub(
+          package,
+          executable,
+          script,
+          overwrite: overwriteBinStubs,
+          snapshot: snapshots[script]);
+      if (previousPackage != null) {
+        collided[executable] = previousPackage;
+        if (!overwriteBinStubs) continue;
+      }
+      installed.add(executable);
+    }
+    if (installed.isNotEmpty) {
+      var names = namedSequence("executable", installed.map(log.bold));
+      log.message("Installed $names.");
+    }
+    if (collided.isNotEmpty) {
+      for (var command in ordered(collided.keys)) {
+        if (overwriteBinStubs) {
+          log.warning(
+              "Replaced ${log.bold(command)} previously installed from "
+                  "${log.bold(collided[command])}.");
+        } else {
+          log.warning(
+              "Executable ${log.bold(command)} was already installed "
+                  "from ${log.bold(collided[command])}.");
+        }
+      }
+      if (!overwriteBinStubs) {
+        log.warning(
+            "Deactivate the other package(s) or activate "
+                "${log.bold(package.name)} using --overwrite.");
+      }
+    }
+    if (executables != null) {
+      var unknown = ordered(
+          executables.where((exe) => !package.pubspec.executables.keys.contains(exe)));
+      if (unknown.isNotEmpty) {
+        dataError("Unknown ${namedSequence('executable', unknown)}.");
+      }
+    }
+    var binFiles = package.listFiles(
+        beneath: "bin",
+        recursive: false).map((path) => package.relative(path)).toList();
+    for (var executable in installed) {
+      var script = package.pubspec.executables[executable];
+      var scriptPath = p.join("bin", "$script.dart");
+      if (!binFiles.contains(scriptPath)) {
+        log.warning(
+            'Warning: Executable "$executable" runs "$scriptPath", '
+                'which was not found in ${log.bold(package.name)}.');
+      }
+    }
+    if (installed.isNotEmpty) _suggestIfNotOnPath(installed);
+  }
+  String _createBinStub(Package package, String executable, String script,
+      {bool overwrite, String snapshot}) {
+    var binStubPath = p.join(_binStubDir, executable);
+    if (Platform.operatingSystem == "windows") binStubPath += ".bat";
+    var previousPackage;
+    if (fileExists(binStubPath)) {
+      var contents = readTextFile(binStubPath);
+      var match = _binStubPackagePattern.firstMatch(contents);
+      if (match != null) {
+        previousPackage = match[1];
+        if (!overwrite) return previousPackage;
+      } else {
+        log.fine("Could not parse binstub $binStubPath:\n$contents");
+      }
+    }
+    var invocation;
+    if (snapshot != null) {
+      assert(p.isAbsolute(snapshot));
+      invocation = 'dart "$snapshot"';
+    } else {
+      invocation = "pub global run ${package.name}:$script";
+    }
+    if (Platform.operatingSystem == "windows") {
+      var batch = """
+@echo off
+rem This file was created by pub v${sdk.version}.
+rem Package: ${package.name}
+rem Version: ${package.version}
+rem Executable: ${executable}
+rem Script: ${script}
+$invocation %*
+""";
+      writeTextFile(binStubPath, batch);
+    } else {
+      var bash = """
+#!/usr/bin/env sh
+# This file was created by pub v${sdk.version}.
+# Package: ${package.name}
+# Version: ${package.version}
+# Executable: ${executable}
+# Script: ${script}
+$invocation "\$@"
+""";
+      writeTextFile(binStubPath, bash);
+      var result = Process.runSync('chmod', ['+x', binStubPath]);
+      if (result.exitCode != 0) {
+        try {
+          deleteEntry(binStubPath);
+        } on IOException catch (err) {
+          log.fine("Could not delete binstub:\n$err");
+        }
+        fail(
+            'Could not make "$binStubPath" executable (exit code '
+                '${result.exitCode}):\n${result.stderr}');
+      }
+    }
+    return previousPackage;
+  }
+  void _deleteBinStubs(String package) {
+    if (!dirExists(_binStubDir)) return;
+    for (var file in listDir(_binStubDir, includeDirs: false)) {
+      var contents = readTextFile(file);
+      var match = _binStubPackagePattern.firstMatch(contents);
+      if (match == null) {
+        log.fine("Could not parse binstub $file:\n$contents");
+        continue;
+      }
+      if (match[1] == package) {
+        log.fine("Deleting old binstub $file");
+        deleteEntry(file);
+      }
+    }
+  }
+  void _suggestIfNotOnPath(List<String> installed) {
+    if (Platform.operatingSystem == "windows") {
+      var result = runProcessSync("where", [r"\q", installed.first + ".bat"]);
+      if (result.exitCode == 0) return;
+      log.warning(
+          "${log.yellow('Warning:')} Pub installs executables into "
+              "${log.bold(_binStubDir)}, which is not on your path.\n"
+              "You can fix that by adding that directory to your system's "
+              '"Path" environment variable.\n'
+              'A web search for "configure windows path" will show you how.');
+    } else {
+      var result = runProcessSync("which", [installed.first]);
+      if (result.exitCode == 0) return;
+      var binDir = _binStubDir;
+      if (binDir.startsWith(Platform.environment['HOME'])) {
+        binDir =
+            p.join("~", p.relative(binDir, from: Platform.environment['HOME']));
+      }
+      log.warning(
+          "${log.yellow('Warning:')} Pub installs executables into "
+              "${log.bold(binDir)}, which is not on your path.\n"
+              "You can fix that by adding this to your shell's config file "
+              "(.bashrc, .bash_profile, etc.):\n" "\n"
+              "  ${log.bold('export PATH="\$PATH":"$binDir"')}\n" "\n");
+    }
+  }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/io.dart b/sdk/lib/_internal/pub_generated/lib/src/io.dart
index dd0d560..01bc538 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/io.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/io.dart
@@ -97,7 +97,7 @@
 Future<String> createFileFromStream(Stream<List<int>> stream, String file) {
   log.io("Creating $file from stream.");
   return _descriptorPool.withResource(() {
-    return Chain.track(stream.pipe(new File(file).openWrite())).then((_) {
+    return stream.pipe(new File(file).openWrite()).then((_) {
       log.fine("Created $file from stream.");
       return file;
     });
@@ -268,7 +268,7 @@
   return path.normalize(path.join(libDir, '..', '..', '..', '..', '..', '..'));
 }
 final Stream<String> stdinLines =
-    streamToLines(new ByteStream(Chain.track(stdin)).toStringStream());
+    streamToLines(new ByteStream(stdin).toStringStream());
 Future<bool> confirm(String message) {
   log.fine('Showing confirm message: $message');
   if (runningAsTest) {
@@ -284,9 +284,7 @@
 }
 Future flushThenExit(int status) {
   return Future.wait(
-      [
-          Chain.track(stdout.close()),
-          Chain.track(stderr.close())]).then((_) => exit(status));
+      [stdout.close(), stderr.close()]).then((_) => exit(status));
 }
 Pair<EventSink, Future> consumerToSink(StreamConsumer consumer) {
   var controller = new StreamController(sync: true);
@@ -364,14 +362,11 @@
     var errorGroup = new ErrorGroup();
     var pair = consumerToSink(process.stdin);
     _stdin = pair.first;
-    _stdinClosed = errorGroup.registerFuture(Chain.track(pair.last));
-    _stdout =
-        new ByteStream(errorGroup.registerStream(Chain.track(process.stdout)));
-    _stderr =
-        new ByteStream(errorGroup.registerStream(Chain.track(process.stderr)));
+    _stdinClosed = errorGroup.registerFuture(pair.last);
+    _stdout = new ByteStream(errorGroup.registerStream(process.stdout));
+    _stderr = new ByteStream(errorGroup.registerStream(process.stderr));
     var exitCodeCompleter = new Completer();
-    _exitCode =
-        errorGroup.registerFuture(Chain.track(exitCodeCompleter.future));
+    _exitCode = errorGroup.registerFuture(exitCodeCompleter.future);
     _process.exitCode.then((code) => exitCodeCompleter.complete(code));
   }
   bool kill([ProcessSignal signal = ProcessSignal.SIGTERM]) =>
@@ -415,9 +410,9 @@
   return completer.future;
 }
 Future withTempDir(Future fn(String path)) {
-  return syncFuture(() {
+  return new Future.sync(() {
     var tempDir = createSystemTempDir();
-    return syncFuture(
+    return new Future.sync(
         () => fn(tempDir)).whenComplete(() => deleteEntry(tempDir));
   });
 }
@@ -494,7 +489,7 @@
   });
 }
 ByteStream createTarGz(List contents, {baseDir}) {
-  return new ByteStream(futureStream(syncFuture(() {
+  return new ByteStream(futureStream(new Future.sync(() {
     var buffer = new StringBuffer();
     buffer.write('Creating .tag.gz stream containing:\n');
     contents.forEach((file) => buffer.write('$file\n'));
@@ -514,7 +509,7 @@
       return startProcess("tar", args).then((process) => process.stdout);
     }
     var tempDir = createSystemTempDir();
-    return syncFuture(() {
+    return new Future.sync(() {
       var tarFile = path.join(tempDir, "intermediate.tar");
       var args = ["a", "-w$baseDir", tarFile];
       args.addAll(contents.map((entry) => '-i!$entry'));
diff --git a/sdk/lib/_internal/pub_generated/lib/src/package.dart b/sdk/lib/_internal/pub_generated/lib/src/package.dart
index 73b5b05..a497b1e 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/package.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/package.dart
@@ -1,7 +1,8 @@
 library pub.package;
 import 'dart:io';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 import 'package:barback/barback.dart';
+import 'barback/transformer_id.dart';
 import 'io.dart';
 import 'git.dart' as git;
 import 'pubspec.dart';
@@ -18,7 +19,7 @@
   final String dir;
   String get name {
     if (pubspec.name != null) return pubspec.name;
-    if (dir != null) return path.basename(dir);
+    if (dir != null) return p.basename(dir);
     return null;
   }
   Version get version => pubspec.version;
@@ -37,23 +38,22 @@
     return deps.values.toSet();
   }
   List<AssetId> get executableIds {
-    var binDir = path.join(dir, 'bin');
-    if (!dirExists(binDir)) return [];
     return ordered(
         listFiles(
-            beneath: binDir,
+            beneath: "bin",
             recursive: false)).where(
-                (executable) => path.extension(executable) == '.dart').map((executable) {
+                (executable) => p.extension(executable) == '.dart').map((executable) {
       return new AssetId(
           name,
-          path.toUri(path.relative(executable, from: dir)).toString());
+          p.toUri(p.relative(executable, from: dir)).toString());
     }).toList();
   }
   String get readmePath {
-    var readmes = listDir(
-        dir).map(path.basename).where((entry) => entry.contains(_README_REGEXP));
+    var readmes = listFiles(
+        recursive: false).map(
+            p.basename).where((entry) => entry.contains(_README_REGEXP));
     if (readmes.isEmpty) return null;
-    return path.join(dir, readmes.reduce((readme1, readme2) {
+    return p.join(dir, readmes.reduce((readme1, readme2) {
       var extensions1 = ".".allMatches(readme1).length;
       var extensions2 = ".".allMatches(readme2).length;
       var comparison = extensions1.compareTo(extensions2);
@@ -66,14 +66,44 @@
         pubspec = new Pubspec.load(packageDir, sources, expectedName: name);
   Package.inMemory(this.pubspec) : dir = null;
   Package(this.pubspec, this.dir);
+  String path(String part1, [String part2, String part3, String part4,
+      String part5, String part6, String part7]) {
+    if (dir == null) {
+      throw new StateError(
+          "Package $name is in-memory and doesn't have paths " "on disk.");
+    }
+    return p.join(dir, part1, part2, part3, part4, part5, part6, part7);
+  }
+  String relative(String path) {
+    if (dir == null) {
+      throw new StateError(
+          "Package $name is in-memory and doesn't have paths " "on disk.");
+    }
+    return p.relative(path, from: dir);
+  }
+  String transformerPath(TransformerId id) {
+    if (id.package != name) {
+      throw new ArgumentError("Transformer $id isn't in package $name.");
+    }
+    if (id.path != null) return path('lib', p.fromUri('${id.path}.dart'));
+    var transformerPath = path('lib/transformer.dart');
+    if (fileExists(transformerPath)) return transformerPath;
+    return path('lib/$name.dart');
+  }
   static final _WHITELISTED_FILES = const ['.htaccess'];
   static final _blacklistedFiles = createFileFilter(['pubspec.lock']);
   static final _blacklistedDirs = createDirectoryFilter(['packages']);
-  List<String> listFiles({String beneath, recursive: true}) {
-    if (beneath == null) beneath = dir;
+  List<String> listFiles({String beneath, bool recursive: true,
+      bool useGitIgnore: false}) {
+    if (beneath == null) {
+      beneath = dir;
+    } else {
+      beneath = p.join(dir, beneath);
+    }
+    if (!dirExists(beneath)) return [];
     var files;
-    if (git.isInstalled && dirExists(path.join(dir, '.git'))) {
-      var relativeBeneath = path.relative(beneath, from: dir);
+    if (useGitIgnore && git.isInstalled && dirExists(path('.git'))) {
+      var relativeBeneath = p.relative(beneath, from: dir);
       files = git.runSync(
           ["ls-files", "--cached", "--others", "--exclude-standard", relativeBeneath],
           workingDir: dir);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/package_graph.dart b/sdk/lib/_internal/pub_generated/lib/src/package_graph.dart
index 26326c8..7f6554c 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/package_graph.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/package_graph.dart
@@ -1,14 +1,28 @@
 library pub.package_graph;
+import 'barback/transformer_cache.dart';
 import 'entrypoint.dart';
 import 'lock_file.dart';
 import 'package.dart';
+import 'source/cached.dart';
 import 'utils.dart';
 class PackageGraph {
   final Entrypoint entrypoint;
   final LockFile lockFile;
   final Map<String, Package> packages;
   Map<String, Set<Package>> _transitiveDependencies;
+  TransformerCache _transformerCache;
   PackageGraph(this.entrypoint, this.lockFile, this.packages);
+  TransformerCache loadTransformerCache() {
+    if (_transformerCache == null) {
+      if (entrypoint.root.dir == null) {
+        throw new StateError(
+            "Can't load the transformer cache for virtual "
+                "entrypoint ${entrypoint.root.name}.");
+      }
+      _transformerCache = new TransformerCache.load(this);
+    }
+    return _transformerCache;
+  }
   Set<Package> transitiveDependencies(String package) {
     if (package == entrypoint.root.name) return packages.values.toSet();
     if (_transitiveDependencies == null) {
@@ -22,4 +36,22 @@
     }
     return _transitiveDependencies[package];
   }
+  bool isPackageMutable(String package) {
+    var id = lockFile.packages[package];
+    if (id == null) return true;
+    var source = entrypoint.cache.sources[id.source];
+    if (source is! CachedSource) return true;
+    return transitiveDependencies(package).any((dep) {
+      var depId = lockFile.packages[dep.name];
+      if (depId == null) return true;
+      return entrypoint.cache.sources[depId.source] is! CachedSource;
+    });
+  }
+  bool isPackageStatic(String package) {
+    var id = lockFile.packages[package];
+    if (id == null) return false;
+    var source = entrypoint.cache.sources[id.source];
+    if (source is! CachedSource) return false;
+    return packages[package].pubspec.transformers.isEmpty;
+  }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/pubspec.dart b/sdk/lib/_internal/pub_generated/lib/src/pubspec.dart
index ce32ae2..2023486 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/pubspec.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/pubspec.dart
@@ -171,6 +171,44 @@
   }
   bool _parsedPublishTo = false;
   String _publishTo;
+  Map<String, String> get executables {
+    if (_executables != null) return _executables;
+    _executables = {};
+    var yaml = fields['executables'];
+    if (yaml == null) return _executables;
+    if (yaml is! Map) {
+      _error(
+          '"executables" field must be a map.',
+          fields.nodes['executables'].span);
+    }
+    yaml.nodes.forEach((key, value) {
+      validateName(name, description) {}
+      if (key.value is! String) {
+        _error('"executables" keys must be strings.', key.span);
+      }
+      final keyPattern = new RegExp(r"^[a-zA-Z0-9_-]+$");
+      if (!keyPattern.hasMatch(key.value)) {
+        _error(
+            '"executables" keys may only contain letters, '
+                'numbers, hyphens and underscores.',
+            key.span);
+      }
+      if (value.value == null) {
+        value = key;
+      } else if (value.value is! String) {
+        _error('"executables" values must be strings or null.', value.span);
+      }
+      final valuePattern = new RegExp(r"[/\\]");
+      if (valuePattern.hasMatch(value.value)) {
+        _error(
+            '"executables" values may not contain path separators.',
+            value.span);
+      }
+      _executables[key.value] = value.value;
+    });
+    return _executables;
+  }
+  Map<String, String> _executables;
   bool get isPrivate => publishTo == "none";
   bool get isEmpty =>
       name == null && version == Version.none && dependencies.isEmpty;
diff --git a/sdk/lib/_internal/pub_generated/lib/src/sdk.dart b/sdk/lib/_internal/pub_generated/lib/src/sdk.dart
index 5a49dfc..ccf767b 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/sdk.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/sdk.dart
@@ -10,7 +10,27 @@
 Version _getVersion() {
   var sdkVersion = Platform.environment["_PUB_TEST_SDK_VERSION"];
   if (sdkVersion != null) return new Version.parse(sdkVersion);
-  var revisionPath = path.join(_rootDirectory, "version");
-  var version = readTextFile(revisionPath).trim();
+  if (runningFromSdk) {
+    var version = readTextFile(path.join(_rootDirectory, "version")).trim();
+    return new Version.parse(version);
+  }
+  var contents = readTextFile(path.join(repoRoot, "tools/VERSION"));
+  parseField(name) {
+    var pattern = new RegExp("^$name ([a-z0-9]+)", multiLine: true);
+    var match = pattern.firstMatch(contents);
+    return match[1];
+  }
+  var channel = parseField("CHANNEL");
+  var major = parseField("MAJOR");
+  var minor = parseField("MINOR");
+  var patch = parseField("PATCH");
+  var prerelease = parseField("PRERELEASE");
+  var prereleasePatch = parseField("PRERELEASE_PATCH");
+  var version = "$major.$minor.$patch";
+  if (channel == "be") {
+    version += "-edge";
+  } else if (channel == "dev") {
+    version += "-dev.$prerelease.$prereleasePatch";
+  }
   return new Version.parse(version);
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/solver/backtracking_solver.dart b/sdk/lib/_internal/pub_generated/lib/src/solver/backtracking_solver.dart
index 04fc159..e850bb5 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/solver/backtracking_solver.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/solver/backtracking_solver.dart
@@ -277,7 +277,7 @@
     });
   }
   Future _registerDependency(Dependency dependency) {
-    return syncFuture(() {
+    return new Future.sync(() {
       _validateDependency(dependency);
       var dep = dependency.dep;
       var dependencies = _getDependencies(dep.name);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/source/git.dart b/sdk/lib/_internal/pub_generated/lib/src/source/git.dart
index 5a04d12..c15a63f 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/source/git.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/source/git.dart
@@ -120,7 +120,7 @@
     })).then((_) => new Pair(successes, failures));
   }
   Future<String> _ensureRevision(PackageId id) {
-    return syncFuture(() {
+    return new Future.sync(() {
       var path = _repoCachePath(id);
       if (!entryExists(path)) {
         return _clone(
@@ -152,7 +152,7 @@
   }
   Future _clone(String from, String to, {bool mirror: false, bool shallow:
       false}) {
-    return syncFuture(() {
+    return new Future.sync(() {
       ensureDir(to);
       var args = ["clone", from, to];
       if (mirror) args.insert(1, "--mirror");
diff --git a/sdk/lib/_internal/pub_generated/lib/src/source/hosted.dart b/sdk/lib/_internal/pub_generated/lib/src/source/hosted.dart
index 265b673..3a9cd17 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/source/hosted.dart
@@ -117,7 +117,7 @@
   }
   Future<bool> _download(String server, String package, Version version,
       String destPath) {
-    return syncFuture(() {
+    return new Future.sync(() {
       var url = Uri.parse("$server/packages/$package/versions/$version.tar.gz");
       log.io("Get package from $url.");
       log.message('Downloading ${log.bold(package)} ${version}...');
diff --git a/sdk/lib/_internal/pub_generated/lib/src/source/path.dart b/sdk/lib/_internal/pub_generated/lib/src/source/path.dart
index 017b8d4..9244829 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/source/path.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/source/path.dart
@@ -17,7 +17,7 @@
   static String pathFromDescription(description) => description["path"];
   final name = 'path';
   Future<Pubspec> doDescribe(PackageId id) {
-    return syncFuture(() {
+    return new Future.sync(() {
       var dir = _validatePath(id.name, id.description);
       return new Pubspec.load(dir, systemCache.sources, expectedName: id.name);
     });
@@ -28,7 +28,7 @@
     return path1 == path2;
   }
   Future get(PackageId id, String symlink) {
-    return syncFuture(() {
+    return new Future.sync(() {
       var dir = _validatePath(id.name, id.description);
       createPackageSymlink(
           id.name,
diff --git a/sdk/lib/_internal/pub_generated/lib/src/utils.dart b/sdk/lib/_internal/pub_generated/lib/src/utils.dart
index dcaf044..5d7a872 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/utils.dart
@@ -50,7 +50,6 @@
   Future<List> get future => _completer.future;
 }
 Future newFuture(callback()) => new Future.value().then((_) => callback());
-Future syncFuture(callback()) => Chain.track(new Future.sync(callback));
 Future captureErrors(Future callback(), {bool captureStackChains: false}) {
   var completer = new Completer();
   var wrappedCallback = () {
@@ -102,6 +101,11 @@
   }
   return result.toString();
 }
+String namedSequence(String name, Iterable iter, [String plural]) {
+  if (iter.length == 1) return "$name ${iter.single}";
+  if (plural == null) plural = "${name}s";
+  return "$plural ${toSentence(iter)}";
+}
 String toSentence(Iterable iter) {
   if (iter.length == 1) return iter.first.toString();
   return iter.take(iter.length - 1).join(", ") + " and ${iter.last}";
@@ -156,6 +160,11 @@
   minuendSet.removeAll(subtrahend);
   return minuendSet;
 }
+bool overlaps(Set set1, Set set2) {
+  var smaller = set1.length > set2.length ? set1 : set2;
+  var larger = smaller == set1 ? set2 : set1;
+  return smaller.any(larger.contains);
+}
 List ordered(Iterable<Comparable> iter) {
   var list = iter.toList();
   list.sort();
@@ -198,8 +207,8 @@
   return Future.wait(iter.map((element) {
     return Future.wait(
         [
-            syncFuture(() => key(element)),
-            syncFuture(() => value(element))]).then((results) {
+            new Future.sync(() => key(element)),
+            new Future.sync(() => value(element))]).then((results) {
       map[results[0]] = results[1];
     });
   })).then((_) => map);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/validator.dart b/sdk/lib/_internal/pub_generated/lib/src/validator.dart
index 27f071b..f8c4b9e 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/validator.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/validator.dart
@@ -7,6 +7,7 @@
 import 'validator/dependency.dart';
 import 'validator/dependency_override.dart';
 import 'validator/directory.dart';
+import 'validator/executable.dart';
 import 'validator/license.dart';
 import 'validator/name.dart';
 import 'validator/pubspec_field.dart';
@@ -27,6 +28,7 @@
         new DependencyValidator(entrypoint),
         new DependencyOverrideValidator(entrypoint),
         new DirectoryValidator(entrypoint),
+        new ExecutableValidator(entrypoint),
         new CompiledDartdocValidator(entrypoint),
         new Utf8ReadmeValidator(entrypoint)];
     if (packageSize != null) {
diff --git a/sdk/lib/_internal/pub_generated/lib/src/validator/compiled_dartdoc.dart b/sdk/lib/_internal/pub_generated/lib/src/validator/compiled_dartdoc.dart
index 3dc88b4..03323fa 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/validator/compiled_dartdoc.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/validator/compiled_dartdoc.dart
@@ -3,13 +3,12 @@
 import 'package:path/path.dart' as path;
 import '../entrypoint.dart';
 import '../io.dart';
-import '../utils.dart';
 import '../validator.dart';
 class CompiledDartdocValidator extends Validator {
   CompiledDartdocValidator(Entrypoint entrypoint) : super(entrypoint);
   Future validate() {
-    return syncFuture(() {
-      for (var entry in entrypoint.root.listFiles()) {
+    return new Future.sync(() {
+      for (var entry in entrypoint.root.listFiles(useGitIgnore: true)) {
         if (path.basename(entry) != "nav.json") continue;
         var dir = path.dirname(entry);
         var files = [
diff --git a/sdk/lib/_internal/pub_generated/lib/src/validator/directory.dart b/sdk/lib/_internal/pub_generated/lib/src/validator/directory.dart
index 133b3da..0318932 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/validator/directory.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/validator/directory.dart
@@ -3,7 +3,6 @@
 import 'package:path/path.dart' as path;
 import '../entrypoint.dart';
 import '../io.dart';
-import '../utils.dart';
 import '../validator.dart';
 class DirectoryValidator extends Validator {
   DirectoryValidator(Entrypoint entrypoint) : super(entrypoint);
@@ -14,7 +13,7 @@
       "tests",
       "tools"];
   Future validate() {
-    return syncFuture(() {
+    return new Future.sync(() {
       for (var dir in listDir(entrypoint.root.dir)) {
         if (!dirExists(dir)) continue;
         dir = path.basename(dir);
diff --git a/sdk/lib/_internal/pub_generated/lib/src/validator/executable.dart b/sdk/lib/_internal/pub_generated/lib/src/validator/executable.dart
new file mode 100644
index 0000000..20349ec
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/lib/src/validator/executable.dart
@@ -0,0 +1,29 @@
+library pub.validator.executable;
+import 'dart:async';
+import 'package:path/path.dart' as p;
+import '../entrypoint.dart';
+import '../validator.dart';
+class ExecutableValidator extends Validator {
+  ExecutableValidator(Entrypoint entrypoint) : super(entrypoint);
+  Future validate() {
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        var binFiles = entrypoint.root.listFiles(
+            beneath: "bin",
+            recursive: false).map(((path) => entrypoint.root.relative(path))).toList();
+        entrypoint.root.pubspec.executables.forEach(((executable, script) {
+          var scriptPath = p.join("bin", "$script.dart");
+          if (binFiles.contains(scriptPath)) return;
+          warnings.add(
+              'Your pubspec.yaml lists an executable "$executable" that '
+                  'points to a script "$scriptPath" that does not exist.');
+        }));
+        completer0.complete(null);
+      } catch (e0) {
+        completer0.completeError(e0);
+      }
+    });
+    return completer0.future;
+  }
+}
diff --git a/sdk/lib/_internal/pub_generated/lib/src/validator/license.dart b/sdk/lib/_internal/pub_generated/lib/src/validator/license.dart
index 8d19d54..c32c5c9 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/validator/license.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/validator/license.dart
@@ -2,17 +2,16 @@
 import 'dart:async';
 import 'package:path/path.dart' as path;
 import '../entrypoint.dart';
-import '../io.dart';
 import '../utils.dart';
 import '../validator.dart';
 class LicenseValidator extends Validator {
   LicenseValidator(Entrypoint entrypoint) : super(entrypoint);
   Future validate() {
-    return syncFuture(() {
+    return new Future.sync(() {
       var licenseLike =
           new RegExp(r"^([a-zA-Z0-9]+[-_])?(LICENSE|COPYING)(\..*)?$");
-      if (listDir(
-          entrypoint.root.dir).map(path.basename).any(licenseLike.hasMatch)) {
+      if (entrypoint.root.listFiles(
+          recursive: false).map(path.basename).any(licenseLike.hasMatch)) {
         return;
       }
       errors.add(
diff --git a/sdk/lib/_internal/pub_generated/lib/src/validator/name.dart b/sdk/lib/_internal/pub_generated/lib/src/validator/name.dart
index 10171e1..ccda01c 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/validator/name.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/validator/name.dart
@@ -2,7 +2,6 @@
 import 'dart:async';
 import 'package:path/path.dart' as path;
 import '../entrypoint.dart';
-import '../io.dart';
 import '../utils.dart';
 import '../validator.dart';
 final _RESERVED_WORDS = [
@@ -40,7 +39,7 @@
 class NameValidator extends Validator {
   NameValidator(Entrypoint entrypoint) : super(entrypoint);
   Future validate() {
-    return syncFuture(() {
+    return new Future.sync(() {
       _checkName(
           entrypoint.root.name,
           'Package name "${entrypoint.root.name}"',
@@ -64,10 +63,9 @@
     });
   }
   List<String> get _libraries {
-    var libDir = path.join(entrypoint.root.dir, "lib");
-    if (!dirExists(libDir)) return [];
+    var libDir = entrypoint.root.path("lib");
     return entrypoint.root.listFiles(
-        beneath: libDir).map(
+        beneath: "lib").map(
             (file) =>
                 path.relative(
                     file,
diff --git a/sdk/lib/_internal/pub_generated/lib/src/validator/utf8_readme.dart b/sdk/lib/_internal/pub_generated/lib/src/validator/utf8_readme.dart
index 2f81ba5..d840dff 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/validator/utf8_readme.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/validator/utf8_readme.dart
@@ -3,12 +3,11 @@
 import 'dart:convert';
 import '../entrypoint.dart';
 import '../io.dart';
-import '../utils.dart';
 import '../validator.dart';
 class Utf8ReadmeValidator extends Validator {
   Utf8ReadmeValidator(Entrypoint entrypoint) : super(entrypoint);
   Future validate() {
-    return syncFuture(() {
+    return new Future.sync(() {
       var readme = entrypoint.root.readmePath;
       if (readme == null) return;
       var bytes = readBinaryFile(readme);
diff --git a/sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/conservative_dependencies_test.dart b/sdk/lib/_internal/pub_generated/test/dependency_computer/conservative_dependencies_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/conservative_dependencies_test.dart
rename to sdk/lib/_internal/pub_generated/test/dependency_computer/conservative_dependencies_test.dart
diff --git a/sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/cycle_test.dart b/sdk/lib/_internal/pub_generated/test/dependency_computer/cycle_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/cycle_test.dart
rename to sdk/lib/_internal/pub_generated/test/dependency_computer/cycle_test.dart
diff --git a/sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/dev_transformers_test.dart b/sdk/lib/_internal/pub_generated/test/dependency_computer/dev_transformers_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/dev_transformers_test.dart
rename to sdk/lib/_internal/pub_generated/test/dependency_computer/dev_transformers_test.dart
diff --git a/sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/error_test.dart b/sdk/lib/_internal/pub_generated/test/dependency_computer/error_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/error_test.dart
rename to sdk/lib/_internal/pub_generated/test/dependency_computer/error_test.dart
diff --git a/sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/import_dependencies_test.dart b/sdk/lib/_internal/pub_generated/test/dependency_computer/import_dependencies_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/import_dependencies_test.dart
rename to sdk/lib/_internal/pub_generated/test/dependency_computer/import_dependencies_test.dart
diff --git a/sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/no_dependencies_test.dart b/sdk/lib/_internal/pub_generated/test/dependency_computer/no_dependencies_test.dart
similarity index 100%
rename from sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/no_dependencies_test.dart
rename to sdk/lib/_internal/pub_generated/test/dependency_computer/no_dependencies_test.dart
diff --git a/sdk/lib/_internal/pub_generated/test/dependency_computer/transformers_needed_by_library_test.dart b/sdk/lib/_internal/pub_generated/test/dependency_computer/transformers_needed_by_library_test.dart
new file mode 100644
index 0000000..be60945
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/dependency_computer/transformers_needed_by_library_test.dart
@@ -0,0 +1,111 @@
+library pub_tests;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+void main() {
+  initConfig();
+  integration("reports a dependency if the library itself is transformed", () {
+    d.dir(appPath, [d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": {
+            "path": "../foo"
+          }
+        },
+        "transformers": [{
+            "foo": {
+              "\$include": "bin/myapp.dart.dart"
+            }
+          }]
+      }),
+          d.dir(
+              "bin",
+              [d.file("myapp.dart", "import 'package:myapp/lib.dart';")])]).create();
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "version": "1.0.0"
+      }), d.dir("lib", [d.file("foo.dart", transformer())])]).create();
+    expectLibraryDependencies('myapp|bin/myapp.dart', ['foo']);
+  });
+  integration(
+      "reports a dependency if a transformed local file is imported",
+      () {
+    d.dir(appPath, [d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": {
+            "path": "../foo"
+          }
+        },
+        "transformers": [{
+            "foo": {
+              "\$include": "lib/lib.dart"
+            }
+          }]
+      }),
+          d.dir("lib", [d.file("lib.dart", "")]),
+          d.dir(
+              "bin",
+              [d.file("myapp.dart", "import 'package:myapp/lib.dart';")])]).create();
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "version": "1.0.0"
+      }), d.dir("lib", [d.file("foo.dart", transformer())])]).create();
+    expectLibraryDependencies('myapp|bin/myapp.dart', ['foo']);
+  });
+  integration(
+      "reports a dependency if a transformed foreign file is imported",
+      () {
+    d.dir(appPath, [d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": {
+            "path": "../foo"
+          }
+        }
+      }),
+          d.dir(
+              "bin",
+              [d.file("myapp.dart", "import 'package:foo/foo.dart';")])]).create();
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": [{
+            "foo": {
+              "\$include": "lib/foo.dart"
+            }
+          }]
+      }),
+          d.dir(
+              "lib",
+              [d.file("foo.dart", ""), d.file("transformer.dart", transformer())])]).create();
+    expectLibraryDependencies('myapp|bin/myapp.dart', ['foo']);
+  });
+  integration(
+      "doesn't report a dependency if no transformed files are " "imported",
+      () {
+    d.dir(appPath, [d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": {
+            "path": "../foo"
+          }
+        },
+        "transformers": [{
+            "foo": {
+              "\$include": "lib/lib.dart"
+            }
+          }]
+      }),
+          d.dir("lib", [d.file("lib.dart", ""), d.file("untransformed.dart", "")]),
+          d.dir(
+              "bin",
+              [
+                  d.file("myapp.dart", "import 'package:myapp/untransformed.dart';")])]).create();
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "version": "1.0.0"
+      }), d.dir("lib", [d.file("foo.dart", transformer())])]).create();
+    expectLibraryDependencies('myapp|bin/myapp.dart', []);
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/utils.dart b/sdk/lib/_internal/pub_generated/test/dependency_computer/utils.dart
similarity index 76%
rename from sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/utils.dart
rename to sdk/lib/_internal/pub_generated/test/dependency_computer/utils.dart
index 5382961..ee048b1 100644
--- a/sdk/lib/_internal/pub_generated/test/transformers_needed_by_transformers/utils.dart
+++ b/sdk/lib/_internal/pub_generated/test/dependency_computer/utils.dart
@@ -1,8 +1,9 @@
 library pub_tests;
+import 'package:barback/barback.dart';
 import 'package:path/path.dart' as p;
 import 'package:scheduled_test/scheduled_test.dart';
 import '../../lib/src/barback/cycle_exception.dart';
-import '../../lib/src/barback/transformers_needed_by_transformers.dart';
+import '../../lib/src/barback/dependency_computer.dart';
 import '../../lib/src/entrypoint.dart';
 import '../../lib/src/io.dart';
 import '../../lib/src/package.dart';
@@ -14,8 +15,9 @@
 void expectDependencies(Map<String, Iterable<String>> expected) {
   expected = mapMap(expected, value: (_, ids) => ids.toSet());
   schedule(() {
+    var computer = new DependencyComputer(_loadPackageGraph());
     var result = mapMap(
-        computeTransformersNeededByTransformers(_loadPackageGraph()),
+        computer.transformersNeededByTransformers(),
         key: (id, _) => id.toString(),
         value: (_, ids) => ids.map((id) => id.toString()).toSet());
     expect(result, equals(expected));
@@ -23,9 +25,10 @@
 }
 void expectException(matcher) {
   schedule(() {
-    expect(
-        () => computeTransformersNeededByTransformers(_loadPackageGraph()),
-        throwsA(matcher));
+    expect(() {
+      var computer = new DependencyComputer(_loadPackageGraph());
+      computer.transformersNeededByTransformers();
+    }, throwsA(matcher));
   }, "expect an exception: $matcher");
 }
 void expectCycleException(Iterable<String> steps) {
@@ -35,6 +38,15 @@
     return true;
   }, "cycle exception:\n${steps.map((step) => "  $step").join("\n")}"));
 }
+void expectLibraryDependencies(String id, Iterable<String> expected) {
+  expected = expected.toSet();
+  schedule(() {
+    var computer = new DependencyComputer(_loadPackageGraph());
+    var result = computer.transformersNeededByLibrary(
+        new AssetId.parse(id)).map((id) => id.toString()).toSet();
+    expect(result, equals(expected));
+  }, "expect dependencies to match $expected");
+}
 PackageGraph _loadPackageGraph() {
   var packages = {};
   var systemCache = new SystemCache(p.join(sandboxDir, cachePath));
diff --git a/sdk/lib/_internal/pub_generated/test/get/cache_transformed_dependency_test.dart b/sdk/lib/_internal/pub_generated/test/get/cache_transformed_dependency_test.dart
new file mode 100644
index 0000000..6a05685
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/get/cache_transformed_dependency_test.dart
@@ -0,0 +1,302 @@
+library pub_tests;
+import 'package:scheduled_test/scheduled_test.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+const MODE_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class ModeTransformer extends Transformer {
+  final BarbackSettings _settings;
+
+  ModeTransformer.asPlugin(this._settings);
+
+  String get allowedExtensions => '.dart';
+
+  void apply(Transform transform) {
+    return transform.primaryInput.readAsString().then((contents) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id,
+          contents.replaceAll("MODE", _settings.mode.name)));
+    });
+  }
+}
+""";
+main() {
+  initConfig();
+  integration("caches a transformed dependency", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+      builder.serve("foo", "1.2.3", deps: {
+        'barback': 'any'
+      }, pubspec: {
+        'transformers': ['foo']
+      },
+          contents: [
+              d.dir(
+                  "lib",
+                  [
+                      d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+                      d.file("foo.dart", "final message = 'Hello!';")])]);
+    });
+    d.appDir({
+      "foo": "1.2.3"
+    }).create();
+    pubGet(output: contains("Precompiled foo."));
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/deps/debug/foo/lib",
+                [d.file("foo.dart", "final message = 'Goodbye!';")])]).validate();
+  });
+  integration("caches a dependency transformed by its dependency", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+      builder.serve("foo", "1.2.3", deps: {
+        'bar': '1.2.3'
+      }, pubspec: {
+        'transformers': ['bar']
+      },
+          contents: [d.dir("lib", [d.file("foo.dart", "final message = 'Hello!';")])]);
+      builder.serve("bar", "1.2.3", deps: {
+        'barback': 'any'
+      },
+          contents: [
+              d.dir(
+                  "lib",
+                  [d.file("transformer.dart", replaceTransformer("Hello", "Goodbye"))])]);
+    });
+    d.appDir({
+      "foo": "1.2.3"
+    }).create();
+    pubGet(output: contains("Precompiled foo."));
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/deps/debug/foo/lib",
+                [d.file("foo.dart", "final message = 'Goodbye!';")])]).validate();
+  });
+  integration("doesn't cache an untransformed dependency", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+      builder.serve(
+          "foo",
+          "1.2.3",
+          contents: [d.dir("lib", [d.file("foo.dart", "final message = 'Hello!';")])]);
+    });
+    d.appDir({
+      "foo": "1.2.3"
+    }).create();
+    pubGet(output: isNot(contains("Precompiled foo.")));
+    d.dir(appPath, [d.nothing(".pub/deps")]).validate();
+  });
+  integration("recaches when the dependency is updated", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+      builder.serve("foo", "1.2.3", deps: {
+        'barback': 'any'
+      }, pubspec: {
+        'transformers': ['foo']
+      },
+          contents: [
+              d.dir(
+                  "lib",
+                  [
+                      d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+                      d.file("foo.dart", "final message = 'Hello!';")])]);
+      builder.serve("foo", "1.2.4", deps: {
+        'barback': 'any'
+      }, pubspec: {
+        'transformers': ['foo']
+      },
+          contents: [
+              d.dir(
+                  "lib",
+                  [
+                      d.file("transformer.dart", replaceTransformer("Hello", "See ya")),
+                      d.file("foo.dart", "final message = 'Hello!';")])]);
+    });
+    d.appDir({
+      "foo": "1.2.3"
+    }).create();
+    pubGet(output: contains("Precompiled foo."));
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/deps/debug/foo/lib",
+                [d.file("foo.dart", "final message = 'Goodbye!';")])]).validate();
+    d.appDir({
+      "foo": "1.2.4"
+    }).create();
+    pubGet(output: contains("Precompiled foo."));
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/deps/debug/foo/lib",
+                [d.file("foo.dart", "final message = 'See ya!';")])]).validate();
+  });
+  integration("recaches when a transitive dependency is updated", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+      builder.serve("foo", "1.2.3", deps: {
+        'barback': 'any',
+        'bar': 'any'
+      }, pubspec: {
+        'transformers': ['foo']
+      },
+          contents: [
+              d.dir(
+                  "lib",
+                  [
+                      d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+                      d.file("foo.dart", "final message = 'Hello!';")])]);
+      builder.serve("bar", "5.6.7");
+    });
+    d.appDir({
+      "foo": "1.2.3"
+    }).create();
+    pubGet(output: contains("Precompiled foo."));
+    servePackages((builder) => builder.serve("bar", "6.0.0"));
+    pubUpgrade(output: contains("Precompiled foo."));
+  });
+  integration("doesn't recache when an unrelated dependency is updated", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+      builder.serve("foo", "1.2.3", deps: {
+        'barback': 'any'
+      }, pubspec: {
+        'transformers': ['foo']
+      },
+          contents: [
+              d.dir(
+                  "lib",
+                  [
+                      d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+                      d.file("foo.dart", "final message = 'Hello!';")])]);
+      builder.serve("bar", "5.6.7");
+    });
+    d.appDir({
+      "foo": "1.2.3"
+    }).create();
+    pubGet(output: contains("Precompiled foo."));
+    servePackages((builder) => builder.serve("bar", "6.0.0"));
+    pubUpgrade(output: isNot(contains("Precompiled foo.")));
+  });
+  integration("caches the dependency in debug mode", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+      builder.serve("foo", "1.2.3", deps: {
+        'barback': 'any'
+      }, pubspec: {
+        'transformers': ['foo']
+      },
+          contents: [
+              d.dir(
+                  "lib",
+                  [
+                      d.file("transformer.dart", MODE_TRANSFORMER),
+                      d.file("foo.dart", "final mode = 'MODE';")])]);
+    });
+    d.appDir({
+      "foo": "1.2.3"
+    }).create();
+    pubGet(output: contains("Precompiled foo."));
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/deps/debug/foo/lib",
+                [d.file("foo.dart", "final mode = 'debug';")])]).validate();
+  });
+  integration("loads code from the cache", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+      builder.serve("foo", "1.2.3", deps: {
+        'barback': 'any'
+      }, pubspec: {
+        'transformers': ['foo']
+      },
+          contents: [
+              d.dir(
+                  "lib",
+                  [
+                      d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+                      d.file("foo.dart", "final message = 'Hello!';")])]);
+    });
+    d.dir(appPath, [d.appPubspec({
+        "foo": "1.2.3"
+      }), d.dir('bin', [d.file('script.dart', """
+          import 'package:foo/foo.dart';
+
+          void main() => print(message);""")])]).create();
+    pubGet(output: contains("Precompiled foo."));
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/deps/debug/foo/lib",
+                [d.file("foo.dart", "final message = 'Modified!';")])]).create();
+    var pub = pubRun(args: ["script"]);
+    pub.stdout.expect("Modified!");
+    pub.shouldExit();
+  });
+  integration("doesn't re-transform code loaded from the cache", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+      builder.serve("foo", "1.2.3", deps: {
+        'barback': 'any'
+      }, pubspec: {
+        'transformers': ['foo']
+      },
+          contents: [
+              d.dir(
+                  "lib",
+                  [
+                      d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")),
+                      d.file("foo.dart", "final message = 'Hello!';")])]);
+    });
+    d.dir(appPath, [d.appPubspec({
+        "foo": "1.2.3"
+      }), d.dir('bin', [d.file('script.dart', """
+          import 'package:foo/foo.dart';
+
+          void main() => print(message);""")])]).create();
+    pubGet(output: contains("Precompiled foo."));
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/deps/debug/foo/lib",
+                [d.file("foo.dart", "final message = 'Hello!';")])]).create();
+    var pub = pubRun(args: ["script"]);
+    pub.stdout.expect("Hello!");
+    pub.shouldExit();
+  });
+}
+String replaceTransformer(String input, String output) {
+  return """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class ReplaceTransformer extends Transformer {
+  ReplaceTransformer.asPlugin();
+
+  String get allowedExtensions => '.dart';
+
+  Future apply(Transform transform) {
+    return transform.primaryInput.readAsString().then((contents) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id,
+          contents.replaceAll("$input", "$output")));
+    });
+  }
+}
+""";
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/activate/bad_version_test.dart b/sdk/lib/_internal/pub_generated/test/global/activate/bad_version_test.dart
index 8130c3f..bdfdeb5 100644
--- a/sdk/lib/_internal/pub_generated/test/global/activate/bad_version_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/activate/bad_version_test.dart
@@ -1,17 +1,12 @@
+import 'package:scheduled_test/scheduled_test.dart';
 import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../test_pub.dart';
 main() {
   initConfig();
   integration('fails if the version constraint cannot be parsed', () {
-    schedulePub(args: ["global", "activate", "foo", "1.0"], error: """
-            Could not parse version "1.0". Unknown text at "1.0".
-
-            Usage: pub global activate <package...>
-            -h, --help      Print usage information for this command.
-            -s, --source    The source used to find the package.
-                            [git, hosted (default), path]
-
-            Run "pub help" to see global options.
-            """, exitCode: exit_codes.USAGE);
+    schedulePub(
+        args: ["global", "activate", "foo", "1.0"],
+        error: contains('Could not parse version "1.0". Unknown text at "1.0".'),
+        exitCode: exit_codes.USAGE);
   });
 }
diff --git a/sdk/lib/_internal/pub_generated/test/global/activate/constraint_with_path_test.dart b/sdk/lib/_internal/pub_generated/test/global/activate/constraint_with_path_test.dart
index fed36ab..372646e 100644
--- a/sdk/lib/_internal/pub_generated/test/global/activate/constraint_with_path_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/activate/constraint_with_path_test.dart
@@ -1,3 +1,4 @@
+import 'package:scheduled_test/scheduled_test.dart';
 import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../test_pub.dart';
 main() {
@@ -5,15 +6,7 @@
   integration('fails if a version is passed with the path source', () {
     schedulePub(
         args: ["global", "activate", "-spath", "foo", "1.2.3"],
-        error: """
-            Unexpected argument "1.2.3".
-
-            Usage: pub global activate <package...>
-            -h, --help      Print usage information for this command.
-            -s, --source    The source used to find the package.
-                            [git, hosted (default), path]
-
-            Run "pub help" to see global options.
-            """, exitCode: exit_codes.USAGE);
+        error: contains('Unexpected argument "1.2.3".'),
+        exitCode: exit_codes.USAGE);
   });
 }
diff --git a/sdk/lib/_internal/pub_generated/test/global/activate/missing_package_arg_test.dart b/sdk/lib/_internal/pub_generated/test/global/activate/missing_package_arg_test.dart
index b2eec9e..30abe54 100644
--- a/sdk/lib/_internal/pub_generated/test/global/activate/missing_package_arg_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/activate/missing_package_arg_test.dart
@@ -1,17 +1,12 @@
+import 'package:scheduled_test/scheduled_test.dart';
 import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../test_pub.dart';
 main() {
   initConfig();
   integration('fails if no package was given', () {
-    schedulePub(args: ["global", "activate"], error: """
-            No package to activate given.
-
-            Usage: pub global activate <package...>
-            -h, --help      Print usage information for this command.
-            -s, --source    The source used to find the package.
-                            [git, hosted (default), path]
-
-            Run "pub help" to see global options.""",
+    schedulePub(
+        args: ["global", "activate"],
+        error: contains("No package to activate given."),
         exitCode: exit_codes.USAGE);
   });
 }
diff --git a/sdk/lib/_internal/pub_generated/test/global/activate/unexpected_arguments_test.dart b/sdk/lib/_internal/pub_generated/test/global/activate/unexpected_arguments_test.dart
index 090a437..2cd4ba0 100644
--- a/sdk/lib/_internal/pub_generated/test/global/activate/unexpected_arguments_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/activate/unexpected_arguments_test.dart
@@ -1,3 +1,4 @@
+import 'package:scheduled_test/scheduled_test.dart';
 import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../test_pub.dart';
 main() {
@@ -5,15 +6,7 @@
   integration('fails if there are extra arguments', () {
     schedulePub(
         args: ["global", "activate", "foo", "1.0.0", "bar", "baz"],
-        error: """
-            Unexpected arguments "bar" and "baz".
-
-            Usage: pub global activate <package...>
-            -h, --help      Print usage information for this command.
-            -s, --source    The source used to find the package.
-                            [git, hosted (default), path]
-
-            Run "pub help" to see global options.""",
+        error: contains('Unexpected arguments "bar" and "baz".'),
         exitCode: exit_codes.USAGE);
   });
 }
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/binstub_runs_executable_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/binstub_runs_executable_test.dart
new file mode 100644
index 0000000..c0a86bc
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/binstub_runs_executable_test.dart
@@ -0,0 +1,54 @@
+import 'dart:io';
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_process.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+main() {
+  initConfig();
+  integration("the generated binstub runs a snapshotted executable", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", pubspec: {
+        "executables": {
+          "foo-script": "script"
+        }
+      },
+          contents: [
+              d.dir("bin", [d.file("script.dart", "main(args) => print('ok \$args');")])]);
+    });
+    schedulePub(args: ["global", "activate", "foo"]);
+    var process = new ScheduledProcess.start(
+        p.join(sandboxDir, cachePath, "bin", binStubName("foo-script")),
+        ["arg1", "arg2"],
+        environment: getEnvironment());
+    process.stdout.expect("ok [arg1, arg2]");
+    process.shouldExit();
+  });
+  integration("the generated binstub runs a non-snapshotted executable", () {
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "executables": {
+          "foo-script": "script"
+        }
+      }),
+          d.dir(
+              "bin",
+              [d.file("script.dart", "main(args) => print('ok \$args');")])]).create();
+    schedulePub(args: ["global", "activate", "-spath", "../foo"]);
+    var process = new ScheduledProcess.start(
+        p.join(sandboxDir, cachePath, "bin", binStubName("foo-script")),
+        ["arg1", "arg2"],
+        environment: getEnvironment());
+    process.stdout.expect("ok [arg1, arg2]");
+    process.shouldExit();
+  });
+}
+getEnvironment() {
+  var binDir = p.dirname(Platform.executable);
+  var separator = Platform.operatingSystem == "windows" ? ";" : ":";
+  var path = "${Platform.environment["PATH"]}$separator$binDir";
+  var environment = getPubTestEnvironment();
+  environment["PATH"] = path;
+  return environment;
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/binstub_runs_global_run_if_no_snapshot_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/binstub_runs_global_run_if_no_snapshot_test.dart
new file mode 100644
index 0000000..1c4357d
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/binstub_runs_global_run_if_no_snapshot_test.dart
@@ -0,0 +1,28 @@
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+main() {
+  initConfig();
+  integration("the binstubs runs pub global run if there is no snapshot", () {
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "executables": {
+          "foo-script": "script"
+        }
+      }),
+          d.dir("bin", [d.file("script.dart", "main() => print('ok');")])]).create();
+    schedulePub(
+        args: ["global", "activate", "--source", "path", "../foo"],
+        output: contains("Installed executable foo-script."));
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                "bin",
+                [
+                    d.matcherFile(
+                        binStubName("foo-script"),
+                        contains("pub global run foo:script"))])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart
new file mode 100644
index 0000000..dccd1fa
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/binstub_runs_precompiled_snapshot_test.dart
@@ -0,0 +1,28 @@
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+main() {
+  initConfig();
+  integration("the binstubs runs a precompiled snapshot if present", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", pubspec: {
+        "executables": {
+          "foo-script": "script"
+        }
+      },
+          contents: [
+              d.dir("bin", [d.file("script.dart", "main(args) => print('ok');")])]);
+    });
+    schedulePub(args: ["global", "activate", "foo"]);
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                "bin",
+                [
+                    d.matcherFile(
+                        binStubName("foo-script"),
+                        contains("script.dart.snapshot"))])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/creates_executables_in_pubspec_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/creates_executables_in_pubspec_test.dart
new file mode 100644
index 0000000..9ca44011
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/creates_executables_in_pubspec_test.dart
@@ -0,0 +1,37 @@
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+main() {
+  initConfig();
+  integration("creates binstubs for each executable in the pubspec", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", pubspec: {
+        "executables": {
+          "one": null,
+          "two-renamed": "second"
+        }
+      },
+          contents: [
+              d.dir(
+                  "bin",
+                  [
+                      d.file("one.dart", "main(args) => print('one');"),
+                      d.file("second.dart", "main(args) => print('two');"),
+                      d.file("nope.dart", "main(args) => print('nope');")])]);
+    });
+    schedulePub(
+        args: ["global", "activate", "foo"],
+        output: contains("Installed executables one and two-renamed."));
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                "bin",
+                [
+                    d.matcherFile(binStubName("one"), contains("one")),
+                    d.matcherFile(binStubName("two-renamed"), contains("second")),
+                    d.nothing(binStubName("two")),
+                    d.nothing(binStubName("nope"))])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/does_not_warn_if_no_executables_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/does_not_warn_if_no_executables_test.dart
new file mode 100644
index 0000000..0141330
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/does_not_warn_if_no_executables_test.dart
@@ -0,0 +1,20 @@
+import 'dart:io';
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+main() {
+  initConfig();
+  integration("does not warn if the package has no executables", () {
+    servePackages((builder) {
+      builder.serve(
+          "foo",
+          "1.0.0",
+          contents: [
+              d.dir("bin", [d.file("script.dart", "main(args) => print('ok \$args');")])]);
+    });
+    schedulePub(
+        args: ["global", "activate", "foo"],
+        output: isNot(contains("is not on your path")));
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/does_not_warn_if_on_path_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/does_not_warn_if_on_path_test.dart
new file mode 100644
index 0000000..0faa7bd
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/does_not_warn_if_on_path_test.dart
@@ -0,0 +1,28 @@
+import 'dart:io';
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+main() {
+  initConfig();
+  integration("does not warn if the binstub directory is on the path", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", pubspec: {
+        "executables": {
+          "script": null
+        }
+      },
+          contents: [
+              d.dir("bin", [d.file("script.dart", "main(args) => print('ok \$args');")])]);
+    });
+    var binDir = p.dirname(Platform.executable);
+    var separator = Platform.operatingSystem == "windows" ? ";" : ":";
+    var path = "${Platform.environment["PATH"]}$separator$binDir";
+    schedulePub(
+        args: ["global", "activate", "foo"],
+        output: isNot(contains("is not on your path")),
+        environment: {
+      "PATH": path
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/explicit_and_no_executables_options_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/explicit_and_no_executables_options_test.dart
new file mode 100644
index 0000000..ad01ac6
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/explicit_and_no_executables_options_test.dart
@@ -0,0 +1,22 @@
+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';
+main() {
+  initConfig();
+  integration("errors if -x and --no-executables are both passed", () {
+    d.dir("foo", [d.libPubspec("foo", "1.0.0")]).create();
+    schedulePub(
+        args: [
+            "global",
+            "activate",
+            "--source",
+            "path",
+            "../foo",
+            "-x",
+            "anything",
+            "--no-executables"],
+        error: contains("Cannot pass both --no-executables and --executable."),
+        exitCode: exit_codes.USAGE);
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/explicit_executables_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/explicit_executables_test.dart
new file mode 100644
index 0000000..fa4ae74
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/explicit_executables_test.dart
@@ -0,0 +1,41 @@
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+main() {
+  initConfig();
+  integration("only creates binstubs for the listed executables", () {
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "executables": {
+          "one": "script",
+          "two": "script",
+          "three": "script"
+        }
+      }),
+          d.dir("bin", [d.file("script.dart", "main() => print('ok');")])]).create();
+    schedulePub(
+        args: [
+            "global",
+            "activate",
+            "--source",
+            "path",
+            "../foo",
+            "-x",
+            "one",
+            "--executable",
+            "three"],
+        output: contains("Installed executables one and three."));
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                "bin",
+                [
+                    d.matcherFile(binStubName("one"), contains("pub global run foo:script")),
+                    d.nothing(binStubName("two")),
+                    d.matcherFile(
+                        binStubName("three"),
+                        contains("pub global run foo:script"))])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/missing_script_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/missing_script_test.dart
new file mode 100644
index 0000000..7e1d199
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/missing_script_test.dart
@@ -0,0 +1,23 @@
+import 'package:path/path.dart' as p;
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+main() {
+  initConfig();
+  integration("errors if an executable's script can't be found", () {
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "executables": {
+          "missing": "not_here",
+          "nope": null
+        }
+      })]).create();
+    var pub = startPub(args: ["global", "activate", "-spath", "../foo"]);
+    pub.stderr.expect(
+        'Warning: Executable "missing" runs '
+            '"${p.join('bin', 'not_here.dart')}", which was not found in foo.');
+    pub.stderr.expect(
+        'Warning: Executable "nope" runs '
+            '"${p.join('bin', 'nope.dart')}", which was not found in foo.');
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/name_collision_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/name_collision_test.dart
new file mode 100644
index 0000000..01fe3f0
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/name_collision_test.dart
@@ -0,0 +1,46 @@
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+main() {
+  initConfig();
+  integration("does not overwrite an existing binstub", () {
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "executables": {
+          "foo": "foo",
+          "collide1": "foo",
+          "collide2": "foo"
+        }
+      }),
+          d.dir("bin", [d.file("foo.dart", "main() => print('ok');")])]).create();
+    d.dir("bar", [d.pubspec({
+        "name": "bar",
+        "executables": {
+          "bar": "bar",
+          "collide1": "bar",
+          "collide2": "bar"
+        }
+      }),
+          d.dir("bin", [d.file("bar.dart", "main() => print('ok');")])]).create();
+    schedulePub(args: ["global", "activate", "-spath", "../foo"]);
+    var pub = startPub(args: ["global", "activate", "-spath", "../bar"]);
+    pub.stdout.expect(consumeThrough("Installed executable bar."));
+    pub.stderr.expect("Executable collide1 was already installed from foo.");
+    pub.stderr.expect("Executable collide2 was already installed from foo.");
+    pub.stderr.expect(
+        "Deactivate the other package(s) or activate bar using " "--overwrite.");
+    pub.shouldExit();
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                "bin",
+                [
+                    d.matcherFile(binStubName("foo"), contains("foo:foo")),
+                    d.matcherFile(binStubName("bar"), contains("bar:bar")),
+                    d.matcherFile(binStubName("collide1"), contains("foo:foo")),
+                    d.matcherFile(binStubName("collide2"), contains("foo:foo"))])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/name_collision_with_overwrite_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/name_collision_with_overwrite_test.dart
new file mode 100644
index 0000000..dcae553
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/name_collision_with_overwrite_test.dart
@@ -0,0 +1,46 @@
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+main() {
+  initConfig();
+  integration("overwrites an existing binstub if --overwrite is passed", () {
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "executables": {
+          "foo": "foo",
+          "collide1": "foo",
+          "collide2": "foo"
+        }
+      }),
+          d.dir("bin", [d.file("foo.dart", "main() => print('ok');")])]).create();
+    d.dir("bar", [d.pubspec({
+        "name": "bar",
+        "executables": {
+          "bar": "bar",
+          "collide1": "bar",
+          "collide2": "bar"
+        }
+      }),
+          d.dir("bin", [d.file("bar.dart", "main() => print('ok');")])]).create();
+    schedulePub(args: ["global", "activate", "-spath", "../foo"]);
+    var pub =
+        startPub(args: ["global", "activate", "-spath", "../bar", "--overwrite"]);
+    pub.stdout.expect(
+        consumeThrough("Installed executables bar, collide1 and collide2."));
+    pub.stderr.expect("Replaced collide1 previously installed from foo.");
+    pub.stderr.expect("Replaced collide2 previously installed from foo.");
+    pub.shouldExit();
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                "bin",
+                [
+                    d.matcherFile(binStubName("foo"), contains("foo:foo")),
+                    d.matcherFile(binStubName("bar"), contains("bar:bar")),
+                    d.matcherFile(binStubName("collide1"), contains("bar:bar")),
+                    d.matcherFile(binStubName("collide2"), contains("bar:bar"))])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/no_executables_flag_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/no_executables_flag_test.dart
new file mode 100644
index 0000000..c66d627
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/no_executables_flag_test.dart
@@ -0,0 +1,22 @@
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+main() {
+  initConfig();
+  integration("does not create binstubs if --no-executables is passed", () {
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "executables": {
+          "one": null
+        }
+      }),
+          d.dir("bin", [d.file("one.dart", "main() => print('ok');")])]).create();
+    schedulePub(args: ["global", "activate", "--source", "path", "../foo"]);
+    schedulePub(
+        args: ["global", "activate", "--source", "path", "../foo", "--no-executables"]);
+    d.dir(
+        cachePath,
+        [d.dir("bin", [d.nothing(binStubName("one"))])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/path_package_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/path_package_test.dart
new file mode 100644
index 0000000..9e6e448
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/path_package_test.dart
@@ -0,0 +1,28 @@
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+main() {
+  initConfig();
+  integration("creates binstubs when activating a path package", () {
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "executables": {
+          "foo": null
+        }
+      }),
+          d.dir("bin", [d.file("foo.dart", "main() => print('ok');")])]).create();
+    schedulePub(
+        args: ["global", "activate", "--source", "path", "../foo"],
+        output: contains("Installed executable foo."));
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                "bin",
+                [
+                    d.matcherFile(
+                        binStubName("foo"),
+                        contains("pub global run foo:foo"))])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/reactivate_removes_old_executables_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/reactivate_removes_old_executables_test.dart
new file mode 100644
index 0000000..8159aea
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/reactivate_removes_old_executables_test.dart
@@ -0,0 +1,37 @@
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+main() {
+  initConfig();
+  integration("removes previous binstubs when reactivating a package", () {
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "executables": {
+          "one": null,
+          "two": null
+        }
+      }),
+          d.dir(
+              "bin",
+              [
+                  d.file("one.dart", "main() => print('ok');"),
+                  d.file("two.dart", "main() => print('ok');")])]).create();
+    schedulePub(args: ["global", "activate", "--source", "path", "../foo"]);
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "executables": {
+          "two": null
+        }
+      })]).create();
+    schedulePub(args: ["global", "activate", "--source", "path", "../foo"]);
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                "bin",
+                [
+                    d.nothing(binStubName("one")),
+                    d.matcherFile(binStubName("two"), contains("two"))])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/removes_even_if_not_in_pubspec_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/removes_even_if_not_in_pubspec_test.dart
new file mode 100644
index 0000000..5a2646b7
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/removes_even_if_not_in_pubspec_test.dart
@@ -0,0 +1,24 @@
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+main() {
+  initConfig();
+  integration("removes all binstubs for package", () {
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "executables": {
+          "foo": null
+        }
+      }),
+          d.dir("bin", [d.file("foo.dart", "main() => print('ok');")])]).create();
+    schedulePub(args: ["global", "activate", "--source", "path", "../foo"]);
+    d.dir("foo", [d.pubspec({
+        "name": "foo"
+      })]).create();
+    schedulePub(args: ["global", "deactivate", "foo"]);
+    d.dir(
+        cachePath,
+        [d.dir("bin", [d.nothing(binStubName("foo"))])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/removes_when_deactivated_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/removes_when_deactivated_test.dart
new file mode 100644
index 0000000..397c4da
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/removes_when_deactivated_test.dart
@@ -0,0 +1,31 @@
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+main() {
+  initConfig();
+  integration("removes binstubs when the package is deactivated", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", pubspec: {
+        "executables": {
+          "one": null,
+          "two": null
+        }
+      },
+          contents: [
+              d.dir(
+                  "bin",
+                  [
+                      d.file("one.dart", "main(args) => print('one');"),
+                      d.file("two.dart", "main(args) => print('two');")])]);
+    });
+    schedulePub(args: ["global", "activate", "foo"]);
+    schedulePub(args: ["global", "deactivate", "foo"]);
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                "bin",
+                [d.nothing(binStubName("one")), d.nothing(binStubName("two"))])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/unknown_explicit_executable_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/unknown_explicit_executable_test.dart
new file mode 100644
index 0000000..8df940a
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/unknown_explicit_executable_test.dart
@@ -0,0 +1,32 @@
+import 'package:scheduled_test/scheduled_stream.dart';
+import '../../../lib/src/exit_codes.dart' as exit_codes;
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+main() {
+  initConfig();
+  integration("errors on an unknown explicit executable", () {
+    d.dir("foo", [d.pubspec({
+        "name": "foo",
+        "executables": {
+          "one": "one"
+        }
+      }),
+          d.dir("bin", [d.file("one.dart", "main() => print('ok');")])]).create();
+    var pub = startPub(
+        args: [
+            "global",
+            "activate",
+            "--source",
+            "path",
+            "../foo",
+            "-x",
+            "who",
+            "-x",
+            "one",
+            "--executable",
+            "wat"]);
+    pub.stdout.expect(consumeThrough("Installed executable one."));
+    pub.stderr.expect("Unknown executables wat and who.");
+    pub.shouldExit(exit_codes.DATA);
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/utils.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/utils.dart
new file mode 100644
index 0000000..0a0d0cc
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/utils.dart
@@ -0,0 +1,5 @@
+import 'dart:io';
+binStubName(String name) {
+  if (Platform.operatingSystem == "windows") return "$name.bat";
+  return name;
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/warns_if_not_on_path_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/warns_if_not_on_path_test.dart
new file mode 100644
index 0000000..31b4660
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/warns_if_not_on_path_test.dart
@@ -0,0 +1,20 @@
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+main() {
+  initConfig();
+  integration("warns if the binstub directory is not on the path", () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", pubspec: {
+        "executables": {
+          "some-dart-script": "script"
+        }
+      },
+          contents: [
+              d.dir("bin", [d.file("script.dart", "main(args) => print('ok \$args');")])]);
+    });
+    schedulePub(
+        args: ["global", "activate", "foo"],
+        error: contains("is not on your path"));
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/run/errors_if_outside_bin_test.dart b/sdk/lib/_internal/pub_generated/test/global/run/errors_if_outside_bin_test.dart
index 1916935..c249400 100644
--- a/sdk/lib/_internal/pub_generated/test/global/run/errors_if_outside_bin_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/run/errors_if_outside_bin_test.dart
@@ -18,6 +18,8 @@
 
 Usage: pub global run <package>:<executable> [args...]
 -h, --help    Print usage information for this command.
+    --mode    Mode to run transformers in.
+              (defaults to "release")
 
 Run "pub help" to see global options.
 """, exitCode: exit_codes.USAGE);
diff --git a/sdk/lib/_internal/pub_generated/test/global/run/missing_executable_arg_test.dart b/sdk/lib/_internal/pub_generated/test/global/run/missing_executable_arg_test.dart
index d0d42de..0dad947 100644
--- a/sdk/lib/_internal/pub_generated/test/global/run/missing_executable_arg_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/run/missing_executable_arg_test.dart
@@ -8,6 +8,8 @@
 
             Usage: pub global run <package>:<executable> [args...]
             -h, --help    Print usage information for this command.
+                --mode    Mode to run transformers in.
+                          (defaults to "release")
 
             Run "pub help" to see global options.
             """, exitCode: exit_codes.USAGE);
diff --git a/sdk/lib/_internal/pub_generated/test/global/run/mode_test.dart b/sdk/lib/_internal/pub_generated/test/global/run/mode_test.dart
new file mode 100644
index 0000000..61194be
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/run/mode_test.dart
@@ -0,0 +1,50 @@
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class DartTransformer extends Transformer {
+  final BarbackSettings _settings;
+
+  DartTransformer.asPlugin(this._settings);
+
+  String get allowedExtensions => '.in';
+
+  void apply(Transform transform) {
+    transform.addOutput(new Asset.fromString(
+        new AssetId(transform.primaryInput.id.package, "bin/script.dart"),
+        "void main() => print('\${_settings.mode.name}');"));
+  }
+}
+""";
+main() {
+  initConfig();
+  integration(
+      'runs a script in an activated package with customizable modes',
+      () {
+    servePackages((builder) {
+      builder.serveRepoPackage("barback");
+      builder.serve("foo", "1.0.0", deps: {
+        "barback": "any"
+      }, pubspec: {
+        "transformers": ["foo/src/transformer"]
+      },
+          contents: [
+              d.dir(
+                  "lib",
+                  [
+                      d.dir(
+                          "src",
+                          [d.file("transformer.dart", TRANSFORMER), d.file("primary.in", "")])])]);
+    });
+    schedulePub(args: ["global", "activate", "foo"]);
+    var pub = pubRun(global: true, args: ["foo:script"]);
+    pub.stdout.expect("release");
+    pub.shouldExit();
+    pub = pubRun(global: true, args: ["--mode", "custom-mode", "foo:script"]);
+    pub.stdout.expect("custom-mode");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/package_list_files_test.dart b/sdk/lib/_internal/pub_generated/test/package_list_files_test.dart
index 466ee82..7a2c861 100644
--- a/sdk/lib/_internal/pub_generated/test/package_list_files_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/package_list_files_test.dart
@@ -6,8 +6,8 @@
 import '../lib/src/system_cache.dart';
 import 'descriptor.dart' as d;
 import 'test_pub.dart';
-var root;
-var entrypoint;
+String root;
+Entrypoint entrypoint;
 main() {
   initConfig();
   group('not in a git repo', () {
@@ -69,7 +69,7 @@
                     path.join(root, 'subdir', 'subfile2.txt')]));
       });
     });
-    integration("ignores files that are gitignored", () {
+    integration("ignores files that are gitignored if desired", () {
       d.dir(
           appPath,
           [
@@ -83,7 +83,7 @@
                       d.file('subfile2.text', 'subcontents')])]).create();
       schedule(() {
         expect(
-            entrypoint.root.listFiles(),
+            entrypoint.root.listFiles(useGitIgnore: true),
             unorderedEquals(
                 [
                     path.join(root, 'pubspec.yaml'),
@@ -91,6 +91,17 @@
                     path.join(root, 'file2.text'),
                     path.join(root, 'subdir', 'subfile2.text')]));
       });
+      schedule(() {
+        expect(
+            entrypoint.root.listFiles(),
+            unorderedEquals(
+                [
+                    path.join(root, 'pubspec.yaml'),
+                    path.join(root, 'file1.txt'),
+                    path.join(root, 'file2.text'),
+                    path.join(root, 'subdir', 'subfile1.txt'),
+                    path.join(root, 'subdir', 'subfile2.text')]));
+      });
     });
     commonTests();
   });
diff --git a/sdk/lib/_internal/pub_generated/test/pubspec_test.dart b/sdk/lib/_internal/pub_generated/test/pubspec_test.dart
index 1f308d0..1070220 100644
--- a/sdk/lib/_internal/pub_generated/test/pubspec_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/pubspec_test.dart
@@ -386,5 +386,55 @@
             (pubspec) => pubspec.publishTo);
       });
     });
+    group("executables", () {
+      test("defaults to an empty map if omitted", () {
+        var pubspec = new Pubspec.parse('', sources);
+        expect(pubspec.executables, isEmpty);
+      });
+      test("allows simple names for keys and most characters in values", () {
+        var pubspec = new Pubspec.parse('''
+executables:
+  abcDEF-123_: "abc DEF-123._"
+''', sources);
+        expect(pubspec.executables['abcDEF-123_'], equals('abc DEF-123._'));
+      });
+      test("throws if not a map", () {
+        expectPubspecException(
+            'executables: not map',
+            (pubspec) => pubspec.executables);
+      });
+      test("throws if key is not a string", () {
+        expectPubspecException(
+            'executables: {123: value}',
+            (pubspec) => pubspec.executables);
+      });
+      test("throws if a key isn't a simple name", () {
+        expectPubspecException(
+            'executables: {funny/name: ok}',
+            (pubspec) => pubspec.executables);
+      });
+      test("throws if a value is not a string", () {
+        expectPubspecException(
+            'executables: {command: 123}',
+            (pubspec) => pubspec.executables);
+      });
+      test("throws if a value contains a path separator", () {
+        expectPubspecException(
+            'executables: {command: funny_name/part}',
+            (pubspec) => pubspec.executables);
+      });
+      test("throws if a value contains a windows path separator", () {
+        expectPubspecException(
+            r'executables: {command: funny_name\part}',
+            (pubspec) => pubspec.executables);
+      });
+      test("uses the key if the value is null", () {
+        var pubspec = new Pubspec.parse('''
+executables:
+  command:
+''', sources);
+        expect(pubspec.executables['command'], equals('command'));
+      });
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub_generated/test/run/allows_dart_extension_test.dart b/sdk/lib/_internal/pub_generated/test/run/allows_dart_extension_test.dart
new file mode 100644
index 0000000..2eaee23
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/run/allows_dart_extension_test.dart
@@ -0,0 +1,23 @@
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+const SCRIPT = """
+import 'dart:io';
+
+main() {
+  stdout.writeln("stdout output");
+  stderr.writeln("stderr output");
+  exitCode = 123;
+}
+""";
+main() {
+  initConfig();
+  integration('allows a ".dart" extension on the argument', () {
+    d.dir(
+        appPath,
+        [d.appPubspec(), d.dir("bin", [d.file("script.dart", SCRIPT)])]).create();
+    var pub = pubRun(args: ["script.dart"]);
+    pub.stdout.expect("stdout output");
+    pub.stderr.expect("stderr output");
+    pub.shouldExit(123);
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/run/doesnt_load_an_unnecessary_transformer_test.dart b/sdk/lib/_internal/pub_generated/test/run/doesnt_load_an_unnecessary_transformer_test.dart
new file mode 100644
index 0000000..abcb9b2
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/run/doesnt_load_an_unnecessary_transformer_test.dart
@@ -0,0 +1,43 @@
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class BrokenTransformer extends Transformer {
+  RewriteTransformer.asPlugin() {
+    throw 'This transformer is broken!';
+  }
+
+  String get allowedExtensions => '.txt';
+
+  void apply(Transform transform) {}
+}
+""";
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("doesn't load an unnecessary transformer", () {
+      d.dir(appPath, [d.pubspec({
+          "name": "myapp",
+          "transformers": [{
+              "myapp/src/transformer": {
+                r"$include": "lib/myapp.dart"
+              }
+            }]
+        }),
+            d.dir(
+                "lib",
+                [
+                    d.file("myapp.dart", ""),
+                    d.dir("src", [d.file("transformer.dart", TRANSFORMER)])]),
+            d.dir("bin", [d.file("hi.dart", "void main() => print('Hello!');")])]).create();
+      createLockFile('myapp', pkg: ['barback']);
+      var pub = pubRun(args: ["hi"]);
+      pub.stdout.expect("Hello!");
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/run/errors_if_no_executable_is_given_test.dart b/sdk/lib/_internal/pub_generated/test/run/errors_if_no_executable_is_given_test.dart
index 9b12e3f..9e2e0aa 100644
--- a/sdk/lib/_internal/pub_generated/test/run/errors_if_no_executable_is_given_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/run/errors_if_no_executable_is_given_test.dart
@@ -10,6 +10,8 @@
 
 Usage: pub run <executable> [args...]
 -h, --help    Print usage information for this command.
+    --mode    Mode to run transformers in.
+              (defaults to "release" for dependencies, "debug" for entrypoint)
 
 Run "pub help" to see global options.
 """, exitCode: exit_codes.USAGE);
diff --git a/sdk/lib/_internal/pub_generated/test/run/errors_if_path_in_dependency_test.dart b/sdk/lib/_internal/pub_generated/test/run/errors_if_path_in_dependency_test.dart
index 1558cdc..5a74b82 100644
--- a/sdk/lib/_internal/pub_generated/test/run/errors_if_path_in_dependency_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/run/errors_if_path_in_dependency_test.dart
@@ -17,6 +17,8 @@
 
 Usage: pub run <executable> [args...]
 -h, --help    Print usage information for this command.
+    --mode    Mode to run transformers in.
+              (defaults to "release" for dependencies, "debug" for entrypoint)
 
 Run "pub help" to see global options.
 """, exitCode: exit_codes.USAGE);
diff --git a/sdk/lib/_internal/pub_generated/test/run/mode_test.dart b/sdk/lib/_internal/pub_generated/test/run/mode_test.dart
new file mode 100644
index 0000000..721a9dd
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/run/mode_test.dart
@@ -0,0 +1,74 @@
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class DartTransformer extends Transformer {
+  final BarbackSettings _settings;
+
+  DartTransformer.asPlugin(this._settings);
+
+  String get allowedExtensions => '.in';
+
+  void apply(Transform transform) {
+    transform.addOutput(new Asset.fromString(
+        new AssetId(transform.primaryInput.id.package, "bin/script.dart"),
+        "void main() => print('\${_settings.mode.name}');"));
+  }
+}
+""";
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration('runs a local script with customizable modes', () {
+      d.dir(appPath, [d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+            d.dir(
+                "lib",
+                [
+                    d.dir(
+                        "src",
+                        [
+                            d.file("transformer.dart", TRANSFORMER),
+                            d.file("primary.in", "")])])]).create();
+      createLockFile('myapp', pkg: ['barback']);
+      var pub = pubRun(args: ["script"]);
+      pub.stdout.expect("debug");
+      pub.shouldExit();
+      pub = pubRun(args: ["--mode", "custom-mode", "script"]);
+      pub.stdout.expect("custom-mode");
+      pub.shouldExit();
+    });
+    integration('runs a dependency script with customizable modes', () {
+      d.dir("foo", [d.pubspec({
+          "name": "foo",
+          "version": "1.2.3",
+          "transformers": ["foo/src/transformer"]
+        }),
+            d.dir(
+                "lib",
+                [
+                    d.dir(
+                        "src",
+                        [
+                            d.file("transformer.dart", TRANSFORMER),
+                            d.file("primary.in", "")])])]).create();
+      d.appDir({
+        "foo": {
+          "path": "../foo"
+        }
+      }).create();
+      createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
+      var pub = pubRun(args: ["foo:script"]);
+      pub.stdout.expect("release");
+      pub.shouldExit();
+      pub = pubRun(args: ["--mode", "custom-mode", "foo:script"]);
+      pub.stdout.expect("custom-mode");
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/serve/does_not_serve_gitignored_assets_in_a_path_dependency_test.dart b/sdk/lib/_internal/pub_generated/test/serve/does_not_serve_gitignored_assets_in_a_path_dependency_test.dart
deleted file mode 100644
index ce55ae3..0000000
--- a/sdk/lib/_internal/pub_generated/test/serve/does_not_serve_gitignored_assets_in_a_path_dependency_test.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-library pub_tests;
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-import 'utils.dart';
-main() {
-  initConfig();
-  integration("doesn't serve .gitignored assets in a path dependency", () {
-    ensureGit();
-    d.dir(appPath, [d.appPubspec({
-        "foo": {
-          "path": "../foo"
-        }
-      })]).create();
-    d.git(
-        "foo",
-        [
-            d.libPubspec("foo", "1.0.0"),
-            d.dir(
-                "lib",
-                [
-                    d.file("outer.txt", "outer contents"),
-                    d.file("visible.txt", "visible"),
-                    d.dir("dir", [d.file("inner.txt", "inner contents")])]),
-            d.file(".gitignore", "/lib/outer.txt\n/lib/dir")]).create();
-    pubServe(shouldGetFirst: true);
-    requestShould404("packages/foo/outer.txt");
-    requestShould404("packages/foo/dir/inner.txt");
-    requestShouldSucceed("packages/foo/visible.txt", "visible");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub_generated/test/serve/does_not_serve_gitignored_assets_test.dart b/sdk/lib/_internal/pub_generated/test/serve/does_not_serve_gitignored_assets_test.dart
deleted file mode 100644
index a49736a..0000000
--- a/sdk/lib/_internal/pub_generated/test/serve/does_not_serve_gitignored_assets_test.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-library pub_tests;
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-import 'utils.dart';
-main() {
-  initConfig();
-  integration("doesn't serve .gitignored assets", () {
-    ensureGit();
-    d.git(
-        appPath,
-        [
-            d.appPubspec(),
-            d.dir(
-                "web",
-                [
-                    d.file("outer.txt", "outer contents"),
-                    d.dir("dir", [d.file("inner.txt", "inner contents")])]),
-            d.file(".gitignore", "/web/outer.txt\n/web/dir")]).create();
-    pubServe();
-    requestShould404("outer.txt");
-    requestShould404("dir/inner.txt");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub_generated/test/serve/serves_hidden_assets_that_arent_gitignored_test.dart b/sdk/lib/_internal/pub_generated/test/serve/serves_hidden_assets_that_arent_gitignored_test.dart
deleted file mode 100644
index 4c59aa9..0000000
--- a/sdk/lib/_internal/pub_generated/test/serve/serves_hidden_assets_that_arent_gitignored_test.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-library pub_tests;
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-import 'utils.dart';
-main() {
-  initConfig();
-  integration("serves hidden assets that aren't .gitignored", () {
-    ensureGit();
-    d.git(
-        appPath,
-        [
-            d.appPubspec(),
-            d.dir(
-                "web",
-                [
-                    d.file(".outer.txt", "outer contents"),
-                    d.dir(".dir", [d.file("inner.txt", "inner contents")])])]).create();
-    pubServe();
-    requestShouldSucceed(".outer.txt", "outer contents");
-    requestShouldSucceed(".dir/inner.txt", "inner contents");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub_generated/test/serve/utils.dart b/sdk/lib/_internal/pub_generated/test/serve/utils.dart
index c1c2c2a..3460ac9 100644
--- a/sdk/lib/_internal/pub_generated/test/serve/utils.dart
+++ b/sdk/lib/_internal/pub_generated/test/serve/utils.dart
@@ -262,9 +262,8 @@
   };
   if (params != null) message["params"] = params;
   _webSocket.add(JSON.encode(message));
-  return Chain.track(
-      _webSocketBroadcastStream.firstWhere(
-          (response) => response["id"] == id)).then((value) {
+  return _webSocketBroadcastStream.firstWhere(
+      (response) => response["id"] == id).then((value) {
     currentSchedule.addDebugInfo(
         "Web Socket request $method with params $params\n" "Result: $value");
     expect(value["id"], equals(id));
diff --git a/sdk/lib/_internal/pub_generated/test/test_pub.dart b/sdk/lib/_internal/pub_generated/test/test_pub.dart
index de08e22..fa699e4 100644
--- a/sdk/lib/_internal/pub_generated/test/test_pub.dart
+++ b/sdk/lib/_internal/pub_generated/test/test_pub.dart
@@ -241,10 +241,10 @@
       () => createSymlink(p.join(sandboxDir, target), p.join(sandboxDir, symlink)),
       'symlinking $target to $symlink');
 }
-void schedulePub({List args, output, error, outputJson,
-    Future<Uri> tokenEndpoint, int exitCode: exit_codes.SUCCESS}) {
+void schedulePub({List args, output, error, outputJson, int exitCode:
+    exit_codes.SUCCESS, Map<String, String> environment}) {
   assert(output == null || outputJson == null);
-  var pub = startPub(args: args, tokenEndpoint: tokenEndpoint);
+  var pub = startPub(args: args, environment: environment);
   pub.shouldExit(exitCode);
   var failures = [];
   var stderr;
@@ -280,11 +280,22 @@
               "Looks great! Are you ready to upload your package (y/n)?"));
   pub.writeLine("y");
 }
-ScheduledProcess startPub({List args, Future<Uri> tokenEndpoint}) {
-  String pathInSandbox(String relPath) {
-    return p.join(p.absolute(sandboxDir), relPath);
+String _pathInSandbox(String relPath) {
+  return p.join(p.absolute(sandboxDir), relPath);
+}
+Map getPubTestEnvironment([String tokenEndpoint]) {
+  var environment = {};
+  environment['_PUB_TESTING'] = 'true';
+  environment['PUB_CACHE'] = _pathInSandbox(cachePath);
+  environment['_PUB_TEST_SDK_VERSION'] = "0.1.2+3";
+  if (tokenEndpoint != null) {
+    environment['_PUB_TEST_TOKEN_ENDPOINT'] = tokenEndpoint.toString();
   }
-  ensureDir(pathInSandbox(appPath));
+  return environment;
+}
+ScheduledProcess startPub({List args, Future<String> tokenEndpoint, Map<String,
+    String> environment}) {
+  ensureDir(_pathInSandbox(appPath));
   var dartBin = Platform.executable;
   if (dartBin.contains(Platform.pathSeparator)) {
     dartBin = p.absolute(dartBin);
@@ -294,26 +305,23 @@
   dartArgs.addAll(args);
   if (tokenEndpoint == null) tokenEndpoint = new Future.value();
   var environmentFuture = tokenEndpoint.then((tokenEndpoint) {
-    var environment = {};
-    environment['_PUB_TESTING'] = 'true';
-    environment['PUB_CACHE'] = pathInSandbox(cachePath);
-    environment['_PUB_TEST_SDK_VERSION'] = "0.1.2+3";
-    if (tokenEndpoint != null) {
-      environment['_PUB_TEST_TOKEN_ENDPOINT'] = tokenEndpoint.toString();
-    }
+    var pubEnvironment = getPubTestEnvironment(tokenEndpoint);
     if (_hasServer) {
       return port.then((p) {
-        environment['PUB_HOSTED_URL'] = "http://localhost:$p";
-        return environment;
+        pubEnvironment['PUB_HOSTED_URL'] = "http://localhost:$p";
+        return pubEnvironment;
       });
     }
-    return environment;
+    return pubEnvironment;
+  }).then((pubEnvironment) {
+    if (environment != null) pubEnvironment.addAll(environment);
+    return pubEnvironment;
   });
   return new PubProcess.start(
       dartBin,
       dartArgs,
       environment: environmentFuture,
-      workingDirectory: pathInSandbox(appPath),
+      workingDirectory: _pathInSandbox(appPath),
       description: args.isEmpty ? 'pub' : 'pub ${args.first}');
 }
 class PubProcess extends ScheduledProcess {
@@ -579,7 +587,7 @@
     schedulePackageValidation(ValidatorCreator fn) {
   return schedule(() {
     var cache = new SystemCache.withSources(p.join(sandboxDir, cachePath));
-    return syncFuture(() {
+    return new Future.sync(() {
       var validator = fn(new Entrypoint(p.join(sandboxDir, appPath), cache));
       return validator.validate().then((_) {
         return new Pair(validator.errors, validator.warnings);
diff --git a/sdk/lib/_internal/pub_generated/test/transformer/cache_test.dart b/sdk/lib/_internal/pub_generated/test/transformer/cache_test.dart
new file mode 100644
index 0000000..80a5278
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/transformer/cache_test.dart
@@ -0,0 +1,239 @@
+library pub_tests;
+import 'package:scheduled_test/scheduled_test.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+const REPLACE_FROM_LIBRARY_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:bar/bar.dart';
+
+class ReplaceTransformer extends Transformer {
+  ReplaceTransformer.asPlugin();
+
+  String get allowedExtensions => '.dart';
+
+  Future apply(Transform transform) {
+    return transform.primaryInput.readAsString().then((contents) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id,
+          contents.replaceAll("Hello", replacement)));
+    });
+  }
+}
+""";
+void setUp() {
+  servePackages((builder) {
+    builder.serveRepoPackage('barback');
+    builder.serve("foo", "1.2.3", deps: {
+      'barback': 'any'
+    },
+        contents: [
+            d.dir(
+                "lib",
+                [d.file("transformer.dart", replaceTransformer("Hello", "Goodbye"))])]);
+    builder.serve("bar", "1.2.3", deps: {
+      'barback': 'any'
+    },
+        contents: [
+            d.dir(
+                "lib",
+                [d.file("transformer.dart", replaceTransformer("Goodbye", "See ya"))])]);
+  });
+  d.dir(appPath, [d.pubspec({
+      "name": "myapp",
+      "dependencies": {
+        "foo": "1.2.3",
+        "bar": "1.2.3"
+      },
+      "transformers": ["foo"]
+    }),
+        d.dir("bin", [d.file("myapp.dart", "main() => print('Hello!');")])]).create();
+  pubGet();
+}
+main() {
+  initConfig();
+  integration("caches a transformer snapshot", () {
+    setUp();
+    var process = pubRun(args: ['myapp']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/transformers",
+                [
+                    d.file("manifest.txt", "0.1.2+3\nfoo"),
+                    d.matcherFile("transformers.snapshot", isNot(isEmpty))])]).validate();
+    process = pubRun(args: ['myapp']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+  });
+  integration("recaches if the SDK version is out-of-date", () {
+    setUp();
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/transformers",
+                [
+                    d.file("manifest.txt", "0.0.1\nfoo"),
+                    d.file("transformers.snapshot", "junk")])]).create();
+    var process = pubRun(args: ['myapp']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/transformers",
+                [
+                    d.file("manifest.txt", "0.1.2+3\nfoo"),
+                    d.matcherFile("transformers.snapshot", isNot(isEmpty))])]).validate();
+  });
+  integration("recaches if the transformers change", () {
+    setUp();
+    var process = pubRun(args: ['myapp']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/transformers",
+                [
+                    d.file("manifest.txt", "0.1.2+3\nfoo"),
+                    d.matcherFile("transformers.snapshot", isNot(isEmpty))])]).validate();
+    d.dir(appPath, [d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": "1.2.3",
+          "bar": "1.2.3"
+        },
+        "transformers": ["foo", "bar"]
+      }),
+          d.dir("bin", [d.file("myapp.dart", "main() => print('Hello!');")])]).create();
+    process = pubRun(args: ['myapp']);
+    process.stdout.expect("See ya!");
+    process.shouldExit();
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/transformers",
+                [
+                    d.file("manifest.txt", "0.1.2+3\nbar,foo"),
+                    d.matcherFile("transformers.snapshot", isNot(isEmpty))])]).validate();
+  });
+  integration("recaches if the transformer version changes", () {
+    setUp();
+    var process = pubRun(args: ['myapp']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/transformers",
+                [
+                    d.file("manifest.txt", "0.1.2+3\nfoo"),
+                    d.matcherFile("transformers.snapshot", isNot(isEmpty))])]).validate();
+    servePackages((builder) {
+      builder.serve("foo", "2.0.0", deps: {
+        'barback': 'any'
+      },
+          contents: [
+              d.dir(
+                  "lib",
+                  [d.file("transformer.dart", replaceTransformer("Hello", "New"))])]);
+    });
+    d.dir(appPath, [d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": "any"
+        },
+        "transformers": ["foo"]
+      })]).create();
+    pubUpgrade();
+    process = pubRun(args: ['myapp']);
+    process.stdout.expect("New!");
+    process.shouldExit();
+    d.dir(
+        appPath,
+        [
+            d.dir(
+                ".pub/transformers",
+                [
+                    d.file("manifest.txt", "0.1.2+3\nfoo"),
+                    d.matcherFile("transformers.snapshot", isNot(isEmpty))])]).validate();
+  });
+  integration("recaches if a transitive dependency version changes", () {
+    servePackages((builder) {
+      builder.serveRepoPackage('barback');
+      builder.serve("foo", "1.2.3", deps: {
+        'barback': 'any',
+        'bar': 'any'
+      },
+          contents: [
+              d.dir("lib", [d.file("transformer.dart", REPLACE_FROM_LIBRARY_TRANSFORMER)])]);
+      builder.serve(
+          "bar",
+          "1.2.3",
+          contents: [
+              d.dir("lib", [d.file("bar.dart", "final replacement = 'Goodbye';")])]);
+    });
+    d.dir(appPath, [d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": "1.2.3"
+        },
+        "transformers": ["foo"]
+      }),
+          d.dir("bin", [d.file("myapp.dart", "main() => print('Hello!');")])]).create();
+    pubGet();
+    var process = pubRun(args: ['myapp']);
+    process.stdout.expect("Goodbye!");
+    process.shouldExit();
+    servePackages((builder) {
+      builder.serve(
+          "bar",
+          "2.0.0",
+          contents: [
+              d.dir("lib", [d.file("bar.dart", "final replacement = 'See ya';")])]);
+    });
+    d.dir(appPath, [d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": "any"
+        },
+        "transformers": ["foo"]
+      })]).create();
+    pubUpgrade();
+    process = pubRun(args: ['myapp']);
+    process.stdout.expect("See ya!");
+    process.shouldExit();
+  });
+}
+String replaceTransformer(String input, String output) {
+  return """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class ReplaceTransformer extends Transformer {
+  ReplaceTransformer.asPlugin();
+
+  String get allowedExtensions => '.dart';
+
+  Future apply(Transform transform) {
+    return transform.primaryInput.readAsString().then((contents) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id,
+          contents.replaceAll("$input", "$output")));
+    });
+  }
+}
+""";
+}
diff --git a/sdk/lib/_internal/pub_generated/test/validator/executable_test.dart b/sdk/lib/_internal/pub_generated/test/validator/executable_test.dart
new file mode 100644
index 0000000..a8be285
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/validator/executable_test.dart
@@ -0,0 +1,44 @@
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../lib/src/entrypoint.dart';
+import '../../lib/src/validator.dart';
+import '../../lib/src/validator/executable.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+Validator executable(Entrypoint entrypoint) =>
+    new ExecutableValidator(entrypoint);
+main() {
+  initConfig();
+  setUp(d.validPackage.create);
+  group('should consider a package valid if it', () {
+    integration('has executables that are present', () {
+      d.dir(appPath, [d.pubspec({
+          "name": "test_pkg",
+          "version": "1.0.0",
+          "executables": {
+            "one": "one_script",
+            "two": null
+          }
+        }),
+            d.dir(
+                "bin",
+                [
+                    d.file("one_script.dart", "main() => print('ok');"),
+                    d.file("two.dart", "main() => print('ok');")])]).create();
+      expectNoValidationError(executable);
+    });
+  });
+  group("should consider a package invalid if it", () {
+    integration('is missing one or more listed executables', () {
+      d.dir(appPath, [d.pubspec({
+          "name": "test_pkg",
+          "version": "1.0.0",
+          "executables": {
+            "nope": "not_there",
+            "nada": null
+          }
+        })]).create();
+      expectValidationWarning(executable);
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/version_solver_test.dart b/sdk/lib/_internal/pub_generated/test/version_solver_test.dart
index 93ff88e2..77a9f00 100644
--- a/sdk/lib/_internal/pub_generated/test/version_solver_test.dart
+++ b/sdk/lib/_internal/pub_generated/test/version_solver_test.dart
@@ -1356,7 +1356,7 @@
     return new Future.value('${id.name}-${id.version}');
   }
   Future<List<Version>> getVersions(String name, String description) {
-    return syncFuture(() {
+    return new Future.sync(() {
       if (_requestedVersions.contains(description)) {
         throw new Exception(
             'Version list for $description was already ' 'requested.');
@@ -1370,7 +1370,7 @@
     });
   }
   Future<Pubspec> describeUncached(PackageId id) {
-    return syncFuture(() {
+    return new Future.sync(() {
       if (_requestedPubspecs.containsKey(id.description) &&
           _requestedPubspecs[id.description].contains(id.version)) {
         throw new Exception('Pubspec for $id was already requested.');
diff --git a/sdk/lib/async/async_error.dart b/sdk/lib/async/async_error.dart
index cac1e4d..9a64085 100644
--- a/sdk/lib/async/async_error.dart
+++ b/sdk/lib/async/async_error.dart
@@ -21,14 +21,7 @@
   }
 }
 
-class _AsyncError implements Error {
-  final error;
-  final StackTrace stackTrace;
-
-  _AsyncError(this.error, this.stackTrace);
-}
-
-class _UncaughtAsyncError extends _AsyncError {
+class _UncaughtAsyncError extends AsyncError {
   _UncaughtAsyncError(error, StackTrace stackTrace)
       : super(error, _getBestStackTrace(error, stackTrace));
 
diff --git a/sdk/lib/async/broadcast_stream_controller.dart b/sdk/lib/async/broadcast_stream_controller.dart
index a9879e0..cda7c0f 100644
--- a/sdk/lib/async/broadcast_stream_controller.dart
+++ b/sdk/lib/async/broadcast_stream_controller.dart
@@ -239,6 +239,11 @@
 
   void addError(Object error, [StackTrace stackTrace]) {
     if (!_mayAddEvent) throw _addEventError();
+    AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+    if (replacement != null) {
+      error = replacement.error;
+      stackTrace = replacement.stackTrace;
+    }
     _sendError(error, stackTrace);
   }
 
@@ -269,7 +274,6 @@
   }
 
   void _addError(Object error, StackTrace stackTrace) {
-    assert(_isAddingStream);
     _sendError(error, stackTrace);
   }
 
@@ -459,7 +463,8 @@
       _addPendingEvent(new _DelayedError(error, stackTrace));
       return;
     }
-    super.addError(error, stackTrace);
+    if (!_mayAddEvent) throw _addEventError();
+    _sendError(error, stackTrace);
     while (_hasPending) {
       _pending.handleNext(this);
     }
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 1f85d93..a4971be 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -117,7 +117,7 @@
       try {
         result._complete(computation());
       } catch (e, s) {
-        result._completeError(e, s);
+        _completeWithErrorCallback(result, e, s);
       }
     });
     return result;
@@ -143,7 +143,7 @@
       try {
         result._complete(computation());
       } catch (e, s) {
-        result._completeError(e, s);
+        _completeWithErrorCallback(result, e, s);
       }
     });
     return result;
@@ -190,6 +190,13 @@
    * Use [Completer] to create a Future and complete it later.
    */
   factory Future.error(Object error, [StackTrace stackTrace]) {
+    if (!identical(Zone.current, _ROOT_ZONE)) {
+      AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+      if (replacement != null) {
+        error = replacement.error;
+        stackTrace = replacement.stackTrace;
+      }
+    }
     return new _Future<T>.immediateError(error, stackTrace);
   }
 
@@ -212,12 +219,14 @@
    * later time that isn't necessarily after a known fixed duration.
    */
   factory Future.delayed(Duration duration, [T computation()]) {
-    Completer completer = new Completer.sync();
-    Future result = completer.future;
-    if (computation != null) {
-      result = result.then((ignored) => computation());
-    }
-    new Timer(duration, completer.complete);
+    _Future result = new _Future<T>();
+    new Timer(duration, () {
+      try {
+        result._complete(computation == null ? null : computation());
+      } catch (e, s) {
+        _completeWithErrorCallback(result, e, s);
+      }
+    });
     return result;
   }
 
@@ -235,7 +244,7 @@
    * error to occur, the remaining errors are silently dropped).
    */
   static Future<List> wait(Iterable<Future> futures, {bool eagerError: false}) {
-    Completer completer;  // Completer for the returned future.
+    final _Future<List> result = new _Future<List>();
     List values;  // Collects the values. Set to null on error.
     int remaining = 0;  // How many futures are we waiting for.
     var error;   // The first error from a future.
@@ -243,18 +252,18 @@
 
     // Handle an error from any of the futures.
     handleError(theError, theStackTrace) {
-      bool isFirstError = values != null;
+      final bool isFirstError = (values != null);
       values = null;
       remaining--;
       if (isFirstError) {
         if (remaining == 0 || eagerError) {
-          completer.completeError(theError, theStackTrace);
+          result._completeError(theError, theStackTrace);
         } else {
           error = theError;
           stackTrace = theStackTrace;
         }
       } else if (remaining == 0 && !eagerError) {
-        completer.completeError(error, stackTrace);
+        result._completeError(error, stackTrace);
       }
     }
 
@@ -267,10 +276,10 @@
         if (values != null) {
           values[pos] = value;
           if (remaining == 0) {
-            completer.complete(values);
+            result._completeWithValue(values);
           }
         } else if (remaining == 0 && !eagerError) {
-          completer.completeError(error, stackTrace);
+          result._completeError(error, stackTrace);
         }
       }, onError: handleError);
     }
@@ -278,8 +287,7 @@
       return new Future.value(const []);
     }
     values = new List(remaining);
-    completer = new Completer<List>();
-    return completer.future;
+    return result;
   }
 
   /**
@@ -650,3 +658,15 @@
    */
   bool get isCompleted;
 }
+
+// Helper function completing a _Future with error, but checking the zone
+// for error replacement first.
+void _completeWithErrorCallback(_Future result, error, stackTrace) {
+  AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+  if (replacement == null) {
+    result._completeError(error, stackTrace);
+  } else {
+    result._completeError(replacement.error, replacement.stackTrace);
+  }
+}
+
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index a1f09a4..124b7ab 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -16,7 +16,18 @@
 
   void complete([value]);
 
-  void completeError(Object error, [StackTrace stackTrace]);
+  void completeError(Object error, [StackTrace stackTrace]) {
+    if (error == null) throw new ArgumentError("Error must not be null");
+    if (!future._mayComplete) throw new StateError("Future already completed");
+    AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+    if (replacement != null) {
+      error = replacement.error;
+      stackTrace = replacement.stackTrace;
+    }
+    _completeError(error, stackTrace);
+  }
+
+  void _completeError(Object error, StackTrace stackTrace);
 
   // The future's _isComplete doesn't take into account pending completions.
   // We therefore use _mayComplete.
@@ -30,9 +41,7 @@
     future._asyncComplete(value);
   }
 
-  void completeError(Object error, [StackTrace stackTrace]) {
-    if (error == null) throw new ArgumentError("Error must not be null");
-    if (!future._mayComplete) throw new StateError("Future already completed");
+  void _completeError(Object error, StackTrace stackTrace) {
     future._asyncCompleteError(error, stackTrace);
   }
 }
@@ -44,8 +53,7 @@
     future._complete(value);
   }
 
-  void completeError(Object error, [StackTrace stackTrace]) {
-    if (!future._mayComplete) throw new StateError("Future already completed");
+  void _completeError(Object error, StackTrace stackTrace) {
     future._completeError(error, stackTrace);
   }
 }
@@ -213,7 +221,7 @@
     return _resultOrListeners;
   }
 
-  _AsyncError get _error {
+  AsyncError get _error {
     assert(_isComplete && _hasError);
     return _resultOrListeners;
   }
@@ -227,7 +235,7 @@
   void _setError(Object error, StackTrace stackTrace) {
     assert(!_isComplete);  // But may have a completion pending.
     _state = _ERROR;
-    _resultOrListeners = new _AsyncError(error, stackTrace);
+    _resultOrListeners = new AsyncError(error, stackTrace);
   }
 
   void _addListener(_Future listener) {
@@ -437,7 +445,7 @@
       if (!source._isComplete) return;  // Chained future.
       bool hasError = source._hasError;
       if (hasError && listeners == null) {
-        _AsyncError asyncError = source._error;
+        AsyncError asyncError = source._error;
         source._zone.handleUncaughtError(
             asyncError.error, asyncError.stackTrace);
         return;
@@ -471,7 +479,7 @@
         Zone zone = listener._zone;
         if (hasError && !source._zone.inSameErrorZone(zone)) {
           // Don't cross zone boundaries with errors.
-          _AsyncError asyncError = source._error;
+          AsyncError asyncError = source._error;
           source._zone.handleUncaughtError(
               asyncError.error, asyncError.stackTrace);
           return;
@@ -489,13 +497,13 @@
                                                  sourceValue);
             return true;
           } catch (e, s) {
-            listenerValueOrError = new _AsyncError(e, s);
+            listenerValueOrError = new AsyncError(e, s);
             return false;
           }
         }
 
         void handleError() {
-          _AsyncError asyncError = source._error;
+          AsyncError asyncError = source._error;
           _FutureErrorTest test = listener._errorTest;
           bool matchesTest = true;
           if (test != null) {
@@ -504,7 +512,7 @@
             } catch (e, s) {
               // TODO(ajohnsen): Should we suport rethrow for test throws?
               listenerValueOrError = identical(asyncError.error, e) ?
-                  asyncError : new _AsyncError(e, s);
+                  asyncError : new AsyncError(e, s);
               listenerHasValue = false;
               return;
             }
@@ -522,7 +530,7 @@
               }
             } catch (e, s) {
               listenerValueOrError = identical(asyncError.error, e) ?
-                  asyncError : new _AsyncError(e, s);
+                  asyncError : new AsyncError(e, s);
               listenerHasValue = false;
               return;
             }
@@ -542,7 +550,7 @@
             if (hasError && identical(source._error.error, e)) {
               listenerValueOrError = source._error;
             } else {
-              listenerValueOrError = new _AsyncError(e, s);
+              listenerValueOrError = new AsyncError(e, s);
             }
             listenerHasValue = false;
           }
@@ -614,7 +622,7 @@
         listener._setValue(listenerValueOrError);
       } else {
         listeners = listener._removeListeners();
-        _AsyncError asyncError = listenerValueOrError;
+        AsyncError asyncError = listenerValueOrError;
         listener._setError(asyncError.error, asyncError.stackTrace);
       }
       // Prepare for next round.
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 2392739..906476b 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -84,14 +84,14 @@
     // Use the controller's buffering to fill in the value even before
     // the stream has a listener. For a single value, it's not worth it
     // to wait for a listener before doing the `then` on the future.
-    StreamController<T> controller = new StreamController<T>(sync: true);
+    _StreamController<T> controller = new StreamController<T>(sync: true);
     future.then((value) {
-        controller.add(value);
-        controller.close();
+        controller._add(value);
+        controller._closeUnchecked();
       },
       onError: (error, stackTrace) {
-        controller.addError(error, stackTrace);
-        controller.close();
+        controller._addError(error, stackTrace);
+        controller._closeUnchecked();
       });
     return controller.stream;
   }
@@ -313,8 +313,11 @@
     StreamController controller;
     StreamSubscription subscription;
     void onListen () {
-      var add = controller.add;
-      var addError = controller.addError;
+      final add = controller.add;
+      assert(controller is _StreamController ||
+             controller is _BroadcastStreamController);
+      final eventSink = controller;
+      final addError = eventSink._addError;
       subscription = this.listen(
           (T event) {
             var newValue;
@@ -371,6 +374,9 @@
     StreamController controller;
     StreamSubscription subscription;
     void onListen() {
+      assert(controller is _StreamController ||
+             controller is _BroadcastStreamController);
+      final eventSink = controller;
       subscription = this.listen(
           (T event) {
             Stream newStream;
@@ -386,7 +392,7 @@
                         .whenComplete(subscription.resume);
             }
           },
-          onError: controller.addError,
+          onError: eventSink._addError,  // Avoid Zone error replacement.
           onDone: controller.close
       );
     }
@@ -504,7 +510,7 @@
           try {
             throw IterableElementError.noElement();
           } catch (e, s) {
-            result._completeError(e, s);
+            _completeWithErrorCallback(result, e,  s);
           }
         } else {
           result._complete(value);
@@ -562,7 +568,7 @@
         try {
           buffer.write(element);
         } catch (e, s) {
-          _cancelAndError(subscription, result, e, s);
+          _cancelAndErrorWithReplacement(subscription, result, e, s);
         }
       },
       onError: (e) {
@@ -909,7 +915,7 @@
         try {
           throw IterableElementError.noElement();
         } catch (e, s) {
-          future._completeError(e, s);
+          _completeWithErrorCallback(future, e, s);
         }
       },
       cancelOnError: true);
@@ -944,7 +950,7 @@
         try {
           throw IterableElementError.noElement();
         } catch (e, s) {
-          future._completeError(e, s);
+          _completeWithErrorCallback(future, e, s);
         }
       },
       cancelOnError: true);
@@ -971,7 +977,7 @@
           try {
             throw IterableElementError.tooMany();
           } catch (e, s) {
-            _cancelAndError(subscription, future, e, s);
+            _cancelAndErrorWithReplacement(subscription, future, e, s);
           }
           return;
         }
@@ -987,7 +993,7 @@
         try {
           throw IterableElementError.noElement();
         } catch (e, s) {
-          future._completeError(e, s);
+          _completeWithErrorCallback(future, e, s);
         }
       },
       cancelOnError: true);
@@ -1039,7 +1045,7 @@
         try {
           throw IterableElementError.noElement();
         } catch (e, s) {
-          future._completeError(e, s);
+          _completeWithErrorCallback(future, e, s);
         }
       },
       cancelOnError: true);
@@ -1084,7 +1090,7 @@
         try {
           throw IterableElementError.noElement();
         } catch (e, s) {
-          future._completeError(e, s);
+          _completeWithErrorCallback(future, e, s);
         }
       },
       cancelOnError: true);
@@ -1112,7 +1118,7 @@
                 try {
                   throw IterableElementError.tooMany();
                 } catch (e, s) {
-                  _cancelAndError(subscription, future, e, s);
+                  _cancelAndErrorWithReplacement(subscription, future, e, s);
                 }
                 return;
               }
@@ -1132,7 +1138,7 @@
         try {
           throw IterableElementError.noElement();
         } catch (e, s) {
-          future._completeError(e, s);
+          _completeWithErrorCallback(future, e, s);
         }
       },
       cancelOnError: true);
@@ -1212,7 +1218,10 @@
     }
     void onError(error, StackTrace stackTrace) {
       timer.cancel();
-      controller.addError(error, stackTrace);
+      assert(controller is _StreamController ||
+             controller is _BroadcastStreamController);
+      var eventSink = controller;
+      eventSink._addError(error, stackTrace);  // Avoid Zone error replacement.
       timer = zone.createTimer(timeLimit, timeout);
     }
     void onDone() {
@@ -1228,7 +1237,7 @@
       if (onTimeout == null) {
         timeout = () {
           controller.addError(new TimeoutException("No stream event",
-                                                   timeLimit));
+                                                   timeLimit), null);
         };
       } else {
         onTimeout = zone.registerUnaryCallback(onTimeout);
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index 50490f5..fe3fbdd 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -415,6 +415,11 @@
    */
   void addError(Object error, [StackTrace stackTrace]) {
     if (!_mayAddEvent) throw _badEventState();
+    AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+    if (replacement != null) {
+      error = replacement.error;
+      stackTrace = replacement.stackTrace;
+    }
     _addError(error, stackTrace);
   }
 
@@ -436,13 +441,17 @@
       return _ensureDoneFuture();
     }
     if (!_mayAddEvent) throw _badEventState();
+    _closeUnchecked();
+    return _ensureDoneFuture();
+  }
+
+  void _closeUnchecked() {
     _state |= _STATE_CLOSED;
     if (hasListener) {
       _sendDone();
     } else if (_isInitialState) {
       _ensurePendingEvents().add(const _DelayedDone());
     }
-    return _ensureDoneFuture();
   }
 
   // EventSink interface. Used by the [addStream] events.
diff --git a/sdk/lib/async/stream_impl.dart b/sdk/lib/async/stream_impl.dart
index 20314c8..394e1c6 100644
--- a/sdk/lib/async/stream_impl.dart
+++ b/sdk/lib/async/stream_impl.dart
@@ -1008,9 +1008,10 @@
           _subscription.resume();
           return new _Future<bool>.immediate(true);
         case _STATE_EXTRA_ERROR:
-          Object prefetch = _futureOrPrefetch;
+          AsyncError prefetch = _futureOrPrefetch;
           _clear();
-          return new _Future<bool>.immediateError(prefetch);
+          return new _Future<bool>.immediateError(prefetch.error,
+                                                  prefetch.stackTrace);
         case _STATE_EXTRA_DONE:
           _clear();
           return new _Future<bool>.immediate(false);
@@ -1063,7 +1064,7 @@
     }
     _subscription.pause();
     assert(_futureOrPrefetch == null);
-    _futureOrPrefetch = error;
+    _futureOrPrefetch = new AsyncError(error, stackTrace);
     _state = _STATE_EXTRA_ERROR;
   }
 
diff --git a/sdk/lib/async/stream_pipe.dart b/sdk/lib/async/stream_pipe.dart
index 4be169c..309a771 100644
--- a/sdk/lib/async/stream_pipe.dart
+++ b/sdk/lib/async/stream_pipe.dart
@@ -11,7 +11,12 @@
   try {
     onSuccess(userCode());
   } catch (e, s) {
-    onError(e, s);
+    AsyncError replacement = Zone.current.errorCallback(e, s);
+    if (replacement == null) {
+      onError(e, s);
+    } else {
+      onError(replacement.error, replacement.stackTrace);
+    }
   }
 }
 
@@ -29,6 +34,17 @@
   }
 }
 
+void _cancelAndErrorWithReplacement(StreamSubscription subscription,
+                                    _Future future,
+                                    error, StackTrace stackTrace) {
+  AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+  if (replacement != null) {
+    error = replacement.error;
+    stackTrace = replacement.stackTrace;
+  }
+  _cancelAndError(subscription, future, error, stackTrace);
+}
+
 /** Helper function to make an onError argument to [_runUserCode]. */
 _cancelAndErrorClosure(StreamSubscription subscription, _Future future) =>
   ((error, StackTrace stackTrace) => _cancelAndError(
@@ -169,6 +185,16 @@
 
 typedef bool _Predicate<T>(T value);
 
+void _addErrorWithReplacement(_EventSink sink, error, stackTrace) {
+  AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
+  if (replacement == null) {
+    sink._addError(error, stackTrace);
+  } else {
+    sink._addError(replacement.error, replacement.stackTrace);
+  }
+}
+
+
 class _WhereStream<T> extends _ForwardingStream<T, T> {
   final _Predicate<T> _test;
 
@@ -180,7 +206,7 @@
     try {
       satisfies = _test(inputEvent);
     } catch (e, s) {
-      sink._addError(e, s);
+      _addErrorWithReplacement(sink, e, s);
       return;
     }
     if (satisfies) {
@@ -206,7 +232,7 @@
     try {
       outputEvent = _transform(inputEvent);
     } catch (e, s) {
-      sink._addError(e, s);
+      _addErrorWithReplacement(sink, e, s);
       return;
     }
     sink._add(outputEvent);
@@ -230,7 +256,7 @@
     } catch (e, s) {
       // If either _expand or iterating the generated iterator throws,
       // we abort the iteration.
-      sink._addError(e, s);
+      _addErrorWithReplacement(sink, e, s);
     }
   }
 }
@@ -257,7 +283,7 @@
       try {
         matches = _test(error);
       } catch (e, s) {
-        sink._addError(e, s);
+        _addErrorWithReplacement(sink, e, s);
         return;
       }
     }
@@ -268,7 +294,7 @@
         if (identical(e, error)) {
           sink._addError(error, stackTrace);
         } else {
-          sink._addError(e, s);
+          _addErrorWithReplacement(sink, e, s);
         }
         return;
       }
@@ -314,7 +340,7 @@
     try {
       satisfies = _test(inputEvent);
     } catch (e, s) {
-      sink._addError(e, s);
+      _addErrorWithReplacement(sink, e, s);
       // The test didn't say true. Didn't say false either, but we stop anyway.
       sink._close();
       return;
@@ -362,7 +388,7 @@
     try {
       satisfies = _test(inputEvent);
     } catch (e, s) {
-      sink._addError(e, s);
+      _addErrorWithReplacement(sink, e, s);
       // A failure to return a boolean is considered "not matching".
       _hasFailed = true;
       return;
@@ -398,7 +424,7 @@
           isEqual = _equals(_previous, inputEvent);
         }
       } catch (e, s) {
-        sink._addError(e, s);
+        _addErrorWithReplacement(sink, e, s);
         return null;
       }
       if (!isEqual) {
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index 541a66f..1f2993d 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -21,6 +21,8 @@
     Zone self, ZoneDelegate parent, Zone zone, f(arg));
 typedef ZoneBinaryCallback RegisterBinaryCallbackHandler(
     Zone self, ZoneDelegate parent, Zone zone, f(arg1, arg2));
+typedef AsyncError ErrorCallbackHandler(Zone self, ZoneDelegate parent,
+    Zone zone, Object error, StackTrace stackTrace);
 typedef void ScheduleMicrotaskHandler(
     Zone self, ZoneDelegate parent, Zone zone, f());
 typedef Timer CreateTimerHandler(
@@ -34,6 +36,16 @@
                          ZoneSpecification specification,
                          Map zoneValues);
 
+/// Pair of error and stack trace. Returned by [Zone.errorCallback].
+class AsyncError implements Error {
+  final error;
+  final StackTrace stackTrace;
+
+  AsyncError(this.error, this.stackTrace);
+  String toString() => error.toString();
+}
+
+
 class _ZoneFunction {
   final _Zone zone;
   final Function function;
@@ -77,6 +89,8 @@
         Zone self, ZoneDelegate parent, Zone zone, f(arg)),
     ZoneBinaryCallback registerBinaryCallback(
         Zone self, ZoneDelegate parent, Zone zone, f(arg1, arg2)),
+    AsyncError errorCallback(Zone self, ZoneDelegate parent, Zone zone,
+                             Object error, StackTrace stackTrace),
     void scheduleMicrotask(
         Zone self, ZoneDelegate parent, Zone zone, f()),
     Timer createTimer(Zone self, ZoneDelegate parent, Zone zone,
@@ -106,6 +120,8 @@
         Zone self, ZoneDelegate parent, Zone zone, f(arg)): null,
     ZoneBinaryCallback registerBinaryCallback(
         Zone self, ZoneDelegate parent, Zone zone, f(arg1, arg2)): null,
+    AsyncError errorCallback(Zone self, ZoneDelegate parent, Zone zone,
+                             Object error, StackTrace stackTrace),
     void scheduleMicrotask(
         Zone self, ZoneDelegate parent, Zone zone, f()): null,
     Timer createTimer(Zone self, ZoneDelegate parent, Zone zone,
@@ -133,6 +149,9 @@
       registerBinaryCallback: registerBinaryCallback != null
                          ? registerBinaryCallback
                          : other.registerBinaryCallback,
+      errorCallback: errorCallback != null
+                         ? errorCallback
+                         : other.errorCallback,
       scheduleMicrotask: scheduleMicrotask != null
                          ? scheduleMicrotask
                          : other.scheduleMicrotask,
@@ -151,6 +170,7 @@
   RegisterCallbackHandler get registerCallback;
   RegisterUnaryCallbackHandler get registerUnaryCallback;
   RegisterBinaryCallbackHandler get registerBinaryCallback;
+  ErrorCallbackHandler get errorCallback;
   ScheduleMicrotaskHandler get scheduleMicrotask;
   CreateTimerHandler get createTimer;
   CreatePeriodicTimerHandler get createPeriodicTimer;
@@ -174,6 +194,7 @@
     this.registerCallback: null,
     this.registerUnaryCallback: null,
     this.registerBinaryCallback: null,
+    this.errorCallback: null,
     this.scheduleMicrotask: null,
     this.createTimer: null,
     this.createPeriodicTimer: null,
@@ -189,6 +210,7 @@
   final /*RegisterCallbackHandler*/ registerCallback;
   final /*RegisterUnaryCallbackHandler*/ registerUnaryCallback;
   final /*RegisterBinaryCallbackHandler*/ registerBinaryCallback;
+  final /*ErrorCallbackHandler*/ errorCallback;
   final /*ScheduleMicrotaskHandler*/ scheduleMicrotask;
   final /*CreateTimerHandler*/ createTimer;
   final /*CreatePeriodicTimerHandler*/ createPeriodicTimer;
@@ -214,6 +236,7 @@
   ZoneCallback registerCallback(Zone zone, f());
   ZoneUnaryCallback registerUnaryCallback(Zone zone, f(arg));
   ZoneBinaryCallback registerBinaryCallback(Zone zone, f(arg1, arg2));
+  AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace);
   void scheduleMicrotask(Zone zone, f());
   Timer createTimer(Zone zone, Duration duration, void f());
   Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer));
@@ -380,6 +403,23 @@
       f(arg1, arg2), { bool runGuarded: true });
 
   /**
+   * Intercepts errors when added programmtically to a `Future` or `Stream`.
+   *
+   * When caling [Completer.completeError], [Stream.addError],
+   * or [Future] constructors that take an error or a callback that may throw,
+   * the current zone is allowed to intercept and replace the error.
+   *
+   * When other libraries use intermediate controllers or completers, such
+   * calls may contain errors that have already been processed.
+   *
+   * Return `null` if no replacement is desired.
+   * The original error is used unchanged in that case.
+   * Otherwise return an instance of [AsyncError] holding
+   * the new pair of error and stack trace.
+   */
+  AsyncError errorCallback(Object error, StackTrace stackTrace);
+
+  /**
    * Runs [f] asynchronously in this zone.
    */
   void scheduleMicrotask(void f());
@@ -495,6 +535,14 @@
         implZone, _parentDelegate(implZone), zone, f);
   }
 
+  AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) {
+    _ZoneFunction implementation = _delegationTarget._errorCallback;
+    _Zone implZone = implementation.zone;
+    if (identical(implZone, _ROOT_ZONE)) return null;
+    return (implementation.function)(implZone, _parentDelegate(implZone), zone,
+                                     error, stackTrace);
+  }
+
   void scheduleMicrotask(Zone zone, f()) {
     _ZoneFunction implementation = _delegationTarget._scheduleMicrotask;
     _Zone implZone = implementation.zone;
@@ -545,6 +593,7 @@
   _ZoneFunction get _registerCallback;
   _ZoneFunction get _registerUnaryCallback;
   _ZoneFunction get _registerBinaryCallback;
+  _ZoneFunction get _errorCallback;
   _ZoneFunction get _scheduleMicrotask;
   _ZoneFunction get _createTimer;
   _ZoneFunction get _createPeriodicTimer;
@@ -569,6 +618,7 @@
   _ZoneFunction _registerCallback;
   _ZoneFunction _registerUnaryCallback;
   _ZoneFunction _registerBinaryCallback;
+  _ZoneFunction _errorCallback;
   _ZoneFunction _scheduleMicrotask;
   _ZoneFunction _createTimer;
   _ZoneFunction _createPeriodicTimer;
@@ -615,6 +665,9 @@
     _registerBinaryCallback = (specification.registerBinaryCallback != null)
         ? new _ZoneFunction(this, specification.registerBinaryCallback)
         : parent._registerBinaryCallback;
+    _errorCallback = (specification.errorCallback != null)
+        ? new _ZoneFunction(this, specification.errorCallback)
+        : parent._errorCallback;
     _scheduleMicrotask = (specification.scheduleMicrotask != null)
         ? new _ZoneFunction(this, specification.scheduleMicrotask)
         : parent._scheduleMicrotask;
@@ -781,6 +834,16 @@
         implementation.zone, parentDelegate, this, f);
   }
 
+  AsyncError errorCallback(Object error, StackTrace stackTrace) {
+    final _ZoneFunction implementation = this._errorCallback;
+    assert(implementation != null);
+    final Zone implementationZone = implementation.zone;
+    if (identical(implementationZone, _ROOT_ZONE)) return null;
+    final ZoneDelegate parentDelegate = _parentDelegate(implementationZone);
+    return (implementation.function)(
+        implementationZone, parentDelegate, this, error, stackTrace);
+  }
+
   void scheduleMicrotask(void f()) {
     _ZoneFunction implementation = this._scheduleMicrotask;
     assert(implementation != null);
@@ -870,6 +933,9 @@
   return f;
 }
 
+AsyncError _rootErrorCallback(Zone self, ZoneDelegate parent, Zone zone,
+                              Object error, StackTrace stackTrace) => null;
+
 void _rootScheduleMicrotask(Zone self, ZoneDelegate parent, Zone zone, f()) {
   if (!identical(_ROOT_ZONE, zone)) {
     f = zone.bindCallback(f);
@@ -940,6 +1006,7 @@
       _rootRegisterUnaryCallback;
   RegisterBinaryCallbackHandler get registerBinaryCallback =>
       _rootRegisterBinaryCallback;
+  ErrorCallbackHandler get errorCallback => _rootErrorCallback;
   ScheduleMicrotaskHandler get scheduleMicrotask => _rootScheduleMicrotask;
   CreateTimerHandler get createTimer => _rootCreateTimer;
   CreatePeriodicTimerHandler get createPeriodicTimer =>
@@ -963,6 +1030,8 @@
       const _ZoneFunction(_ROOT_ZONE, _rootRegisterUnaryCallback);
   _ZoneFunction get _registerBinaryCallback =>
       const _ZoneFunction(_ROOT_ZONE, _rootRegisterBinaryCallback);
+  _ZoneFunction get _errorCallback =>
+      const _ZoneFunction(_ROOT_ZONE, _rootErrorCallback);
   _ZoneFunction get _scheduleMicrotask =>
       const _ZoneFunction(_ROOT_ZONE, _rootScheduleMicrotask);
   _ZoneFunction get _createTimer =>
@@ -1094,6 +1163,8 @@
 
   ZoneBinaryCallback registerBinaryCallback(f(arg1, arg2)) => f;
 
+  AsyncError errorCallback(Object error, StackTrace stackTrace) => null;
+
   void scheduleMicrotask(void f()) {
     _rootScheduleMicrotask(null, null, this, f);
   }
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index b58efb4..6373ad0 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -39,6 +39,7 @@
 import 'dart:svg' show SvgSvgElement;
 import 'dart:web_audio' as web_audio;
 import 'dart:web_gl' as gl;
+import 'dart:web_gl' show RenderingContext;
 import 'dart:web_sql';
 import 'dart:_isolate_helper' show IsolateNatives;
 import 'dart:_foreign_helper' show JS, JS_INTERCEPTOR_CONSTANT, JS_CONST;
@@ -1516,6 +1517,8 @@
 
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
+  @Creates('CanvasRenderingContext2D|RenderingContext')
+  @Returns('CanvasRenderingContext2D|RenderingContext|Null')
   Object getContext(String contextId, [Map attrs]) {
     if (attrs != null) {
       var attrs_1 = convertDartToNative_Dictionary(attrs);
@@ -1526,10 +1529,14 @@
   @JSName('getContext')
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
+  @Creates('CanvasRenderingContext2D|RenderingContext')
+  @Returns('CanvasRenderingContext2D|RenderingContext|Null')
   Object _getContext_1(contextId, attrs) native;
   @JSName('getContext')
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
+  @Creates('CanvasRenderingContext2D|RenderingContext')
+  @Returns('CanvasRenderingContext2D|RenderingContext|Null')
   Object _getContext_2(contextId) native;
 
   @JSName('toDataURL')
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart
index adf8245..2c43295 100644
--- a/sdk/lib/io/file_system_entity.dart
+++ b/sdk/lib/io/file_system_entity.dart
@@ -418,6 +418,8 @@
    * Use `events` to specify what events to listen for. The constants in
    * [FileSystemEvent] can be or'ed together to mix events. Default is
    * [FileSystemEvent.ALL].
+   *
+   * A move event may be reported as seperate delete and create events.
    */
   Stream<FileSystemEvent> watch({int events: FileSystemEvent.ALL,
                                  bool recursive: false})
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index f0c4282..d908338 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -178,6 +178,18 @@
    */
   HttpHeaders get defaultResponseHeaders;
 
+   /**
+   * Whether the [HttpServer] should compress the content, if possible.
+   *
+   * The content can only be compressed when the response is using
+   * chunked Transfer-Encoding and the incoming request has `gzip`
+   * as an accepted encoding in the Accept-Encoding header.
+   *
+   * The default value is `false` (compression disabled).
+   * To enable, set `autoCompress` to `true`.
+   */
+  bool autoCompress;
+
   /**
    * Get or set the timeout used for idle keep-alive connections. If no further
    * request is seen within [idleTimeout] after the previous request was
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index e0557e0..da5d2b6 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -948,7 +948,9 @@
     bool gzip = false;
     if (isServerSide) {
       var response = outbound;
-      if (outbound.bufferOutput && outbound.headers.chunkedTransferEncoding) {
+      if (response._httpRequest._httpServer.autoCompress &&
+          outbound.bufferOutput &&
+          outbound.headers.chunkedTransferEncoding) {
         List acceptEncodings =
             response._httpRequest.headers[HttpHeaders.ACCEPT_ENCODING];
         List contentEncoding = outbound.headers[HttpHeaders.CONTENT_ENCODING];
@@ -2150,6 +2152,7 @@
 
   String serverHeader;
   final HttpHeaders defaultResponseHeaders = _initDefaultResponseHeaders();
+  bool autoCompress = false;
 
   Duration _idleTimeout;
   Timer _idleTimer;
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 332e3b2..b90901e 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -127,8 +127,8 @@
    * If [packageRoot] is omitted, it defaults to the same URI that
    * the current isolate is using.
    *
-   * WARNING: The [packageRoot] parameter is not implemented on any
-   * platform yet.
+   * WARNING: The [packageRoot] parameter is not implemented on all
+   * platforms yet.
    *
    * If the [paused] parameter is set to `true`,
    * the isolate will start up in a paused state,
diff --git a/site/try/build_try.gyp b/site/try/build_try.gyp
index 882a6bc..1638810 100644
--- a/site/try/build_try.gyp
+++ b/site/try/build_try.gyp
@@ -56,7 +56,6 @@
           '../../pkg/logging/lib',
           '../../pkg/matcher/lib',
           '../../pkg/path/lib',
-          '../../pkg/serialization/lib',
           '../../pkg/stack_trace/lib',
           '../../pkg/string_scanner/lib',
           '../../pkg/unittest/lib',
diff --git a/site/try/poi/Makefile b/site/try/poi/Makefile
new file mode 100644
index 0000000..f4637ea
--- /dev/null
+++ b/site/try/poi/Makefile
@@ -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.
+
+# This Makefile is used to run the analyzer on the sources of poi.dart.
+# Unfortunately, we have to ignore some hints either due to bugs in the
+# analyzer, or due to patterns in dart2js (for example, unused imports of
+# helpers.dart).
+#
+# The purpose of this Makefile is to be used from inside Emacs to fix any valid
+# warning or hints reported. The whitelist is maintained as needed by those who
+# use this Makefile.
+
+SDK_DIR=../../../xcodebuild/ReleaseIA32/dart-sdk
+PACKAGE_ROOT=../../../xcodebuild/ReleaseIA32/packages/
+
+all:
+	@echo $(SDK_DIR)/bin/dartanalyzer -p $(PACKAGE_ROOT) repeat_poi.dart
+	@$(SDK_DIR)/bin/dartanalyzer -p $(PACKAGE_ROOT) \
+	--package-warnings --machine ../poi/repeat_poi.dart 2>&1 \
+	| grep -v DEPRECATED_MEMBER_USE \
+	| grep -v DEAD_CODE \
+	| grep -v 'INFO|HINT|ARGUMENT_TYPE_NOT_ASSIGNABLE|' \
+	| grep -v 'INFO|HINT|UNUSED_IMPORT|.*/compiler/implementation/cps_ir/optimizers\.dart|7|8|27|' \
+	| grep -v 'INFO|HINT|UNUSED_IMPORT|.*/compiler/implementation/dart2jslib\.dart|26|8|22|' \
+	| grep -v 'INFO|HINT|UNUSED_IMPORT|.*/compiler/implementation/dart_types\.dart|17|8|22|' \
+	| grep -v 'INFO|HINT|UNUSED_IMPORT|.*/compiler/implementation/deferred_load\.dart|59|8|11|' \
+	| grep -v 'INFO|HINT|UNUSED_IMPORT|.*/compiler/implementation/elements/elements\.dart|28|8|25|' \
+	| grep -v 'INFO|HINT|UNUSED_IMPORT|.*/compiler/implementation/elements/modelx\.dart|8|8|25|' \
+	| grep -v 'INFO|HINT|UNUSED_IMPORT|.*/compiler/implementation/js_emitter/js_emitter\.dart|47|8|25|' \
+	| grep -v 'INFO|HINT|UNUSED_IMPORT|.*/compiler/implementation/library_loader\.dart|25|8|22|' \
+	| grep -v 'INFO|HINT|UNUSED_IMPORT|.*/compiler/implementation/patch_parser\.dart|120|8|22|' \
+	| grep -v 'INFO|HINT|UNUSED_IMPORT|.*/compiler/implementation/resolution/class_members\.dart|22|8|25|' \
+	| sed -e "s,$(PWD)/,," \
+	| awk -F'|' '{print $$4 ":" $$5 ":" $$6 ":\n [" n$$3 "]" $$8 }' \
diff --git a/site/try/poi/poi.dart b/site/try/poi/poi.dart
index 603a5a6..f817088 100644
--- a/site/try/poi/poi.dart
+++ b/site/try/poi/poi.dart
@@ -6,8 +6,7 @@
 
 import 'dart:async' show
     Completer,
-    Future,
-    Stream;
+    Future;
 
 import 'dart:io' show
     File,
@@ -20,15 +19,13 @@
 import 'dart:io' as io;
 
 import 'dart:convert' show
-    LineSplitter,
     UTF8;
 
 import 'package:dart2js_incremental/dart2js_incremental.dart' show
     reuseCompiler;
 
 import 'package:compiler/implementation/source_file_provider.dart' show
-    FormattingDiagnosticHandler,
-    SourceFileProvider;
+    FormattingDiagnosticHandler;
 
 import 'package:compiler/compiler.dart' as api;
 
@@ -53,6 +50,9 @@
 
 import 'package:compiler/implementation/elements/modelx.dart' as modelx;
 
+import 'package:compiler/implementation/elements/modelx.dart' show
+    DeclarationSite;
+
 import 'package:compiler/implementation/dart_types.dart' show
     DartType;
 
@@ -100,6 +100,8 @@
 
 Stopwatch wallClock = new Stopwatch();
 
+Compiler cachedCompiler;
+
 /// Iterator for reading lines from [io.stdin].
 class StdinIterator implements Iterator<String> {
   String current;
@@ -183,7 +185,7 @@
 /// [simulateMutation].
 api.CompilerInputProvider simulateMutation(
     String fileName,
-    SourceFileProvider inputProvider) {
+    api.CompilerInputProvider inputProvider) {
   Uri script = Uri.base.resolveUri(new Uri.file(fileName));
   int count = poiCount;
   Future cache;
@@ -266,7 +268,7 @@
   Uri script = Uri.base.resolveUri(new Uri.file(fileName));
   if (positionString == null) return null;
   int position = int.parse(
-      positionString, onError: (_) => print('Please enter an integer.'));
+      positionString, onError: (_) { print('Please enter an integer.'); });
   if (position == null) return repeat();
 
   inputProvider(script);
@@ -326,16 +328,15 @@
 /// Find the token corresponding to [position] in [element].  The method only
 /// works for instances of [PartialElement] or [LibraryElement].  Support for
 /// [LibraryElement] is currently limited, and works only for named libraries.
-Token findToken(Element element, int position) {
+Token findToken(modelx.ElementX element, int position) {
   Token beginToken;
-  if (element is PartialElement) {
-    beginToken = element.beginToken;
-  } else if (element is PartialClassElement) {
-    beginToken = element.beginToken;
+  DeclarationSite site = element.declarationSite;
+  if (site is PartialElement) {
+    beginToken = site.beginToken;
   } else if (element.isLibrary) {
     // TODO(ahe): Generalize support for library elements (and update above
     // documentation).
-    LibraryElement lib = element;
+    modelx.LibraryElementX lib = element;
     var tag = lib.libraryTag;
     if (tag != null) {
       beginToken = tag.libraryKeyword;
@@ -352,13 +353,11 @@
   return null;
 }
 
-Compiler cachedCompiler;
-
 Future<Element> runPoi(
-    Uri script, int position,
+    Uri script,
+    int position,
     api.CompilerInputProvider inputProvider,
     api.DiagnosticHandler handler) {
-
   Uri libraryRoot = Uri.base.resolve('sdk/');
   Uri packageRoot = Uri.base.resolveUri(
       new Uri.file('${Platform.packageRoot}/'));
@@ -373,18 +372,27 @@
       '--disable-type-inference',
   ];
 
-  cachedCompiler = reuseCompiler(
+  return reuseCompiler(
       diagnosticHandler: handler,
       inputProvider: inputProvider,
       options: options,
       cachedCompiler: cachedCompiler,
       libraryRoot: libraryRoot,
       packageRoot: packageRoot,
-      packagesAreImmutable: true);
+      packagesAreImmutable: true).then((Compiler newCompiler) {
+    var filter = new ScriptOnlyFilter(script);
+    newCompiler.enqueuerFilter = filter;
+    return runPoiInternal(newCompiler, script, position);
+  });
+}
 
-  cachedCompiler.enqueuerFilter = new ScriptOnlyFilter(script);
+Future<Element> runPoiInternal(
+    Compiler newCompiler,
+    Uri uri,
+    int position) {
+  cachedCompiler = newCompiler;
 
-  return cachedCompiler.run(script).then((success) {
+  return cachedCompiler.run(uri).then((success) {
     if (success != true) {
       throw 'Compilation failed';
     }
@@ -411,10 +419,11 @@
 
   FindPositionVisitor(this.position, this.element);
 
-  visitElement(Element e) {
-    if (e is PartialElement) {
-      if (e.beginToken.charOffset <= position &&
-          position < e.endToken.next.charOffset) {
+  visitElement(modelx.ElementX e) {
+    DeclarationSite site = e.declarationSite;
+    if (site is PartialElement) {
+      if (site.beginToken.charOffset <= position &&
+          position < site.endToken.next.charOffset) {
         element = e;
       }
     }
diff --git a/site/try/src/compiler_isolate.dart b/site/try/src/compiler_isolate.dart
index f6265ae..8d5ff43 100644
--- a/site/try/src/compiler_isolate.dart
+++ b/site/try/src/compiler_isolate.dart
@@ -16,6 +16,9 @@
 import 'package:dart2js_incremental/dart2js_incremental.dart' show
     reuseCompiler;
 
+import 'package:compiler/implementation/dart2jslib.dart' show
+    Compiler;
+
 const bool THROW_ON_ERROR = false;
 
 final cachedSources = new Map<Uri, Future<String>>();
@@ -107,16 +110,17 @@
     }
   }
   Stopwatch compilationTimer = new Stopwatch()..start();
-  cachedCompiler = reuseCompiler(
+  reuseCompiler(
       diagnosticHandler: handler,
       inputProvider: inputProvider,
       options: options,
       cachedCompiler: cachedCompiler,
       libraryRoot: sdkLocation,
       packageRoot: Uri.base.resolve('/packages/'),
-      packagesAreImmutable: true);
-
-  cachedCompiler.run(Uri.parse('$PRIVATE_SCHEME:/main.dart')).then((success) {
+      packagesAreImmutable: true).then((Compiler newCompiler) {
+    cachedCompiler = newCompiler;
+    return cachedCompiler.run(Uri.parse('$PRIVATE_SCHEME:/main.dart'));
+  }).then((success) {
     compilationTimer.stop();
     print('Compilation took ${compilationTimer.elapsed}');
     if (cachedCompiler.libraryLoader
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index 653463b..7dc4b37 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -16,6 +16,10 @@
 LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19 issue 668
 LibTest/typed_data/ByteData/buffer_A01_t01: Fail # co19 r736 bug - sent comment.
 
+# TODO(terry) re-enable the below CSS tests when Chrome 38 and (Dartium 38) are ready issue 21075
+LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: Skip 
+LayoutTests/fast/css/font-shorthand-from-longhands_t01: Skip
+
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A01_t06: Fail, Pass, OK # co19 issue 695
 
 # These tests are obsolete and need updating.
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 83f7c3d..f3443a6 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -645,6 +645,7 @@
 LayoutTests/fast/canvas/canvas-scale-fillRect-shadow_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/canvas-transforms-fillRect-shadow_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
+LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: Skip # Times out flakily. co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/counters/complex-before_t01: RuntimeError, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/getComputedStyle/computed-style-select-overflow_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/vertical-align-length-copy-bug_t01: RuntimeError # co19-roll r761: Please triage this failure.
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index bdd9ed4..bd98f39 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -92,6 +92,7 @@
                           Map<String, String> coreSource,
                           bool disableInlining: true,
                           bool minify: false,
+                          bool trustTypeAnnotations: false,
                           int expectedErrors,
                           int expectedWarnings}) {
   MockCompiler compiler = new MockCompiler.internal(
@@ -100,6 +101,7 @@
       coreSource: coreSource,
       disableInlining: disableInlining,
       enableMinification: minify,
+      trustTypeAnnotations: trustTypeAnnotations,
       expectedErrors: expectedErrors,
       expectedWarnings: expectedWarnings);
   compiler.registerSource(uri, code);
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index caa07bf..e9d5ffd4 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -89,9 +89,9 @@
     expectedNames.addAll(nativeNames);
 
     Set recordedNames = new Set()
-        ..addAll(backend.emitter.recordedMangledNames)
-        ..addAll(backend.emitter.mangledFieldNames.keys)
-        ..addAll(backend.emitter.mangledGlobalFieldNames.keys);
+        ..addAll(backend.emitter.oldEmitter.recordedMangledNames)
+        ..addAll(backend.emitter.oldEmitter.mangledFieldNames.keys)
+        ..addAll(backend.emitter.oldEmitter.mangledGlobalFieldNames.keys);
     Expect.setEquals(new Set.from(expectedNames), recordedNames);
 
     for (var library in compiler.libraryLoader.libraries) {
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 4f1ab34..13bfe4e 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -72,6 +72,7 @@
        // Our unit tests check code generation output that is
        // affected by inlining support.
        bool disableInlining: true,
+       bool trustTypeAnnotations: false,
        int this.expectedWarnings,
        int this.expectedErrors})
       : sourceFiles = new Map<String, SourceFile>(),
@@ -84,6 +85,7 @@
               analyzeOnly: analyzeOnly,
               emitJavaScript: emitJavaScript,
               preserveComments: preserveComments,
+              trustTypeAnnotations: trustTypeAnnotations,
               showPackageWarnings: true) {
     this.disableInlining = disableInlining;
 
diff --git a/tests/compiler/dart2js/size_test.dart b/tests/compiler/dart2js/size_test.dart
index 423b5c2..5ab3fcc 100644
--- a/tests/compiler/dart2js/size_test.dart
+++ b/tests/compiler/dart2js/size_test.dart
@@ -32,7 +32,8 @@
       var backend = compiler.backend;
 
       // Make sure no class is emitted.
-      Expect.isFalse(generated.contains(backend.emitter.finishClassesName));
+      Expect.isFalse(generated.contains(
+          backend.emitter.oldEmitter.finishClassesName));
     });
   }));
 }
diff --git a/tests/compiler/dart2js/source_mapping_test.dart b/tests/compiler/dart2js/source_mapping_test.dart
index 3118cd3..d25edcf 100644
--- a/tests/compiler/dart2js/source_mapping_test.dart
+++ b/tests/compiler/dart2js/source_mapping_test.dart
@@ -16,7 +16,7 @@
   compiler.sourceFiles[uri.toString()] = sourceFile;
   JavaScriptBackend backend = compiler.backend;
   return compiler.runCompiler(uri).then((_) {
-    return backend.emitter.mainBuffer;
+    return backend.emitter.oldEmitter.mainBuffer;
   });
 }
 
diff --git a/tests/compiler/dart2js/trust_type_annotations_test.dart b/tests/compiler/dart2js/trust_type_annotations_test.dart
new file mode 100644
index 0000000..301d061
--- /dev/null
+++ b/tests/compiler/dart2js/trust_type_annotations_test.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+import 'compiler_helper.dart';
+
+const String TEST = """
+class A {
+  int aField;
+
+  A(this.aField);
+
+  // Test return type annotation.
+  int foo(a) => a;
+  // Test parameter type annotation.
+  faa (int a) => a;
+  // Test annotations on locals.
+  baz(x) {
+    int y = x;
+    return y;
+  }
+  // Test tear-off closure type annotations.
+  int bar(x) => x;
+  int tear(x) {
+    var torn = bar;
+    // Have torn escape through closure to disable tracing.
+    var fail = (() => torn)();
+    return fail(x);
+  }
+}
+
+main () {
+  var a = new A("42");
+  print(a.aField);
+  print(a.foo("42"));
+  print(a.foo(42));
+  print(a.faa("42"));
+  print(a.faa(42));
+  print(a.baz("42"));
+  print(a.baz(42));
+  // Test trusting types of tear off closures.
+  print(a.tear("42"));
+  print(a.tear(42));
+}
+""";
+
+void main() {
+  Uri uri = new Uri(scheme: 'source');
+  var compiler = compilerFor(TEST, uri, trustTypeAnnotations: true);
+  asyncTest(() => compiler.runCompiler(uri).then((_) {
+    var typesInferrer = compiler.typesTask.typesInferrer;
+
+    ClassElement classA = findElement(compiler, "A");
+
+    checkReturn(String name, TypeMask type) {
+      var element = classA.lookupMember(name);
+      var mask = typesInferrer.getReturnTypeOfElement(element);
+      Expect.isTrue(type.containsMask(
+          typesInferrer.getReturnTypeOfElement(element), compiler.world));
+    }
+    checkType(String name, type) {
+      var element = classA.lookupMember(name);
+      Expect.isTrue(type.containsMask(
+                typesInferrer.getTypeOfElement(element), compiler.world));
+    }
+
+    var intMask = new TypeMask.subtype(compiler.intClass, compiler.world);
+
+    checkReturn('foo', intMask);
+    checkReturn('faa', intMask);
+    checkType('aField', intMask);
+    checkReturn('bar', intMask);
+    checkReturn('baz', intMask);
+    checkReturn('tear', intMask);
+  }));
+}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 3492258..b21d660 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -51,13 +51,5 @@
 timer_negative_test: Fail, OK # A negative runtime test.
 bailout8_test: Fail, OK # Mismatch in thrown exception.
 
-[ $csp ]
-deferred/deferred_class_test: Fail # http://dartbug.com/16898
-deferred/deferred_constant_test: Fail # http://dartbug.com/16898
-deferred/deferred_constant2_test: Fail # http://dartbug.com/16898
-deferred/deferred_constant3_test: Fail # http://dartbug.com/16898
-deferred/deferred_constant4_test: Fail # http://dartbug.com/16898
-deferred/deferred_constant5_test: Fail # http://dartbug.com/16898
-
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 deferred/*: Skip # Issue 17458
diff --git a/tests/isolate/function_send_test.dart b/tests/isolate/function_send_test.dart
new file mode 100644
index 0000000..95f4f93
--- /dev/null
+++ b/tests/isolate/function_send_test.dart
@@ -0,0 +1,186 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void toplevel(port, message) { port.send("toplevel:$message"); }
+Function createFuncToplevel() => (p, m) { p.send(m); };
+class C {
+  Function initializer;
+  Function body;
+  C() : initializer = ((p, m) { throw "initializer"; }) {
+    body = (p, m) { throw "body"; };
+  }
+  static void staticFunc(port, message) { port.send("static:$message"); }
+  static Function createFuncStatic() => (p, m) { throw "static expr"; };
+  void instanceMethod(p, m) { throw "instanceMethod"; }
+  Function createFuncMember() => (p, m) { throw "instance expr"; };
+  void call(n, p) { throw "C"; }
+}
+
+class Callable {
+  void call(p, m) { p.send(["callable", m]); }
+}
+
+
+void main() {
+  asyncStart();
+
+  // Sendables are top-level functions and static functions only.
+  testSendable("toplevel", toplevel);
+  testSendable("static", C.staticFunc);
+  // Unsendables are any closure - instance methods or function expression.
+  var c = new C();
+  testUnsendable("instance method", c.instanceMethod);
+  testUnsendable("static context expression", createFuncToplevel());
+  testUnsendable("static context expression", C.createFuncStatic());
+  testUnsendable("initializer context expression", c.initializer);
+  testUnsendable("constructor context expression", c.body);
+  testUnsendable("instance method context expression", c.createFuncMember());
+
+  // The result of `toplevel.call` and `staticFunc.call` may or may not be
+  // identical to `toplevel` and `staticFunc` respectively. If they are not
+  // equal, they may or may not be considered toplevel/static functions anyway,
+  // and therefore sendable. The VM and dart2js curretnly disagrees on whether
+  // `toplevel` and `toplevel.call` are identical, both allow them to be sent.
+  // If this is ever specified to something else, use:
+  //     testUnsendable("toplevel.call", toplevel.call);
+  //     testUnsendable("static.call", C.staticFunc.call);
+  // instead.
+  // These two tests should be considered canaries for accidental behavior
+  // change rather than requirements.
+  testSendable("toplevel", toplevel.call);
+  testSendable("static", C.staticFunc.call);
+
+  // Callable objects are sendable if general objects are (VM yes, dart2js no).
+  // It's unspecified whether arbitrary objects can be sent. If it is specified,
+  // add a test that `new Callable()` is either sendable or unsendable.
+
+  // The call method of a callable object is a closure holding the object,
+  // not a top-level or static function, so it should be blocked, just as
+  // a normal method.
+  testUnsendable("callable object", new Callable().call);
+
+  asyncEnd();
+  return;
+}
+
+// Create a receive port that expects exactly one message.
+// Pass the message to `callback` and return the sendPort.
+SendPort singleMessagePort(callback) {
+  var p;
+  p = new RawReceivePort((v) { p.close(); callback(v); });
+  return p.sendPort;
+}
+
+// A singleMessagePort that expects the message to be a specific value.
+SendPort expectMessagePort(message) {
+  asyncStart();
+  return singleMessagePort((v) {
+    Expect.equals(message, v);
+    asyncEnd();
+  });
+}
+
+void testSendable(name, func) {
+  // Function as spawn message.
+  Isolate.spawn(callFunc, [func, expectMessagePort("$name:spawn"), "spawn"]);
+
+  // Send function to same isolate.
+  var reply = expectMessagePort("$name:direct");
+  singleMessagePort(callFunc).send([func, reply, "direct"]);
+
+  // Send function to other isolate, call it there.
+  reply = expectMessagePort("$name:other isolate");
+  callPort().then((p) {
+    p.send([func, reply, "other isolate"]);
+  });
+
+  // Round-trip function trough other isolate.
+  echoPort((roundtripFunc) {
+    Expect.identical(func, roundtripFunc, "$name:send through isolate");
+  }).then((port) { port.send(func); });
+}
+
+// Creates a new isolate and a pair of ports that expect a single message
+// to be sent to the other isolate and back to the callback function.
+Future<SendPort> echoPort(callback(value)) {
+  Completer completer = new Completer<SendPort>();
+  SendPort replyPort = singleMessagePort(callback);
+  RawReceivePort initPort;
+  initPort = new RawReceivePort((p) {
+    completer.complete(p);
+    initPort.close();
+  });
+  return Isolate.spawn(_echo, [replyPort, initPort.sendPort])
+                .then((isolate) => completer.future);
+}
+
+void _echo(msg) {
+  var replyPort = msg[0];
+  RawReceivePort requestPort;
+  requestPort = new RawReceivePort((msg) {
+    replyPort.send(msg);
+    requestPort.close();  // Single echo only.
+  });
+  msg[1].send(requestPort.sendPort);
+}
+
+// Creates other isolate that waits for a single message, `msg`, on the returned
+// port, and executes it as `msg[0](msg[1],msg[2])` in the other isolate.
+Future<SendPort> callPort() {
+  Completer completer = new Completer<SendPort>();
+  SendPort initPort = singleMessagePort(completer.complete);
+  return Isolate.spawn(_call, initPort)
+                .then((_) => completer.future);
+}
+
+void _call(initPort) {
+  initPort.send(singleMessagePort(callFunc));
+}
+
+void testUnsendable(name, func) {
+  asyncStart();
+  Isolate.spawn(nop, func).then((v) => throw "allowed spawn direct?",
+                                onError: (e,s){ asyncEnd(); });
+  asyncStart();
+  Isolate.spawn(nop, [func]).then((v) => throw "allowed spawn wrapped?",
+                                  onError: (e,s){ asyncEnd(); });
+
+  asyncStart();
+  var noReply = new RawReceivePort((_) { throw "Unexpected message: $_"; });
+  // Currently succeedes incorrectly in dart2js.
+  Expect.throws(() {                /// 01: ok
+    noReply.sendPort.send(func);    /// 01: continued
+  }, null, "send direct");          /// 01: continued
+  Expect.throws(() {                /// 01: continued
+    noReply.sendPort.send([func]);  /// 01: continued
+  }, null, "send wrapped");         /// 01: continued
+  scheduleMicrotask(() {
+    noReply.close();
+    asyncEnd();
+  });
+
+  // Try sending through other isolate.
+  asyncStart();
+  echoPort((v) { Expect.equals(0, v); })
+    .then((p) {
+      try {
+        p.send(func);
+      } finally {
+        p.send(0);   // Closes echo port.
+      }
+    })
+    .then((p) => throw "unreachable 2",
+          onError: (e, s) {asyncEnd();});
+}
+
+void nop(_) {}
+
+void callFunc(message) {
+  message[0](message[1], message[2]);
+}
diff --git a/tests/isolate/illegal_msg_function_test.dart b/tests/isolate/illegal_msg_function_test.dart
index 5493abe..95d409f 100644
--- a/tests/isolate/illegal_msg_function_test.dart
+++ b/tests/isolate/illegal_msg_function_test.dart
@@ -9,8 +9,6 @@
 import "package:unittest/unittest.dart";
 import "remote_unittest_helper.dart";
 
-funcFoo(x) => x + 2;
-
 echo(sendPort) {
   var port = new ReceivePort();
   sendPort.send(port.sendPort);
@@ -22,7 +20,7 @@
 void main([args, port]) {
   if (testRemote(main, port)) return;
   test("msg_function", () {
-    var function = funcFoo;
+    var function = (x) => x + 2;
     ReceivePort port = new ReceivePort();
     Future spawn = Isolate.spawn(echo, port.sendPort);
     var caught_exception = false;
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 5a36c41..6a6742d 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -24,6 +24,7 @@
 handle_error_test: Fail   # Not implemented yet
 handle_error2_test: Fail  # Not implemented yet
 handle_error3_test: Fail  # Not implemented yet
+function_send_test: Fail   # Not implemented yet
 
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
 *: Skip # Isolate tests are timing out flakily on Android content_shell.  Issue 19795
@@ -40,6 +41,8 @@
 [ $compiler == dart2js ]
 serialization_test: RuntimeError # Issue 1882, tries to access class TestingOnly declared in isolate_patch.dart
 
+function_send_test/01: RuntimeError # dart2js allows sending closures to the same isolate.
+
 [ $compiler == dart2js && $runtime == safari ]
 cross_isolate_message_test: Skip # Issue 12627
 message_test: Skip # Issue 12627
@@ -99,3 +102,6 @@
 browser/typed_data_message_test: StaticWarning
 mint_maker_test: StaticWarning
 serialization_test: StaticWarning
+
+[ $compiler != none || $runtime != vm ]
+package_root_test: SkipByDesign # Uses dart:io.
diff --git a/tests/isolate/package_root_test.dart b/tests/isolate/package_root_test.dart
new file mode 100644
index 0000000..2ee6b30
--- /dev/null
+++ b/tests/isolate/package_root_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'dart:isolate';
+
+final SPAWN_PACKAGE_ROOT = Uri.parse("otherPackageRoot");
+
+void main([args, port]) {
+  if (port != null) {
+    testPackageRoot(args);
+    return;
+  }
+  var p = new ReceivePort();
+  Isolate.spawnUri(Platform.script,
+                   [p.sendPort, Platform.packageRoot],
+                   {},
+                   packageRoot: SPAWN_PACKAGE_ROOT);
+  p.listen((msg) {
+    p.close();
+  });
+}
+
+
+void testPackageRoot(args) {
+  var parentPackageRoot = args[1];
+  if (parentPackageRoot == Platform.packageRoot) {
+    throw "Got parent package root";
+  }
+  if (Uri.parse(Platform.packageRoot) != SPAWN_PACKAGE_ROOT) {
+    throw "Wrong package root";
+  }
+  args[0].send(null);
+}
+
diff --git a/tests/language/compile_time_constant12_test.dart b/tests/language/compile_time_constant12_test.dart
new file mode 100644
index 0000000..0ae5f57
--- /dev/null
+++ b/tests/language/compile_time_constant12_test.dart
@@ -0,0 +1,13 @@
+// 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.
+
+const String s = "foo";
+const int i = s.length; /// 01: compile-time error
+
+use(x) => x;
+
+main() {
+  use(s);
+  use(i); /// 01: continued
+}
diff --git a/tests/language/compile_time_constant_c_test.dart b/tests/language/compile_time_constant_c_test.dart
index bf3d485..e55e0c7 100644
--- a/tests/language/compile_time_constant_c_test.dart
+++ b/tests/language/compile_time_constant_c_test.dart
@@ -6,7 +6,7 @@
   499: 400 + 99
 };
 const m2 = const {
-  "foo" + "bar": 42  /// 02: compile-time error
+  "foo" + "bar": 42 /// 01: compile-time error
 };
 
 use(x) => x;
diff --git a/tests/language/language.status b/tests/language/language.status
index 854574c..2000cd7 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -105,6 +105,7 @@
 main_test/21: Fail # http://dartbug.com/20028
 main_test/42: Fail # http://dartbug.com/20028
 
+
 [ $compiler == none && $runtime == drt ]
 disassemble_test: Pass, Fail # Issue 18122
 
@@ -119,4 +120,6 @@
 [ $compiler == none && ($runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) && $mode == debug ]
 large_class_declaration_test: Skip # Times out. Issue 20352
 
+[ $compiler == none && $runtime == ContentShellOnAndroid ]
+gc_test: Skip # Times out flakily. Issue 20956
 
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 214d84a..aa530e1 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -250,11 +250,6 @@
 [ $minified ]
 stack_trace_test: Fail, OK # Stack trace not preserved in minified code.
 
-[ ($compiler == dart2js && $csp)]
-deferred_constraints_type_annotation_test/*: Skip # Issue 16898
-deferred_constraints_constants_test/*: Skip # Issue 16898
-deferred_no_such_method_test*: Skip # Issue 16898
-
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 *deferred*: Skip # Issue 17458
 cha_deopt*: Skip # Issue 17458
diff --git a/tests/language/regress_21016_test.dart b/tests/language/regress_21016_test.dart
new file mode 100644
index 0000000..1d9d071
--- /dev/null
+++ b/tests/language/regress_21016_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that we give up on tracing a function if one of its closurizations
+// escapes tracing.
+
+class A {
+  var _boo = 22;
+  get boo {
+    return _boo;
+    return 1;
+  }
+}
+
+class B {
+  var _bar = 42;
+  get boo {
+    return _bar;
+    return 1;
+  }
+}
+
+class Holder {
+  tearMe(x) => x.boo;
+}
+
+var list = [];
+
+main () {
+  var holder = new Holder();
+  var hide = ((X) => X)(holder.tearMe);
+  hide(new A());
+  list.add(holder.tearMe);
+  var x = list[0];
+  x(new B());
+}
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index bbddc24..6f8d9bd 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -20,27 +20,4 @@
 
 # Pub is starting to use the new async syntax, which isn't supported on the
 # analyzer bots yet.
-lib/_internal/pub/bin/pub: CompileTimeError
-lib/_internal/pub/lib/src/command: CompileTimeError
-lib/_internal/pub/lib/src/command/barback: CompileTimeError
-lib/_internal/pub/lib/src/command/build: CompileTimeError
-lib/_internal/pub/lib/src/command/cache: CompileTimeError
-lib/_internal/pub/lib/src/command/cache_add: CompileTimeError
-lib/_internal/pub/lib/src/command/cache_list: CompileTimeError
-lib/_internal/pub/lib/src/command/cache_repair: CompileTimeError
-lib/_internal/pub/lib/src/command/deps: CompileTimeError
-lib/_internal/pub/lib/src/command/downgrade: CompileTimeError
-lib/_internal/pub/lib/src/command/get: CompileTimeError
-lib/_internal/pub/lib/src/command/global: CompileTimeError
-lib/_internal/pub/lib/src/command/global_activate: CompileTimeError
-lib/_internal/pub/lib/src/command/global_deactivate: CompileTimeError
-lib/_internal/pub/lib/src/command/global_list: CompileTimeError
-lib/_internal/pub/lib/src/command/global_run: CompileTimeError
-lib/_internal/pub/lib/src/command/help: CompileTimeError
-lib/_internal/pub/lib/src/command/lish: CompileTimeError
-lib/_internal/pub/lib/src/command/list_package_dirs: CompileTimeError
-lib/_internal/pub/lib/src/command/run: CompileTimeError
-lib/_internal/pub/lib/src/command/serve: CompileTimeError
-lib/_internal/pub/lib/src/command/upgrade: CompileTimeError
-lib/_internal/pub/lib/src/command/uploader: CompileTimeError
-lib/_internal/pub/lib/src/command/version: CompileTimeError
+lib/_internal/pub/*: Pass, CompileTimeError
diff --git a/tests/lib/async/zone_error_callback_test.dart b/tests/lib/async/zone_error_callback_test.dart
new file mode 100644
index 0000000..fcf0ba7
--- /dev/null
+++ b/tests/lib/async/zone_error_callback_test.dart
@@ -0,0 +1,327 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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';
+import 'package:async_helper/async_helper.dart';
+import 'dart:async';
+
+main() {
+  asyncStart();
+  testNoChange();
+  testWithReplacement();
+  asyncEnd();
+}
+
+class MockStack implements StackTrace {
+  final int id;
+  const MockStack(this.id);
+  String toString() => "MocKStack($id)";
+}
+const stack1 = const MockStack(1);
+const stack2 = const MockStack(2);
+
+class SomeError implements Error {
+  final int id;
+  const SomeError(this.id);
+  StackTrace get stackTrace => stack2;
+  String toString() => "SomeError($id)";
+}
+
+const error1 = const SomeError(1);
+const error2 = const SomeError(2);
+
+void expectError(e, s) {
+  // Remember one asyncStart per use of this callback.
+  Expect.identical(error1, e);
+  Expect.identical(stack1, s);
+  asyncEnd();
+}
+
+void expectErrorOnly(e, s) {
+  // Remember one asyncStart per use of this callback.
+  Expect.identical(error1, e);
+  asyncEnd();
+}
+
+AsyncError replace(self, parent, zone, e, s) {
+  if (e == "ignore") return null;  // For testing handleError throwing.
+  Expect.identical(error1, e);  // Ensure replacement only called once
+  return new AsyncError(error2, stack2);
+}
+
+var replaceZoneSpec = new ZoneSpecification(errorCallback: replace);
+
+// Expectation after replacing.
+void expectReplaced(e, s) {
+  Expect.identical(error2, e);
+  Expect.identical(stack2, s);
+  asyncEnd();
+}
+
+
+void testProgrammaticErrors(expectError) {
+  {
+    asyncStart();
+    Completer c = new Completer();
+    c.future.catchError(expectError);
+    c.completeError(error1, stack1);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.listen(null, onError: expectError, cancelOnError: true);
+    controller.addError(error1, stack1);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController(sync: true);
+    controller.stream.listen(null, onError: expectError, cancelOnError: true);
+    controller.addError(error1, stack1);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController.broadcast();
+    controller.stream.listen(null, onError: expectError, cancelOnError: true);
+    controller.addError(error1, stack1);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController.broadcast(sync: true);
+    controller.stream.listen(null, onError: expectError, cancelOnError: true);
+    controller.addError(error1, stack1);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.asBroadcastStream().listen(
+        null, onError: expectError, cancelOnError: true);
+    controller.addError(error1, stack1);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController(sync: true);
+    controller.stream.asBroadcastStream().listen(
+        null, onError: expectError, cancelOnError: true);
+    controller.addError(error1, stack1);
+  }
+
+  {
+    asyncStart();
+    Future f = new Future.error(error1, stack1);
+    f.catchError(expectError);
+  }
+}
+
+void testThrownErrors(expectErrorOnly) {
+  // Throw error in non-registered callback.
+  {
+    asyncStart();
+    Future f = new Future(() => throw error1);
+    f.catchError(expectErrorOnly);
+  }
+
+  {
+    asyncStart();
+    Future f = new Future.microtask(() => throw error1);
+    f.catchError(expectErrorOnly);
+  }
+
+  {
+    asyncStart();
+    Future f = new Future.sync(() => throw error1);
+    f.catchError(expectErrorOnly);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.map((x) => throw error1).listen(
+        null, onError: expectErrorOnly, cancelOnError: true);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.where((x) => throw error1).listen(
+        null, onError: expectErrorOnly, cancelOnError: true);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.forEach((x) => throw error1).catchError(expectErrorOnly);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.expand((x) => throw error1).listen(
+        null, onError: expectErrorOnly, cancelOnError: true);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.asyncMap((x) => throw error1).listen(
+        null, onError: expectErrorOnly, cancelOnError: true);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.asyncExpand((x) => throw error1).listen(
+        null, onError: expectErrorOnly, cancelOnError: true);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.handleError((e, s) => throw error1).listen(
+        null, onError: expectErrorOnly, cancelOnError: true);
+    controller.addError("ignore", null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.skipWhile((x) => throw error1).listen(
+        null, onError: expectErrorOnly, cancelOnError: true);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.takeWhile((x) => throw error1).listen(
+        null, onError: expectErrorOnly, cancelOnError: true);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.every((x) => throw error1).catchError(expectErrorOnly);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.any((x) => throw error1).catchError(expectErrorOnly);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.firstWhere((x) => throw error1)
+                     .catchError(expectErrorOnly);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.lastWhere((x) => throw error1)
+                     .catchError(expectErrorOnly);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.singleWhere((x) => throw error1)
+                     .catchError(expectErrorOnly);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.reduce((x, y) => throw error1)
+              .catchError(expectErrorOnly);
+    controller.add(null);
+    controller.add(null);
+  }
+
+  {
+    asyncStart();
+    StreamController controller = new StreamController();
+    controller.stream.fold(null, (x, y) => throw error1)
+                     .catchError(expectErrorOnly);
+    controller.add(null);
+  }
+}
+
+
+testNoChange() {
+  void testTransparent() {
+    testProgrammaticErrors(expectError);
+    testThrownErrors(expectErrorOnly);
+  }
+
+  // Run directly.
+  testTransparent();
+
+  // Run in a zone that doesn't change callback.
+  runZoned(testTransparent,
+           zoneSpecification:
+               new ZoneSpecification(handleUncaughtError: (s,p,z,e,t){}));
+
+  // Run in zone that delegates to root zone
+  runZoned(testTransparent,
+           zoneSpecification: new ZoneSpecification(
+               errorCallback: (s,p,z,e,t) => p.errorCallback(z, e, t)));
+
+  // Run in a zone that returns null from the callback.
+  runZoned(testTransparent,
+           zoneSpecification:
+               new ZoneSpecification(errorCallback: (s,p,z,e,t) => null));
+
+  // Run in zone that returns same values.
+  runZoned(testTransparent,
+           zoneSpecification: new ZoneSpecification(
+               errorCallback: (s,p,z,e,t) => new AsyncError(e, t)));
+
+  // Run in zone that returns null, inside zone that does replacement.
+  runZoned(() {
+    runZoned(testTransparent,
+             zoneSpecification:
+                 new ZoneSpecification(errorCallback: (s,p,z,e,t)=>null));
+  }, zoneSpecification: replaceZoneSpec);
+}
+
+
+void testWithReplacement() {
+  void testReplaced() {
+    testProgrammaticErrors(expectReplaced);
+    testThrownErrors(expectReplaced);
+  }
+  // Zone which replaces errors.
+  runZoned(testReplaced, zoneSpecification: replaceZoneSpec);
+
+  // Nested zone, only innermost gets to act.
+  runZoned(() {
+    runZoned(testReplaced, zoneSpecification: replaceZoneSpec);
+  }, zoneSpecification: replaceZoneSpec);
+
+  // Use delegation to parent which replaces.
+  runZoned(() {
+    runZoned(testReplaced,
+             zoneSpecification: new ZoneSpecification(
+                 errorCallback: (s,p,z,e,t) => p.errorCallback(z,e,t)));
+  }, zoneSpecification: replaceZoneSpec);
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 0d76b8f..64ef006 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -12,9 +12,8 @@
 mirrors/redirecting_factory_different_type_test: SkipByDesign # Tests type checks.
 
 [ $csp ]
-async/deferred/deferred_in_isolate_test: RuntimeError # Issue 16898
-mirrors/deferred_mirrors_metadata_test: Fail # Issue 16898
-mirrors/deferred_mirrors_metatarget_test: Fail # Issue 16898
+# Deferred loading does not work from an isolate in CSP-mode
+async/deferred/deferred_in_isolate_test: Skip # Issue 16898
 
 [ $compiler == dart2js ]
 async/schedule_microtask6_test: RuntimeError # global error handling is not supported. http://dartbug.com/5958
@@ -97,6 +96,7 @@
 mirrors/static_members_test: RuntimeError # Issue 14633, Issue 12164
 mirrors/typedef_test/none: RuntimeError # http://dartbug.com/6490
 mirrors/typedef_metadata_test: RuntimeError # Issue 12785
+mirrors/typedef_reflected_type_test/01: RuntimeError # Issue 12607
 mirrors/typevariable_mirror_metadata_test: CompileTimeError # Issue 10905
 mirrors/type_variable_is_static_test: RuntimeError # Issue 6335
 mirrors/type_variable_owner_test/01: RuntimeError # Issue 12785
@@ -122,6 +122,8 @@
 math/math2_test: RuntimeError
 
 [ $compiler == dart2js && ($jscl || $runtime == d8) ]
+mirrors/invocation_fuzz_test/none: RuntimeError # Issue 15566
+[ $compiler == dart2js && ($minified || $runtime == jsshell) ]
 mirrors/invocation_fuzz_test: RuntimeError # Issue 15566
 
 [ $compiler == dart2js && $runtime == jsshell ]
@@ -256,6 +258,7 @@
 
 [$compiler == none && $runtime == ContentShellOnAndroid ]
 async/stream_timeout_test: RuntimeError, Pass # Issue 19127
+async/slow_consumer3_test: Skip # Times out flakily. Issue 20956
 convert/streamed_conversion_utf8_encode_test: Skip # Times out or passes. Issue 19127
 convert/streamed_conversion_utf8_decode_test: Skip # Times out or passes. Issue 19127
 mirrors/lazy_static_test: Skip # Times out. Issue 19127
diff --git a/tests/lib/math/pi_test.dart b/tests/lib/math/pi_test.dart
index deb58fd..9e3565a 100644
--- a/tests/lib/math/pi_test.dart
+++ b/tests/lib/math/pi_test.dart
@@ -11,10 +11,33 @@
 import "package:expect/expect.dart";
 import 'dart:math';
 
-void main() {
-  var seed = new Random().nextInt(1<<16);
+var known_bad_seeds = const [
+  50051,
+  55597,
+  59208
+];
+
+void main([args]) {
+  // Select a seed either from the argument passed in or
+  // otherwise a random seed.
+  var seed = -1;
+  if ((args != null) && (args.length > 0)) {
+    seed = int.parse(args[0]);
+  } else {
+    var seed_prng = new Random();
+    while (seed == -1) {
+      seed = seed_prng.nextInt(1<<16);
+      if (known_bad_seeds.contains(seed)) {
+        // Reset seed and try again.
+        seed = -1;
+      }
+    }
+  }
+  
+  // Setup the PRNG for the Monte Carlo simulation.
   print("pi_test seed: $seed");
   var prng = new Random(seed);
+
   var outside = 0;
   var inside = 0;
   for (var i = 0; i < 600000; i++) {
diff --git a/tests/lib/mirrors/invocation_fuzz_test.dart b/tests/lib/mirrors/invocation_fuzz_test.dart
index d50523b..7ec1b87 100644
--- a/tests/lib/mirrors/invocation_fuzz_test.dart
+++ b/tests/lib/mirrors/invocation_fuzz_test.dart
@@ -3,14 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // This test reflectively enumerates all the methods in the system and tries to
-// invoke them will all nulls. This may result in Dart exceptions or hangs, but
-// should never result in crashes or JavaScript exceptions.
+// invoke them will various basic values (nulls, ints, etc). This may result in
+// Dart exceptions or hangs, but should never result in crashes or JavaScript
+// exceptions.
 
 library test.invoke_natives;
 
 import 'dart:mirrors';
 import 'dart:async';
-import 'package:expect/expect.dart';
 
 // Methods to be skipped, by qualified name.
 var blacklist = [
@@ -26,11 +26,17 @@
   // These prevent the test from exiting.
   'dart.async._scheduleAsyncCallback',
   'dart.async._setTimerFactoryClosure',
-
   'dart.isolate._startMainIsolate',
   'dart.isolate._startIsolate',
   'dart.io.sleep',
   'dart.io.HttpServer.HttpServer.listenOn',
+  new RegExp(r'dart.io.*'),  /// smi: ok
+
+  // Runtime exceptions we can't catch because they occur too early in event
+  // dispatch to be caught in a zone.
+  'dart.isolate._isolateScheduleImmediate',
+  'dart.io._Timer._createTimer',  /// smi: ok
+  'dart.async.runZoned',  /// string: ok
 
   // These either cause the VM to segfault or throw uncatchable API errors.
   // TODO(15274): Fix them and remove from blacklist.
@@ -43,6 +49,10 @@
   'dart.io._FileSystemWatcher._listenOnSocket',
   'dart.io.SystemEncoding.decode',
   'dart.io.SystemEncoding.encode',
+  'dart.core.StringBuffer.toString',  /// emptyarray: ok
+
+  // See Object_toString and Issue 20583
+  'dart.core.Error._objectToString',  /// string: ok
 ];
 
 bool isBlacklisted(Symbol qualifiedSymbol) {
@@ -67,7 +77,8 @@
 
   if (m.isRegularMethod) {
     task.action =
-        () => target.invoke(m.simpleName, new List(m.parameters.length));
+      () => target.invoke(m.simpleName,
+                          new List.filled(m.parameters.length, fuzzArgument));
   } else if (m.isGetter) {
     task.action =
         () => target.getField(m.simpleName);
@@ -106,8 +117,9 @@
     task.name = MirrorSystem.getName(m.qualifiedName);
 
     task.action = () {
-      var instance = classMirror.newInstance(m.constructorName,
-                                             new List(m.parameters.length));
+      var instance = classMirror.newInstance(
+          m.constructorName,
+          new List.filled(m.parameters.length, fuzzArgument));
       checkInstance(instance, task.name);
     };
     queue.add(task);
@@ -148,13 +160,21 @@
   testZone.createTimer(Duration.ZERO, doOneTask);
 }
 
+var fuzzArgument;
+
 main([args]) {
+  fuzzArgument = null;
+  fuzzArgument = 1;  /// smi: ok
+  fuzzArgument = false;  /// false: ok
+  fuzzArgument = 'string';  /// string: ok
+  fuzzArgument = new List(0);  /// emptyarray: ok
+
   currentMirrorSystem().libraries.values.forEach(checkLibrary);
 
   var valueObjects =
     [true, false, null,
      0, 0xEFFFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFF,
-     "foo", 'blåbærgrød', 'Îñţérñåţîöñåļîžåţîờñ'];
+     "foo", 'blåbærgrød', 'Îñţérñåţîöñåļîžåţîờñ', "𝄞", #symbol];
   valueObjects.forEach((v) => checkInstance(reflect(v), 'value object'));
 
   uncaughtErrorHandler(self, parent, zone, error, stack) {};
diff --git a/tests/lib/mirrors/typedef_reflected_type_test.dart b/tests/lib/mirrors/typedef_reflected_type_test.dart
new file mode 100644
index 0000000..9286a88
--- /dev/null
+++ b/tests/lib/mirrors/typedef_reflected_type_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test;
+
+import 'package:expect/expect.dart';
+import 'stringify.dart';
+
+@MirrorsUsed(targets: "test")
+import 'dart:mirrors';
+
+typedef int Foo<T>(String x);
+typedef int Bar();
+
+class C {
+  Bar fun(Foo<int> x) => null;
+}
+
+main() {
+  var m = reflectClass(C).declarations[#fun];
+
+  Expect.equals(Bar, m.returnType.reflectedType);
+  Expect.equals("Foo<int>", m.parameters[0].type.reflectedType.toString());   /// 01: ok
+  Expect.equals(int, m.parameters[0].type.typeArguments[0].reflectedType);    /// 01: continued
+  Expect.isFalse(m.parameters[0].type.isOriginalDeclaration);                 /// 01: continued
+
+  var lib = currentMirrorSystem().findLibrary(#test);
+  Expect.isTrue(lib.declarations[#Foo].isOriginalDeclaration);
+}
diff --git a/tests/standalone/io/http_compression_test.dart b/tests/standalone/io/http_compression_test.dart
index 83e2fae..fc04b84 100644
--- a/tests/standalone/io/http_compression_test.dart
+++ b/tests/standalone/io/http_compression_test.dart
@@ -14,6 +14,7 @@
 void testServerCompress({bool clientAutoUncompress: true}) {
   void test(List<int> data) {
     HttpServer.bind("127.0.0.1", 0).then((server) {
+      server.autoCompress = true;
       server.listen((request) {
         request.response.add(data);
         request.response.close();
@@ -55,6 +56,7 @@
 void testAcceptEncodingHeader() {
   void test(String encoding, bool valid) {
     HttpServer.bind("127.0.0.1", 0).then((server) {
+      server.autoCompress = true;
       server.listen((request) {
         request.response.write("data");
         request.response.close();
@@ -92,8 +94,33 @@
   test('gzipx;', false);
 }
 
+void testDisableCompressTest() {
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    Expect.equals(false, server.autoCompress);
+    server.listen((request) {
+      Expect.equals('gzip', request.headers.value(HttpHeaders.ACCEPT_ENCODING));
+      request.response.write("data");
+      request.response.close();
+    });
+    var client = new HttpClient();
+    client.get("127.0.0.1", server.port, "/")
+        .then((request) => request.close())
+        .then((response) {
+          Expect.equals(null,
+                        response.headers.value(HttpHeaders.CONTENT_ENCODING));
+          response.listen(
+              (_) {},
+              onDone: () {
+                server.close();
+                client.close();
+              });
+        });
+  });
+}
+
 void main() {
   testServerCompress();
   testServerCompress(clientAutoUncompress: false);
   testAcceptEncodingHeader();
+  testDisableCompressTest();
 }
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index b1787c1..6e16f0d 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -47,7 +47,8 @@
 http_launch_test: Skip
 vmservice/*: Skip # Do not run standalone vm service tests in browser.
 issue14236_test: Skip # Issue 14236 Script snapshots do not work in the browser.
-
+javascript_compatibility_errors_test: Skip
+javascript_compatibility_warnings_test: Skip
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 javascript_int_overflow_literal_test/01: Fail, OK
@@ -59,7 +60,6 @@
 # This is runtime test.
 io/process_exit_negative_test: Skip
 
-
 [ $compiler == dart2js ]
 number_identity_test: Skip # Bigints and int/double diff. not supported.
 typed_data_test: Skip # dart:typed_data support needed.
@@ -136,8 +136,6 @@
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 javascript_int_overflow_literal_test/01: Fail # Issue 13719: Please triage this failure.
 javascript_int_overflow_test: Fail # Issue 13719: Please triage this failure.
-javascript_compatibility_errors_test: Skip
-javascript_compatibility_warnings_test: Skip
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 io/directory_invalid_arguments_test: StaticWarning
diff --git a/tests/try/poi/diff_test.dart b/tests/try/poi/diff_test.dart
index ae384cf..e01a1f9 100644
--- a/tests/try/poi/diff_test.dart
+++ b/tests/try/poi/diff_test.dart
@@ -25,7 +25,7 @@
     Element,
     LibraryElement;
 
-import 'package:try/poi/diff.dart' show
+import 'package:dart2js_incremental/diff.dart' show
     Difference,
     computeDifference;
 
diff --git a/tools/VERSION b/tools/VERSION
index c45c01e..f40729c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 7
 PATCH 0
-PRERELEASE 3
-PRERELEASE_PATCH 3
+PRERELEASE 4
+PRERELEASE_PATCH 0
diff --git a/tools/bots/pub.py b/tools/bots/pub.py
index 796297d..aeed588 100755
--- a/tools/bots/pub.py
+++ b/tools/bots/pub.py
@@ -54,23 +54,15 @@
 
   if build_info.system == 'windows':
     common_args.append('-j1')
-  opt_threshold = '--vm-options=--optimization-counter-threshold=5'
   if build_info.mode == 'release':
     bot.RunTest('pub and pkg ', build_info,
                 common_args + ['pub', 'pkg', 'docs'],
                 swallow_error=True)
-    bot.RunTest('pub and pkg optimization counter thresshold 5', build_info,
-                common_args + ['--append_logs', opt_threshold,
-                               'pub', 'pkg', 'docs'],
-                swallow_error=True)
   else:
     # Pub tests currently have a lot of timeouts when run in debug mode.
     # See issue 18479
     bot.RunTest('pub and pkg', build_info, common_args + ['pkg', 'docs'],
                 swallow_error=True)
-    bot.RunTest('pub and pkg optimization counter threshold 5', build_info,
-                common_args + ['--append_logs', opt_threshold, 'pkg', 'docs'],
-                swallow_error=True)
 
   if build_info.mode == 'release':
     pkgbuild_build_info = bot.BuildInfo('none', 'vm', build_info.mode,
diff --git a/tools/build.py b/tools/build.py
index 4ca6262..f38757a 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -34,9 +34,18 @@
 """
 DEFAULT_ARM_CROSS_COMPILER_PATH = '/usr/bin'
 
+usage = """\
+usage: %%prog [options] [targets]
+
+This script runs 'make' in the *current* directory. So, run it from
+the Dart repo root,
+
+  %s ,
+
+unless you really intend to use a non-default Makefile.""" % DART_ROOT
 
 def BuildOptions():
-  result = optparse.OptionParser()
+  result = optparse.OptionParser(usage=usage)
   result.add_option("-m", "--mode",
       help='Build variants (comma-separated).',
       metavar='[all,debug,release]',
diff --git a/tools/create_debian_chroot.sh b/tools/create_debian_chroot.sh
index ec6d52a..fdb1cf2 100755
--- a/tools/create_debian_chroot.sh
+++ b/tools/create_debian_chroot.sh
@@ -64,16 +64,15 @@
   else
     SVN_PATH="branches/$CHANNEL/deps/all.deps"
   fi
+  SRC_URI=$SVN_REPRO$SVN_PATH
 fi
-SRC_URI=$SVN_REPRO$SVN_PATH
 
 # Create Debian wheezy chroot.
 debootstrap --arch=$ARCH --components=main,restricted,universe,multiverse \
     wheezy $CHROOT http://http.us.debian.org/debian/
 chroot $CHROOT apt-get update
-mount -o bind /proc $CHROOT/proc  # Needed for openjdk-6-jdk.
 chroot $CHROOT apt-get -y install \
-    debhelper python g++-4.6 openjdk-6-jdk git subversion
+    debhelper python g++-4.6 git subversion
 
 # Add chrome-bot user.
 chroot $CHROOT groupadd --gid 1000 chrome-bot
diff --git a/tools/ddbg_service/HACKING.txt b/tools/ddbg_service/HACKING.txt
new file mode 100644
index 0000000..27c47d7
--- /dev/null
+++ b/tools/ddbg_service/HACKING.txt
@@ -0,0 +1,17 @@
+ddbg_service
+---
+
+ddbg_service is a command line debugger for the Dart VM implemented
+using the Dart VM Service.  It is still being written and is not ready
+for use.
+
+Assumptions:
+You are running pub from the latest dev channel release of Dart Editor.
+
+Before running ddbg_service, you will need to run get packages from pub:
+
+    pub upgrade
+
+Then launch ddbg_service:
+
+    dart bin/ddbg_service.dart
diff --git a/tools/ddbg_service/bin/ddbg_service.dart b/tools/ddbg_service/bin/ddbg_service.dart
new file mode 100644
index 0000000..0023ba3
--- /dev/null
+++ b/tools/ddbg_service/bin/ddbg_service.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.
+
+// A command line debugger implemented using the VM Service protocol.
+
+library ddbg2;
+
+import "dart:async";
+
+import 'package:ddbg/debugger.dart';
+
+Debugger debugger;
+
+void onError(self, parent, zone, error, StackTrace trace) {
+  if (debugger != null) {
+    debugger.onUncaughtError(error, trace);
+  } else {
+    print('\n--------\nExiting due to unexpected error:\n'
+          '  $error\n$trace\n');
+    exit();
+  }
+}
+
+void main(List<String> args) {
+  // Setup a zone which will exit the debugger cleanly on any uncaught
+  // exception.
+  var zone = Zone.ROOT.fork(specification:new ZoneSpecification(
+      handleUncaughtError: onError));
+  
+  zone.run(() {
+      debugger = new Debugger();
+  });
+}
diff --git a/tools/ddbg_service/lib/commando.dart b/tools/ddbg_service/lib/commando.dart
new file mode 100644
index 0000000..3996880
--- /dev/null
+++ b/tools/ddbg_service/lib/commando.dart
@@ -0,0 +1,750 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library commando;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:math';
+
+import 'package:ddbg/terminfo.dart';
+
+typedef List<String> CommandCompleter(List<String> commandParts);
+
+class Commando {
+  // Ctrl keys
+  static const runeCtrlA   = 0x01;
+  static const runeCtrlB   = 0x02;
+  static const runeCtrlD   = 0x04;
+  static const runeCtrlE   = 0x05;
+  static const runeCtrlF   = 0x06;
+  static const runeTAB     = 0x09;
+  static const runeNewline = 0x0a;
+  static const runeCtrlK   = 0x0b;
+  static const runeCtrlL   = 0x0c;
+  static const runeCtrlN   = 0x0e;
+  static const runeCtrlP   = 0x10;
+  static const runeCtrlU   = 0x15;
+  static const runeCtrlY   = 0x19;
+  static const runeESC     = 0x1b;
+  static const runeSpace   = 0x20;
+  static const runeDEL     = 0x7F;
+
+  StreamController<String> _commandController;
+
+  Stream get commands => _commandController.stream;
+
+  Commando({consoleIn,
+            consoleOut,
+            this.prompt : '> ',
+          this.completer : null}) {
+    _stdin = (consoleIn != null ? consoleIn : stdin);
+    _stdout = (consoleOut != null ? consoleOut : stdout);
+    _commandController = new StreamController<String>(
+        onCancel: _onCancel);
+    _stdin.echoMode = false;
+    _stdin.lineMode = false;
+    _screenWidth = _term.cols - 1;
+    _writePrompt();
+    // TODO(turnidge): Handle errors in _stdin here.
+    _stdinSubscription =
+        _stdin.transform(UTF8.decoder).listen(_handleText, onDone:_done);
+  }
+
+  Future _onCancel() {
+    _stdin.echoMode = true;
+    _stdin.lineMode = true;
+    var future = _stdinSubscription.cancel();
+    if (future != null) {
+      return future;
+    } else {
+      return new Future.value();
+    }
+  }
+
+  // Before terminating, call close() to restore terminal settings.
+  void _done() {
+    _onCancel().then((_) {
+        _commandController.close();
+      });
+  }
+  
+  void _handleText(String text) {
+    try {
+      if (!_promptShown) {
+        _bufferedInput.write(text);
+        return;
+      }
+
+      var runes = text.runes.toList();
+      var pos = 0;
+      while (pos < runes.length) {
+        if (!_promptShown) {
+          // A command was processed which hid the prompt.  Buffer
+          // the rest of the input.
+          //
+          // TODO(turnidge): Here and elsewhere in the file I pass
+          // runes to String.fromCharCodes.  Does this work?
+          _bufferedInput.write(
+              new String.fromCharCodes(runes.skip(pos)));
+          return;
+        }
+
+        var rune = runes[pos];
+
+        // Count consecutive tabs because double-tab is meaningful.
+        if (rune == runeTAB) {
+          _tabCount++;
+        } else {
+          _tabCount = 0;
+        }
+
+        if (_isControlRune(rune)) {
+          pos += _handleControlSequence(runes, pos);
+        } else {
+          pos += _handleRegularSequence(runes, pos);
+        }
+      }
+    } catch(e, trace) {
+      _commandController.addError(e, trace);
+    }
+  }
+
+  int _handleControlSequence(List<int> runes, int pos) {
+    var runesConsumed = 1;  // Most common result.
+    var char = runes[pos];
+    switch (char) {
+      case runeCtrlA:
+        _home();
+        break;
+           
+      case runeCtrlB:
+        _leftArrow();
+        break;
+
+      case runeCtrlD:
+        if (_currentLine.length == 0) {
+          // ^D on an empty line means quit.
+          _stdout.writeln("^D");
+          _done();
+        } else {
+          _delete();
+        }
+        break;
+           
+      case runeCtrlE:
+        _end();
+        break;
+           
+      case runeCtrlF:
+        _rightArrow();
+        break;
+
+      case runeTAB:
+        _complete(_tabCount > 1);
+        break;
+      
+      case runeNewline:
+        _newline();
+        break;
+      
+      case runeCtrlK:
+        _kill();
+        break;
+           
+      case runeCtrlL:
+        _clearScreen();
+        break;
+           
+      case runeCtrlN:
+        _historyNext();
+        break;
+
+      case runeCtrlP:
+        _historyPrevious();
+        break;
+
+      case runeCtrlU:
+        _clearLine();
+        break;
+           
+      case runeCtrlY:
+        _yank();
+        break;
+           
+      case runeESC:
+        // Check to see if this is an arrow key.
+        if (pos + 2 < runes.length &&  // must be a 3 char sequence.
+            runes[pos + 1] == 0x5b) {  // second char must be '['.
+          switch (runes[pos + 2]) {
+            case 0x41:  // ^[[A = up arrow
+              _historyPrevious();
+              runesConsumed = 3;
+              break;
+
+            case 0x42:  // ^[[B = down arrow
+              _historyNext();
+              runesConsumed = 3;
+              break;
+
+            case 0x43:  // ^[[C = right arrow
+              _rightArrow();
+              runesConsumed = 3;
+              break;
+        
+            case 0x44:  // ^[[D = left arrow
+              _leftArrow();
+              runesConsumed = 3;
+              break;
+
+            default:
+              // Ignore the escape character.
+              break;
+          }
+        }
+        break;
+
+      case runeDEL:
+        _backspace();
+        break;
+
+      default:
+        // Ignore the escape character.
+        break;
+    }
+    return runesConsumed;
+  }
+
+  int _handleRegularSequence(List<int> runes, int pos) {
+    var len = pos + 1;
+    while (len < runes.length && !_isControlRune(runes[len])) {
+      len++;
+    }
+    _addChars(runes.getRange(pos, len));
+    return len;
+  }
+
+  bool _isControlRune(int char) {
+    return (char >= 0x00 && char < 0x20) || (char == 0x7f);
+  }
+
+  void _writePromptAndLine() {
+    _writePrompt();
+    var pos = _writeRange(_currentLine, 0, _currentLine.length);
+    _cursorPos = _move(pos, _cursorPos);
+  }
+
+  void _writePrompt() {
+    _stdout.write(prompt);
+  }
+
+  void _addChars(Iterable<int> chars) {
+    var newLine = [];
+    newLine..addAll(_currentLine.take(_cursorPos))
+           ..addAll(chars)
+           ..addAll(_currentLine.skip(_cursorPos));
+    _update(newLine, (_cursorPos + chars.length));
+  }
+
+  void _backspace() {
+    if (_cursorPos == 0) {
+      return;
+    }
+
+    var newLine = [];
+    newLine..addAll(_currentLine.take(_cursorPos - 1))
+           ..addAll(_currentLine.skip(_cursorPos));
+    _update(newLine, (_cursorPos - 1));
+  }
+
+  void _delete() {
+    if (_cursorPos == _currentLine.length) {
+      return;
+    }
+
+    var newLine = [];
+    newLine..addAll(_currentLine.take(_cursorPos))
+           ..addAll(_currentLine.skip(_cursorPos + 1));
+    _update(newLine, _cursorPos);
+  }
+
+  void _home() {
+    _updatePos(0);
+  }
+
+  void _end() {
+    _updatePos(_currentLine.length);
+  }
+
+  void _clearScreen() {
+    _stdout.write(_term.clear);
+    _term.resize();
+    _screenWidth = _term.cols - 1;
+    _writePromptAndLine();
+  }
+
+  void _kill() {
+    var newLine = [];
+    newLine.addAll(_currentLine.take(_cursorPos));
+    _killBuffer = _currentLine.skip(_cursorPos).toList();
+    _update(newLine, _cursorPos);
+  }
+
+  void _clearLine() {
+    _update([], 0);
+  }
+
+  void _yank() {
+    var newLine = [];
+    newLine..addAll(_currentLine.take(_cursorPos))
+           ..addAll(_killBuffer)
+           ..addAll(_currentLine.skip(_cursorPos));
+    _update(newLine, (_cursorPos + _killBuffer.length));
+  }
+
+  static String _trimLeadingSpaces(String line) {
+    bool _isSpace(int rune) {
+      return rune == runeSpace;
+    }
+    return new String.fromCharCodes(line.runes.skipWhile(_isSpace));
+  }
+
+  static String _sharedPrefix(String one, String two) {
+    var len = min(one.length, two.length);
+    var runesOne = one.runes.toList();
+    var runesTwo = two.runes.toList();
+    var pos;
+    for (pos = 0; pos < len; pos++) {
+      if (runesOne[pos] != runesTwo[pos]) {
+        break;
+      }
+    }
+    var shared =  new String.fromCharCodes(runesOne.take(pos));
+    return shared;
+  }
+
+  void _complete(bool showCompletions) {
+    if (completer == null) {
+      return;
+    }
+
+    var linePrefix = _currentLine.take(_cursorPos).toList();
+    var lineAsString = new String.fromCharCodes(linePrefix);
+    var commandParts = new List.from(lineAsString.split(' ').where((line) {
+          return line != ' ' && line != '';
+        }));
+    if (lineAsString.endsWith(' ')) {
+      // If the current line ends with a space, they are hoping to
+      // complete the next word in the command.  Add an empty string
+      // to the commandParts to signal this to the completer.
+      commandParts.add('');
+    }
+    List<String> completionList = completer(commandParts);
+    var completion = null;
+
+    if (completionList.length == 0) {
+      // The current line admits no possible completion.
+      return;
+
+    } else if (completionList.length == 1) {
+      // There is a single, non-ambiguous completion for the current line.
+      completion = completionList[0];
+
+    } else {
+      // There are ambiguous completions. Find the longest common
+      // shared prefix of all of the completions.
+      completion = completionList.fold(completionList[0], _sharedPrefix);
+    }
+
+    if (showCompletions) {
+      // User hit double-TAB.  Show them all possible completions.
+      completionList.sort((a,b) => a.compareTo(b));
+      _move(_cursorPos, _currentLine.length);
+      _stdout.writeln();
+      _stdout.writeln(completionList);
+      _writePromptAndLine();
+      return;
+
+    } else {
+      // Apply the current completion.
+      var completionRunes = completion.runes.toList();
+
+      var newLine = [];
+      newLine..addAll(completionRunes)
+             ..addAll(_currentLine.skip(_cursorPos));
+      _update(newLine, completionRunes.length);
+      return;
+    }
+  }
+
+  void _newline() {
+    _addLineToHistory(_currentLine);
+    _linePos = _lines.length;
+
+    _end();
+    _stdout.writeln();
+
+    // Call the user's command handler.
+    _commandController.add(new String.fromCharCodes(_currentLine));
+    
+    _currentLine = [];
+    _cursorPos = 0;
+    if (_promptShown) {
+      _writePrompt();
+    }
+  }
+
+  void _leftArrow() {
+    _updatePos(_cursorPos - 1);
+  }
+
+  void _rightArrow() {
+    _updatePos(_cursorPos + 1);
+  }
+
+  void _addLineToHistory(List<int> line) {
+    if (_tempLineAdded) {
+      _lines.removeLast();
+      _tempLineAdded = false;
+    }
+    if (line.length > 0) {
+      _lines.add(line);
+    }
+  }
+
+  void _addTempLineToHistory(List<int> line) {
+    _lines.add(line);
+    _tempLineAdded = true;
+  }
+
+  void _replaceHistory(List<int> line, int linePos) {
+    _lines[linePos] = line;
+  }
+
+  void _historyPrevious() {
+    if (_linePos == 0) {
+      return;
+    }
+
+    if (_linePos == _lines.length) {
+      // The current in-progress line gets temporarily stored in history.
+      _addTempLineToHistory(_currentLine);
+    } else {
+      // Any edits get committed to history.
+      _replaceHistory(_currentLine, _linePos);
+    }
+
+    _linePos -= 1;
+    var line = _lines[_linePos];
+    _update(line, line.length);
+  }
+
+  void _historyNext() {
+    // For the very first command, _linePos (0) will exceed
+    // (_lines.length - 1) (-1) so we use a ">=" here instead of an "==".
+    if (_linePos >= (_lines.length - 1)) {
+      return;
+    }
+
+    // Any edits get committed to history.
+    _replaceHistory(_currentLine, _linePos);
+
+    _linePos += 1;
+    var line = _lines[_linePos];
+    _update(line, line.length);
+  }
+
+  void _updatePos(int newCursorPos) {
+    if (newCursorPos < 0) {
+      return;
+    }
+    if (newCursorPos > _currentLine.length) {
+      return;
+    }
+
+    _cursorPos = _move(_cursorPos, newCursorPos);
+  }
+
+  void _update(List<int> newLine, int newCursorPos) {
+    var pos = _cursorPos;
+    var diffPos;
+    var sharedLen = min(_currentLine.length, newLine.length);
+
+    // Find first difference.
+    for (diffPos = 0; diffPos < sharedLen; diffPos++) {
+      if (_currentLine[diffPos] != newLine[diffPos]) {
+        break;
+      }
+    }
+
+    // Move the cursor to where the difference begins.
+    pos = _move(pos, diffPos);
+
+    // Write the new text.
+    pos = _writeRange(newLine, pos, newLine.length);
+
+    // Clear any extra characters at the end.
+    pos = _clearRange(pos, _currentLine.length);
+
+    // Move the cursor back to the input point.
+    _cursorPos = _move(pos, newCursorPos);
+    _currentLine = newLine;    
+  }
+
+  void print(String text) {
+    bool togglePrompt = _promptShown;
+    if (togglePrompt) {
+      hide();
+    }
+    _stdout.writeln(text);
+    if (togglePrompt) {
+      show();
+    }
+  }
+  
+  void hide() {
+    if (!_promptShown) {
+      return;
+    }
+    _promptShown = false;
+    // We need to erase everything, including the prompt.
+    var curLine = _getLine(_cursorPos);
+    var lastLine = _getLine(_currentLine.length);
+
+    // Go to last line.
+    if (curLine < lastLine) {
+      for (var i = 0; i < (lastLine - curLine); i++) {
+        // This moves us to column 0.
+        _stdout.write(_term.cursorDown);
+      }
+      curLine = lastLine;
+    } else {
+      // Move to column 0.
+      _stdout.write('\r');
+    }
+
+    // Work our way up, clearing lines.
+    while (true) {
+      _stdout.write(_term.clrEOL);
+      if (curLine > 0) {
+        _stdout.write(_term.cursorUp);
+      } else {
+        break;
+      }
+    }
+  }
+
+  void show() {
+    if (_promptShown) {
+      return;
+    }
+    _promptShown = true;
+    _writePromptAndLine();
+
+    // If input was buffered while the prompt was hidden, process it
+    // now.
+    if (!_bufferedInput.isEmpty) {
+      var input = _bufferedInput.toString();
+      _bufferedInput.clear();
+      _handleText(input);
+    }
+  }
+
+  int _writeRange(List<int> text, int pos, int writeToPos) {
+    if (pos >= writeToPos) {
+      return pos;
+    }
+    while (pos < writeToPos) {
+      var margin = _nextMargin(pos);
+      var limit = min(writeToPos, margin);
+      _stdout.write(new String.fromCharCodes(text.getRange(pos, limit)));
+      pos = limit;
+      if (pos == margin) {
+        _stdout.write('\n');
+      }
+    }
+    return pos;
+  }
+
+  int _clearRange(int pos, int clearToPos) {
+    if (pos >= clearToPos) {
+      return pos;
+    }
+    while (true) {
+      var limit = _nextMargin(pos);
+      _stdout.write(_term.clrEOL);
+      if (limit >= clearToPos) {
+        return pos;
+      }
+      _stdout.write('\n');
+      pos = limit;
+    }
+  }
+
+  int _move(int pos, int newPos) {
+    if (pos == newPos) {
+      return pos;
+    }
+
+    var curCol = _getCol(pos);
+    var curLine = _getLine(pos);
+    var newCol = _getCol(newPos);
+    var newLine = _getLine(newPos);
+
+    if (curLine > newLine) {
+      for (var i = 0; i < (curLine - newLine); i++) {
+        _stdout.write(_term.cursorUp);
+      }
+    }
+    if (curLine < newLine) {
+      for (var i = 0; i < (newLine - curLine); i++) {
+        _stdout.write(_term.cursorDown);
+      }
+
+      // Moving down resets column to zero, oddly.
+      curCol = 0;
+    }
+    if (curCol > newCol) {
+      for (var i = 0; i < (curCol - newCol); i++) {
+        _stdout.write(_term.cursorBack);
+      }
+    }
+    if (curCol < newCol) {
+      for (var i = 0; i < (newCol - curCol); i++) {
+        _stdout.write(_term.cursorForward);
+      }
+    }
+
+    return newPos;
+  }
+        
+  int _nextMargin(int pos) {
+    var truePos = pos + prompt.length;
+    return ((truePos ~/ _screenWidth) + 1) * _screenWidth - prompt.length;
+  }
+
+  int _getLine(int pos) {
+    var truePos = pos + prompt.length;
+    return truePos ~/ _screenWidth;
+  }
+
+  int _getCol(int pos) {
+    var truePos = pos + prompt.length;
+    return truePos % _screenWidth;
+  }
+
+  Stdin _stdin;
+  StreamSubscription _stdinSubscription;
+  IOSink _stdout;
+  final String prompt;
+  bool _promptShown = true;
+  final CommandCompleter completer;
+  TermInfo _term = new TermInfo();
+
+  // TODO(turnidge): See if we can get screen resize events.
+  int _screenWidth;
+  List<int> _currentLine = [];  // A list of runes.
+  StringBuffer _bufferedInput = new StringBuffer();
+  List<List<int>> _lines = [];
+
+  // When using the command history, the current line is temporarily
+  // added to the history to allow the user to return to it.  This
+  // values tracks whether the history has a temporary line at the end.
+  bool _tempLineAdded = false;
+  int _linePos = 0;
+  int _cursorPos = 0;
+  int _tabCount = 0;
+  List<int> _killBuffer = [];
+}
+
+
+// Demo code.
+
+
+List<String> _myCompleter(List<String> commandTokens) {
+  List<String> completions = new List<String>();
+
+  // First word completions.
+  if (commandTokens.length <= 1) {
+    String prefix = '';
+    if (commandTokens.length == 1) {
+      prefix = commandTokens.first;
+    }
+    if ('quit'.startsWith(prefix)) {
+      completions.add('quit');
+    }
+    if ('help'.startsWith(prefix)) {
+      completions.add('help');
+    }
+    if ('happyface'.startsWith(prefix)) {
+      completions.add('happyface');
+    }
+  }
+
+  // Complete 'foobar' or 'gondola' anywhere in string.
+  String lastWord = commandTokens.last;
+  if ('foobar'.startsWith(lastWord)) {
+    completions.add('foobar');
+  }
+  if ('gondola'.startsWith(lastWord)) {
+    completions.add('gondola');
+  }
+
+  return completions;
+}
+
+
+int _helpCount = 0;
+Commando cmdo;
+var cmdoSubscription;
+
+
+void _handleCommand(String rawCommand) {
+  String command = rawCommand.trim();
+  cmdo.hide();
+  if (command == 'quit') {
+    var future = cmdoSubscription.cancel();
+    if (future != null) {
+      future.then((_) {
+          print('Exiting');
+          exit(0);
+        });
+    } else {
+      print('Exiting');
+      exit(0);
+    }
+  } else if (command == 'help') {
+    switch (_helpCount) {
+      case 0:
+        print('I will not help you.');
+        break;
+      case 1:
+        print('I mean it.');
+        break;
+      case 2:
+        print('Seriously.');
+        break;
+      case 100:
+        print('Well now.');
+        break;
+      default:
+        print("Okay.  Type 'quit' to quit");
+        break;
+    }
+    _helpCount++;
+  } else if (command == 'happyface') {
+    print(':-)');
+  } else {
+    print('Received command($command)');
+  }
+  cmdo.show();
+}
+
+
+void main() {
+  print('[Commando demo]');
+  cmdo = new Commando(completer:_myCompleter);
+  cmdoSubscription = cmdo.commands.listen(_handleCommand);
+}
diff --git a/tools/ddbg_service/lib/debugger.dart b/tools/ddbg_service/lib/debugger.dart
new file mode 100644
index 0000000..d3b0f9c
--- /dev/null
+++ b/tools/ddbg_service/lib/debugger.dart
@@ -0,0 +1,478 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library debugger;
+
+import "dart:async";
+import "dart:io";
+
+import "package:ddbg/commando.dart";
+import "package:observatory/service_io.dart";
+
+class Debugger {
+  Commando cmdo;
+  var _cmdoSubscription;
+
+  CommandList _commands;
+
+  VM _vm;
+  VM get vm => _vm;
+  set vm(VM vm) {
+    if (_vm == vm) {
+      // Do nothing.
+      return;
+    }
+    if (_vm != null) {
+      _vm.disconnect();
+    }
+    if (vm != null) {
+      vm.onConnect.then(_vmConnected);
+      vm.onDisconnect.then(_vmDisconnected);
+      vm.errors.stream.listen(_onServiceError);
+      vm.exceptions.stream.listen(_onServiceException);
+      vm.events.stream.listen(_onServiceEvent);
+    }
+    _vm = vm;
+  }
+
+  _vmConnected(VM vm) {
+    cmdo.print('Connected to vm');
+  }
+
+  _vmDisconnected(VM vm) {
+    cmdo.print('Disconnected from vm');
+  }
+
+  _onServiceError(ServiceError error) {
+    cmdo.print('error $error');
+  }
+
+  _onServiceException(ServiceException exception) {
+    cmdo.print('${exception.message}');
+  }
+
+  _onServiceEvent(ServiceEvent event) {
+    switch (event.eventType) {
+      case 'GC':
+        // Ignore GC events for now.
+        break;
+      default:
+        cmdo.print('event $event');
+        break;
+    }
+  }
+
+  VM _isolate;
+  VM get isolate => _isolate;
+  set isolate(Isolate isolate) {
+    _isolate = isolate;
+    cmdo.print('Current isolate is now isolate ${getIsolateIndex(_isolate)}');
+  }
+
+  Map _isolateIndexMap = new Map();
+  int _nextIsolateIndex = 0;
+  int getIsolateIndex(Isolate isolate) {
+    var index = _isolateIndexMap[isolate.id];
+    if (index == null) {
+      index = _nextIsolateIndex++;
+      _isolateIndexMap[isolate.id] = index;
+    }
+    return index;
+  }
+
+  void onUncaughtError(error, StackTrace trace) {
+    if (error is ServiceException ||
+        error is ServiceError) {
+      // These are handled elsewhere.  Ignore.
+      return;
+    }
+    cmdo.print('\n--------\nExiting due to unexpected error:\n'
+                '  $error\n$trace\n');
+    quit();
+  }
+
+  Debugger() {
+    cmdo = new Commando(completer: _completeCommand);
+    _cmdoSubscription = cmdo.commands.listen(_processCommand,
+                                             onError: _cmdoError,
+                                             onDone: _cmdoDone);
+    _commands = new CommandList();
+    _commands.register(new AttachCommand());
+    _commands.register(new DetachCommand());
+    _commands.register(new HelpCommand(_commands));
+    _commands.register(new IsolateCommand());
+    _commands.register(new QuitCommand());
+  }
+
+  Future _closeCmdo() {
+    var sub = _cmdoSubscription;
+    _cmdoSubscription = null;
+    cmdo = null;
+
+    var future = sub.cancel();
+    if (future != null) {
+      return future;
+    } else {
+      return new Future.value();
+    }
+  }
+
+  Future quit() {
+    return Future.wait([_closeCmdo()]).then((_) {
+        exit(0);
+      });
+  }
+
+  void _cmdoError(error, StackTrace trace) {
+    cmdo.print('\n--------\nExiting due to unexpected error:\n'
+               '  $error\n$trace\n');
+    quit();
+  }
+
+  void _cmdoDone() {
+    quit();
+  }
+
+  List<String> _completeCommand(List<String> commandParts) {
+    return _commands.complete(commandParts);
+  }
+
+  void _processCommand(String cmdLine) {
+    void huh() {
+      cmdo.print("'$cmdLine' not understood, try 'help' for help.");
+    }
+
+    cmdo.hide();
+    cmdLine = cmdLine.trim();
+    var args = cmdLine.split(' ');
+    if (args.length == 0) {
+      return;
+    }
+    var command = args[0];
+    var matches  = _commands.match(command, true);
+    if (matches.length == 0) {
+      huh();
+      cmdo.show();
+    } else if (matches.length == 1) {
+      matches[0].run(this, args).then((_) {
+          cmdo.show();
+        });
+    } else {
+      var matchNames = matches.map((handler) => handler.name);
+      cmdo.print("Ambigous command '$command' : ${matchNames.toList()}");
+      cmdo.show();
+    }
+  }
+
+}
+
+// Every debugger command extends this base class.
+abstract class Command {
+  String get name;
+  String get helpShort;
+  void printHelp(Debugger debugger, List<String> args);
+  Future run(Debugger debugger, List<String> args);
+  List<String> complete(List<String> commandParts) {
+    return ["$name ${commandParts.join(' ')}"];
+
+  }
+}
+
+class AttachCommand extends Command {
+  final name = 'attach';
+  final helpShort = 'Attach to a running Dart VM';
+  void printHelp(Debugger debugger, List<String> args) {
+    debugger.cmdo.print('''
+----- attach -----
+
+Attach to the Dart VM running at the indicated host:port. If no
+host:port is provided, attach to the VM running on the default port.
+
+Usage:
+  attach
+  attach <host:port>
+''');
+  }
+
+  Future run(Debugger debugger, List<String> args) {
+    var cmdo = debugger.cmdo;
+    if (args.length > 2) {
+      cmdo.print('$name expects 0 or 1 arguments');
+      return new Future.value();
+    }
+    String hostPort = 'localhost:8181';
+    if (args.length > 1) {
+      hostPort = args[1];
+    }
+
+    debugger.vm = new WebSocketVM(new WebSocketVMTarget('ws://${hostPort}/ws'));
+    return debugger.vm.load().then((vm) {
+        if (debugger.isolate == null) {
+          for (var isolate in vm.isolates) {
+            if (isolate.name == 'root') {
+              debugger.isolate = isolate;
+            }
+          }
+        }
+      });
+  }
+}
+
+class CommandList {
+  List _commands = new List<Command>();
+
+  void register(Command cmd) {
+    _commands.add(cmd);
+  }
+
+  List<Command> match(String commandName, bool exactMatchWins) {
+    var matches = [];
+    for (var command in _commands) {
+      if (command.name.startsWith(commandName)) {
+        if (exactMatchWins && command.name == commandName) {
+          // Exact match
+          return [command];
+        } else {
+          matches.add(command);
+        }
+      }
+    }
+    return matches;
+  }
+
+  List<String> complete(List<String> commandParts) {
+    var completions = new List<String>();
+    String prefix = commandParts[0];
+    for (var command in _commands) {
+      if (command.name.startsWith(prefix)) {
+        completions.addAll(command.complete(commandParts.sublist(1)));
+      }
+    }
+    return completions;
+  }
+
+  void printHelp(Debugger debugger, List<String> args) {
+    var cmdo = debugger.cmdo;
+    if (args.length <= 1) {
+      cmdo.print("\nDebugger commands:\n");
+      for (var command in _commands) {
+        cmdo.print('  ${command.name.padRight(11)} ${command.helpShort}');
+      }
+      cmdo.print("For more information about a particular command, type:\n\n"
+                  "  help <command>\n");
+
+      cmdo.print("Commands may be abbreviated: e.g. type 'h' for 'help.\n");
+    } else {
+      var commandName = args[1];
+      var matches =match(commandName, true);
+      if (matches.length == 0) {
+        cmdo.print("Command '$commandName' not recognized.  "
+                    "Try 'help' for a list of commands.");
+      } else {
+        for (var command in matches) {
+          command.printHelp(debugger, args);
+        }
+      }
+    }
+  }
+}
+
+class DetachCommand extends Command {
+  final name = 'detach';
+  final helpShort = 'Detach from a running Dart VM';
+  void printHelp(Debugger debugger, List<String> args) {
+    debugger.cmdo.print('''
+----- detach -----
+
+Detach from the Dart VM.
+
+Usage:
+  detach
+''');
+  }
+
+  Future run(Debugger debugger, List<String> args) {
+    var cmdo = debugger.cmdo;
+    if (args.length > 1) {
+      cmdo.print('$name expects no arguments');
+      return new Future.value();
+    }
+    if (debugger.vm == null) {
+      cmdo.print('No VM is attached');
+    } else {
+      debugger.vm = null;
+    }
+    return new Future.value();
+  }
+}
+
+class HelpCommand extends Command {
+  HelpCommand(this._commands);
+  final CommandList _commands;
+
+  final name = 'help';
+  final helpShort = 'Show a list of debugger commands';
+  void printHelp(Debugger debugger, List<String> args) {
+    debugger.cmdo.print('''
+----- help -----
+
+Show a list of debugger commands or get more information about a
+particular command.
+
+Usage:
+  help
+  help <command>
+''');
+  }
+
+  Future run(Debugger debugger, List<String> args) {
+    _commands.printHelp(debugger, args);
+    return new Future.value();
+  }
+
+  List<String> complete(List<String> commandParts) {
+    if (commandParts.isEmpty) {
+      return ['$name '];
+    }
+    return _commands.complete(commandParts).map((value) {
+        return '$name $value';
+      });
+  }
+}
+
+class IsolateCommand extends Command {
+  final name = 'isolate';
+  final helpShort = 'Isolate control';
+  void printHelp(Debugger debugger, List<String> args) {
+    debugger.cmdo.print('''
+----- isolate -----
+
+List all isolates.
+
+Usage:
+  isolate
+  isolate list
+
+Set current isolate.
+
+Usage:
+  isolate <id>
+''');
+  }
+
+  Future run(Debugger debugger, List<String> args) {
+    var cmdo = debugger.cmdo;
+    if (args.length == 1 ||
+        (args.length == 2 && args[1] == 'list')) {
+      return _listIsolates(debugger);
+    } else if (args.length == 2) {
+      cmdo.print('UNIMPLEMENTED');
+      return new Future.value();
+    } else {
+      if (args.length > 1) {
+        cmdo.print('Unrecognized isolate command');
+        printHelp(debugger, []);
+        return new Future.value();
+      }
+    }
+  }
+    
+  Future _listIsolates(Debugger debugger) {
+    var cmdo = debugger.cmdo;
+    if (debugger.vm == null) {
+      cmdo.print('No VM is attached');
+      return new Future.value();
+    }
+    return debugger.vm.reload().then((vm) {
+        // Sort the isolates by their indices.
+        var isolates = vm.isolates.toList();
+        isolates.sort((iso1, iso2) {
+            return (debugger.getIsolateIndex(iso1) -
+                    debugger.getIsolateIndex(iso2));
+          });
+
+        StringBuffer sb = new StringBuffer();
+        cmdo.print('  ID       NAME         STATE');
+        cmdo.print('-----------------------------------------------');
+        for (var isolate in isolates) {
+          if (isolate == debugger.isolate) {
+            sb.write('* ');
+          } else {
+            sb.write('  ');
+          }
+          sb.write(debugger.getIsolateIndex(isolate).toString().padRight(8));
+          sb.write(' ');
+          sb.write(isolate.name.padRight(12));
+          sb.write(' ');
+          if (isolate.pauseEvent != null) {
+            switch (isolate.pauseEvent.eventType) {
+              case 'IsolateCreated':
+                sb.write('paused at isolate start');
+                break;
+              case 'IsolateShutdown':
+                sb.write('paused at isolate exit');
+                break;
+              case 'IsolateInterrupted':
+                sb.write('paused');
+                break;
+              case 'BreakpointReached':
+                sb.write('paused by breakpoint');
+                break;
+              case 'ExceptionThrown':
+                sb.write('paused by exception');
+                break;
+              default:
+                sb.write('paused by unknown cause');
+                break;
+            }
+          } else if (isolate.running) {
+            sb.write('running');
+          } else if (isolate.idle) {
+            sb.write('idle');
+          } else if (isolate.loading) {
+            // TODO(turnidge): This is weird in a command line debugger.
+            sb.write('(not available)');
+          }
+          sb.write('\n');
+        }
+        cmdo.print(sb);
+      });
+    return new Future.value();
+  }
+
+  List<String> complete(List<String> commandParts) {
+    if (commandParts.isEmpty) {
+      return ['$name ${commandParts.join(" ")}'];
+    } else {
+      var completions =  _commands.complete(commandParts);
+      return completions.map((completion) {
+          return '$name $completion';
+        });
+    }
+  }
+}
+
+class QuitCommand extends Command {
+  final name = 'quit';
+  final helpShort = 'Quit the debugger.';
+  void printHelp(Debugger debugger, List<String> args) {
+    debugger.cmdo.print('''
+----- quit -----
+
+Quit the debugger.
+
+Usage:
+  quit
+''');
+  }
+
+  Future run(Debugger debugger, List<String> args) {
+    var cmdo = debugger.cmdo;
+    if (args.length > 1) {
+      cmdo.print("Unexpected arguments to $name command.");
+      return new Future.value();
+    }
+    return debugger.quit();
+  }
+}
diff --git a/tools/ddbg_service/lib/terminfo.dart b/tools/ddbg_service/lib/terminfo.dart
new file mode 100644
index 0000000..0ec8860
--- /dev/null
+++ b/tools/ddbg_service/lib/terminfo.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library terminfo;
+
+import 'dart:convert';
+import 'dart:io';
+
+int _tputGetInteger(String capName) {
+  var result = Process.runSync('tput',  ['$capName'], stdoutEncoding:UTF8);
+  if (result.exitCode != 0) {
+    return 0;
+  }
+  return int.parse(result.stdout);
+}
+
+String _tputGetSequence(String capName) {
+  var result = Process.runSync('tput',  ['$capName'], stdoutEncoding:UTF8);
+  if (result.exitCode != 0) {
+    return '';
+  }
+  return result.stdout;
+}
+
+class TermInfo {
+  TermInfo() {
+    resize();
+  }
+
+  int get lines => _lines;
+  int get cols => _cols;
+
+  int _lines;
+  int _cols;
+
+  void resize() {
+    _lines = _tputGetInteger('lines');
+    _cols = _tputGetInteger('cols');
+  }
+
+  // Back one character.
+  final String cursorBack = _tputGetSequence('cub1');
+
+  // Forward one character.
+  final String cursorForward = _tputGetSequence('cuf1');
+
+  // Up one character.
+  final String cursorUp = _tputGetSequence('cuu1');
+
+  // Down one character.
+  final String cursorDown = _tputGetSequence('cud1');
+
+  // Clear to end of line.
+  final String clrEOL = _tputGetSequence('el');
+
+  // Clear screen and home cursor.
+  final String clear = _tputGetSequence('clear');
+}
diff --git a/tools/ddbg_service/pubspec.yaml b/tools/ddbg_service/pubspec.yaml
new file mode 100644
index 0000000..f6b93de
--- /dev/null
+++ b/tools/ddbg_service/pubspec.yaml
@@ -0,0 +1,8 @@
+name: ddbg
+description: A command-line Dart debugger
+dependencies:
+  logging: any
+  observatory:
+    path: /Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/observatory
+#dev_dependencies:
+#  unittest: any
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index 8b6a4cd..8fbc8ae 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -133,6 +133,11 @@
       "@Creates('Null')",
     ],
 
+    'HTMLCanvasElement.getContext': [
+      "@Creates('CanvasRenderingContext2D|RenderingContext')",
+      "@Returns('CanvasRenderingContext2D|RenderingContext|Null')",
+    ],
+
     'HTMLInputElement.valueAsDate': [
       "@Creates('Null')", # JS date object.
     ],
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index fe6970a..04acea0 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -48,6 +48,7 @@
 import 'dart:svg' show SvgSvgElement;
 import 'dart:web_audio' as web_audio;
 import 'dart:web_gl' as gl;
+import 'dart:web_gl' show RenderingContext;
 import 'dart:web_sql';
 import 'dart:_js_helper' show
     convertDartClosureToJS, Creates, JavaScriptIndexingBehavior,
diff --git a/tools/gyp/find_mac_gcc_version.py b/tools/gyp/find_mac_gcc_version.py
index d70f5bf..40670ec 100755
--- a/tools/gyp/find_mac_gcc_version.py
+++ b/tools/gyp/find_mac_gcc_version.py
@@ -25,7 +25,7 @@
       return '4.2'
     elif major == 4 and minor < 5:
       return 'com.apple.compilers.llvmgcc42'
-    elif (major == 4 and minor >= 5) or major == 5:
+    elif (major == 4 and minor >= 5) or major == 5 or major == 6:
       # XCode seems to select the specific clang version automatically
       return 'com.apple.compilers.llvm.clang.1_0'
     else:
diff --git a/tools/gyp/xcode.gypi b/tools/gyp/xcode.gypi
index 6197887..1c0faff 100644
--- a/tools/gyp/xcode.gypi
+++ b/tools/gyp/xcode.gypi
@@ -52,5 +52,11 @@
     # Perhaps we should set it to @rpath instead. See
     # http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/RunpathDependentLibraries.html#//apple_ref/doc/uid/TP40008306-SW1
     'INSTALL_PATH': '$(TARGET_BUILD_DIR)',
+
+    # This must go here because mac_deployment_target is defined in this file,
+    # which is only included on mac, and configurations_xcode.gypi is included
+    # on all platforms, so it would be an undefined variable there.
+    # Move this to configurations_xcode if we start including it only on mac.
+    'MACOSX_DEPLOYMENT_TARGET': '<(mac_deployment_target)',
   },
 }